Fix PR3172: if we see an eof or } at the top level, reject it.

This is important because ParseDeclarationOrFunctionDefinition
skips to, but does not consume, an } on error.

llvm-svn: 60719
This commit is contained in:
Chris Lattner 2008-12-08 21:59:01 +00:00
parent 3a90716f6a
commit 46415261ee
2 changed files with 14 additions and 0 deletions

View File

@ -295,6 +295,7 @@ void Parser::ParseTranslationUnit() {
}
/// ParseExternalDeclaration:
///
/// external-declaration: [C99 6.9], declaration: [C++ dcl.dcl]
/// function-definition
/// declaration
@ -318,6 +319,13 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() {
ConsumeToken();
// TODO: Invoke action for top-level semicolon.
return 0;
case tok::r_brace:
Diag(Tok, diag::err_expected_external_declaration);
ConsumeBrace();
return 0;
case tok::eof:
Diag(Tok, diag::err_expected_external_declaration);
return 0;
case tok::kw___extension__: {
// __extension__ silences extension warnings in the subexpression.
ExtensionRAIIObject O(Diags); // Use RAII to do this.
@ -352,6 +360,7 @@ Parser::DeclTy *Parser::ParseExternalDeclaration() {
case tok::kw_export: // As in 'export template'
// A function definition cannot start with a these keywords.
return ParseDeclaration(Declarator::FileContext);
default:
// We can't tell whether this is a function-definition or declaration yet.
return ParseDeclarationOrFunctionDefinition();

View File

@ -7,3 +7,8 @@ static char *f (char * (*g) (char **, int), char **p, ...) {
s = g (p, __builtin_va_arg(v, int)); // expected-error {{identifier}} expected-warning {{extension}}
}
// PR3172
} // expected-error {{expected external declaration}}