diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 98e82ada635..2d08c82d4e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2000-09-17 Joseph S. Myers + + * c-decl.c (grokdeclarator): Don't give a warning about defaulting + to int for plain complex which defaults to complex double. Do + warn about defaulting to complex double if pedantic. Warn about + complex integer types if pedantic. Warn about complex types if + pedantic and not in C99 mode. + * c-typeck.c (build_unary_op): If pedantic, warn about use of ~ + for complex conjugation. + 2000-09-17 Joseph S. Myers * contrib.texi: Update my entry. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 1de1f9748c3..8287eefb2e4 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -4078,7 +4078,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) { if ((! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) | (1 << (int) RID_SIGNED) - | (1 << (int) RID_UNSIGNED)))) + | (1 << (int) RID_UNSIGNED) + | (1 << (int) RID_COMPLEX)))) /* Don't warn about typedef foo = bar. */ && ! (specbits & (1 << (int) RID_TYPEDEF) && initialized) && ! in_system_header) @@ -4209,6 +4210,8 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) if (specbits & 1 << (int) RID_COMPLEX) { + if (pedantic && !flag_isoc99) + pedwarn ("ISO C89 does not support complex types"); /* If we just have "complex", it is equivalent to "complex double", but if any modifiers at all are specified it is the complex form of TYPE. E.g, "complex short" is @@ -4218,9 +4221,17 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) && ! (specbits & ((1 << (int) RID_LONG) | (1 << (int) RID_SHORT) | (1 << (int) RID_SIGNED) | (1 << (int) RID_UNSIGNED)))) - type = complex_double_type_node; + { + if (pedantic) + pedwarn ("ISO C does not support plain `complex' meaning `double complex'"); + type = complex_double_type_node; + } else if (type == integer_type_node) - type = complex_integer_type_node; + { + if (pedantic) + pedwarn ("ISO C does not support complex integer types"); + type = complex_integer_type_node; + } else if (type == float_type_node) type = complex_float_type_node; else if (type == double_type_node) @@ -4228,7 +4239,11 @@ grokdeclarator (declarator, declspecs, decl_context, initialized) else if (type == long_double_type_node) type = complex_long_double_type_node; else - type = build_complex_type (type); + { + if (pedantic) + pedwarn ("ISO C does not support complex integer types"); + type = build_complex_type (type); + } } /* Figure out the type qualifiers for the declaration. There are diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index f4b42b991a5..75fb57a6b61 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2807,6 +2807,8 @@ build_unary_op (code, xarg, noconvert) if (typecode == COMPLEX_TYPE) { code = CONJ_EXPR; + if (pedantic) + pedwarn ("ISO C does not support `~' for complex conjugation"); if (!noconvert) arg = default_conversion (arg); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3e847d85565..0362ad7f2f6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-09-17 Joseph S. Myers + + * gcc.dg/c90-complex-1.c, gcc.dg/c99-complex-1.c: New tests. + 2000-09-17 Greg McGary * gcc.c-torture/execute/20000917-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/c90-complex-1.c b/gcc/testsuite/gcc.dg/c90-complex-1.c new file mode 100644 index 00000000000..b65fc6873e9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c90-complex-1.c @@ -0,0 +1,7 @@ +/* Test for _Complex: in C99 only. */ +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1990 -pedantic-errors" } */ + +_Complex double foo; /* { dg-bogus "warning" "warning in place of error" } */ +/* { dg-error "C" "_Complex not in C90" { target *-*-* } 6 } */ diff --git a/gcc/testsuite/gcc.dg/c99-complex-1.c b/gcc/testsuite/gcc.dg/c99-complex-1.c new file mode 100644 index 00000000000..2e1ba7df539 --- /dev/null +++ b/gcc/testsuite/gcc.dg/c99-complex-1.c @@ -0,0 +1,33 @@ +/* Test for _Complex: in C99 only. A few basic tests. */ +/* Origin: Joseph Myers */ +/* { dg-do compile } */ +/* { dg-options "-std=iso9899:1999 -pedantic-errors" } */ + +/* Test _Complex allowed on floating types. */ + +float _Complex a; +_Complex float b; +double _Complex c; +_Complex double d; +long double _Complex e; +_Complex long double f; + +/* Plain `_Complex' for complex double is a GNU extension. */ +_Complex g; /* { dg-bogus "warning" "warning in place of error" } */ +/* { dg-error "plain" "plain _Complex" { target *-*-* } 16 } */ + +/* Complex integer types are GNU extensions. */ +_Complex int h; /* { dg-bogus "warning" "warning in place of error" } */ +/* { dg-error "complex integer" "_Complex int" { target *-*-* } 20 } */ +_Complex long i; /* { dg-bogus "warning" "warning in place of error" } */ +/* { dg-error "complex integer" "_Complex long" { target *-*-* } 22 } */ + +/* Use of ~ for complex conjugation is a GNU extension, but a constraint + violation (6.5.3.3p1) in C99. +*/ +_Complex double +foo (_Complex double z) +{ + return ~z; /* { dg-bogus "warning" "warning in place of error" } */ + /* { dg-error "complex conj" "~ for conjugation" { target *-*-* } 31 } */ +}