[Parser] Fix TryParseLambdaIntroducer() error handling

rdar://35066196

Differential Revision: https://reviews.llvm.org/D39419

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@317493 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Jan Korous 2017-11-06 17:42:17 +00:00
parent 157a622d78
commit 0b7495e180
2 changed files with 31 additions and 14 deletions

View File

@ -991,27 +991,34 @@ Optional<unsigned> Parser::ParseLambdaIntroducer(LambdaIntroducer &Intro,
///
/// Returns true if it hit something unexpected.
bool Parser::TryParseLambdaIntroducer(LambdaIntroducer &Intro) {
TentativeParsingAction PA(*this);
{
bool SkippedInits = false;
TentativeParsingAction PA1(*this);
bool SkippedInits = false;
Optional<unsigned> DiagID(ParseLambdaIntroducer(Intro, &SkippedInits));
if (ParseLambdaIntroducer(Intro, &SkippedInits)) {
PA1.Revert();
return true;
}
if (DiagID) {
PA.Revert();
return true;
if (!SkippedInits) {
PA1.Commit();
return false;
}
PA1.Revert();
}
if (SkippedInits) {
// Parse it again, but this time parse the init-captures too.
PA.Revert();
Intro = LambdaIntroducer();
DiagID = ParseLambdaIntroducer(Intro);
assert(!DiagID && "parsing lambda-introducer failed on reparse");
// Try to parse it again, but this time parse the init-captures too.
Intro = LambdaIntroducer();
TentativeParsingAction PA2(*this);
if (!ParseLambdaIntroducer(Intro)) {
PA2.Commit();
return false;
}
PA.Commit();
return false;
PA2.Revert();
return true;
}
static void

View File

@ -0,0 +1,10 @@
// RUN: %clang_cc1 -fsyntax-only -verify -x objective-c++ -std=c++11 %s
void foo() { // expected-note {{to match this '{'}}
int bar;
auto baz = [
bar( // expected-note {{to match this '('}} expected-note {{to match this '('}}
foo_undeclared() // expected-error{{use of undeclared identifier 'foo_undeclared'}} expected-error{{use of undeclared identifier 'foo_undeclared'}}
/* ) */
] () { }; // expected-error{{expected ')'}}
} // expected-error{{expected ')'}} expected-error{{expected ';' at end of declaration}} expected-error{{expected '}'}}