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 | |
| 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
| -rw-r--r-- | clang/lib/Parse/ParseExprCXX.cpp | 13 | ||||
| -rw-r--r-- | clang/test/Parser/cxx0x-lambda-expressions.cpp | 5 |
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; |

