@@ -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 (
@@ -5714,7 +5715,8 @@ bool Sema::CheckTemplateArgumentList(
57145715 // Check the default template argument.
57155716 if (CheckTemplateArgument (*Param, Arg, Template, TemplateLoc, RAngleLoc, 0 ,
57165717 SugaredConverted, CanonicalConverted,
5717- CTAK_Specified))
5718+ CTAK_Specified,
5719+ /* MatchedPackOnParmToNonPackOnArg=*/ nullptr ))
57185720 return true ;
57195721
57205722 SugaredConverted.back ().setIsDefaulted (true );
@@ -7292,10 +7294,10 @@ static void DiagnoseTemplateParameterListArityMismatch(
72927294 Sema &S, TemplateParameterList *New, TemplateParameterList *Old,
72937295 Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc);
72947296
7295- bool Sema::CheckTemplateTemplateArgument (TemplateTemplateParmDecl *Param,
7296- TemplateParameterList *Params,
7297- TemplateArgumentLoc &Arg,
7298- bool IsDeduced ) {
7297+ bool Sema::CheckTemplateTemplateArgument (
7298+ TemplateTemplateParmDecl *Param, TemplateParameterList *Params,
7299+ TemplateArgumentLoc &Arg, bool IsDeduced ,
7300+ bool *MatchedPackOnParmToNonPackOnArg ) {
72997301 TemplateName Name = Arg.getArgument ().getAsTemplateOrTemplatePattern ();
73007302 auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs ();
73017303 if (!Template) {
@@ -7339,7 +7341,8 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
73397341 // A template-argument matches a template template-parameter P when P
73407342 // is at least as specialized as the template-argument A.
73417343 if (!isTemplateTemplateParameterAtLeastAsSpecializedAs (
7342- Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced))
7344+ Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced,
7345+ MatchedPackOnParmToNonPackOnArg))
73437346 return true ;
73447347 // P2113
73457348 // C++20[temp.func.order]p2
@@ -9757,11 +9760,14 @@ DeclResult Sema::ActOnExplicitInstantiation(
97579760
97589761 // Check that the template argument list is well-formed for this
97599762 // template.
9763+ bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false ;
97609764 SmallVector<TemplateArgument, 4 > SugaredConverted, CanonicalConverted;
9761- if (CheckTemplateArgumentList (ClassTemplate, TemplateNameLoc, TemplateArgs,
9762- /* DefaultArgs=*/ {}, false , SugaredConverted,
9763- CanonicalConverted,
9764- /* UpdateArgsWithConversions=*/ true ))
9765+ if (CheckTemplateArgumentList (
9766+ ClassTemplate, TemplateNameLoc, TemplateArgs,
9767+ /* DefaultArgs=*/ {}, false , SugaredConverted, CanonicalConverted,
9768+ /* UpdateArgsWithConversions=*/ true ,
9769+ /* ConstraintsNotSatisfied=*/ nullptr , /* PartialOrderingTTP=*/ false ,
9770+ &PrimaryHasMatchedPackOnParmToNonPackOnArg))
97659771 return true ;
97669772
97679773 // Find the class template specialization declaration that
@@ -9882,7 +9888,9 @@ DeclResult Sema::ActOnExplicitInstantiation(
98829888 = cast_or_null<ClassTemplateSpecializationDecl>(
98839889 Specialization->getDefinition ());
98849890 if (!Def)
9885- InstantiateClassTemplateSpecialization (TemplateNameLoc, Specialization, TSK);
9891+ InstantiateClassTemplateSpecialization (
9892+ TemplateNameLoc, Specialization, TSK,
9893+ /* Complain=*/ true , PrimaryHasMatchedPackOnParmToNonPackOnArg);
98869894 else if (TSK == TSK_ExplicitInstantiationDefinition) {
98879895 MarkVTableUsed (TemplateNameLoc, Specialization, true );
98889896 Specialization->setPointOfInstantiation (Def->getPointOfInstantiation ());
0 commit comments