Skip to content

Commit 4cc02b0

Browse files
committed
[FOLD] treat names prefixed by 'template' as template argument lists when skipping past template arguments
1 parent ad3e526 commit 4cc02b0

File tree

1 file changed

+35
-35
lines changed

1 file changed

+35
-35
lines changed

clang/lib/Parse/ParseTentative.cpp

+35-35
Original file line numberDiff line numberDiff line change
@@ -2328,9 +2328,6 @@ Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip,
23282328
if (!TryConsumeToken(tok::less))
23292329
return TPResult::False;
23302330

2331-
bool IsNestedTemplateArgumentList = !GreaterThanIsOperator;
2332-
GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
2333-
23342331
auto TrySkipTemplateArgument = [&]() {
23352332
bool NextIsTemplateId = false;
23362333
unsigned TemplateDepth = 0;
@@ -2344,76 +2341,76 @@ Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip,
23442341
case tok::semi:
23452342
return TPResult::False;
23462343

2347-
case tok::comma:
2348-
case tok::greater:
2349-
case tok::greatergreater:
23502344
case tok::greatergreatergreater:
2345+
if (TemplateDepth)
2346+
--TemplateDepth;
2347+
[[fallthrough]];
2348+
case tok::greatergreater:
2349+
if (TemplateDepth)
2350+
--TemplateDepth;
2351+
[[fallthrough]];
2352+
case tok::greater:
2353+
if (TemplateDepth) {
2354+
ConsumeToken();
2355+
--TemplateDepth;
2356+
break;
2357+
}
2358+
[[fallthrough]];
2359+
case tok::comma:
23512360
return TPResult::True;
23522361

23532362
case tok::l_paren:
23542363
ConsumeParen();
23552364
if (!SkipUntil(tok::r_paren, StopAtSemi))
23562365
return TPResult::Error;
23572366
break;
2367+
23582368
case tok::l_brace:
23592369
ConsumeBrace();
23602370
if (!SkipUntil(tok::r_brace, StopAtSemi))
23612371
return TPResult::Error;
23622372
break;
2373+
23632374
case tok::l_square:
23642375
ConsumeBracket();
23652376
if (!SkipUntil(tok::r_square, StopAtSemi))
23662377
return TPResult::Error;
23672378
break;
2379+
23682380
case tok::question:
23692381
ConsumeToken();
23702382
if (!SkipUntil(tok::colon, StopAtSemi))
23712383
return TPResult::Error;
23722384
break;
23732385

2374-
#if 0
2375-
case tok::kw_template:
2376-
ConsumeToken();
2377-
NextIsTemplateId = true;
2378-
continue;
2379-
#endif
2386+
case tok::kw_template:
2387+
ConsumeToken();
2388+
NextIsTemplateId = true;
2389+
continue;
2390+
23802391
case tok::identifier:
23812392
ConsumeToken();
2382-
#if 0
2383-
if (Tok.is(tok::less)) {
2384-
if (!NextIsTemplateId)
2385-
return TPResult::Ambiguous;
2386-
ConsumeToken();
2387-
if (!SkipUntil({tok::greater, tok::greatergreater, tok::greatergreatergreater}, StopAtSemi))
2388-
return TPResult::Error;
2389-
break;
2390-
}
2391-
#else
2392-
if (Tok.is(tok::less))
2393-
return TPResult::Ambiguous;
2393+
if (Tok.is(tok::less)) {
2394+
if (!NextIsTemplateId)
2395+
return TPResult::Ambiguous;
2396+
ConsumeToken();
2397+
++TemplateDepth;
2398+
}
23942399
break;
2395-
#endif
23962400

23972401
case tok::kw_operator:
23982402
if (TPResult TPR = TryParseNonConversionOperatorId();
23992403
TPR == TPResult::Error) {
24002404
return TPResult::Error;
24012405
} else if (TPR == TPResult::True) {
2402-
if (Tok.is(tok::less))
2403-
return TPResult::Ambiguous;
2404-
}
2405-
break;
2406-
2407-
#if 0
24082406
if (Tok.is(tok::less)) {
24092407
if (!NextIsTemplateId)
24102408
return TPResult::Ambiguous;
24112409
ConsumeToken();
2412-
if (!SkipUntil({tok::greater, tok::greatergreater, tok::greatergreatergreater}, StopAtSemi))
2413-
return TPResult::Error;
2410+
++TemplateDepth;
24142411
}
2415-
break;
2416-
#endif
2412+
}
2413+
break;
24172414

24182415
case tok::kw_const_cast:
24192416
case tok::kw_dynamic_cast:
@@ -2454,6 +2451,9 @@ Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip,
24542451
}
24552452
};
24562453

2454+
bool IsNestedTemplateArgumentList = !GreaterThanIsOperator;
2455+
GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
2456+
24572457
while (true) {
24582458
// An expression cannot be followed by a braced-init-list unless
24592459
// its the right operand of an assignment operator.

0 commit comments

Comments
 (0)