@@ -1593,8 +1593,16 @@ NamedDecl *Sema::ActOnTemplateTemplateParameter(
15931593 assert (S->isTemplateParamScope () &&
15941594 " Template template parameter not in template parameter scope!" );
15951595
1596- // Construct the parameter object.
15971596 bool IsParameterPack = EllipsisLoc.isValid ();
1597+
1598+ bool Invalid = false ;
1599+ if (CheckTemplateParameterList (
1600+ Params,
1601+ /* OldParams=*/ nullptr ,
1602+ IsParameterPack ? TPC_TemplateTemplateParameterPack : TPC_Other))
1603+ Invalid = true ;
1604+
1605+ // Construct the parameter object.
15981606 TemplateTemplateParmDecl *Param = TemplateTemplateParmDecl::Create (
15991607 Context, Context.getTranslationUnitDecl (),
16001608 NameLoc.isInvalid () ? TmpLoc : NameLoc, Depth, Position, IsParameterPack,
@@ -1617,9 +1625,12 @@ NamedDecl *Sema::ActOnTemplateTemplateParameter(
16171625 if (Params->size () == 0 ) {
16181626 Diag (Param->getLocation (), diag::err_template_template_parm_no_parms)
16191627 << SourceRange (Params->getLAngleLoc (), Params->getRAngleLoc ());
1620- Param-> setInvalidDecl () ;
1628+ Invalid = true ;
16211629 }
16221630
1631+ if (Invalid)
1632+ Param->setInvalidDecl ();
1633+
16231634 // C++0x [temp.param]p9:
16241635 // A default template-argument may be specified for any kind of
16251636 // template-parameter that is not a template parameter pack.
@@ -2068,7 +2079,7 @@ DeclResult Sema::CheckClassTemplate(
20682079 SemanticContext->isDependentContext ())
20692080 ? TPC_ClassTemplateMember
20702081 : TUK == TagUseKind::Friend ? TPC_FriendClassTemplate
2071- : TPC_ClassTemplate ,
2082+ : TPC_Other ,
20722083 SkipBody))
20732084 Invalid = true ;
20742085
@@ -2210,9 +2221,8 @@ static bool DiagnoseDefaultTemplateArgument(Sema &S,
22102221 SourceLocation ParamLoc,
22112222 SourceRange DefArgRange) {
22122223 switch (TPC) {
2213- case Sema::TPC_ClassTemplate:
2214- case Sema::TPC_VarTemplate:
2215- case Sema::TPC_TypeAliasTemplate:
2224+ case Sema::TPC_Other:
2225+ case Sema::TPC_TemplateTemplateParameterPack:
22162226 return false ;
22172227
22182228 case Sema::TPC_FunctionTemplate:
@@ -2385,8 +2395,11 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
23852395 MissingDefaultArg = true ;
23862396 } else if (NonTypeTemplateParmDecl *NewNonTypeParm
23872397 = dyn_cast<NonTypeTemplateParmDecl>(*NewParam)) {
2388- // Check for unexpanded parameter packs.
2389- if (!NewNonTypeParm->isParameterPack () &&
2398+ // Check for unexpanded parameter packs, except in a template template
2399+ // parameter pack, as in those any unexpanded packs should be expanded
2400+ // along with the parameter itself.
2401+ if (TPC != TPC_TemplateTemplateParameterPack &&
2402+ !NewNonTypeParm->isParameterPack () &&
23902403 DiagnoseUnexpandedParameterPack (NewNonTypeParm->getLocation (),
23912404 NewNonTypeParm->getTypeSourceInfo (),
23922405 UPPC_NonTypeTemplateParameterType)) {
@@ -2494,8 +2507,7 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
24942507 // If a template parameter of a primary class template or alias template
24952508 // is a template parameter pack, it shall be the last template parameter.
24962509 if (SawParameterPack && (NewParam + 1 ) != NewParamEnd &&
2497- (TPC == TPC_ClassTemplate || TPC == TPC_VarTemplate ||
2498- TPC == TPC_TypeAliasTemplate)) {
2510+ (TPC == TPC_Other || TPC == TPC_TemplateTemplateParameterPack)) {
24992511 Diag ((*NewParam)->getLocation (),
25002512 diag::err_template_param_pack_must_be_last_template_parameter);
25012513 Invalid = true ;
@@ -2528,8 +2540,8 @@ bool Sema::CheckTemplateParameterList(TemplateParameterList *NewParams,
25282540 << PrevModuleName;
25292541 Invalid = true ;
25302542 } else if (MissingDefaultArg &&
2531- (TPC == TPC_ClassTemplate || TPC == TPC_FriendClassTemplate ||
2532- TPC == TPC_VarTemplate || TPC == TPC_TypeAliasTemplate )) {
2543+ (TPC == TPC_Other || TPC == TPC_TemplateTemplateParameterPack ||
2544+ TPC == TPC_FriendClassTemplate )) {
25332545 // C++ 23[temp.param]p14:
25342546 // If a template-parameter of a class template, variable template, or
25352547 // alias template has a default template argument, each subsequent
0 commit comments