This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Another C99 _Complex patch


This patch makes a few changes related to C99 complex support
(pedwarns in appropriate places), and adds a couple of testcases.

Bootstrapped with no regressions on i686-pc-linux-gnu.  OK to commit?

gcc/ChangeLog:
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.

gcc/testsuite/ChangeLog:
2000-09-17  Joseph S. Myers  <jsm28@cam.ac.uk>

	* gcc.dg/c90-complex-1.c, gcc.dg/c99-complex-1.c: New tests.

--- c-decl.c.orig	Mon Sep 11 21:51:23 2000
+++ c-decl.c	Sun Sep 17 10:20:39 2000
@@ -4069,7 +4069,8 @@ grokdeclarator (declarator, declspecs, d
     {
       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)
@@ -4200,6 +4201,8 @@ grokdeclarator (declarator, declspecs, d
 
   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
@@ -4209,9 +4212,17 @@ grokdeclarator (declarator, declspecs, d
 	  && ! (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)
@@ -4219,7 +4230,11 @@ grokdeclarator (declarator, declspecs, d
       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
--- c-typeck.c.orig	Tue Sep 12 17:53:41 2000
+++ c-typeck.c	Sun Sep 17 10:24:18 2000
@@ -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);
 	}
--- testsuite/gcc.dg/c90-complex-1.c.orig	Fri Sep 11 11:31:59 1998
+++ testsuite/gcc.dg/c90-complex-1.c	Sun Sep 17 10:28:21 2000
@@ -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 } */
--- testsuite/gcc.dg/c99-complex-1.c.orig	Fri Sep 11 11:31:59 1998
+++ testsuite/gcc.dg/c99-complex-1.c	Sun Sep 17 10:36:28 2000
@@ -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 } */
+}

-- 
Joseph S. Myers
jsm28@cam.ac.uk


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]