@@ -5018,7 +5018,7 @@ bool Sema::CheckTemplateArgument(
5018
5018
unsigned ArgumentPackIndex,
5019
5019
SmallVectorImpl<TemplateArgument> &SugaredConverted,
5020
5020
SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5021
- CheckTemplateArgumentKind CTAK) {
5021
+ CheckTemplateArgumentKind CTAK, bool *MatchedPackOnParmToNonPackOnArg ) {
5022
5022
// Check template type parameters.
5023
5023
if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
5024
5024
return CheckTemplateTypeArgument (TTP, Arg, SugaredConverted,
@@ -5234,7 +5234,8 @@ bool Sema::CheckTemplateArgument(
5234
5234
case TemplateArgument::Template:
5235
5235
case TemplateArgument::TemplateExpansion:
5236
5236
if (CheckTemplateTemplateArgument (TempParm, Params, Arg,
5237
- /* IsDeduced=*/ CTAK != CTAK_Specified))
5237
+ /* IsDeduced=*/ CTAK != CTAK_Specified,
5238
+ MatchedPackOnParmToNonPackOnArg))
5238
5239
return true ;
5239
5240
5240
5241
SugaredConverted.push_back (Arg.getArgument ());
@@ -5308,7 +5309,7 @@ bool Sema::CheckTemplateArgumentList(
5308
5309
SmallVectorImpl<TemplateArgument> &SugaredConverted,
5309
5310
SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5310
5311
bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied,
5311
- bool PartialOrderingTTP) {
5312
+ bool PartialOrderingTTP, bool *MatchedPackOnParmToNonPackOnArg ) {
5312
5313
5313
5314
if (ConstraintsNotSatisfied)
5314
5315
*ConstraintsNotSatisfied = false ;
@@ -5384,10 +5385,10 @@ bool Sema::CheckTemplateArgumentList(
5384
5385
5385
5386
if (ArgIdx < NumArgs) {
5386
5387
// Check the template argument we were given.
5387
- if (CheckTemplateArgument (*Param, NewArgs[ArgIdx], Template, TemplateLoc,
5388
- RAngleLoc, SugaredArgumentPack. size () ,
5389
- SugaredConverted, CanonicalConverted,
5390
- CTAK_Specified))
5388
+ if (CheckTemplateArgument (
5389
+ *Param, NewArgs[ArgIdx], Template, TemplateLoc, RAngleLoc ,
5390
+ SugaredArgumentPack. size (), SugaredConverted, CanonicalConverted,
5391
+ CTAK_Specified, MatchedPackOnParmToNonPackOnArg ))
5391
5392
return true ;
5392
5393
5393
5394
CanonicalConverted.back ().setIsDefaulted (
@@ -5564,7 +5565,8 @@ bool Sema::CheckTemplateArgumentList(
5564
5565
// Check the default template argument.
5565
5566
if (CheckTemplateArgument (*Param, Arg, Template, TemplateLoc, RAngleLoc, 0 ,
5566
5567
SugaredConverted, CanonicalConverted,
5567
- CTAK_Specified))
5568
+ CTAK_Specified,
5569
+ /* MatchedPackOnParmToNonPackOnArg=*/ nullptr ))
5568
5570
return true ;
5569
5571
5570
5572
SugaredConverted.back ().setIsDefaulted (true );
@@ -7147,10 +7149,10 @@ static void DiagnoseTemplateParameterListArityMismatch(
7147
7149
Sema &S, TemplateParameterList *New, TemplateParameterList *Old,
7148
7150
Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc);
7149
7151
7150
- bool Sema::CheckTemplateTemplateArgument (TemplateTemplateParmDecl *Param,
7151
- TemplateParameterList *Params,
7152
- TemplateArgumentLoc &Arg,
7153
- bool IsDeduced ) {
7152
+ bool Sema::CheckTemplateTemplateArgument (
7153
+ TemplateTemplateParmDecl *Param, TemplateParameterList *Params,
7154
+ TemplateArgumentLoc &Arg, bool IsDeduced ,
7155
+ bool *MatchedPackOnParmToNonPackOnArg ) {
7154
7156
TemplateName Name = Arg.getArgument ().getAsTemplateOrTemplatePattern ();
7155
7157
auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs ();
7156
7158
if (!Template) {
@@ -7194,7 +7196,8 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
7194
7196
// A template-argument matches a template template-parameter P when P
7195
7197
// is at least as specialized as the template-argument A.
7196
7198
if (!isTemplateTemplateParameterAtLeastAsSpecializedAs (
7197
- Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced))
7199
+ Params, Param, Template, DefaultArgs, Arg.getLocation (), IsDeduced,
7200
+ MatchedPackOnParmToNonPackOnArg))
7198
7201
return true ;
7199
7202
// P2113
7200
7203
// C++20[temp.func.order]p2
@@ -9611,11 +9614,14 @@ DeclResult Sema::ActOnExplicitInstantiation(
9611
9614
9612
9615
// Check that the template argument list is well-formed for this
9613
9616
// template.
9617
+ bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false ;
9614
9618
SmallVector<TemplateArgument, 4 > SugaredConverted, CanonicalConverted;
9615
- if (CheckTemplateArgumentList (ClassTemplate, TemplateNameLoc, TemplateArgs,
9616
- /* DefaultArgs=*/ {}, false , SugaredConverted,
9617
- CanonicalConverted,
9618
- /* UpdateArgsWithConversions=*/ true ))
9619
+ if (CheckTemplateArgumentList (
9620
+ ClassTemplate, TemplateNameLoc, TemplateArgs,
9621
+ /* DefaultArgs=*/ {}, false , SugaredConverted, CanonicalConverted,
9622
+ /* UpdateArgsWithConversions=*/ true ,
9623
+ /* ConstraintsNotSatisfied=*/ nullptr , /* PartialOrderingTTP=*/ false ,
9624
+ &PrimaryHasMatchedPackOnParmToNonPackOnArg))
9619
9625
return true ;
9620
9626
9621
9627
// Find the class template specialization declaration that
@@ -9736,7 +9742,9 @@ DeclResult Sema::ActOnExplicitInstantiation(
9736
9742
= cast_or_null<ClassTemplateSpecializationDecl>(
9737
9743
Specialization->getDefinition ());
9738
9744
if (!Def)
9739
- InstantiateClassTemplateSpecialization (TemplateNameLoc, Specialization, TSK);
9745
+ InstantiateClassTemplateSpecialization (
9746
+ TemplateNameLoc, Specialization, TSK,
9747
+ /* Complain=*/ true , PrimaryHasMatchedPackOnParmToNonPackOnArg);
9740
9748
else if (TSK == TSK_ExplicitInstantiationDefinition) {
9741
9749
MarkVTableUsed (TemplateNameLoc, Specialization, true );
9742
9750
Specialization->setPointOfInstantiation (Def->getPointOfInstantiation ());
0 commit comments