diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-01-12 02:28:16 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-01-12 02:28:16 +0000 |
commit | 89296ee2c39b772aa8528c1c2111974ed367b770 (patch) | |
tree | 0919d4444c80a7d1c5501ec091ab9f42dc1824c6 /clang/lib/Parse/ParseExprCXX.cpp | |
parent | b5869f6c7ca256b554c1d91f8e3ce2144f33a328 (diff) | |
download | bcm5719-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.cpp | 13 |
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(); } |