PR c++/13305
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 6 Dec 2003 06:53:02 +0000 (06:53 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 6 Dec 2003 06:53:02 +0000 (06:53 +0000)
* parser.c (cp_parser_elaborated_type_specifier): Accept
attributes.

PR c++/13305
* g++.dg/ext/attrib9.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74361 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/attrib9.C [new file with mode: 0644]

index 39dd385..adfdb7e 100644 (file)
@@ -1,3 +1,10 @@
+2003-12-05  Danny Smith <dannysmith@gcc.gnu.org>
+           Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/13305
+       * parser.c (cp_parser_elaborated_type_specifier): Accept
+       attributes.
+       
 2003-12-05  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/13314
index 97d3283..3f8fe70 100644 (file)
@@ -8647,6 +8647,14 @@ cp_parser_type_name (cp_parser* parser)
      typename :: [opt] nested-name-specifier template [opt] 
        template-id 
 
+   GNU extension:
+
+   elaborated-type-specifier:
+     class-key attributes :: [opt] nested-name-specifier [opt] identifier
+     class-key attributes :: [opt] nested-name-specifier [opt] 
+               template [opt] template-id
+     enum attributes :: [opt] nested-name-specifier [opt] identifier
+
    If IS_FRIEND is TRUE, then this elaborated-type-specifier is being
    declared `friend'.  If IS_DECLARATION is TRUE, then this
    elaborated-type-specifier appears in a decl-specifiers-seq, i.e.,
@@ -8662,6 +8670,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
   enum tag_types tag_type;
   tree identifier;
   tree type = NULL_TREE;
+  tree attributes = NULL_TREE;
 
   /* See if we're looking at the `enum' keyword.  */
   if (cp_lexer_next_token_is_keyword (parser->lexer, RID_ENUM))
@@ -8670,6 +8679,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
       cp_lexer_consume_token (parser->lexer);
       /* Remember that it's an enumeration type.  */
       tag_type = enum_type;
+      /* Parse the attributes.  */
+      attributes = cp_parser_attributes_opt (parser);
     }
   /* Or, it might be `typename'.  */
   else if (cp_lexer_next_token_is_keyword (parser->lexer,
@@ -8689,6 +8700,8 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
       tag_type = cp_parser_class_key (parser);
       if (tag_type == none_type)
        return error_mark_node;
+      /* Parse the attributes.  */
+      attributes = cp_parser_attributes_opt (parser);
     }
 
   /* Look for the `::' operator.  */
@@ -8858,7 +8871,7 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
             declaration context.  */
 
          type = xref_tag (tag_type, identifier, 
-                          /*attributes=*/NULL_TREE,
+                          attributes,
                           (is_friend 
                            || !is_declaration
                            || cp_lexer_next_token_is_not (parser->lexer, 
index aba0ad3..f6fd9ff 100644 (file)
@@ -1,5 +1,10 @@
 2003-12-05  Mark Mitchell  <mark@codesourcery.com>
 
+       PR c++/13305
+       * g++.dg/ext/attrib9.C: New test.
+
+2003-12-05  Mark Mitchell  <mark@codesourcery.com>
+
        PR c++/13314
        * g++.dg/template/error7.C: New test.
 
diff --git a/gcc/testsuite/g++.dg/ext/attrib9.C b/gcc/testsuite/g++.dg/ext/attrib9.C
new file mode 100644 (file)
index 0000000..ee6fdb1
--- /dev/null
@@ -0,0 +1,5 @@
+class __attribute__((unused)) C;
+struct __attribute__((unused)) S;
+union __attribute__((unused)) U;
+enum e {};
+enum __attribute__((unused)) e;