[PATCH] D39419: Fix crash when parsing objective-c++ containing invalid lambda
Jan Korous via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 30 06:59:48 PDT 2017
jkorous-apple created this revision.
https://reviews.llvm.org/D39419
Files:
lib/Parse/ParseExprCXX.cpp
test/Parser/objcxx11-invalid-lambda.cpp
Index: test/Parser/objcxx11-invalid-lambda.cpp
===================================================================
--- /dev/null
+++ test/Parser/objcxx11-invalid-lambda.cpp
@@ -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 '}'}}
\ No newline at end of file
Index: lib/Parse/ParseExprCXX.cpp
===================================================================
--- lib/Parse/ParseExprCXX.cpp
+++ lib/Parse/ParseExprCXX.cpp
@@ -991,27 +991,34 @@
///
/// 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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39419.120813.patch
Type: text/x-patch
Size: 2182 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171030/0292cbc5/attachment.bin>
More information about the cfe-commits
mailing list