@@ -5175,7 +5175,7 @@ bool Sema::CheckTemplateArgument(
5175
5175
unsigned ArgumentPackIndex,
5176
5176
SmallVectorImpl<TemplateArgument> &SugaredConverted,
5177
5177
SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5178
- CheckTemplateArgumentKind CTAK) {
5178
+ CheckTemplateArgumentKind CTAK, bool *MatchedPackOnParmToNonPackOnArg ) {
5179
5179
// Check template type parameters.
5180
5180
if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
5181
5181
return CheckTemplateTypeArgument(TTP, Arg, SugaredConverted,
@@ -5391,7 +5391,8 @@ bool Sema::CheckTemplateArgument(
5391
5391
case TemplateArgument::Template:
5392
5392
case TemplateArgument::TemplateExpansion:
5393
5393
if (CheckTemplateTemplateArgument(TempParm, Params, Arg,
5394
- /*IsDeduced=*/CTAK != CTAK_Specified))
5394
+ /*IsDeduced=*/CTAK != CTAK_Specified,
5395
+ MatchedPackOnParmToNonPackOnArg))
5395
5396
return true;
5396
5397
5397
5398
SugaredConverted.push_back(Arg.getArgument());
@@ -5465,7 +5466,7 @@ bool Sema::CheckTemplateArgumentList(
5465
5466
SmallVectorImpl<TemplateArgument> &SugaredConverted,
5466
5467
SmallVectorImpl<TemplateArgument> &CanonicalConverted,
5467
5468
bool UpdateArgsWithConversions, bool *ConstraintsNotSatisfied,
5468
- bool PartialOrderingTTP) {
5469
+ bool PartialOrderingTTP, bool *MatchedPackOnParmToNonPackOnArg ) {
5469
5470
5470
5471
if (ConstraintsNotSatisfied)
5471
5472
*ConstraintsNotSatisfied = false;
@@ -5541,10 +5542,10 @@ bool Sema::CheckTemplateArgumentList(
5541
5542
5542
5543
if (ArgIdx < NumArgs) {
5543
5544
// 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 ))
5548
5549
return true;
5549
5550
5550
5551
CanonicalConverted.back().setIsDefaulted(
@@ -5702,7 +5703,8 @@ bool Sema::CheckTemplateArgumentList(
5702
5703
// Check the default template argument.
5703
5704
if (CheckTemplateArgument(*Param, Arg, Template, TemplateLoc, RAngleLoc, 0,
5704
5705
SugaredConverted, CanonicalConverted,
5705
- CTAK_Specified))
5706
+ CTAK_Specified,
5707
+ /*MatchedPackOnParmToNonPackOnArg=*/nullptr))
5706
5708
return true;
5707
5709
5708
5710
SugaredConverted.back().setIsDefaulted(true);
@@ -7283,10 +7285,10 @@ static void DiagnoseTemplateParameterListArityMismatch(
7283
7285
Sema &S, TemplateParameterList *New, TemplateParameterList *Old,
7284
7286
Sema::TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc);
7285
7287
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 ) {
7290
7292
TemplateName Name = Arg.getArgument().getAsTemplateOrTemplatePattern();
7291
7293
auto [Template, DefaultArgs] = Name.getTemplateDeclAndDefaultArgs();
7292
7294
if (!Template) {
@@ -7330,7 +7332,8 @@ bool Sema::CheckTemplateTemplateArgument(TemplateTemplateParmDecl *Param,
7330
7332
// A template-argument matches a template template-parameter P when P
7331
7333
// is at least as specialized as the template-argument A.
7332
7334
if (!isTemplateTemplateParameterAtLeastAsSpecializedAs(
7333
- Params, Param, Template, DefaultArgs, Arg.getLocation(), IsDeduced))
7335
+ Params, Param, Template, DefaultArgs, Arg.getLocation(), IsDeduced,
7336
+ MatchedPackOnParmToNonPackOnArg))
7334
7337
return true;
7335
7338
// P2113
7336
7339
// C++20[temp.func.order]p2
@@ -9745,11 +9748,14 @@ DeclResult Sema::ActOnExplicitInstantiation(
9745
9748
9746
9749
// Check that the template argument list is well-formed for this
9747
9750
// template.
9751
+ bool PrimaryHasMatchedPackOnParmToNonPackOnArg = false;
9748
9752
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))
9753
9759
return true;
9754
9760
9755
9761
// Find the class template specialization declaration that
@@ -9870,7 +9876,9 @@ DeclResult Sema::ActOnExplicitInstantiation(
9870
9876
= cast_or_null<ClassTemplateSpecializationDecl>(
9871
9877
Specialization->getDefinition());
9872
9878
if (!Def)
9873
- InstantiateClassTemplateSpecialization(TemplateNameLoc, Specialization, TSK);
9879
+ InstantiateClassTemplateSpecialization(
9880
+ TemplateNameLoc, Specialization, TSK,
9881
+ /*Complain=*/true, PrimaryHasMatchedPackOnParmToNonPackOnArg);
9874
9882
else if (TSK == TSK_ExplicitInstantiationDefinition) {
9875
9883
MarkVTableUsed(TemplateNameLoc, Specialization, true);
9876
9884
Specialization->setPointOfInstantiation(Def->getPointOfInstantiation());
0 commit comments