the declspec of a declaration can have storage-class specifiers,

type qualifiers and type specifiers in any order.   For example,
this is valid: struct x {...} typedef y;

This fixes PR6208.

llvm-svn: 95094
This commit is contained in:
Chris Lattner 2010-02-02 17:32:27 +00:00
parent ffa70e8b27
commit afe6a840d4
3 changed files with 25 additions and 7 deletions

View File

@ -935,13 +935,24 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
if (TUK == Action::TUK_Definition) {
switch (Tok.getKind()) {
case tok::semi: // struct foo {...} ;
case tok::star: // struct foo {...} * P;
case tok::amp: // struct foo {...} & R = ...
case tok::identifier: // struct foo {...} V ;
case tok::r_paren: //(struct foo {...} ) {4}
case tok::annot_cxxscope: // struct foo {...} a:: b;
case tok::annot_typename: // struct foo {...} a ::b;
case tok::annot_template_id: // struct foo {...} a<int> ::b;
case tok::star: // struct foo {...} * P;
case tok::amp: // struct foo {...} & R = ...
case tok::identifier: // struct foo {...} V ;
case tok::r_paren: //(struct foo {...} ) {4}
case tok::annot_cxxscope: // struct foo {...} a:: b;
case tok::annot_typename: // struct foo {...} a ::b;
case tok::annot_template_id: // struct foo {...} a<int> ::b;
// Storage-class specifiers
case tok::kw_static: // struct foo {...} static x;
case tok::kw_extern: // struct foo {...} extern x;
case tok::kw_typedef: // struct foo {...} typedef x;
case tok::kw_register: // struct foo {...} register x;
case tok::kw_auto: // struct foo {...} auto x;
// Type qualifiers
case tok::kw_const: // struct foo {...} const x;
case tok::kw_volatile: // struct foo {...} volatile x;
case tok::kw_restrict: // struct foo {...} restrict x;
case tok::kw_inline: // struct foo {...} inline foo() {};
break;
case tok::r_brace: // struct bar { struct foo {...} }

View File

@ -71,3 +71,7 @@ struct test9 {
int y;
int z // expected-warning {{expected ';' at end of declaration list}}
};
// PR6208
struct test10 { int a; } static test10x;
struct test11 { int a; } const test11x;

View File

@ -8,8 +8,11 @@ void foof(const char *, ...) __attribute__((__format__(__printf__, 1, 2))), barf
int typedef validTypeDecl() { } // expected-error {{function definition declared 'typedef'}}
struct _zend_module_entry { } // expected-error {{expected ';' after struct}}
int gv1;
typedef struct _zend_function_entry { } // expected-error {{expected ';' after struct}} \
// expected-error {{declaration does not declare anything}}
int gv2;
static void buggy(int *x) { }
// Type qualifiers.