mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 00:36:06 +00:00
Parse: It's cleaner to handle cxx_defaultarg_end in SkipUntil directly
llvm-svn: 225616
This commit is contained in:
parent
a3aef35d54
commit
234b8188df
@ -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:
|
||||
|
@ -716,16 +716,9 @@ ExprResult Parser::ParseLambdaExpression() {
|
||||
Optional<unsigned> 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();
|
||||
}
|
||||
|
||||
|
@ -262,6 +262,10 @@ bool Parser::SkipUntil(ArrayRef<tok::TokenKind> 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();
|
||||
|
@ -103,5 +103,5 @@ class G {
|
||||
void l(int x = C<int, C<int, int>::C1>().f()) {}
|
||||
|
||||
// This isn't, but it shouldn't crash. The diagnostics don't matter much.
|
||||
void m(int x = C<int, union int>().f()) {} // expected-error {{declaration of anonymous union must be a definition}}
|
||||
}; // expected-error {{expected a type}}
|
||||
void m(int x = C<int, union int>().f()) {} // expected-error {{declaration of anonymous union must be a definition}} expected-error {{expected a type}}
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user