c-decl.c (grokfield): Don't allow typedefs for structures or unions with no tag by...
authorJoseph Myers <joseph@codesourcery.com>
Fri, 18 Mar 2011 21:16:31 +0000 (21:16 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Fri, 18 Mar 2011 21:16:31 +0000 (21:16 +0000)
* c-decl.c (grokfield): Don't allow typedefs for structures or
unions with no tag by default.
* doc/extend.texi (Unnamed Fields): Update.

testsuite:
* 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.

From-SVN: r171170

gcc/ChangeLog
gcc/c-decl.c
gcc/doc/extend.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/anon-struct-11.c
gcc/testsuite/gcc.dg/c1x-anon-struct-1.c
gcc/testsuite/gcc.dg/c1x-anon-struct-3.c [new file with mode: 0644]

index 762dbb4a45c1c0717b3124b851d5f44688cfe007..b6680a99ab55d314bc5abee744748d14a505202e 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2011-03-18  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.md (float<SSEMODEI24:mode><X87MODEF:mode>2):
index b438b066c831c5247087f233a709137641c636c2..8f9c44400482f72e8fac60f1989dece2b3a7363e 100644 (file)
@@ -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;
index eaad0892d9c9b9ecf30b48fedf781dd3b6bce913..c8971012b4e79d603ba934d7dd97fdb65198f5f2 100644 (file)
@@ -13352,12 +13352,11 @@ The compiler gives errors for such constructs.
 @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 5c39684eaec81b22cd3797599142b8973d5a423d..3cda22b33a251e35733778b60cd4708647b49755 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2011-03-18  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * gcc.dg/vect/slp-multitypes-2.c: Replace dg-do run with
index 1084e5bded67db349b025b061ab4079d143dc7cc..c2f85fc24e43bcc5e32781a252045b3a222d3684 100644 (file)
@@ -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 711fe65df3db7b545c92a1855a159d7d901d165d..6d4b433d733b22351cc5eaf797fd07d3ed23a714 100644 (file)
@@ -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
diff --git a/gcc/testsuite/gcc.dg/c1x-anon-struct-3.c b/gcc/testsuite/gcc.dg/c1x-anon-struct-3.c
new file mode 100644 (file)
index 0000000..1841edd
--- /dev/null
@@ -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;
+  };
+};