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]
Other format: [Raw text]

Make C1X anonymous structs/unions follow N1549


This week's London WG14 meeting agreed to disallow the use of typedefs
in declaring anonymous structure and union fields, as per N1549.  This
patch implements this, restricting the use of typedefs in this case to
-fms-extensions and -fplan9-extensions as in 4.5 and earlier releases.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.  Applied
to mainline.  Any comments from other RMs about whether this should go
in 4.6 as well, to avoid 4.6.0 being more lenient in this area than
both 4.5 and 4.7?  (The issue is about what is accepted by default
rather than -std=c1x, since -std=c1x users in 4.6 should know it's
experimental and subject to change.)

2011-03-18  Joseph Myers  <joseph@codesourcery.com>

	* c-decl.c (grokfield): Don't allow typedefs for structures or
	unions with no tag by default.
	* doc/extend.texi (Unnamed Fields): Update.

testsuite:
2011-03-18  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/c1x-anon-struct-1.c: Don't test use of typedefs.
	* gcc.dg/c1x-anon-struct-3.c: New test.
	* gcc.dg/anon-struct-11.c: Update.

Index: doc/extend.texi
===================================================================
--- doc/extend.texi	(revision 171110)
+++ doc/extend.texi	(working copy)
@@ -13352,12 +13352,11 @@ The compiler gives errors for such const
 @opindex fms-extensions
 Unless @option{-fms-extensions} is used, the unnamed field must be a
 structure or union definition without a tag (for example, @samp{struct
-@{ int a; @};}), or a @code{typedef} name for such a structure or
-union.  If @option{-fms-extensions} is used, the field may
+@{ int a; @};}).  If @option{-fms-extensions} is used, the field may
 also be a definition with a tag such as @samp{struct foo @{ int a;
 @};}, a reference to a previously defined structure or union such as
 @samp{struct foo;}, or a reference to a @code{typedef} name for a
-previously defined structure or union type with a tag.
+previously defined structure or union type.
 
 @opindex fplan9-extensions
 The option @option{-fplan9-extensions} enables
Index: testsuite/gcc.dg/c1x-anon-struct-3.c
===================================================================
--- testsuite/gcc.dg/c1x-anon-struct-3.c	(revision 0)
+++ testsuite/gcc.dg/c1x-anon-struct-3.c	(revision 0)
@@ -0,0 +1,34 @@
+/* Test for anonymous structures and unions in C1X.  Test for invalid
+   cases: typedefs disallowed by N1549.  */
+/* { dg-do compile } */
+/* { dg-options "-std=c1x -pedantic-errors" } */
+
+typedef struct
+{
+  int i;
+} s0;
+
+typedef union
+{
+  int i;
+} u0;
+
+struct s1
+{
+  int a;
+  u0; /* { dg-error "declaration does not declare anything" } */
+  struct
+  {
+    int b;
+  };
+};
+
+union u1
+{
+  int b;
+  s0; /* { dg-error "declaration does not declare anything" } */
+  union
+  {
+    int c;
+  };
+};
Index: testsuite/gcc.dg/anon-struct-11.c
===================================================================
--- testsuite/gcc.dg/anon-struct-11.c	(revision 171110)
+++ testsuite/gcc.dg/anon-struct-11.c	(working copy)
@@ -50,7 +50,7 @@ struct E {
   struct F { char f; };	/* { dg-warning "does not declare anything" } */
   char c;
   union {
-    D;
+    D;			/* { dg-warning "does not declare anything" } */
   };
   char e;
 };
@@ -85,7 +85,7 @@ test2 (void)
   e.e = 5;
   f2 (&e);		/* { dg-warning "incompatible pointer type" } */
   f3 (&e);		/* { dg-warning "incompatible pointer type" } */
-  if (e.d != 4)
+  if (e.d != 4)		/* { dg-error "no member" } */
     abort ();
   if (e.f != 6)		/* { dg-error "no member" } */
     abort ();
Index: testsuite/gcc.dg/c1x-anon-struct-1.c
===================================================================
--- testsuite/gcc.dg/c1x-anon-struct-1.c	(revision 171110)
+++ testsuite/gcc.dg/c1x-anon-struct-1.c	(working copy)
@@ -4,20 +4,13 @@
 
 #include <stddef.h>
 
-typedef struct
-{
-  int i;
-} s0;
-
-typedef union
-{
-  int i;
-} u0;
-
 struct s1
 {
   int a;
-  u0;
+  union
+  {
+    int i;
+  };
   struct
   {
     int b;
@@ -27,7 +20,10 @@ struct s1
 union u1
 {
   int b;
-  s0;
+  struct
+  {
+    int i;
+  };
   union
   {
     int c;
@@ -44,7 +40,10 @@ struct s2
 
 struct s3
 {
-  u0;
+  union
+  {
+    int i;
+  };
 };
 
 struct s4
Index: c-decl.c
===================================================================
--- c-decl.c	(revision 171110)
+++ c-decl.c	(working copy)
@@ -6674,11 +6674,14 @@ grokfield (location_t loc,
 		      || TREE_CODE (type) == UNION_TYPE);
       bool ok = false;
 
-      if (type_ok)
+      if (type_ok
+	  && (flag_ms_extensions
+	      || flag_plan9_extensions
+	      || !declspecs->typedef_p))
 	{
 	  if (flag_ms_extensions || flag_plan9_extensions)
 	    ok = true;
-	  else if (TYPE_NAME (TYPE_MAIN_VARIANT (type)) == NULL)
+	  else if (TYPE_NAME (type) == NULL)
 	    ok = true;
 	  else
 	    ok = false;

-- 
Joseph S. Myers
joseph@codesourcery.com


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