@@ -5175,7 +5175,7 @@ bool Sema::CheckTemplateArgument(
51755175 unsigned ArgumentPackIndex,
51765176 SmallVectorImpl<TemplateArgument> &SugaredConverted,
51775177 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5178- CheckTemplateArgumentKind CTAK) {
5178+ CheckTemplateArgumentKind CTAK, bool *MatchedPackOnParmToNonPackOnArg ) {
51795179 // Check template type parameters.
51805180 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
51815181 return CheckTemplateTypeArgument (TTP, Arg, SugaredConverted,
@@ -5391,7 +5391,8 @@ bool Sema::CheckTemplateArgument(
53915391 case TemplateArgument::Template:
53925392 case TemplateArgument::TemplateExpansion:
53935393 if (CheckTemplateTemplateArgument (TempParm, Params, Arg,
5394- /* IsDeduced=*/ CTAK != CTAK_Specified))
5394+ /* IsDeduced=*/ CTAK != CTAK_Specified,
5395+ MatchedPackOnParmToNonPackOnArg))
53955396 return true ;
53965397
53975398 SugaredConverted.push_back (Arg.getArgument ());
@@ -5465,7 +5466,7 @@ bool Sema::CheckTemplateArgumentList(
54655466 SmallVectorImpl<TemplateArgument> &SugaredConverted,
54665467 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
54675468 bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied,
5468- bool PartialOrderingTTP) {
5469+ bool PartialOrderingTTP, bool *MatchedPackOnParmToNonPackOnArg ) {
54695470
54705471 if (ConstraintsNotSatisfied)
54715472 *ConstraintsNotSatisfied = false ;
@@ -5541,10 +5542,10 @@ bool Sema::CheckTemplateArgumentList(
55415542
55425543 if (ArgIdx < NumArgs) {
55435544 // Check the template argument we were given.
5544- if (CheckTemplateArgument (*Param, NewArgs[ArgIdx], Template, TemplateLoc,
5545- RAngleLoc, SugaredArgumentPack. size () ,
5546- SugaredConverted, CanonicalConverted,
5547- CTAK_Specified))
5545+ if (CheckTemplateArgument (
5546+ *Param, NewArgs[ArgIdx], Template, TemplateLoc, RAngleLoc ,
5547+ SugaredArgumentPack. size (), SugaredConverted, CanonicalConverted,
5548+ CTAK_Specified, MatchedPackOnParmToNonPackOnArg ))
55485549 return true ;
55495550
55505551 CanonicalConverted.back ().setIsDefaulted (
@@ -5702,7 +5703,8 @@ bool Sema::CheckTemplateArgumentList(
57025703 // Check the default template argument.
57035704 if (CheckTemplateArgument (*Param, Arg, Template, TemplateLoc, RAngleLoc, 0 ,
57045705 SugaredConverted, CanonicalConverted,
5705- CTAK_Specified))
5706+ CTAK_Specified,
5707+ /* MatchedPackOnParmToNonPackOnArg=*/ nullptr ))
57065708 return true ;
57075709
57085710 SugaredConverted.back ().setIsDefaulted (true );
@@ -7283,10 +7285,10 @@ static void DiagnoseTemplateParameterListArityMismatch(
72837285 Sema &S, TemplateParameterList *New, TemplateParameterList *Old,
72847286 Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc);
72857287
7286- bool Sema::CheckTemplateTemplateArgument (TemplateTemplateParmDecl *Param,
7287- TemplateParameterList *Params,
7288- TemplateArgumentLoc &Arg,
7289- bool IsDeduced ) {
7288+ bool Sema::CheckTemplateTemplateArgument (
7289+ TemplateTemplateParmDecl *Param, TemplateParameterList *Params,
7290+ TemplateArgumentLoc &Arg, bool IsDeduced ,
7291+ bool *MatchedPackOnParmToNonPackOnArg ) {
72907292 TemplateName Name = Arg.getArgument ().getAsTemplateOrTemplatePattern ();
72917293 auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs ();
72927294 if (!Template) {
@@ -7330,7 +7332,8 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
73307332 // A template-argument matches a template template-parameter P when P
73317333 // is at least as specialized as the template-argument A.
73327334 if (!isTemplateTemplateParameterAtLeastAsSpecializedAs (
7333- Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced))
7335+ Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced,
7336+ MatchedPackOnParmToNonPackOnArg))
73347337 return true ;
73357338 // P2113
73367339 // C++20[temp.func.order]p2
@@ -9745,11 +9748,14 @@ DeclResult Sema::ActOnExplicitInstantiation(
97459748
97469749 // Check that the template argument list is well-formed for this
97479750 // template.
9751+ bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false ;
97489752 SmallVector<TemplateArgument, 4 > SugaredConverted, CanonicalConverted;
9749- if (CheckTemplateArgumentList (ClassTemplate, TemplateNameLoc, TemplateArgs,
9750- /* DefaultArgs=*/ {}, false , SugaredConverted,
9751- CanonicalConverted,
9752- /* UpdateArgsWithConversions=*/ true ))
9753+ if (CheckTemplateArgumentList (
9754+ ClassTemplate, TemplateNameLoc, TemplateArgs,
9755+ /* DefaultArgs=*/ {}, false , SugaredConverted, CanonicalConverted,
9756+ /* UpdateArgsWithConversions=*/ true ,
9757+ /* ConstraintsNotSatisfied=*/ nullptr , /* PartialOrderingTTP=*/ false ,
9758+ &PrimaryHasMatchedPackOnParmToNonPackOnArg))
97539759 return true ;
97549760
97559761 // Find the class template specialization declaration that
@@ -9870,7 +9876,9 @@ DeclResult Sema::ActOnExplicitInstantiation(
98709876 = cast_or_null<ClassTemplateSpecializationDecl>(
98719877 Specialization->getDefinition ());
98729878 if (!Def)
9873- InstantiateClassTemplateSpecialization (TemplateNameLoc, Specialization, TSK);
9879+ InstantiateClassTemplateSpecialization (
9880+ TemplateNameLoc, Specialization, TSK,
9881+ /* Complain=*/ true , PrimaryHasMatchedPackOnParmToNonPackOnArg);
98749882 else if (TSK == TSK_ExplicitInstantiationDefinition) {
98759883 MarkVTableUsed (TemplateNameLoc, Specialization, true );
98769884 Specialization->setPointOfInstantiation (Def->getPointOfInstantiation ());
0 commit comments