@@ -5204,7 +5204,7 @@ bool Sema::CheckTemplateArgument(
52045204 unsigned ArgumentPackIndex,
52055205 SmallVectorImpl<TemplateArgument> &SugaredConverted,
52065206 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5207- CheckTemplateArgumentKind CTAK) {
5207+ CheckTemplateArgumentKind CTAK, bool *MatchedPackOnParmToNonPackOnArg ) {
52085208 // Check template type parameters.
52095209 if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
52105210 return CheckTemplateTypeArgument (TTP, Arg, SugaredConverted,
@@ -5420,7 +5420,8 @@ bool Sema::CheckTemplateArgument(
54205420 case TemplateArgument::Template:
54215421 case TemplateArgument::TemplateExpansion:
54225422 if (CheckTemplateTemplateArgument (TempParm, Params, Arg,
5423- /* IsDeduced=*/ CTAK != CTAK_Specified))
5423+ /* IsDeduced=*/ CTAK != CTAK_Specified,
5424+ MatchedPackOnParmToNonPackOnArg))
54245425 return true ;
54255426
54265427 SugaredConverted.push_back (Arg.getArgument ());
@@ -5494,7 +5495,7 @@ bool Sema::CheckTemplateArgumentList(
54945495 SmallVectorImpl<TemplateArgument> &SugaredConverted,
54955496 SmallVectorImpl<TemplateArgument> &CanonicalConverted,
54965497 bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied,
5497- bool PartialOrderingTTP) {
5498+ bool PartialOrderingTTP, bool *MatchedPackOnParmToNonPackOnArg ) {
54985499
54995500 if (ConstraintsNotSatisfied)
55005501 *ConstraintsNotSatisfied = false ;
@@ -5570,10 +5571,10 @@ bool Sema::CheckTemplateArgumentList(
55705571
55715572 if (ArgIdx < NumArgs) {
55725573 // Check the template argument we were given.
5573- if (CheckTemplateArgument (*Param, NewArgs[ArgIdx], Template, TemplateLoc,
5574- RAngleLoc, SugaredArgumentPack. size () ,
5575- SugaredConverted, CanonicalConverted,
5576- CTAK_Specified))
5574+ if (CheckTemplateArgument (
5575+ *Param, NewArgs[ArgIdx], Template, TemplateLoc, RAngleLoc ,
5576+ SugaredArgumentPack. size (), SugaredConverted, CanonicalConverted,
5577+ CTAK_Specified, MatchedPackOnParmToNonPackOnArg ))
55775578 return true ;
55785579
55795580 CanonicalConverted.back ().setIsDefaulted (
@@ -5731,7 +5732,8 @@ bool Sema::CheckTemplateArgumentList(
57315732 // Check the default template argument.
57325733 if (CheckTemplateArgument (*Param, Arg, Template, TemplateLoc, RAngleLoc, 0 ,
57335734 SugaredConverted, CanonicalConverted,
5734- CTAK_Specified))
5735+ CTAK_Specified,
5736+ /* MatchedPackOnParmToNonPackOnArg=*/ nullptr ))
57355737 return true ;
57365738
57375739 SugaredConverted.back ().setIsDefaulted (true );
@@ -7321,10 +7323,10 @@ static void DiagnoseTemplateParameterListArityMismatch(
73217323 Sema &S, TemplateParameterList *New, TemplateParameterList *Old,
73227324 Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc);
73237325
7324- bool Sema::CheckTemplateTemplateArgument (TemplateTemplateParmDecl *Param,
7325- TemplateParameterList *Params,
7326- TemplateArgumentLoc &Arg,
7327- bool IsDeduced ) {
7326+ bool Sema::CheckTemplateTemplateArgument (
7327+ TemplateTemplateParmDecl *Param, TemplateParameterList *Params,
7328+ TemplateArgumentLoc &Arg, bool IsDeduced ,
7329+ bool *MatchedPackOnParmToNonPackOnArg ) {
73287330 TemplateName Name = Arg.getArgument ().getAsTemplateOrTemplatePattern ();
73297331 auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs ();
73307332 if (!Template) {
@@ -7368,7 +7370,8 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
73687370 // A template-argument matches a template template-parameter P when P
73697371 // is at least as specialized as the template-argument A.
73707372 if (!isTemplateTemplateParameterAtLeastAsSpecializedAs (
7371- Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced))
7373+ Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced,
7374+ MatchedPackOnParmToNonPackOnArg))
73727375 return true ;
73737376 // P2113
73747377 // C++20[temp.func.order]p2
@@ -9798,11 +9801,14 @@ DeclResult Sema::ActOnExplicitInstantiation(
97989801
97999802 // Check that the template argument list is well-formed for this
98009803 // template.
9804+ bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false ;
98019805 SmallVector<TemplateArgument, 4 > SugaredConverted, CanonicalConverted;
9802- if (CheckTemplateArgumentList (ClassTemplate, TemplateNameLoc, TemplateArgs,
9803- /* DefaultArgs=*/ {}, false , SugaredConverted,
9804- CanonicalConverted,
9805- /* UpdateArgsWithConversions=*/ true ))
9806+ if (CheckTemplateArgumentList (
9807+ ClassTemplate, TemplateNameLoc, TemplateArgs,
9808+ /* DefaultArgs=*/ {}, false , SugaredConverted, CanonicalConverted,
9809+ /* UpdateArgsWithConversions=*/ true ,
9810+ /* ConstraintsNotSatisfied=*/ nullptr , /* PartialOrderingTTP=*/ false ,
9811+ &PrimaryHasMatchedPackOnParmToNonPackOnArg))
98069812 return true ;
98079813
98089814 // Find the class template specialization declaration that
@@ -9923,7 +9929,9 @@ DeclResult Sema::ActOnExplicitInstantiation(
99239929 = cast_or_null<ClassTemplateSpecializationDecl>(
99249930 Specialization->getDefinition ());
99259931 if (!Def)
9926- InstantiateClassTemplateSpecialization (TemplateNameLoc, Specialization, TSK);
9932+ InstantiateClassTemplateSpecialization (
9933+ TemplateNameLoc, Specialization, TSK,
9934+ /* Complain=*/ true , PrimaryHasMatchedPackOnParmToNonPackOnArg);
99279935 else if (TSK == TSK_ExplicitInstantiationDefinition) {
99289936 MarkVTableUsed (TemplateNameLoc, Specialization, true );
99299937 Specialization->setPointOfInstantiation (Def->getPointOfInstantiation ());
0 commit comments