From a5fbb968a2fec68a72a81a67e02ee6742b5e8687 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 12 Jan 2015 03:36:37 +0000 Subject: [PATCH] Parse: It's cleaner to handle cxx_defaultarg_end in SkipUntil directly git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@225616 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Parse/ParseCXXInlineMethods.cpp | 1 + lib/Parse/ParseExprCXX.cpp | 13 +++---------- lib/Parse/Parser.cpp | 6 +++++- test/Parser/cxx-member-initializers.cpp | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/lib/Parse/ParseCXXInlineMethods.cpp b/lib/Parse/ParseCXXInlineMethods.cpp index 7c9cceb12b..ccd051721f 100644 --- a/lib/Parse/ParseCXXInlineMethods.cpp +++ b/lib/Parse/ParseCXXInlineMethods.cpp @@ -652,6 +652,7 @@ bool Parser::ConsumeAndStoreUntil(tok::TokenKind T1, tok::TokenKind T2, switch (Tok.getKind()) { case tok::eof: + case tok::cxx_defaultarg_end: case tok::annot_module_begin: case tok::annot_module_end: case tok::annot_module_include: diff --git a/lib/Parse/ParseExprCXX.cpp b/lib/Parse/ParseExprCXX.cpp index 68bd45e38d..355503caa9 100644 --- a/lib/Parse/ParseExprCXX.cpp +++ b/lib/Parse/ParseExprCXX.cpp @@ -716,16 +716,9 @@ ExprResult Parser::ParseLambdaExpression() { Optional DiagID = ParseLambdaIntroducer(Intro); if (DiagID) { Diag(Tok, DiagID.getValue()); - 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); + SkipUntil(tok::r_square, StopAtSemi); + SkipUntil(tok::l_brace, StopAtSemi); + SkipUntil(tok::r_brace, StopAtSemi); return ExprError(); } diff --git a/lib/Parse/Parser.cpp b/lib/Parse/Parser.cpp index c9243d6488..06a70f7fd3 100644 --- a/lib/Parse/Parser.cpp +++ b/lib/Parse/Parser.cpp @@ -262,6 +262,10 @@ bool Parser::SkipUntil(ArrayRef Toks, SkipUntilFlags Flags) { // Ran out of tokens. return false; + case tok::cxx_defaultarg_end: + // It's never desirable to consume the 'end-of-default-argument' token. + return false; + case tok::annot_pragma_openmp_end: // Stop before an OpenMP pragma boundary. case tok::annot_module_begin: @@ -1948,7 +1952,7 @@ bool BalancedDelimiterTracker::diagnoseMissingClose() { // token. if (P.Tok.isNot(tok::r_paren) && P.Tok.isNot(tok::r_brace) && P.Tok.isNot(tok::r_square) && - P.SkipUntil(Close, FinalToken, tok::cxx_defaultarg_end, + P.SkipUntil(Close, FinalToken, Parser::StopAtSemi | Parser::StopBeforeMatch) && P.Tok.is(Close)) LClose = P.ConsumeAnyToken(); diff --git a/test/Parser/cxx-member-initializers.cpp b/test/Parser/cxx-member-initializers.cpp index 461810c62f..ee509b115e 100644 --- a/test/Parser/cxx-member-initializers.cpp +++ b/test/Parser/cxx-member-initializers.cpp @@ -103,5 +103,5 @@ class G { void l(int x = C::C1>().f()) {} // This isn't, but it shouldn't crash. The diagnostics don't matter much. - void m(int x = C().f()) {} // expected-error {{declaration of anonymous union must be a definition}} -}; // expected-error {{expected a type}} + void m(int x = C().f()) {} // expected-error {{declaration of anonymous union must be a definition}} expected-error {{expected a type}} +}; -- 2.50.1