forked from OSchip/llvm-project
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:
parent
3a90716f6a
commit
46415261ee
|
@ -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();
|
||||
|
|
|
@ -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}}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue