@@ -5179,7 +5179,7 @@ bool Sema::CheckTemplateArgument(
51795179 unsigned ArgumentPackIndex,
51805180 SmallVectorImpl<TemplateArgument> &SugaredConverted,
51815181 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5182- CheckTemplateArgumentKind CTAK) {
5182+ CheckTemplateArgumentKind CTAK, bool *MatchedPackOnParmToNonPackOnArg ) {
51835183 // Check template type parameters.
51845184 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
51855185 return CheckTemplateTypeArgument (TTP, Arg, SugaredConverted,
@@ -5395,7 +5395,8 @@ bool Sema::CheckTemplateArgument(
53955395 case TemplateArgument::Template:
53965396 case TemplateArgument::TemplateExpansion:
53975397 if (CheckTemplateTemplateArgument (TempParm, Params, Arg,
5398- /* IsDeduced=*/ CTAK != CTAK_Specified))
5398+ /* IsDeduced=*/ CTAK != CTAK_Specified,
5399+ MatchedPackOnParmToNonPackOnArg))
53995400 return true ;
54005401
54015402 SugaredConverted.push_back (Arg.getArgument ());
@@ -5469,7 +5470,7 @@ bool Sema::CheckTemplateArgumentList(
54695470 SmallVectorImpl<TemplateArgument> &SugaredConverted,
54705471 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
54715472 bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied,
5472- bool PartialOrderingTTP) {
5473+ bool PartialOrderingTTP, bool *MatchedPackOnParmToNonPackOnArg ) {
54735474
54745475 if (ConstraintsNotSatisfied)
54755476 *ConstraintsNotSatisfied = false ;
@@ -5545,10 +5546,10 @@ bool Sema::CheckTemplateArgumentList(
55455546
55465547 if (ArgIdx < NumArgs) {
55475548 // Check the template argument we were given.
5548- if (CheckTemplateArgument (*Param, NewArgs[ArgIdx], Template, TemplateLoc,
5549- RAngleLoc, SugaredArgumentPack. size () ,
5550- SugaredConverted, CanonicalConverted,
5551- CTAK_Specified))
5549+ if (CheckTemplateArgument (
5550+ *Param, NewArgs[ArgIdx], Template, TemplateLoc, RAngleLoc ,
5551+ SugaredArgumentPack. size (), SugaredConverted, CanonicalConverted,
5552+ CTAK_Specified, MatchedPackOnParmToNonPackOnArg ))
55525553 return true ;
55535554
55545555 CanonicalConverted.back ().setIsDefaulted (
@@ -5706,7 +5707,8 @@ bool Sema::CheckTemplateArgumentList(
57065707 // Check the default template argument.
57075708 if (CheckTemplateArgument (*Param, Arg, Template, TemplateLoc, RAngleLoc, 0 ,
57085709 SugaredConverted, CanonicalConverted,
5709- CTAK_Specified))
5710+ CTAK_Specified,
5711+ /* MatchedPackOnParmToNonPackOnArg=*/ nullptr ))
57105712 return true ;
57115713
57125714 SugaredConverted.back ().setIsDefaulted (true );
@@ -7289,10 +7291,10 @@ static void DiagnoseTemplateParameterListArityMismatch(
72897291 Sema &S, TemplateParameterList *New, TemplateParameterList *Old,
72907292 Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc);
72917293
7292- bool Sema::CheckTemplateTemplateArgument (TemplateTemplateParmDecl *Param,
7293- TemplateParameterList *Params,
7294- TemplateArgumentLoc &Arg,
7295- bool IsDeduced ) {
7294+ bool Sema::CheckTemplateTemplateArgument (
7295+ TemplateTemplateParmDecl *Param, TemplateParameterList *Params,
7296+ TemplateArgumentLoc &Arg, bool IsDeduced ,
7297+ bool *MatchedPackOnParmToNonPackOnArg ) {
72967298 TemplateName Name = Arg.getArgument ().getAsTemplateOrTemplatePattern ();
72977299 auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs ();
72987300 if (!Template) {
@@ -7336,7 +7338,8 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
73367338 // A template-argument matches a template template-parameter P when P
73377339 // is at least as specialized as the template-argument A.
73387340 if (!isTemplateTemplateParameterAtLeastAsSpecializedAs (
7339- Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced))
7341+ Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced,
7342+ MatchedPackOnParmToNonPackOnArg))
73407343 return true ;
73417344 // P2113
73427345 // C++20[temp.func.order]p2
@@ -9754,11 +9757,14 @@ DeclResult Sema::ActOnExplicitInstantiation(
97549757
97559758 // Check that the template argument list is well-formed for this
97569759 // template.
9760+ bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false ;
97579761 SmallVector<TemplateArgument, 4 > SugaredConverted, CanonicalConverted;
9758- if (CheckTemplateArgumentList (ClassTemplate, TemplateNameLoc, TemplateArgs,
9759- /* DefaultArgs=*/ {}, false , SugaredConverted,
9760- CanonicalConverted,
9761- /* UpdateArgsWithConversions=*/ true ))
9762+ if (CheckTemplateArgumentList (
9763+ ClassTemplate, TemplateNameLoc, TemplateArgs,
9764+ /* DefaultArgs=*/ {}, false , SugaredConverted, CanonicalConverted,
9765+ /* UpdateArgsWithConversions=*/ true ,
9766+ /* ConstraintsNotSatisfied=*/ nullptr , /* PartialOrderingTTP=*/ false ,
9767+ &PrimaryHasMatchedPackOnParmToNonPackOnArg))
97629768 return true ;
97639769
97649770 // Find the class template specialization declaration that
@@ -9879,7 +9885,9 @@ DeclResult Sema::ActOnExplicitInstantiation(
98799885 = cast_or_null<ClassTemplateSpecializationDecl>(
98809886 Specialization->getDefinition ());
98819887 if (!Def)
9882- InstantiateClassTemplateSpecialization (TemplateNameLoc, Specialization, TSK);
9888+ InstantiateClassTemplateSpecialization (
9889+ TemplateNameLoc, Specialization, TSK,
9890+ /* Complain=*/ true , PrimaryHasMatchedPackOnParmToNonPackOnArg);
98839891 else if (TSK == TSK_ExplicitInstantiationDefinition) {
98849892 MarkVTableUsed (TemplateNameLoc, Specialization, true );
98859893 Specialization->setPointOfInstantiation (Def->getPointOfInstantiation ());
0 commit comments