From 89296ee2c39b772aa8528c1c2111974ed367b770 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. llvm-svn: 225613 --- clang/lib/Parse/ParseExprCXX.cpp | 13 ++++++++++--- 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 355503c..68bd45e 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/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/clang/test/Parser/cxx0x-lambda-expressions.cpp b/clang/test/Parser/cxx0x-lambda-expressions.cpp index 4bcc60c..e1be756 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(); + +struct S { + template + void m (T x =[0); // expected-error{{expected variable name or 'this' in lambda capture list}} +} s; -- 2.7.4