@@ -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