diff options
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 12 | ||||
-rw-r--r-- | test/Parser/declarators.c | 7 |
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 8cf7a63397..5a5f5092db 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -1750,14 +1750,14 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc, ConsumeToken(); if (!Tok.isObjCAtKeyword(tok::objc_defs)) { Diag(Tok, diag::err_unexpected_at); - SkipUntil(tok::semi, true, true); + SkipUntil(tok::semi, true); continue; } ConsumeToken(); ExpectAndConsume(tok::l_paren, diag::err_expected_lparen); if (!Tok.is(tok::identifier)) { Diag(Tok, diag::err_expected_ident); - SkipUntil(tok::semi, true, true); + SkipUntil(tok::semi, true); continue; } llvm::SmallVector<DeclPtrTy, 16> Fields; @@ -1771,12 +1771,14 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc, if (Tok.is(tok::semi)) { ConsumeToken(); } else if (Tok.is(tok::r_brace)) { - Diag(Tok, diag::ext_expected_semi_decl_list); + ExpectAndConsume(tok::semi, diag::ext_expected_semi_decl_list); break; } else { - Diag(Tok, diag::err_expected_semi_decl_list); - // Skip to end of block or statement + ExpectAndConsume(tok::semi, diag::err_expected_semi_decl_list); + // Skip to end of block or statement to avoid ext-warning on extra ';'. SkipUntil(tok::r_brace, true, true); + // If we stopped at a ';', eat it. + if (Tok.is(tok::semi)) ConsumeToken(); } } diff --git a/test/Parser/declarators.c b/test/Parser/declarators.c index 3831199c8d..074e2ad7cb 100644 --- a/test/Parser/declarators.c +++ b/test/Parser/declarators.c @@ -64,3 +64,10 @@ static f; // expected-warning {{type specifier missing, defaults to 'int'}} static g = 4; // expected-warning {{type specifier missing, defaults to 'int'}} static h // expected-warning {{type specifier missing, defaults to 'int'}} __asm__("foo"); + + +struct test9 { + int x // expected-error {{expected ';' at end of declaration list}} + int y; + int z // expected-warning {{expected ';' at end of declaration list}} +}; |