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
This commit is contained in:
Mark Mitchell 2003-12-06 06:53:02 +00:00
parent 3b099d37f1
commit 360d1b9910
4 changed files with 31 additions and 1 deletions

View 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

View 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,

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,5 @@
class __attribute__((unused)) C;
struct __attribute__((unused)) S;
union __attribute__((unused)) U;
enum e {};
enum __attribute__((unused)) e;