Patchwork [C++] PR 32054

login
register
mail settings
Submitter Paolo Carlini
Date May 25, 2012, 10:37 p.m.
Message ID <4FC009B1.8060005@oracle.com>
Download mbox | patch
Permalink /patch/161434/
State New
Headers show

Comments

Paolo Carlini - May 25, 2012, 10:37 p.m.
Hi,

On 05/25/2012 06:25 PM, Jason Merrill wrote:
> On 05/24/2012 10:57 PM, Paolo Carlini wrote:
>> +        error_at (decl_spec_token_start->location,
>> +              "a storage class is not allowed");
>
> Let's give more explanation here so that the user knows that the 
> problem is a storage class on an anonymous union/struct in class scope.
Good, then I propose the below, using the form "anonymous aggregate", 
because - I didn't know - we are already using it in error messages 
elsewhere, in decl.c too.

Thanks,
Paolo.

////////////////////
Jason Merrill - May 25, 2012, 11:18 p.m.
OK.

Jason

Patch

Index: testsuite/g++.dg/other/anon-union3.C
===================================================================
--- testsuite/g++.dg/other/anon-union3.C	(revision 0)
+++ testsuite/g++.dg/other/anon-union3.C	(revision 0)
@@ -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;
+    };
+};
Index: cp/parser.c
===================================================================
--- cp/parser.c	(revision 187868)
+++ cp/parser.c	(working copy)
@@ -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);