@@ -2514,17 +2514,6 @@ DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,
25142514 return Sema::TDK_Success;
25152515}
25162516
2517- static Sema::TemplateDeductionResult
2518- DeduceTemplateArguments (Sema &S, TemplateParameterList *TemplateParams,
2519- const TemplateArgumentList &ParamList,
2520- const TemplateArgumentList &ArgList,
2521- TemplateDeductionInfo &Info,
2522- SmallVectorImpl<DeducedTemplateArgument> &Deduced) {
2523- return DeduceTemplateArguments (S, TemplateParams, ParamList.asArray (),
2524- ArgList.asArray (), Info, Deduced,
2525- /* NumberOfArgumentsMustMatch=*/ false );
2526- }
2527-
25282517// / Determine whether two template arguments are the same.
25292518static bool isSameTemplateArg (ASTContext &Context,
25302519 TemplateArgument X,
@@ -2945,21 +2934,22 @@ CheckDeducedArgumentConstraints(Sema &S, TemplateDeclT *Template,
29452934 llvm::SmallVector<const Expr *, 3 > AssociatedConstraints;
29462935 Template->getAssociatedConstraints (AssociatedConstraints);
29472936
2948- bool NeedsReplacement = DeducedArgsNeedReplacement (Template);
2949- TemplateArgumentList DeducedTAL{TemplateArgumentList::OnStack,
2950- CanonicalDeducedArgs};
2937+ std::optional<ArrayRef<TemplateArgument>> Innermost;
2938+ // If we don't need to replace the deduced template arguments,
2939+ // we can add them immediately as the inner-most argument list.
2940+ if (!DeducedArgsNeedReplacement (Template))
2941+ Innermost = CanonicalDeducedArgs;
29512942
29522943 MultiLevelTemplateArgumentList MLTAL = S.getTemplateInstantiationArgs (
2953- Template, Template->getDeclContext (), /* Final=*/ false ,
2954- /* InnerMost=*/ NeedsReplacement ? nullptr : &DeducedTAL,
2944+ Template, Template->getDeclContext (), /* Final=*/ false , Innermost,
29552945 /* RelativeToPrimary=*/ true , /* Pattern=*/
29562946 nullptr , /* ForConstraintInstantiation=*/ true );
29572947
29582948 // getTemplateInstantiationArgs picks up the non-deduced version of the
29592949 // template args when this is a variable template partial specialization and
29602950 // not class-scope explicit specialization, so replace with Deduced Args
29612951 // instead of adding to inner-most.
2962- if (NeedsReplacement )
2952+ if (!Innermost )
29632953 MLTAL.replaceInnermostTemplateArguments (Template, CanonicalDeducedArgs);
29642954
29652955 if (S.CheckConstraintSatisfaction (Template, AssociatedConstraints, MLTAL,
@@ -2980,7 +2970,7 @@ static std::enable_if_t<IsPartialSpecialization<T>::value,
29802970 Sema::TemplateDeductionResult>
29812971FinishTemplateArgumentDeduction (
29822972 Sema &S, T *Partial, bool IsPartialOrdering,
2983- const TemplateArgumentList & TemplateArgs,
2973+ ArrayRef<TemplateArgument> TemplateArgs,
29842974 SmallVectorImpl<DeducedTemplateArgument> &Deduced,
29852975 TemplateDeductionInfo &Info) {
29862976 // Unevaluated SFINAE context.
@@ -3073,7 +3063,7 @@ FinishTemplateArgumentDeduction(
30733063// FIXME: Factor out duplication with partial specialization version above.
30743064static Sema::TemplateDeductionResult FinishTemplateArgumentDeduction (
30753065 Sema &S, TemplateDecl *Template, bool PartialOrdering,
3076- const TemplateArgumentList & TemplateArgs,
3066+ ArrayRef<TemplateArgument> TemplateArgs,
30773067 SmallVectorImpl<DeducedTemplateArgument> &Deduced,
30783068 TemplateDeductionInfo &Info) {
30793069 // Unevaluated SFINAE context.
@@ -3122,7 +3112,7 @@ static Sema::TemplateDeductionResult FinishTemplateArgumentDeduction(
31223112// / partial specialization per C++ [temp.class.spec.match].
31233113Sema::TemplateDeductionResult
31243114Sema::DeduceTemplateArguments (ClassTemplatePartialSpecializationDecl *Partial,
3125- const TemplateArgumentList & TemplateArgs,
3115+ ArrayRef<TemplateArgument> TemplateArgs,
31263116 TemplateDeductionInfo &Info) {
31273117 if (Partial->isInvalidDecl ())
31283118 return TDK_Invalid;
@@ -3144,11 +3134,10 @@ Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,
31443134
31453135 SmallVector<DeducedTemplateArgument, 4 > Deduced;
31463136 Deduced.resize (Partial->getTemplateParameters ()->size ());
3147- if (TemplateDeductionResult Result
3148- = ::DeduceTemplateArguments (*this ,
3149- Partial->getTemplateParameters (),
3150- Partial->getTemplateArgs (),
3151- TemplateArgs, Info, Deduced))
3137+ if (TemplateDeductionResult Result = ::DeduceTemplateArguments (
3138+ *this , Partial->getTemplateParameters (),
3139+ Partial->getTemplateArgs ().asArray (), TemplateArgs, Info, Deduced,
3140+ /* NumberOfArgumentsMustMatch=*/ false ))
31523141 return Result;
31533142
31543143 SmallVector<TemplateArgument, 4 > DeducedArgs (Deduced.begin (), Deduced.end ());
@@ -3174,7 +3163,7 @@ Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,
31743163// / partial specialization per C++ [temp.class.spec.match].
31753164Sema::TemplateDeductionResult
31763165Sema::DeduceTemplateArguments (VarTemplatePartialSpecializationDecl *Partial,
3177- const TemplateArgumentList & TemplateArgs,
3166+ ArrayRef<TemplateArgument> TemplateArgs,
31783167 TemplateDeductionInfo &Info) {
31793168 if (Partial->isInvalidDecl ())
31803169 return TDK_Invalid;
@@ -3197,8 +3186,9 @@ Sema::DeduceTemplateArguments(VarTemplatePartialSpecializationDecl *Partial,
31973186 SmallVector<DeducedTemplateArgument, 4 > Deduced;
31983187 Deduced.resize (Partial->getTemplateParameters ()->size ());
31993188 if (TemplateDeductionResult Result = ::DeduceTemplateArguments (
3200- *this , Partial->getTemplateParameters (), Partial->getTemplateArgs (),
3201- TemplateArgs, Info, Deduced))
3189+ *this , Partial->getTemplateParameters (),
3190+ Partial->getTemplateArgs ().asArray (), TemplateArgs, Info, Deduced,
3191+ /* NumberOfArgumentsMustMatch=*/ false ))
32023192 return Result;
32033193
32043194 SmallVector<TemplateArgument, 4 > DeducedArgs (Deduced.begin (), Deduced.end ());
@@ -3427,15 +3417,15 @@ Sema::TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments(
34273417 // specification.
34283418 SmallVector<QualType, 4 > ExceptionStorage;
34293419 if (getLangOpts ().CPlusPlus17 &&
3430- SubstExceptionSpec (Function-> getLocation (), EPI. ExceptionSpec ,
3431- ExceptionStorage,
3432- getTemplateInstantiationArgs (
3433- FunctionTemplate, nullptr , /* Final=*/ true ,
3434- /* Innermost=*/ SugaredExplicitArgumentList,
3435- /* RelativeToPrimary=*/ false ,
3436- /* Pattern=*/ nullptr ,
3437- /* ForConstraintInstantiation=*/ false ,
3438- /* SkipForSpecialization=*/ true )))
3420+ SubstExceptionSpec (
3421+ Function-> getLocation (), EPI. ExceptionSpec , ExceptionStorage,
3422+ getTemplateInstantiationArgs (
3423+ FunctionTemplate, nullptr , /* Final=*/ true ,
3424+ /* Innermost=*/ SugaredExplicitArgumentList-> asArray () ,
3425+ /* RelativeToPrimary=*/ false ,
3426+ /* Pattern=*/ nullptr ,
3427+ /* ForConstraintInstantiation=*/ false ,
3428+ /* SkipForSpecialization=*/ true )))
34393429 return TDK_SubstitutionFailure;
34403430
34413431 *FunctionType = BuildFunctionType (ResultType, ParamTypes,
@@ -5802,10 +5792,8 @@ static bool isAtLeastAsSpecializedAs(Sema &S, QualType T1, QualType T2,
58025792 bool AtLeastAsSpecialized;
58035793 S.runWithSufficientStackSpace (Info.getLocation (), [&] {
58045794 AtLeastAsSpecialized = !FinishTemplateArgumentDeduction (
5805- S, P2, /* IsPartialOrdering=*/ true ,
5806- TemplateArgumentList (TemplateArgumentList::OnStack,
5807- TST1->template_arguments ()),
5808- Deduced, Info);
5795+ S, P2, /* IsPartialOrdering=*/ true , TST1->template_arguments (), Deduced,
5796+ Info);
58095797 });
58105798 return AtLeastAsSpecialized;
58115799}
0 commit comments