re PR c++/32054 (Storage classes on anonymous unions in classes)
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 25 May 2012 23:40:10 +0000 (23:40 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 25 May 2012 23:40:10 +0000 (23:40 +0000)
/cp
2012-05-25  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/32054
* parser.c (cp_parser_member_declaration): A storage class is not
allowed in a declaration of an anonymous aggregate in a class scope.

/testsuite
2012-05-25  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/32054
* g++.dg/other/anon-union3.C: New.

From-SVN: r187902

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/anon-union3.C [new file with mode: 0644]

index daf1a6cfe3e93bffaaf6a46d2541eb2b1991f31c..75c9e2563a5fc6605ae2ce50dde5470add717189 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/32054
+       * parser.c (cp_parser_member_declaration): A storage class is not
+       allowed in a declaration of an anonymous aggregate in a class scope.
+
 2012-05-24  Uros Bizjak  <ubizjak@gmail.com>
 
        PR obj-c++/53441
index 165fdc2c4e6a886c165da2d2bde8658754da6406..9fd8c84d923a556b184b7cc6d595c44490d13338 100644 (file)
@@ -18910,6 +18910,12 @@ cp_parser_member_declaration (cp_parser* parser)
             particular type), as opposed to a nested class.  */
          else if (ANON_AGGR_TYPE_P (type))
            {
+             /* C++11 9.5/6.  */
+             if (decl_specifiers.storage_class != sc_none)
+               error_at (decl_spec_token_start->location,
+                         "a storage class on an anonymous aggregate "
+                         "in class scope is not allowed");
+
              /* Remove constructors and such from TYPE, now that we
                 know it is an anonymous aggregate.  */
              fixup_anonymous_aggr (type);
index 285ae9cce7c7b75cae2dca9499b9240ba690415b..b873c67b4dc219b76253905259bd90036f32fc84 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-25  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/32054
+       * g++.dg/other/anon-union3.C: New.
+
 2012-05-25  Ian Lance Taylor  <iant@google.com>
 
        * gcc.dg/split-6.c: New test.
diff --git a/gcc/testsuite/g++.dg/other/anon-union3.C b/gcc/testsuite/g++.dg/other/anon-union3.C
new file mode 100644 (file)
index 0000000..e65ee94
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/32054
+
+class C
+{
+  auto union      // { dg-error "storage class" "" { target c++98 } }
+    {
+      int a;
+    };            // { dg-error "multiple|specified" "" { target c++11 } }
+  register union  // { dg-error "storage class" }
+    {
+      int b;
+    };
+  static union    // { dg-error "storage class" }
+    {
+      int c;
+    };
+  extern union    // { dg-error "storage class" }
+    {
+      int d;
+    };
+  mutable union   // { dg-error "storage class" }
+    {
+      int e;
+    };
+};