forked from OSchip/llvm-project
Disambiguate between a declaration or an expression, in the 'for-init-statement' part of a 'for' statement.
llvm-svn: 57112
This commit is contained in:
parent
2534620b4e
commit
bc28fefcde
|
@ -590,6 +590,16 @@ private:
|
|||
return isDeclarationSpecifier();
|
||||
}
|
||||
|
||||
/// isSimpleDeclaration - Disambiguates between a declaration or an
|
||||
/// expression, mainly used for the C 'clause-1' or the C++
|
||||
// 'for-init-statement' part of a 'for' statement.
|
||||
/// Returns true for declaration, false for expression.
|
||||
bool isSimpleDeclaration() {
|
||||
if (getLang().CPlusPlus)
|
||||
return isCXXSimpleDeclaration();
|
||||
return isDeclarationSpecifier();
|
||||
}
|
||||
|
||||
/// isCXXDeclarationStatement - C++-specialized function that disambiguates
|
||||
/// between a declaration or an expression statement, when parsing function
|
||||
/// bodies. Returns true for declaration, false for expression.
|
||||
|
|
|
@ -813,7 +813,7 @@ Parser::StmtResult Parser::ParseForStatement() {
|
|||
if (Tok.is(tok::semi)) { // for (;
|
||||
// no first part, eat the ';'.
|
||||
ConsumeToken();
|
||||
} else if (isDeclarationSpecifier()) { // for (int X = 4;
|
||||
} else if (isSimpleDeclaration()) { // for (int X = 4;
|
||||
// Parse declaration, which eats the ';'.
|
||||
if (!C99orCXX) // Use of C99-style for loops in C90 mode?
|
||||
Diag(Tok, diag::ext_c99_variable_decl_in_for_loop);
|
||||
|
|
|
@ -12,6 +12,7 @@ void f() {
|
|||
typeof(int)(a,5)<<a; // expected-error {{function-style cast to a builtin type can only take one argument}}
|
||||
void(a), ++a; // expected-warning {{statement was disambiguated as expression}} expected-warning {{expression result unused}}
|
||||
if (int(a)+1) {}
|
||||
for (int(a)+1;;) {}
|
||||
|
||||
// Declarations.
|
||||
T(*d)(int(p)); // expected-warning {{statement was disambiguated as declaration}} expected-error {{previous definition is here}}
|
||||
|
|
Loading…
Reference in New Issue