Author: majnemer
Date: Sun Jan 11 20:28:16 2015
New Revision: 225613

URL: http://llvm.org/viewvc/llvm-project?rev=225613&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/Parse/ParseExprCXX.cpp
    cfe/trunk/test/Parser/cxx0x-lambda-expressions.cpp

Modified: cfe/trunk/lib/Parse/ParseExprCXX.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExprCXX.cpp?rev=225613&r1=225612&r2=225613&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseExprCXX.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExprCXX.cpp Sun Jan 11 20:28:16 2015
@@ -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();
   }
 

Modified: cfe/trunk/test/Parser/cxx0x-lambda-expressions.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx0x-lambda-expressions.cpp?rev=225613&r1=225612&r2=225613&view=diff
==============================================================================
--- cfe/trunk/test/Parser/cxx0x-lambda-expressions.cpp (original)
+++ cfe/trunk/test/Parser/cxx0x-lambda-expressions.cpp Sun Jan 11 20:28:16 2015
@@ -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;


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to