@@ -1591,8 +1591,16 @@ NamedDecl *Sema::ActOnTemplateTemplateParameter(
1591
1591
assert (S->isTemplateParamScope () &&
1592
1592
" Template template parameter not in template parameter scope!" );
1593
1593
1594
- // Construct the parameter object.
1595
1594
bool IsParameterPack = EllipsisLoc.isValid ();
1595
+
1596
+ bool Invalid = false ;
1597
+ if (CheckTemplateParameterList (
1598
+ Params,
1599
+ /* OldParams=*/ nullptr ,
1600
+ IsParameterPack ? TPC_TemplateTemplateParameterPack : TPC_Other))
1601
+ Invalid = true ;
1602
+
1603
+ // Construct the parameter object.
1596
1604
TemplateTemplateParmDecl *Param = TemplateTemplateParmDecl::Create (
1597
1605
Context, Context.getTranslationUnitDecl (),
1598
1606
NameLoc.isInvalid () ? TmpLoc : NameLoc, Depth, Position, IsParameterPack,
@@ -1615,9 +1623,12 @@ NamedDecl *Sema::ActOnTemplateTemplateParameter(
1615
1623
if (Params->size () == 0 ) {
1616
1624
Diag (Param->getLocation (), diag::err_template_template_parm_no_parms)
1617
1625
<< SourceRange (Params->getLAngleLoc (), Params->getRAngleLoc ());
1618
- Param-> setInvalidDecl () ;
1626
+ Invalid = true ;
1619
1627
}
1620
1628
1629
+ if (Invalid)
1630
+ Param->setInvalidDecl ();
1631
+
1621
1632
// C++0x [temp.param]p9:
1622
1633
// A default template-argument may be specified for any kind of
1623
1634
// template-parameter that is not a template parameter pack.
@@ -2066,7 +2077,7 @@ DeclResult Sema::CheckClassTemplate(
2066
2077
SemanticContext->isDependentContext ())
2067
2078
? TPC_ClassTemplateMember
2068
2079
: TUK == TagUseKind::Friend ? TPC_FriendClassTemplate
2069
- : TPC_ClassTemplate ,
2080
+ : TPC_Other ,
2070
2081
SkipBody))
2071
2082
Invalid = true ;
2072
2083
@@ -2208,9 +2219,8 @@ static bool DiagnoseDefaultTemplateArgument(Sema &S,
2208
2219
SourceLocation ParamLoc,
2209
2220
SourceRange DefArgRange) {
2210
2221
switch (TPC) {
2211
- case Sema::TPC_ClassTemplate:
2212
- case Sema::TPC_VarTemplate:
2213
- case Sema::TPC_TypeAliasTemplate:
2222
+ case Sema::TPC_Other:
2223
+ case Sema::TPC_TemplateTemplateParameterPack:
2214
2224
return false ;
2215
2225
2216
2226
case Sema::TPC_FunctionTemplate:
@@ -2383,8 +2393,11 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
2383
2393
MissingDefaultArg = true ;
2384
2394
} else if (NonTypeTemplateParmDecl *NewNonTypeParm
2385
2395
= dyn_cast<NonTypeTemplateParmDecl>(*NewParam)) {
2386
- // Check for unexpanded parameter packs.
2387
- if (!NewNonTypeParm->isParameterPack () &&
2396
+ // Check for unexpanded parameter packs, except in a template template
2397
+ // parameter pack, as in those any unexpanded packs should be expanded
2398
+ // along with the parameter itself.
2399
+ if (TPC != TPC_TemplateTemplateParameterPack &&
2400
+ !NewNonTypeParm->isParameterPack () &&
2388
2401
DiagnoseUnexpandedParameterPack (NewNonTypeParm->getLocation (),
2389
2402
NewNonTypeParm->getTypeSourceInfo (),
2390
2403
UPPC_NonTypeTemplateParameterType)) {
@@ -2492,8 +2505,7 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
2492
2505
// If a template parameter of a primary class template or alias template
2493
2506
// is a template parameter pack, it shall be the last template parameter.
2494
2507
if (SawParameterPack && (NewParam + 1 ) != NewParamEnd &&
2495
- (TPC == TPC_ClassTemplate || TPC == TPC_VarTemplate ||
2496
- TPC == TPC_TypeAliasTemplate)) {
2508
+ (TPC == TPC_Other || TPC == TPC_TemplateTemplateParameterPack)) {
2497
2509
Diag ((*NewParam)->getLocation (),
2498
2510
diag::err_template_param_pack_must_be_last_template_parameter);
2499
2511
Invalid = true ;
@@ -2526,8 +2538,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
2526
2538
<< PrevModuleName;
2527
2539
Invalid = true ;
2528
2540
} else if (MissingDefaultArg &&
2529
- (TPC == TPC_ClassTemplate || TPC == TPC_FriendClassTemplate ||
2530
- TPC == TPC_VarTemplate || TPC == TPC_TypeAliasTemplate )) {
2541
+ (TPC == TPC_Other || TPC == TPC_TemplateTemplateParameterPack ||
2542
+ TPC == TPC_FriendClassTemplate )) {
2531
2543
// C++ 23[temp.param]p14:
2532
2544
// If a template-parameter of a class template, variable template, or
2533
2545
// alias template has a default template argument, each subsequent
0 commit comments