aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <jsm28@cam.ac.uk>2000-09-17 20:39:56 +0100
committerJoseph Myers <jsm28@gcc.gnu.org>2000-09-17 20:39:56 +0100
commit60e9d01cf742140d4d56eb8aaf7eced14a923141 (patch)
tree334934f9502cc4e6f33fbd5069958392abed651a /gcc
parentbc5006c72549c530c630f8a749612ea5ec2bb9e7 (diff)
downloadgcc-60e9d01cf742140d4d56eb8aaf7eced14a923141.zip
gcc-60e9d01cf742140d4d56eb8aaf7eced14a923141.tar.gz
gcc-60e9d01cf742140d4d56eb8aaf7eced14a923141.tar.bz2
c-decl.c (grokdeclarator): Don't give a warning about defaulting to int for plain complex which defaults...
* 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. testsuite: * gcc.dg/c90-complex-1.c, gcc.dg/c99-complex-1.c: New tests. From-SVN: r36478
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/c-decl.c23
-rw-r--r--gcc/c-typeck.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/c90-complex-1.c7
-rw-r--r--gcc/testsuite/gcc.dg/c99-complex-1.c33
6 files changed, 75 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 98e82ad..2d08c82 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
2000-09-17 Joseph S. Myers <jsm28@cam.ac.uk>
+ * 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 <jsm28@cam.ac.uk>
+
* contrib.texi: Update my entry.
Sun Sep 17 18:48:32 2000 Denis Chertykov <denisc@overta.ru>
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 1de1f97..8287eef 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 f4b42b9..75fb57a 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 3e847d8..0362ad7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2000-09-17 Joseph S. Myers <jsm28@cam.ac.uk>
+
+ * gcc.dg/c90-complex-1.c, gcc.dg/c99-complex-1.c: New tests.
+
2000-09-17 Greg McGary <greg@mcgary.org>
* 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 0000000..b65fc68
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/c90-complex-1.c
@@ -0,0 +1,7 @@
+/* Test for _Complex: in C99 only. */
+/* Origin: Joseph Myers <jsm28@cam.ac.uk> */
+/* { 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 0000000..2e1ba7d
--- /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 <jsm28@cam.ac.uk> */
+/* { 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 } */
+}