summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-01-12 02:28:16 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-01-12 02:28:16 +0000
commit89296ee2c39b772aa8528c1c2111974ed367b770 (patch)
tree0919d4444c80a7d1c5501ec091ab9f42dc1824c6
parentb5869f6c7ca256b554c1d91f8e3ce2144f33a328 (diff)
downloadbcm5719-llvm-89296ee2c39b772aa8528c1c2111974ed367b770.tar.gz
bcm5719-llvm-89296ee2c39b772aa8528c1c2111974ed367b770.zip
Parse: Don't parse beyond the end of the synthetic default argument tok
Recovery from malformed lambda introducers would find us consuming the synthetic default argument token, which is bad. Instead, stop right before that token. llvm-svn: 225613
-rw-r--r--clang/lib/Parse/ParseExprCXX.cpp13
-rw-r--r--clang/test/Parser/cxx0x-lambda-expressions.cpp5
2 files changed, 15 insertions, 3 deletions
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp
index 355503caa9b..68bd45e38d1 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -716,9 +716,16 @@ ExprResult Parser::ParseLambdaExpression() {
Optional<unsigned> DiagID = ParseLambdaIntroducer(Intro);
if (DiagID) {
Diag(Tok, DiagID.getValue());
- SkipUntil(tok::r_square, StopAtSemi);
- SkipUntil(tok::l_brace, StopAtSemi);
- SkipUntil(tok::r_brace, StopAtSemi);
+ auto SkipUntilLambdaToken = [&](tok::TokenKind LambdaToken) {
+ // Don't skip past the end of the default argument.
+ SkipUntil(LambdaToken, tok::cxx_defaultarg_end,
+ StopAtSemi | StopBeforeMatch);
+ if (Tok.is(LambdaToken))
+ ConsumeAnyToken();
+ };
+ SkipUntilLambdaToken(tok::r_square);
+ SkipUntilLambdaToken(tok::l_brace);
+ SkipUntilLambdaToken(tok::r_brace);
return ExprError();
}
diff --git a/clang/test/Parser/cxx0x-lambda-expressions.cpp b/clang/test/Parser/cxx0x-lambda-expressions.cpp
index 4bcc60c73c1..e1be75686ad 100644
--- a/clang/test/Parser/cxx0x-lambda-expressions.cpp
+++ b/clang/test/Parser/cxx0x-lambda-expressions.cpp
@@ -98,3 +98,8 @@ void PR22122() {
}
template void PR22122<int>();
+
+struct S {
+ template <typename T>
+ void m (T x =[0); // expected-error{{expected variable name or 'this' in lambda capture list}}
+} s;
OpenPOWER on IntegriCloud