From b59b29fd325ab3705daabc19b200c00ee6bf59ee Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 12 Jan 2015 02:28:16 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225613 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseExprCXX.cpp | 13 ++++++++++--- test/Parser/cxx0x-lambda-expressions.cpp | 5 +++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index 355503caa9..68bd45e38d 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -716,9 +716,16 @@ ExprResult Parser::ParseLambdaExpression() { Optional 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/test/Parser/cxx0x-lambda-expressions.cpp b/test/Parser/cxx0x-lambda-expressions.cpp index 4bcc60c73c..e1be75686a 100644 --- a/test/Parser/cxx0x-lambda-expressions.cpp +++ b/test/Parser/cxx0x-lambda-expressions.cpp @@ -98,3 +98,8 @@ void PR22122() { } template void PR22122(); + +struct S { + template + void m (T x =[0); // expected-error{{expected variable name or 'this' in lambda capture list}} +} s; -- 2.50.1