diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index daf1a6cfe3e9..75c9e2563a5f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-05-25 Paolo Carlini + + 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 PR obj-c++/53441 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 165fdc2c4e6a..9fd8c84d923a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 285ae9cce7c7..b873c67b4dc2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-25 Paolo Carlini + + PR c++/32054 + * g++.dg/other/anon-union3.C: New. + 2012-05-25 Ian Lance Taylor * 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 index 000000000000..e65ee948a3b8 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/anon-union3.C @@ -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; + }; +};