summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseExprCXX.cpp
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 /clang/lib/Parse/ParseExprCXX.cpp
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
Diffstat (limited to 'clang/lib/Parse/ParseExprCXX.cpp')
-rw-r--r--clang/lib/Parse/ParseExprCXX.cpp13
1 files changed, 10 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();
}
OpenPOWER on IntegriCloud