Author: jkorous Date: Mon Nov 6 09:42:17 2017 New Revision: 317493 URL: http://llvm.org/viewvc/llvm-project?rev=317493&view=rev Log: [Parser] Fix TryParseLambdaIntroducer() error handling
rdar://35066196 Differential Revision: https://reviews.llvm.org/D39419 Added: cfe/trunk/test/Parser/objcxx11-invalid-lambda.cpp Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExprCXX.cpp?rev=317493&r1=317492&r2=317493&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseExprCXX.cpp (original) +++ cfe/trunk/lib/Parse/ParseExprCXX.cpp Mon Nov 6 09:42:17 2017 @@ -991,27 +991,34 @@ Optional<unsigned> Parser::ParseLambdaIn /// /// 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 Added: cfe/trunk/test/Parser/objcxx11-invalid-lambda.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/objcxx11-invalid-lambda.cpp?rev=317493&view=auto ============================================================================== --- cfe/trunk/test/Parser/objcxx11-invalid-lambda.cpp (added) +++ cfe/trunk/test/Parser/objcxx11-invalid-lambda.cpp Mon Nov 6 09:42:17 2017 @@ -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 '}'}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits