Don't assume that a valid expression for the first part of a for-statement
is non-null when diagnosing a broken attempt to write a for-range-statement. llvm-svn: 151081
This commit is contained in:
@@ -1396,8 +1396,7 @@ StmtResult Parser::ParseForStatement(ParsedAttributes &attrs,
|
||||
return StmtError();
|
||||
}
|
||||
Collection = ParseExpression();
|
||||
} else if (getLang().CPlusPlus0x && Tok.is(tok::colon) &&
|
||||
!FirstPart.isInvalid()) {
|
||||
} else if (getLang().CPlusPlus0x && Tok.is(tok::colon) && FirstPart.get()) {
|
||||
// User tried to write the reasonable, but ill-formed, for-range-statement
|
||||
// for (expr : expr) { ... }
|
||||
Diag(Tok, diag::err_for_range_expected_decl)
|
||||
|
||||
@@ -169,3 +169,14 @@ namespace test3 {
|
||||
template<typename T> void f() { for (auto a : A()) {} }
|
||||
void g() { f<int>(); }
|
||||
}
|
||||
|
||||
namespace test4 {
|
||||
void f() {
|
||||
int y;
|
||||
|
||||
// Make sure these don't crash. Better diagnostics would be nice.
|
||||
for (: {1, 2, 3}) {} // expected-error {{expected expression}} expected-error {{expected ';'}}
|
||||
for (x : {1, 2, 3}) {} // expected-error {{undeclared identifier}} expected-error {{expected ';'}}
|
||||
for (y : {1, 2, 3}) {} // expected-error {{must declare a variable}} expected-warning {{result unused}}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user