Skip to content

Commit ec0fc1e

Browse files
committed
[FOLD] treat names prefixed by 'template' as template argument lists when skipping past template arguments
1 parent 58b67ae commit ec0fc1e

File tree

1 file changed

+35
-35
lines changed

1 file changed

+35
-35
lines changed

clang/lib/Parse/ParseTentative.cpp

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2332,9 +2332,6 @@ Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip,
23322332
if (!TryConsumeToken(tok::less))
23332333
return TPResult::False;
23342334

2335-
bool IsNestedTemplateArgumentList = !GreaterThanIsOperator;
2336-
GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
2337-
23382335
auto TrySkipTemplateArgument = [&]() {
23392336
bool NextIsTemplateId = false;
23402337
unsigned TemplateDepth = 0;
@@ -2348,76 +2345,76 @@ Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip,
23482345
case tok::semi:
23492346
return TPResult::False;
23502347

2351-
case tok::comma:
2352-
case tok::greater:
2353-
case tok::greatergreater:
23542348
case tok::greatergreatergreater:
2349+
if (TemplateDepth)
2350+
--TemplateDepth;
2351+
[[fallthrough]];
2352+
case tok::greatergreater:
2353+
if (TemplateDepth)
2354+
--TemplateDepth;
2355+
[[fallthrough]];
2356+
case tok::greater:
2357+
if (TemplateDepth) {
2358+
ConsumeToken();
2359+
--TemplateDepth;
2360+
break;
2361+
}
2362+
[[fallthrough]];
2363+
case tok::comma:
23552364
return TPResult::True;
23562365

23572366
case tok::l_paren:
23582367
ConsumeParen();
23592368
if (!SkipUntil(tok::r_paren, StopAtSemi))
23602369
return TPResult::Error;
23612370
break;
2371+
23622372
case tok::l_brace:
23632373
ConsumeBrace();
23642374
if (!SkipUntil(tok::r_brace, StopAtSemi))
23652375
return TPResult::Error;
23662376
break;
2377+
23672378
case tok::l_square:
23682379
ConsumeBracket();
23692380
if (!SkipUntil(tok::r_square, StopAtSemi))
23702381
return TPResult::Error;
23712382
break;
2383+
23722384
case tok::question:
23732385
ConsumeToken();
23742386
if (!SkipUntil(tok::colon, StopAtSemi))
23752387
return TPResult::Error;
23762388
break;
23772389

2378-
#if 0
2379-
case tok::kw_template:
2380-
ConsumeToken();
2381-
NextIsTemplateId = true;
2382-
continue;
2383-
#endif
2390+
case tok::kw_template:
2391+
ConsumeToken();
2392+
NextIsTemplateId = true;
2393+
continue;
2394+
23842395
case tok::identifier:
23852396
ConsumeToken();
2386-
#if 0
2387-
if (Tok.is(tok::less)) {
2388-
if (!NextIsTemplateId)
2389-
return TPResult::Ambiguous;
2390-
ConsumeToken();
2391-
if (!SkipUntil({tok::greater, tok::greatergreater, tok::greatergreatergreater}, StopAtSemi))
2392-
return TPResult::Error;
2393-
break;
2394-
}
2395-
#else
2396-
if (Tok.is(tok::less))
2397-
return TPResult::Ambiguous;
2397+
if (Tok.is(tok::less)) {
2398+
if (!NextIsTemplateId)
2399+
return TPResult::Ambiguous;
2400+
ConsumeToken();
2401+
++TemplateDepth;
2402+
}
23982403
break;
2399-
#endif
24002404

24012405
case tok::kw_operator:
24022406
if (TPResult TPR = TryParseNonConversionOperatorId();
24032407
TPR == TPResult::Error) {
24042408
return TPResult::Error;
24052409
} else if (TPR == TPResult::True) {
2406-
if (Tok.is(tok::less))
2407-
return TPResult::Ambiguous;
2408-
}
2409-
break;
2410-
2411-
#if 0
24122410
if (Tok.is(tok::less)) {
24132411
if (!NextIsTemplateId)
24142412
return TPResult::Ambiguous;
24152413
ConsumeToken();
2416-
if (!SkipUntil({tok::greater, tok::greatergreater, tok::greatergreatergreater}, StopAtSemi))
2417-
return TPResult::Error;
2414+
++TemplateDepth;
24182415
}
2419-
break;
2420-
#endif
2416+
}
2417+
break;
24212418

24222419
case tok::kw_const_cast:
24232420
case tok::kw_dynamic_cast:
@@ -2458,6 +2455,9 @@ Parser::TPResult Parser::isTemplateArgumentList(unsigned TokensToSkip,
24582455
}
24592456
};
24602457

2458+
bool IsNestedTemplateArgumentList = !GreaterThanIsOperator;
2459+
GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
2460+
24612461
while (true) {
24622462
// An expression cannot be followed by a braced-init-list unless
24632463
// its the right operand of an assignment operator.

0 commit comments

Comments
 (0)