r225613 - Parse: Don't parse beyond the end of the synthetic default argument tok

David Majnemer david.majnemer at gmail.com
Sun Jan 11 18:28:16 PST 2015


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;





More information about the cfe-commits mailing list