From: David Majnemer Date: Mon, 12 Jan 2015 02:28:16 +0000 (+0000) Subject: Parse: Don't parse beyond the end of the synthetic default argument tok X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b59b29fd325ab3705daabc19b200c00ee6bf59ee;p=clang 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 --- 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;