2010-12-17 Nathan Froyd PR c++/46890 * parser.c (cp_parser_class_specifier): Add RID_TYPEDEF to lookahead logic and fix setting of want_semicolon. * g++.dg/pr46890.C: New test. * g++.dg/parse/semicolon.C: Add new cases. --- gcc/cp/parser.c +++ gcc/cp/parser.c @@ -16959,17 +16959,16 @@ cp_parser_class_specifier (cp_parser* parser) static const var = ...; */ case CPP_KEYWORD: if (keyword_is_storage_class_specifier (token->keyword) - || keyword_is_type_qualifier (token->keyword)) + || keyword_is_type_qualifier (token->keyword) + || token->keyword == RID_TYPEDEF) { cp_token *lookahead = cp_lexer_peek_nth_token (parser->lexer, 2); - if (lookahead->type == CPP_KEYWORD - && !keyword_begins_type_specifier (lookahead->keyword)) - want_semicolon = false; - else if (lookahead->type == CPP_NAME) - /* Handling user-defined types here would be nice, but - very tricky. */ - want_semicolon = false; + /* Handling user-defined types here would be nice, but very + tricky. */ + want_semicolon + = (lookahead->type == CPP_KEYWORD + && keyword_begins_type_specifier (lookahead->keyword)); } break; default: --- gcc/testsuite/g++.dg/parse/semicolon3.C +++ gcc/testsuite/g++.dg/parse/semicolon3.C @@ -62,6 +62,48 @@ autotest (void) return ok10.a; } +struct OK11 +{ + int a; +} // no complaints + const *ok11_var; + +struct OK12 +{ + int a; +} // no complaints + const &ok12_var = *(new OK12()); + +struct OK13 +{ + int a; +} // no complaints + static *ok13_var; + +class OK14 +{ + struct OK14sub + { + int a; + } // no complaints + static &ok14_var; +}; + +class OK15 +{ + int a; +} typedef tOK15; + +class OK16 +{ + int a; +} typedef *pOK16; + +class OK17 +{ + int a; +} typedef &rOK16; + struct E1 { int a; @@ -196,6 +238,13 @@ class E17 mutable int i; } // { dg-error "after class definition" } +class E18 +{ + int a; +} // { dg-error "after class definition" } + +typedef int E18int; + /* This was the original test from the PR. */ class C0 --- gcc/testsuite/g++.dg/pr46890.C +++ gcc/testsuite/g++.dg/pr46890.C @@ -0,0 +1,6 @@ +// PR c++/46890 +// { dg-do compile } + +struct MdatResource { +const char *mdatAlloc; +} const *_resource;