summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Parse/ParseExprCXX.cpp13
-rw-r--r--clang/test/Parser/cxx0x-lambda-expressions.cpp5
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;
OpenPOWER on IntegriCloud