diff options
author | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-12-06 06:53:02 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2003-12-06 06:53:02 +0000 |
commit | 360d1b991041860bcf2a1e6f342fb3b19553f827 (patch) | |
tree | e49526bc9b495eca8ff3eb69a7a6f0dee11e4992 /gcc | |
parent | 3b099d37f1f358cc9547ed9a466e7a5c1ba0c33a (diff) | |
download | gcc-360d1b991041860bcf2a1e6f342fb3b19553f827.zip gcc-360d1b991041860bcf2a1e6f342fb3b19553f827.tar.gz gcc-360d1b991041860bcf2a1e6f342fb3b19553f827.tar.bz2 |
re PR c++/13305 (Parser error with 'class __attribute__((dllimport)) Foo;' type specifier)
PR c++/13305
* parser.c (cp_parser_elaborated_type_specifier): Accept
attributes.
PR c++/13305
* g++.dg/ext/attrib9.C: New test.
From-SVN: r74361
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/parser.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attrib9.C | 5 |
4 files changed, 31 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 39dd385..adfdb7e 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 97d3283..3f8fe70 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index aba0ad3..f6fd9ff 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..ee6fdb1d --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib9.C @@ -0,0 +1,5 @@ +class __attribute__((unused)) C; +struct __attribute__((unused)) S; +union __attribute__((unused)) U; +enum e {}; +enum __attribute__((unused)) e; |