brintos

brintos / llvm-project-archived public Read only

0
0
Text · 295.3 KiB · a287319 Raw
7203 lines · cpp
1//===- SemaTemplateDeduction.cpp - Template Argument Deduction ------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements C++ template argument deduction.10//11//===----------------------------------------------------------------------===//12 13#include "TreeTransform.h"14#include "TypeLocBuilder.h"15#include "clang/AST/ASTContext.h"16#include "clang/AST/ASTLambda.h"17#include "clang/AST/Decl.h"18#include "clang/AST/DeclAccessPair.h"19#include "clang/AST/DeclBase.h"20#include "clang/AST/DeclCXX.h"21#include "clang/AST/DeclTemplate.h"22#include "clang/AST/DeclarationName.h"23#include "clang/AST/DynamicRecursiveASTVisitor.h"24#include "clang/AST/Expr.h"25#include "clang/AST/ExprCXX.h"26#include "clang/AST/NestedNameSpecifier.h"27#include "clang/AST/TemplateBase.h"28#include "clang/AST/TemplateName.h"29#include "clang/AST/Type.h"30#include "clang/AST/TypeLoc.h"31#include "clang/AST/TypeOrdering.h"32#include "clang/AST/UnresolvedSet.h"33#include "clang/Basic/AddressSpaces.h"34#include "clang/Basic/ExceptionSpecificationType.h"35#include "clang/Basic/LLVM.h"36#include "clang/Basic/LangOptions.h"37#include "clang/Basic/PartialDiagnostic.h"38#include "clang/Basic/SourceLocation.h"39#include "clang/Basic/Specifiers.h"40#include "clang/Basic/TemplateKinds.h"41#include "clang/Sema/EnterExpressionEvaluationContext.h"42#include "clang/Sema/Ownership.h"43#include "clang/Sema/Sema.h"44#include "clang/Sema/Template.h"45#include "clang/Sema/TemplateDeduction.h"46#include "llvm/ADT/APInt.h"47#include "llvm/ADT/APSInt.h"48#include "llvm/ADT/ArrayRef.h"49#include "llvm/ADT/DenseMap.h"50#include "llvm/ADT/FoldingSet.h"51#include "llvm/ADT/SmallBitVector.h"52#include "llvm/ADT/SmallPtrSet.h"53#include "llvm/ADT/SmallVector.h"54#include "llvm/Support/Casting.h"55#include "llvm/Support/Compiler.h"56#include "llvm/Support/ErrorHandling.h"57#include "llvm/Support/SaveAndRestore.h"58#include <algorithm>59#include <cassert>60#include <optional>61#include <tuple>62#include <type_traits>63#include <utility>64 65namespace clang {66 67  /// Various flags that control template argument deduction.68  ///69  /// These flags can be bitwise-OR'd together.70  enum TemplateDeductionFlags {71    /// No template argument deduction flags, which indicates the72    /// strictest results for template argument deduction (as used for, e.g.,73    /// matching class template partial specializations).74    TDF_None = 0,75 76    /// Within template argument deduction from a function call, we are77    /// matching with a parameter type for which the original parameter was78    /// a reference.79    TDF_ParamWithReferenceType = 0x1,80 81    /// Within template argument deduction from a function call, we82    /// are matching in a case where we ignore cv-qualifiers.83    TDF_IgnoreQualifiers = 0x02,84 85    /// Within template argument deduction from a function call,86    /// we are matching in a case where we can perform template argument87    /// deduction from a template-id of a derived class of the argument type.88    TDF_DerivedClass = 0x04,89 90    /// Allow non-dependent types to differ, e.g., when performing91    /// template argument deduction from a function call where conversions92    /// may apply.93    TDF_SkipNonDependent = 0x08,94 95    /// Whether we are performing template argument deduction for96    /// parameters and arguments in a top-level template argument97    TDF_TopLevelParameterTypeList = 0x10,98 99    /// Within template argument deduction from overload resolution per100    /// C++ [over.over] allow matching function types that are compatible in101    /// terms of noreturn and default calling convention adjustments, or102    /// similarly matching a declared template specialization against a103    /// possible template, per C++ [temp.deduct.decl]. In either case, permit104    /// deduction where the parameter is a function type that can be converted105    /// to the argument type.106    TDF_AllowCompatibleFunctionType = 0x20,107 108    /// Within template argument deduction for a conversion function, we are109    /// matching with an argument type for which the original argument was110    /// a reference.111    TDF_ArgWithReferenceType = 0x40,112  };113}114 115using namespace clang;116using namespace sema;117 118/// The kind of PartialOrdering we're performing template argument deduction119/// for (C++11 [temp.deduct.partial]).120enum class PartialOrderingKind { None, NonCall, Call };121 122static TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch(123    Sema &S, TemplateParameterList *TemplateParams, QualType Param,124    QualType Arg, TemplateDeductionInfo &Info,125    SmallVectorImpl<DeducedTemplateArgument> &Deduced, unsigned TDF,126    PartialOrderingKind POK, bool DeducedFromArrayBound,127    bool *HasDeducedAnyParam);128 129/// What directions packs are allowed to match non-packs.130enum class PackFold { ParameterToArgument, ArgumentToParameter, Both };131 132static TemplateDeductionResult133DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,134                        ArrayRef<TemplateArgument> Ps,135                        ArrayRef<TemplateArgument> As,136                        TemplateDeductionInfo &Info,137                        SmallVectorImpl<DeducedTemplateArgument> &Deduced,138                        bool NumberOfArgumentsMustMatch, bool PartialOrdering,139                        PackFold PackFold, bool *HasDeducedAnyParam);140 141static void MarkUsedTemplateParameters(ASTContext &Ctx,142                                       const TemplateArgument &TemplateArg,143                                       bool OnlyDeduced, unsigned Depth,144                                       llvm::SmallBitVector &Used);145 146static void MarkUsedTemplateParameters(ASTContext &Ctx, QualType T,147                                       bool OnlyDeduced, unsigned Level,148                                       llvm::SmallBitVector &Deduced);149 150static const Expr *unwrapExpressionForDeduction(const Expr *E) {151  // If we are within an alias template, the expression may have undergone152  // any number of parameter substitutions already.153  while (true) {154    if (const auto *IC = dyn_cast<ImplicitCastExpr>(E))155      E = IC->getSubExpr();156    else if (const auto *CE = dyn_cast<ConstantExpr>(E))157      E = CE->getSubExpr();158    else if (const auto *Subst = dyn_cast<SubstNonTypeTemplateParmExpr>(E))159      E = Subst->getReplacement();160    else if (const auto *CCE = dyn_cast<CXXConstructExpr>(E)) {161      // Look through implicit copy construction from an lvalue of the same type.162      if (CCE->getParenOrBraceRange().isValid())163        break;164      // Note, there could be default arguments.165      assert(CCE->getNumArgs() >= 1 && "implicit construct expr should have 1 arg");166      E = CCE->getArg(0);167    } else168      break;169  }170  return E;171}172 173class NonTypeOrVarTemplateParmDecl {174public:175  NonTypeOrVarTemplateParmDecl(const NamedDecl *Template) : Template(Template) {176    assert(177        !Template || isa<NonTypeTemplateParmDecl>(Template) ||178        (isa<TemplateTemplateParmDecl>(Template) &&179         (cast<TemplateTemplateParmDecl>(Template)->templateParameterKind() ==180              TNK_Var_template ||181          cast<TemplateTemplateParmDecl>(Template)->templateParameterKind() ==182              TNK_Concept_template)));183  }184 185  QualType getType() const {186    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))187      return NTTP->getType();188    return getTemplate()->templateParameterKind() == TNK_Concept_template189               ? getTemplate()->getASTContext().BoolTy190               : getTemplate()->getASTContext().DependentTy;191  }192 193  unsigned getDepth() const {194    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))195      return NTTP->getDepth();196    return getTemplate()->getDepth();197  }198 199  unsigned getIndex() const {200    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))201      return NTTP->getIndex();202    return getTemplate()->getIndex();203  }204 205  const TemplateTemplateParmDecl *getTemplate() const {206    return cast<TemplateTemplateParmDecl>(Template);207  }208 209  const NonTypeTemplateParmDecl *getNTTP() const {210    return cast<NonTypeTemplateParmDecl>(Template);211  }212 213  TemplateParameter asTemplateParam() const {214    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))215      return const_cast<NonTypeTemplateParmDecl *>(NTTP);216    return const_cast<TemplateTemplateParmDecl *>(getTemplate());217  }218 219  bool isExpandedParameterPack() const {220    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))221      return NTTP->isExpandedParameterPack();222    return getTemplate()->isExpandedParameterPack();223  }224 225  SourceLocation getLocation() const {226    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Template))227      return NTTP->getLocation();228    return getTemplate()->getLocation();229  }230 231  operator bool() const { return Template; }232 233private:234  const NamedDecl *Template;235};236 237/// If the given expression is of a form that permits the deduction238/// of a non-type template parameter, return the declaration of that239/// non-type template parameter.240static NonTypeOrVarTemplateParmDecl241getDeducedNTTParameterFromExpr(const Expr *E, unsigned Depth) {242  // If we are within an alias template, the expression may have undergone243  // any number of parameter substitutions already.244  E = unwrapExpressionForDeduction(E);245  if (const auto *DRE = dyn_cast<DeclRefExpr>(E))246    if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))247      if (NTTP->getDepth() == Depth)248        return NTTP;249 250  if (const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E);251      ULE && (ULE->isConceptReference() || ULE->isVarDeclReference())) {252    if (auto *TTP = ULE->getTemplateTemplateDecl()) {253 254      if (TTP->getDepth() == Depth)255        return TTP;256    }257  }258  return nullptr;259}260 261static const NonTypeOrVarTemplateParmDecl262getDeducedNTTParameterFromExpr(TemplateDeductionInfo &Info, Expr *E) {263  return getDeducedNTTParameterFromExpr(E, Info.getDeducedDepth());264}265 266/// Determine whether two declaration pointers refer to the same267/// declaration.268static bool isSameDeclaration(Decl *X, Decl *Y) {269  if (NamedDecl *NX = dyn_cast<NamedDecl>(X))270    X = NX->getUnderlyingDecl();271  if (NamedDecl *NY = dyn_cast<NamedDecl>(Y))272    Y = NY->getUnderlyingDecl();273 274  return X->getCanonicalDecl() == Y->getCanonicalDecl();275}276 277/// Verify that the given, deduced template arguments are compatible.278///279/// \returns The deduced template argument, or a NULL template argument if280/// the deduced template arguments were incompatible.281static DeducedTemplateArgument282checkDeducedTemplateArguments(ASTContext &Context,283                              const DeducedTemplateArgument &X,284                              const DeducedTemplateArgument &Y,285                              bool AggregateCandidateDeduction = false) {286  // We have no deduction for one or both of the arguments; they're compatible.287  if (X.isNull())288    return Y;289  if (Y.isNull())290    return X;291 292  // If we have two non-type template argument values deduced for the same293  // parameter, they must both match the type of the parameter, and thus must294  // match each other's type. As we're only keeping one of them, we must check295  // for that now. The exception is that if either was deduced from an array296  // bound, the type is permitted to differ.297  if (!X.wasDeducedFromArrayBound() && !Y.wasDeducedFromArrayBound()) {298    QualType XType = X.getNonTypeTemplateArgumentType();299    if (!XType.isNull()) {300      QualType YType = Y.getNonTypeTemplateArgumentType();301      if (YType.isNull() || !Context.hasSameType(XType, YType))302        return DeducedTemplateArgument();303    }304  }305 306  switch (X.getKind()) {307  case TemplateArgument::Null:308    llvm_unreachable("Non-deduced template arguments handled above");309 310  case TemplateArgument::Type: {311    // If two template type arguments have the same type, they're compatible.312    QualType TX = X.getAsType(), TY = Y.getAsType();313    if (Y.getKind() == TemplateArgument::Type && Context.hasSameType(TX, TY))314      return DeducedTemplateArgument(Context.getCommonSugaredType(TX, TY),315                                     X.wasDeducedFromArrayBound() ||316                                         Y.wasDeducedFromArrayBound());317 318    // If one of the two arguments was deduced from an array bound, the other319    // supersedes it.320    if (X.wasDeducedFromArrayBound() != Y.wasDeducedFromArrayBound())321      return X.wasDeducedFromArrayBound() ? Y : X;322 323    // The arguments are not compatible.324    return DeducedTemplateArgument();325  }326 327  case TemplateArgument::Integral:328    // If we deduced a constant in one case and either a dependent expression or329    // declaration in another case, keep the integral constant.330    // If both are integral constants with the same value, keep that value.331    if (Y.getKind() == TemplateArgument::Expression ||332        Y.getKind() == TemplateArgument::Declaration ||333        (Y.getKind() == TemplateArgument::Integral &&334         llvm::APSInt::isSameValue(X.getAsIntegral(), Y.getAsIntegral())))335      return X.wasDeducedFromArrayBound() ? Y : X;336 337    // All other combinations are incompatible.338    return DeducedTemplateArgument();339 340  case TemplateArgument::StructuralValue:341    // If we deduced a value and a dependent expression, keep the value.342    if (Y.getKind() == TemplateArgument::Expression ||343        (Y.getKind() == TemplateArgument::StructuralValue &&344         X.structurallyEquals(Y)))345      return X;346 347    // All other combinations are incompatible.348    return DeducedTemplateArgument();349 350  case TemplateArgument::Template:351    if (Y.getKind() == TemplateArgument::Template &&352        Context.hasSameTemplateName(X.getAsTemplate(), Y.getAsTemplate()))353      return X;354 355    // All other combinations are incompatible.356    return DeducedTemplateArgument();357 358  case TemplateArgument::TemplateExpansion:359    if (Y.getKind() == TemplateArgument::TemplateExpansion &&360        Context.hasSameTemplateName(X.getAsTemplateOrTemplatePattern(),361                                    Y.getAsTemplateOrTemplatePattern()))362      return X;363 364    // All other combinations are incompatible.365    return DeducedTemplateArgument();366 367  case TemplateArgument::Expression: {368    if (Y.getKind() != TemplateArgument::Expression)369      return checkDeducedTemplateArguments(Context, Y, X);370 371    // Compare the expressions for equality372    llvm::FoldingSetNodeID ID1, ID2;373    X.getAsExpr()->Profile(ID1, Context, true);374    Y.getAsExpr()->Profile(ID2, Context, true);375    if (ID1 == ID2)376      return X.wasDeducedFromArrayBound() ? Y : X;377 378    // Differing dependent expressions are incompatible.379    return DeducedTemplateArgument();380  }381 382  case TemplateArgument::Declaration:383    assert(!X.wasDeducedFromArrayBound());384 385    // If we deduced a declaration and a dependent expression, keep the386    // declaration.387    if (Y.getKind() == TemplateArgument::Expression)388      return X;389 390    // If we deduced a declaration and an integral constant, keep the391    // integral constant and whichever type did not come from an array392    // bound.393    if (Y.getKind() == TemplateArgument::Integral) {394      if (Y.wasDeducedFromArrayBound())395        return TemplateArgument(Context, Y.getAsIntegral(),396                                X.getParamTypeForDecl());397      return Y;398    }399 400    // If we deduced two declarations, make sure that they refer to the401    // same declaration.402    if (Y.getKind() == TemplateArgument::Declaration &&403        isSameDeclaration(X.getAsDecl(), Y.getAsDecl()))404      return X;405 406    // All other combinations are incompatible.407    return DeducedTemplateArgument();408 409  case TemplateArgument::NullPtr:410    // If we deduced a null pointer and a dependent expression, keep the411    // null pointer.412    if (Y.getKind() == TemplateArgument::Expression)413      return TemplateArgument(Context.getCommonSugaredType(414                                  X.getNullPtrType(), Y.getAsExpr()->getType()),415                              true);416 417    // If we deduced a null pointer and an integral constant, keep the418    // integral constant.419    if (Y.getKind() == TemplateArgument::Integral)420      return Y;421 422    // If we deduced two null pointers, they are the same.423    if (Y.getKind() == TemplateArgument::NullPtr)424      return TemplateArgument(425          Context.getCommonSugaredType(X.getNullPtrType(), Y.getNullPtrType()),426          true);427 428    // All other combinations are incompatible.429    return DeducedTemplateArgument();430 431  case TemplateArgument::Pack: {432    if (Y.getKind() != TemplateArgument::Pack ||433        (!AggregateCandidateDeduction && X.pack_size() != Y.pack_size()))434      return DeducedTemplateArgument();435 436    llvm::SmallVector<TemplateArgument, 8> NewPack;437    for (TemplateArgument::pack_iterator438             XA = X.pack_begin(),439             XAEnd = X.pack_end(), YA = Y.pack_begin(), YAEnd = Y.pack_end();440         XA != XAEnd; ++XA) {441      if (YA != YAEnd) {442        TemplateArgument Merged = checkDeducedTemplateArguments(443            Context, DeducedTemplateArgument(*XA, X.wasDeducedFromArrayBound()),444            DeducedTemplateArgument(*YA, Y.wasDeducedFromArrayBound()));445        if (Merged.isNull() && !(XA->isNull() && YA->isNull()))446          return DeducedTemplateArgument();447        NewPack.push_back(Merged);448        ++YA;449      } else {450        NewPack.push_back(*XA);451      }452    }453 454    return DeducedTemplateArgument(455        TemplateArgument::CreatePackCopy(Context, NewPack),456        X.wasDeducedFromArrayBound() && Y.wasDeducedFromArrayBound());457  }458  }459 460  llvm_unreachable("Invalid TemplateArgument Kind!");461}462 463/// Deduce the value of the given non-type template parameter464/// as the given deduced template argument. All non-type template parameter465/// deduction is funneled through here.466static TemplateDeductionResult467DeduceNonTypeTemplateArgument(Sema &S, TemplateParameterList *TemplateParams,468                              const NonTypeOrVarTemplateParmDecl NTTP,469                              const DeducedTemplateArgument &NewDeduced,470                              QualType ValueType, TemplateDeductionInfo &Info,471                              bool PartialOrdering,472                              SmallVectorImpl<DeducedTemplateArgument> &Deduced,473                              bool *HasDeducedAnyParam) {474  assert(NTTP.getDepth() == Info.getDeducedDepth() &&475         "deducing non-type template argument with wrong depth");476 477  DeducedTemplateArgument Result = checkDeducedTemplateArguments(478      S.Context, Deduced[NTTP.getIndex()], NewDeduced);479  if (Result.isNull()) {480    Info.Param = NTTP.asTemplateParam();481    Info.FirstArg = Deduced[NTTP.getIndex()];482    Info.SecondArg = NewDeduced;483    return TemplateDeductionResult::Inconsistent;484  }485  Deduced[NTTP.getIndex()] = Result;486  if (!S.getLangOpts().CPlusPlus17 && !PartialOrdering)487    return TemplateDeductionResult::Success;488 489  if (NTTP.isExpandedParameterPack())490    // FIXME: We may still need to deduce parts of the type here! But we491    // don't have any way to find which slice of the type to use, and the492    // type stored on the NTTP itself is nonsense. Perhaps the type of an493    // expanded NTTP should be a pack expansion type?494    return TemplateDeductionResult::Success;495 496  // Get the type of the parameter for deduction. If it's a (dependent) array497  // or function type, we will not have decayed it yet, so do that now.498  QualType ParamType = S.Context.getAdjustedParameterType(NTTP.getType());499  if (auto *Expansion = dyn_cast<PackExpansionType>(ParamType))500    ParamType = Expansion->getPattern();501 502  // FIXME: It's not clear how deduction of a parameter of reference503  // type from an argument (of non-reference type) should be performed.504  // For now, we just make the argument have same reference type as the505  // parameter.506  if (ParamType->isReferenceType() && !ValueType->isReferenceType()) {507    if (ParamType->isRValueReferenceType())508      ValueType = S.Context.getRValueReferenceType(ValueType);509    else510      ValueType = S.Context.getLValueReferenceType(ValueType);511  }512 513  return DeduceTemplateArgumentsByTypeMatch(514      S, TemplateParams, ParamType, ValueType, Info, Deduced,515      TDF_SkipNonDependent | TDF_IgnoreQualifiers,516      PartialOrdering ? PartialOrderingKind::NonCall517                      : PartialOrderingKind::None,518      /*ArrayBound=*/NewDeduced.wasDeducedFromArrayBound(), HasDeducedAnyParam);519}520 521/// Deduce the value of the given non-type template parameter522/// from the given integral constant.523static TemplateDeductionResult DeduceNonTypeTemplateArgument(524    Sema &S, TemplateParameterList *TemplateParams,525    NonTypeOrVarTemplateParmDecl NTTP, const llvm::APSInt &Value,526    QualType ValueType, bool DeducedFromArrayBound, TemplateDeductionInfo &Info,527    bool PartialOrdering, SmallVectorImpl<DeducedTemplateArgument> &Deduced,528    bool *HasDeducedAnyParam) {529  return DeduceNonTypeTemplateArgument(530      S, TemplateParams, NTTP,531      DeducedTemplateArgument(S.Context, Value, ValueType,532                              DeducedFromArrayBound),533      ValueType, Info, PartialOrdering, Deduced, HasDeducedAnyParam);534}535 536/// Deduce the value of the given non-type template parameter537/// from the given null pointer template argument type.538static TemplateDeductionResult539DeduceNullPtrTemplateArgument(Sema &S, TemplateParameterList *TemplateParams,540                              NonTypeOrVarTemplateParmDecl NTTP,541                              QualType NullPtrType, TemplateDeductionInfo &Info,542                              bool PartialOrdering,543                              SmallVectorImpl<DeducedTemplateArgument> &Deduced,544                              bool *HasDeducedAnyParam) {545  Expr *Value = S.ImpCastExprToType(546                     new (S.Context) CXXNullPtrLiteralExpr(S.Context.NullPtrTy,547                                                           NTTP.getLocation()),548                     NullPtrType,549                     NullPtrType->isMemberPointerType() ? CK_NullToMemberPointer550                                                        : CK_NullToPointer)551                    .get();552  return DeduceNonTypeTemplateArgument(553      S, TemplateParams, NTTP, TemplateArgument(Value, /*IsCanonical=*/false),554      Value->getType(), Info, PartialOrdering, Deduced, HasDeducedAnyParam);555}556 557/// Deduce the value of the given non-type template parameter558/// from the given type- or value-dependent expression.559///560/// \returns true if deduction succeeded, false otherwise.561static TemplateDeductionResult562DeduceNonTypeTemplateArgument(Sema &S, TemplateParameterList *TemplateParams,563                              NonTypeOrVarTemplateParmDecl NTTP, Expr *Value,564                              TemplateDeductionInfo &Info, bool PartialOrdering,565                              SmallVectorImpl<DeducedTemplateArgument> &Deduced,566                              bool *HasDeducedAnyParam) {567  return DeduceNonTypeTemplateArgument(568      S, TemplateParams, NTTP, TemplateArgument(Value, /*IsCanonical=*/false),569      Value->getType(), Info, PartialOrdering, Deduced, HasDeducedAnyParam);570}571 572/// Deduce the value of the given non-type template parameter573/// from the given declaration.574///575/// \returns true if deduction succeeded, false otherwise.576static TemplateDeductionResult577DeduceNonTypeTemplateArgument(Sema &S, TemplateParameterList *TemplateParams,578                              NonTypeOrVarTemplateParmDecl NTTP, ValueDecl *D,579                              QualType T, TemplateDeductionInfo &Info,580                              bool PartialOrdering,581                              SmallVectorImpl<DeducedTemplateArgument> &Deduced,582                              bool *HasDeducedAnyParam) {583  TemplateArgument New(D, T);584  return DeduceNonTypeTemplateArgument(585      S, TemplateParams, NTTP, DeducedTemplateArgument(New), T, Info,586      PartialOrdering, Deduced, HasDeducedAnyParam);587}588 589static TemplateDeductionResult DeduceTemplateArguments(590    Sema &S, TemplateParameterList *TemplateParams, TemplateName Param,591    TemplateName Arg, TemplateDeductionInfo &Info,592    ArrayRef<TemplateArgument> DefaultArguments, bool PartialOrdering,593    SmallVectorImpl<DeducedTemplateArgument> &Deduced,594    bool *HasDeducedAnyParam) {595  TemplateDecl *ParamDecl = Param.getAsTemplateDecl();596  if (!ParamDecl) {597    // The parameter type is dependent and is not a template template parameter,598    // so there is nothing that we can deduce.599    return TemplateDeductionResult::Success;600  }601 602  if (auto *TempParam = dyn_cast<TemplateTemplateParmDecl>(ParamDecl)) {603    // If we're not deducing at this depth, there's nothing to deduce.604    if (TempParam->getDepth() != Info.getDeducedDepth())605      return TemplateDeductionResult::Success;606 607    ArrayRef<NamedDecl *> Params =608        ParamDecl->getTemplateParameters()->asArray();609    unsigned StartPos = 0;610    for (unsigned I = 0, E = std::min(Params.size(), DefaultArguments.size());611         I < E; ++I) {612      if (Params[I]->isParameterPack()) {613        StartPos = DefaultArguments.size();614        break;615      }616      StartPos = I + 1;617    }618 619    // Provisional resolution for CWG2398: If Arg names a template620    // specialization, then we deduce a synthesized template name621    // based on A, but using the TS's extra arguments, relative to P, as622    // defaults.623    DeducedTemplateArgument NewDeduced =624        PartialOrdering625            ? TemplateArgument(S.Context.getDeducedTemplateName(626                  Arg, {StartPos, DefaultArguments.drop_front(StartPos)}))627            : Arg;628 629    DeducedTemplateArgument Result = checkDeducedTemplateArguments(630        S.Context, Deduced[TempParam->getIndex()], NewDeduced);631    if (Result.isNull()) {632      Info.Param = TempParam;633      Info.FirstArg = Deduced[TempParam->getIndex()];634      Info.SecondArg = NewDeduced;635      return TemplateDeductionResult::Inconsistent;636    }637 638    Deduced[TempParam->getIndex()] = Result;639    if (HasDeducedAnyParam)640      *HasDeducedAnyParam = true;641    return TemplateDeductionResult::Success;642  }643 644  // Verify that the two template names are equivalent.645  if (S.Context.hasSameTemplateName(646          Param, Arg, /*IgnoreDeduced=*/DefaultArguments.size() != 0))647    return TemplateDeductionResult::Success;648 649  // Mismatch of non-dependent template parameter to argument.650  Info.FirstArg = TemplateArgument(Param);651  Info.SecondArg = TemplateArgument(Arg);652  return TemplateDeductionResult::NonDeducedMismatch;653}654 655/// Deduce the template arguments by comparing the template parameter656/// type (which is a template-id) with the template argument type.657///658/// \param S the Sema659///660/// \param TemplateParams the template parameters that we are deducing661///662/// \param P the parameter type663///664/// \param A the argument type665///666/// \param Info information about the template argument deduction itself667///668/// \param Deduced the deduced template arguments669///670/// \returns the result of template argument deduction so far. Note that a671/// "success" result means that template argument deduction has not yet failed,672/// but it may still fail, later, for other reasons.673 674static const TemplateSpecializationType *getLastTemplateSpecType(QualType QT) {675  const TemplateSpecializationType *LastTST = nullptr;676  for (const Type *T = QT.getTypePtr(); /**/; /**/) {677    const TemplateSpecializationType *TST =678        T->getAs<TemplateSpecializationType>();679    if (!TST)680      return LastTST;681    if (!TST->isSugared())682      return TST;683    LastTST = TST;684    T = TST->desugar().getTypePtr();685  }686}687 688static TemplateDeductionResult689DeduceTemplateSpecArguments(Sema &S, TemplateParameterList *TemplateParams,690                            const QualType P, QualType A,691                            TemplateDeductionInfo &Info, bool PartialOrdering,692                            SmallVectorImpl<DeducedTemplateArgument> &Deduced,693                            bool *HasDeducedAnyParam) {694  TemplateName TNP;695  ArrayRef<TemplateArgument> PResolved;696  if (isa<TemplateSpecializationType>(P.getCanonicalType())) {697    const TemplateSpecializationType *TP = ::getLastTemplateSpecType(P);698    TNP = TP->getTemplateName();699 700    // No deduction for specializations of dependent template names.701    if (TNP.getAsDependentTemplateName())702      return TemplateDeductionResult::Success;703 704    // FIXME: To preserve sugar, the TST needs to carry sugared resolved705    // arguments.706    PResolved =707        TP->castAsCanonical<TemplateSpecializationType>()->template_arguments();708  } else {709    const auto *TT = P->castAs<InjectedClassNameType>();710    TNP = TT->getTemplateName(S.Context);711    PResolved = TT->getTemplateArgs(S.Context);712  }713 714  // If the parameter is an alias template, there is nothing to deduce.715  if (const auto *TD = TNP.getAsTemplateDecl(); TD && TD->isTypeAlias())716    return TemplateDeductionResult::Success;717  // Pack-producing templates can only be matched after substitution.718  if (isPackProducingBuiltinTemplateName(TNP))719    return TemplateDeductionResult::Success;720 721  // Check whether the template argument is a dependent template-id.722  if (isa<TemplateSpecializationType>(A.getCanonicalType())) {723    const TemplateSpecializationType *SA = ::getLastTemplateSpecType(A);724    TemplateName TNA = SA->getTemplateName();725 726    // If the argument is an alias template, there is nothing to deduce.727    if (const auto *TD = TNA.getAsTemplateDecl(); TD && TD->isTypeAlias())728      return TemplateDeductionResult::Success;729 730    // FIXME: To preserve sugar, the TST needs to carry sugared resolved731    // arguments.732    ArrayRef<TemplateArgument> AResolved =733        SA->getCanonicalTypeInternal()734            ->castAs<TemplateSpecializationType>()735            ->template_arguments();736 737    // Perform template argument deduction for the template name.738    if (auto Result = DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,739                                              /*DefaultArguments=*/AResolved,740                                              PartialOrdering, Deduced,741                                              HasDeducedAnyParam);742        Result != TemplateDeductionResult::Success)743      return Result;744 745    // Perform template argument deduction on each template746    // argument. Ignore any missing/extra arguments, since they could be747    // filled in by default arguments.748    return DeduceTemplateArguments(749        S, TemplateParams, PResolved, AResolved, Info, Deduced,750        /*NumberOfArgumentsMustMatch=*/false, PartialOrdering,751        PackFold::ParameterToArgument, HasDeducedAnyParam);752  }753 754  // If the argument type is a class template specialization, we755  // perform template argument deduction using its template756  // arguments.757  const auto *TA = A->getAs<TagType>();758  TemplateName TNA;759  if (TA) {760    // FIXME: Can't use the template arguments from this TST, as they are not761    // resolved.762    if (const auto *TST = A->getAsNonAliasTemplateSpecializationType())763      TNA = TST->getTemplateName();764    else765      TNA = TA->getTemplateName(S.Context);766  }767  if (TNA.isNull()) {768    Info.FirstArg = TemplateArgument(P);769    Info.SecondArg = TemplateArgument(A);770    return TemplateDeductionResult::NonDeducedMismatch;771  }772 773  ArrayRef<TemplateArgument> AResolved = TA->getTemplateArgs(S.Context);774  // Perform template argument deduction for the template name.775  if (auto Result =776          DeduceTemplateArguments(S, TemplateParams, TNP, TNA, Info,777                                  /*DefaultArguments=*/AResolved,778                                  PartialOrdering, Deduced, HasDeducedAnyParam);779      Result != TemplateDeductionResult::Success)780    return Result;781 782  // Perform template argument deduction for the template arguments.783  return DeduceTemplateArguments(784      S, TemplateParams, PResolved, AResolved, Info, Deduced,785      /*NumberOfArgumentsMustMatch=*/true, PartialOrdering,786      PackFold::ParameterToArgument, HasDeducedAnyParam);787}788 789static bool IsPossiblyOpaquelyQualifiedTypeInternal(const Type *T) {790  assert(T->isCanonicalUnqualified());791 792  switch (T->getTypeClass()) {793  case Type::TypeOfExpr:794  case Type::TypeOf:795  case Type::DependentName:796  case Type::Decltype:797  case Type::PackIndexing:798  case Type::UnresolvedUsing:799  case Type::TemplateTypeParm:800  case Type::Auto:801    return true;802 803  case Type::ConstantArray:804  case Type::IncompleteArray:805  case Type::VariableArray:806  case Type::DependentSizedArray:807    return IsPossiblyOpaquelyQualifiedTypeInternal(808        cast<ArrayType>(T)->getElementType().getTypePtr());809 810  default:811    return false;812  }813}814 815/// Determines whether the given type is an opaque type that816/// might be more qualified when instantiated.817static bool IsPossiblyOpaquelyQualifiedType(QualType T) {818  return IsPossiblyOpaquelyQualifiedTypeInternal(819      T->getCanonicalTypeInternal().getTypePtr());820}821 822/// Helper function to build a TemplateParameter when we don't823/// know its type statically.824static TemplateParameter makeTemplateParameter(Decl *D) {825  if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(D))826    return TemplateParameter(TTP);827  if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D))828    return TemplateParameter(NTTP);829 830  return TemplateParameter(cast<TemplateTemplateParmDecl>(D));831}832 833/// A pack that we're currently deducing.834struct clang::DeducedPack {835  // The index of the pack.836  unsigned Index;837 838  // The old value of the pack before we started deducing it.839  DeducedTemplateArgument Saved;840 841  // A deferred value of this pack from an inner deduction, that couldn't be842  // deduced because this deduction hadn't happened yet.843  DeducedTemplateArgument DeferredDeduction;844 845  // The new value of the pack.846  SmallVector<DeducedTemplateArgument, 4> New;847 848  // The outer deduction for this pack, if any.849  DeducedPack *Outer = nullptr;850 851  DeducedPack(unsigned Index) : Index(Index) {}852};853 854namespace {855 856/// A scope in which we're performing pack deduction.857class PackDeductionScope {858public:859  /// Prepare to deduce the packs named within Pattern.860  /// \param FinishingDeduction Don't attempt to deduce the pack. Useful when861  /// just checking a previous deduction of the pack.862  PackDeductionScope(Sema &S, TemplateParameterList *TemplateParams,863                     SmallVectorImpl<DeducedTemplateArgument> &Deduced,864                     TemplateDeductionInfo &Info, TemplateArgument Pattern,865                     bool DeducePackIfNotAlreadyDeduced = false,866                     bool FinishingDeduction = false)867      : S(S), TemplateParams(TemplateParams), Deduced(Deduced), Info(Info),868        DeducePackIfNotAlreadyDeduced(DeducePackIfNotAlreadyDeduced),869        FinishingDeduction(FinishingDeduction) {870    unsigned NumNamedPacks = addPacks(Pattern);871    finishConstruction(NumNamedPacks);872  }873 874  /// Prepare to directly deduce arguments of the parameter with index \p Index.875  PackDeductionScope(Sema &S, TemplateParameterList *TemplateParams,876                     SmallVectorImpl<DeducedTemplateArgument> &Deduced,877                     TemplateDeductionInfo &Info, unsigned Index)878      : S(S), TemplateParams(TemplateParams), Deduced(Deduced), Info(Info) {879    addPack(Index);880    finishConstruction(1);881  }882 883private:884  void addPack(unsigned Index) {885    // Save the deduced template argument for the parameter pack expanded886    // by this pack expansion, then clear out the deduction.887    DeducedFromEarlierParameter = !Deduced[Index].isNull();888    DeducedPack Pack(Index);889    if (!FinishingDeduction) {890      Pack.Saved = Deduced[Index];891      Deduced[Index] = TemplateArgument();892    }893 894    // FIXME: What if we encounter multiple packs with different numbers of895    // pre-expanded expansions? (This should already have been diagnosed896    // during substitution.)897    if (UnsignedOrNone ExpandedPackExpansions =898            getExpandedPackSize(TemplateParams->getParam(Index)))899      FixedNumExpansions = ExpandedPackExpansions;900 901    Packs.push_back(Pack);902  }903 904  unsigned addPacks(TemplateArgument Pattern) {905    // Compute the set of template parameter indices that correspond to906    // parameter packs expanded by the pack expansion.907    llvm::SmallBitVector SawIndices(TemplateParams->size());908    llvm::SmallVector<TemplateArgument, 4> ExtraDeductions;909 910    auto AddPack = [&](unsigned Index) {911      if (SawIndices[Index])912        return;913      SawIndices[Index] = true;914      addPack(Index);915 916      // Deducing a parameter pack that is a pack expansion also constrains the917      // packs appearing in that parameter to have the same deduced arity. Also,918      // in C++17 onwards, deducing a non-type template parameter deduces its919      // type, so we need to collect the pending deduced values for those packs.920      if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(921              TemplateParams->getParam(Index))) {922        if (!NTTP->isExpandedParameterPack())923          // FIXME: CWG2982 suggests a type-constraint forms a non-deduced924          // context, however it is not yet resolved.925          if (auto *Expansion = dyn_cast<PackExpansionType>(926                  S.Context.getUnconstrainedType(NTTP->getType())))927            ExtraDeductions.push_back(Expansion->getPattern());928      }929      // FIXME: Also collect the unexpanded packs in any type and template930      // parameter packs that are pack expansions.931    };932 933    auto Collect = [&](TemplateArgument Pattern) {934      SmallVector<UnexpandedParameterPack, 2> Unexpanded;935      S.collectUnexpandedParameterPacks(Pattern, Unexpanded);936      for (unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {937        unsigned Depth, Index;938        if (auto DI = getDepthAndIndex(Unexpanded[I]))939          std::tie(Depth, Index) = *DI;940        else941          continue;942 943        if (Depth == Info.getDeducedDepth())944          AddPack(Index);945      }946    };947 948    // Look for unexpanded packs in the pattern.949    Collect(Pattern);950 951    unsigned NumNamedPacks = Packs.size();952 953    // Also look for unexpanded packs that are indirectly deduced by deducing954    // the sizes of the packs in this pattern.955    while (!ExtraDeductions.empty())956      Collect(ExtraDeductions.pop_back_val());957 958    return NumNamedPacks;959  }960 961  void finishConstruction(unsigned NumNamedPacks) {962    // Dig out the partially-substituted pack, if there is one.963    const TemplateArgument *PartialPackArgs = nullptr;964    unsigned NumPartialPackArgs = 0;965    std::pair<unsigned, unsigned> PartialPackDepthIndex(-1u, -1u);966    if (auto *Scope = S.CurrentInstantiationScope)967      if (auto *Partial = Scope->getPartiallySubstitutedPack(968              &PartialPackArgs, &NumPartialPackArgs))969        PartialPackDepthIndex = getDepthAndIndex(Partial);970 971    // This pack expansion will have been partially or fully expanded if972    // it only names explicitly-specified parameter packs (including the973    // partially-substituted one, if any).974    bool IsExpanded = true;975    for (unsigned I = 0; I != NumNamedPacks; ++I) {976      if (Packs[I].Index >= Info.getNumExplicitArgs()) {977        IsExpanded = false;978        IsPartiallyExpanded = false;979        break;980      }981      if (PartialPackDepthIndex ==982            std::make_pair(Info.getDeducedDepth(), Packs[I].Index)) {983        IsPartiallyExpanded = true;984      }985    }986 987    // Skip over the pack elements that were expanded into separate arguments.988    // If we partially expanded, this is the number of partial arguments.989    // FIXME: `&& FixedNumExpansions` is a workaround for UB described in990    // https://github.com/llvm/llvm-project/issues/100095991    if (IsPartiallyExpanded)992      PackElements += NumPartialPackArgs;993    else if (IsExpanded && FixedNumExpansions)994      PackElements += *FixedNumExpansions;995 996    for (auto &Pack : Packs) {997      if (Info.PendingDeducedPacks.size() > Pack.Index)998        Pack.Outer = Info.PendingDeducedPacks[Pack.Index];999      else1000        Info.PendingDeducedPacks.resize(Pack.Index + 1);1001      Info.PendingDeducedPacks[Pack.Index] = &Pack;1002 1003      if (PartialPackDepthIndex ==1004            std::make_pair(Info.getDeducedDepth(), Pack.Index)) {1005        Pack.New.append(PartialPackArgs, PartialPackArgs + NumPartialPackArgs);1006        // We pre-populate the deduced value of the partially-substituted1007        // pack with the specified value. This is not entirely correct: the1008        // value is supposed to have been substituted, not deduced, but the1009        // cases where this is observable require an exact type match anyway.1010        //1011        // FIXME: If we could represent a "depth i, index j, pack elem k"1012        // parameter, we could substitute the partially-substituted pack1013        // everywhere and avoid this.1014        if (!FinishingDeduction && !IsPartiallyExpanded)1015          Deduced[Pack.Index] = Pack.New[PackElements];1016      }1017    }1018  }1019 1020public:1021  ~PackDeductionScope() {1022    for (auto &Pack : Packs)1023      Info.PendingDeducedPacks[Pack.Index] = Pack.Outer;1024  }1025 1026  // Return the size of the saved packs if all of them has the same size.1027  UnsignedOrNone getSavedPackSizeIfAllEqual() const {1028    unsigned PackSize = Packs[0].Saved.pack_size();1029 1030    if (std::all_of(Packs.begin() + 1, Packs.end(), [&PackSize](const auto &P) {1031          return P.Saved.pack_size() == PackSize;1032        }))1033      return PackSize;1034    return std::nullopt;1035  }1036 1037  /// Determine whether this pack has already been deduced from a previous1038  /// argument.1039  bool isDeducedFromEarlierParameter() const {1040    return DeducedFromEarlierParameter;1041  }1042 1043  /// Determine whether this pack has already been partially expanded into a1044  /// sequence of (prior) function parameters / template arguments.1045  bool isPartiallyExpanded() { return IsPartiallyExpanded; }1046 1047  /// Determine whether this pack expansion scope has a known, fixed arity.1048  /// This happens if it involves a pack from an outer template that has1049  /// (notionally) already been expanded.1050  bool hasFixedArity() { return static_cast<bool>(FixedNumExpansions); }1051 1052  /// Determine whether the next element of the argument is still part of this1053  /// pack. This is the case unless the pack is already expanded to a fixed1054  /// length.1055  bool hasNextElement() {1056    return !FixedNumExpansions || *FixedNumExpansions > PackElements;1057  }1058 1059  /// Move to deducing the next element in each pack that is being deduced.1060  void nextPackElement() {1061    // Capture the deduced template arguments for each parameter pack expanded1062    // by this pack expansion, add them to the list of arguments we've deduced1063    // for that pack, then clear out the deduced argument.1064    if (!FinishingDeduction) {1065      for (auto &Pack : Packs) {1066        DeducedTemplateArgument &DeducedArg = Deduced[Pack.Index];1067        if (!Pack.New.empty() || !DeducedArg.isNull()) {1068          while (Pack.New.size() < PackElements)1069            Pack.New.push_back(DeducedTemplateArgument());1070          if (Pack.New.size() == PackElements)1071            Pack.New.push_back(DeducedArg);1072          else1073            Pack.New[PackElements] = DeducedArg;1074          DeducedArg = Pack.New.size() > PackElements + 11075                           ? Pack.New[PackElements + 1]1076                           : DeducedTemplateArgument();1077        }1078      }1079    }1080    ++PackElements;1081  }1082 1083  /// Finish template argument deduction for a set of argument packs,1084  /// producing the argument packs and checking for consistency with prior1085  /// deductions.1086  TemplateDeductionResult finish() {1087    if (FinishingDeduction)1088      return TemplateDeductionResult::Success;1089    // Build argument packs for each of the parameter packs expanded by this1090    // pack expansion.1091    for (auto &Pack : Packs) {1092      // Put back the old value for this pack.1093      if (!FinishingDeduction)1094        Deduced[Pack.Index] = Pack.Saved;1095 1096      // Always make sure the size of this pack is correct, even if we didn't1097      // deduce any values for it.1098      //1099      // FIXME: This isn't required by the normative wording, but substitution1100      // and post-substitution checking will always fail if the arity of any1101      // pack is not equal to the number of elements we processed. (Either that1102      // or something else has gone *very* wrong.) We're permitted to skip any1103      // hard errors from those follow-on steps by the intent (but not the1104      // wording) of C++ [temp.inst]p8:1105      //1106      //   If the function selected by overload resolution can be determined1107      //   without instantiating a class template definition, it is unspecified1108      //   whether that instantiation actually takes place1109      Pack.New.resize(PackElements);1110 1111      // Build or find a new value for this pack.1112      DeducedTemplateArgument NewPack;1113      if (Pack.New.empty()) {1114        // If we deduced an empty argument pack, create it now.1115        NewPack = DeducedTemplateArgument(TemplateArgument::getEmptyPack());1116      } else {1117        TemplateArgument *ArgumentPack =1118            new (S.Context) TemplateArgument[Pack.New.size()];1119        std::copy(Pack.New.begin(), Pack.New.end(), ArgumentPack);1120        NewPack = DeducedTemplateArgument(1121            TemplateArgument(llvm::ArrayRef(ArgumentPack, Pack.New.size())),1122            // FIXME: This is wrong, it's possible that some pack elements are1123            // deduced from an array bound and others are not:1124            //   template<typename ...T, T ...V> void g(const T (&...p)[V]);1125            //   g({1, 2, 3}, {{}, {}});1126            // ... should deduce T = {int, size_t (from array bound)}.1127            Pack.New[0].wasDeducedFromArrayBound());1128      }1129 1130      // Pick where we're going to put the merged pack.1131      DeducedTemplateArgument *Loc;1132      if (Pack.Outer) {1133        if (Pack.Outer->DeferredDeduction.isNull()) {1134          // Defer checking this pack until we have a complete pack to compare1135          // it against.1136          Pack.Outer->DeferredDeduction = NewPack;1137          continue;1138        }1139        Loc = &Pack.Outer->DeferredDeduction;1140      } else {1141        Loc = &Deduced[Pack.Index];1142      }1143 1144      // Check the new pack matches any previous value.1145      DeducedTemplateArgument OldPack = *Loc;1146      DeducedTemplateArgument Result = checkDeducedTemplateArguments(1147          S.Context, OldPack, NewPack, DeducePackIfNotAlreadyDeduced);1148 1149      Info.AggregateDeductionCandidateHasMismatchedArity =1150          OldPack.getKind() == TemplateArgument::Pack &&1151          NewPack.getKind() == TemplateArgument::Pack &&1152          OldPack.pack_size() != NewPack.pack_size() && !Result.isNull();1153 1154      // If we deferred a deduction of this pack, check that one now too.1155      if (!Result.isNull() && !Pack.DeferredDeduction.isNull()) {1156        OldPack = Result;1157        NewPack = Pack.DeferredDeduction;1158        Result = checkDeducedTemplateArguments(S.Context, OldPack, NewPack);1159      }1160 1161      NamedDecl *Param = TemplateParams->getParam(Pack.Index);1162      if (Result.isNull()) {1163        Info.Param = makeTemplateParameter(Param);1164        Info.FirstArg = OldPack;1165        Info.SecondArg = NewPack;1166        return TemplateDeductionResult::Inconsistent;1167      }1168 1169      // If we have a pre-expanded pack and we didn't deduce enough elements1170      // for it, fail deduction.1171      if (UnsignedOrNone Expansions = getExpandedPackSize(Param)) {1172        if (*Expansions != PackElements) {1173          Info.Param = makeTemplateParameter(Param);1174          Info.FirstArg = Result;1175          return TemplateDeductionResult::IncompletePack;1176        }1177      }1178 1179      *Loc = Result;1180    }1181 1182    return TemplateDeductionResult::Success;1183  }1184 1185private:1186  Sema &S;1187  TemplateParameterList *TemplateParams;1188  SmallVectorImpl<DeducedTemplateArgument> &Deduced;1189  TemplateDeductionInfo &Info;1190  unsigned PackElements = 0;1191  bool IsPartiallyExpanded = false;1192  bool DeducePackIfNotAlreadyDeduced = false;1193  bool DeducedFromEarlierParameter = false;1194  bool FinishingDeduction = false;1195  /// The number of expansions, if we have a fully-expanded pack in this scope.1196  UnsignedOrNone FixedNumExpansions = std::nullopt;1197 1198  SmallVector<DeducedPack, 2> Packs;1199};1200 1201} // namespace1202 1203template <class T>1204static TemplateDeductionResult DeduceForEachType(1205    Sema &S, TemplateParameterList *TemplateParams, ArrayRef<QualType> Params,1206    ArrayRef<QualType> Args, TemplateDeductionInfo &Info,1207    SmallVectorImpl<DeducedTemplateArgument> &Deduced, PartialOrderingKind POK,1208    bool FinishingDeduction, T &&DeductFunc) {1209  // C++0x [temp.deduct.type]p10:1210  //   Similarly, if P has a form that contains (T), then each parameter type1211  //   Pi of the respective parameter-type- list of P is compared with the1212  //   corresponding parameter type Ai of the corresponding parameter-type-list1213  //   of A. [...]1214  unsigned ArgIdx = 0, ParamIdx = 0;1215  for (; ParamIdx != Params.size(); ++ParamIdx) {1216    // Check argument types.1217    const PackExpansionType *Expansion1218                                = dyn_cast<PackExpansionType>(Params[ParamIdx]);1219    if (!Expansion) {1220      // Simple case: compare the parameter and argument types at this point.1221 1222      // Make sure we have an argument.1223      if (ArgIdx >= Args.size())1224        return TemplateDeductionResult::MiscellaneousDeductionFailure;1225 1226      if (isa<PackExpansionType>(Args[ArgIdx])) {1227        // C++0x [temp.deduct.type]p22:1228        //   If the original function parameter associated with A is a function1229        //   parameter pack and the function parameter associated with P is not1230        //   a function parameter pack, then template argument deduction fails.1231        return TemplateDeductionResult::MiscellaneousDeductionFailure;1232      }1233 1234      if (TemplateDeductionResult Result =1235              DeductFunc(S, TemplateParams, ParamIdx, ArgIdx,1236                         Params[ParamIdx].getUnqualifiedType(),1237                         Args[ArgIdx].getUnqualifiedType(), Info, Deduced, POK);1238          Result != TemplateDeductionResult::Success)1239        return Result;1240 1241      ++ArgIdx;1242      continue;1243    }1244 1245    // C++0x [temp.deduct.type]p10:1246    //   If the parameter-declaration corresponding to Pi is a function1247    //   parameter pack, then the type of its declarator- id is compared with1248    //   each remaining parameter type in the parameter-type-list of A. Each1249    //   comparison deduces template arguments for subsequent positions in the1250    //   template parameter packs expanded by the function parameter pack.1251 1252    QualType Pattern = Expansion->getPattern();1253    PackDeductionScope PackScope(S, TemplateParams, Deduced, Info, Pattern,1254                                 /*DeducePackIfNotAlreadyDeduced=*/false,1255                                 FinishingDeduction);1256 1257    // A pack scope with fixed arity is not really a pack any more, so is not1258    // a non-deduced context.1259    if (ParamIdx + 1 == Params.size() || PackScope.hasFixedArity()) {1260      for (; ArgIdx < Args.size() && PackScope.hasNextElement(); ++ArgIdx) {1261        // Deduce template arguments from the pattern.1262        if (TemplateDeductionResult Result = DeductFunc(1263                S, TemplateParams, ParamIdx, ArgIdx,1264                Pattern.getUnqualifiedType(), Args[ArgIdx].getUnqualifiedType(),1265                Info, Deduced, POK);1266            Result != TemplateDeductionResult::Success)1267          return Result;1268        PackScope.nextPackElement();1269      }1270    } else {1271      // C++0x [temp.deduct.type]p5:1272      //   The non-deduced contexts are:1273      //     - A function parameter pack that does not occur at the end of the1274      //       parameter-declaration-clause.1275      //1276      // FIXME: There is no wording to say what we should do in this case. We1277      // choose to resolve this by applying the same rule that is applied for a1278      // function call: that is, deduce all contained packs to their1279      // explicitly-specified values (or to <> if there is no such value).1280      //1281      // This is seemingly-arbitrarily different from the case of a template-id1282      // with a non-trailing pack-expansion in its arguments, which renders the1283      // entire template-argument-list a non-deduced context.1284 1285      // If the parameter type contains an explicitly-specified pack that we1286      // could not expand, skip the number of parameters notionally created1287      // by the expansion.1288      UnsignedOrNone NumExpansions = Expansion->getNumExpansions();1289      if (NumExpansions && !PackScope.isPartiallyExpanded()) {1290        for (unsigned I = 0; I != *NumExpansions && ArgIdx < Args.size();1291             ++I, ++ArgIdx)1292          PackScope.nextPackElement();1293      }1294    }1295 1296    // Build argument packs for each of the parameter packs expanded by this1297    // pack expansion.1298    if (auto Result = PackScope.finish();1299        Result != TemplateDeductionResult::Success)1300      return Result;1301  }1302 1303  // DR692, DR13951304  // C++0x [temp.deduct.type]p10:1305  // If the parameter-declaration corresponding to P_i ...1306  // During partial ordering, if Ai was originally a function parameter pack:1307  // - if P does not contain a function parameter type corresponding to Ai then1308  //   Ai is ignored;1309  if (POK == PartialOrderingKind::Call && ArgIdx + 1 == Args.size() &&1310      isa<PackExpansionType>(Args[ArgIdx]))1311    return TemplateDeductionResult::Success;1312 1313  // Make sure we don't have any extra arguments.1314  if (ArgIdx < Args.size())1315    return TemplateDeductionResult::MiscellaneousDeductionFailure;1316 1317  return TemplateDeductionResult::Success;1318}1319 1320/// Deduce the template arguments by comparing the list of parameter1321/// types to the list of argument types, as in the parameter-type-lists of1322/// function types (C++ [temp.deduct.type]p10).1323///1324/// \param S The semantic analysis object within which we are deducing1325///1326/// \param TemplateParams The template parameters that we are deducing1327///1328/// \param Params The list of parameter types1329///1330/// \param Args The list of argument types1331///1332/// \param Info information about the template argument deduction itself1333///1334/// \param Deduced the deduced template arguments1335///1336/// \param TDF bitwise OR of the TemplateDeductionFlags bits that describe1337/// how template argument deduction is performed.1338///1339/// \param PartialOrdering If true, we are performing template argument1340/// deduction for during partial ordering for a call1341/// (C++0x [temp.deduct.partial]).1342///1343/// \param HasDeducedAnyParam If set, the object pointed at will indicate1344/// whether any template parameter was deduced.1345///1346/// \param HasDeducedParam If set, the bit vector will be used to represent1347/// which template parameters were deduced, in order.1348///1349/// \returns the result of template argument deduction so far. Note that a1350/// "success" result means that template argument deduction has not yet failed,1351/// but it may still fail, later, for other reasons.1352static TemplateDeductionResult DeduceTemplateArguments(1353    Sema &S, TemplateParameterList *TemplateParams, ArrayRef<QualType> Params,1354    ArrayRef<QualType> Args, TemplateDeductionInfo &Info,1355    SmallVectorImpl<DeducedTemplateArgument> &Deduced, unsigned TDF,1356    PartialOrderingKind POK, bool *HasDeducedAnyParam,1357    llvm::SmallBitVector *HasDeducedParam) {1358  return ::DeduceForEachType(1359      S, TemplateParams, Params, Args, Info, Deduced, POK,1360      /*FinishingDeduction=*/false,1361      [&](Sema &S, TemplateParameterList *TemplateParams, int ParamIdx,1362          int ArgIdx, QualType P, QualType A, TemplateDeductionInfo &Info,1363          SmallVectorImpl<DeducedTemplateArgument> &Deduced,1364          PartialOrderingKind POK) {1365        bool HasDeducedAnyParamCopy = false;1366        TemplateDeductionResult TDR = DeduceTemplateArgumentsByTypeMatch(1367            S, TemplateParams, P, A, Info, Deduced, TDF, POK,1368            /*DeducedFromArrayBound=*/false, &HasDeducedAnyParamCopy);1369        if (HasDeducedAnyParam && HasDeducedAnyParamCopy)1370          *HasDeducedAnyParam = true;1371        if (HasDeducedParam && HasDeducedAnyParamCopy)1372          (*HasDeducedParam)[ParamIdx] = true;1373        return TDR;1374      });1375}1376 1377/// Determine whether the parameter has qualifiers that the argument1378/// lacks. Put another way, determine whether there is no way to add1379/// a deduced set of qualifiers to the ParamType that would result in1380/// its qualifiers matching those of the ArgType.1381static bool hasInconsistentOrSupersetQualifiersOf(QualType ParamType,1382                                                  QualType ArgType) {1383  Qualifiers ParamQs = ParamType.getQualifiers();1384  Qualifiers ArgQs = ArgType.getQualifiers();1385 1386  if (ParamQs == ArgQs)1387    return false;1388 1389  // Mismatched (but not missing) Objective-C GC attributes.1390  if (ParamQs.getObjCGCAttr() != ArgQs.getObjCGCAttr() &&1391      ParamQs.hasObjCGCAttr())1392    return true;1393 1394  // Mismatched (but not missing) address spaces.1395  if (ParamQs.getAddressSpace() != ArgQs.getAddressSpace() &&1396      ParamQs.hasAddressSpace())1397    return true;1398 1399  // Mismatched (but not missing) Objective-C lifetime qualifiers.1400  if (ParamQs.getObjCLifetime() != ArgQs.getObjCLifetime() &&1401      ParamQs.hasObjCLifetime())1402    return true;1403 1404  // CVR qualifiers inconsistent or a superset.1405  return (ParamQs.getCVRQualifiers() & ~ArgQs.getCVRQualifiers()) != 0;1406}1407 1408bool Sema::isSameOrCompatibleFunctionType(QualType P, QualType A) {1409  const FunctionType *PF = P->getAs<FunctionType>(),1410                     *AF = A->getAs<FunctionType>();1411 1412  // Just compare if not functions.1413  if (!PF || !AF)1414    return Context.hasSameType(P, A);1415 1416  // Noreturn and noexcept adjustment.1417  if (QualType AdjustedParam; TryFunctionConversion(P, A, AdjustedParam))1418    P = AdjustedParam;1419 1420  // FIXME: Compatible calling conventions.1421  return Context.hasSameFunctionTypeIgnoringExceptionSpec(P, A);1422}1423 1424/// Get the index of the first template parameter that was originally from the1425/// innermost template-parameter-list. This is 0 except when we concatenate1426/// the template parameter lists of a class template and a constructor template1427/// when forming an implicit deduction guide.1428static unsigned getFirstInnerIndex(FunctionTemplateDecl *FTD) {1429  auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FTD->getTemplatedDecl());1430  if (!Guide || !Guide->isImplicit())1431    return 0;1432  return Guide->getDeducedTemplate()->getTemplateParameters()->size();1433}1434 1435/// Determine whether a type denotes a forwarding reference.1436static bool isForwardingReference(QualType Param, unsigned FirstInnerIndex) {1437  // C++1z [temp.deduct.call]p3:1438  //   A forwarding reference is an rvalue reference to a cv-unqualified1439  //   template parameter that does not represent a template parameter of a1440  //   class template.1441  if (auto *ParamRef = Param->getAs<RValueReferenceType>()) {1442    if (ParamRef->getPointeeType().getQualifiers())1443      return false;1444    auto *TypeParm =1445        ParamRef->getPointeeType()->getAsCanonical<TemplateTypeParmType>();1446    return TypeParm && TypeParm->getIndex() >= FirstInnerIndex;1447  }1448  return false;1449}1450 1451///  Attempt to deduce the template arguments by checking the base types1452///  according to (C++20 [temp.deduct.call] p4b3.1453///1454/// \param S the semantic analysis object within which we are deducing.1455///1456/// \param RD the top level record object we are deducing against.1457///1458/// \param TemplateParams the template parameters that we are deducing.1459///1460/// \param P the template specialization parameter type.1461///1462/// \param Info information about the template argument deduction itself.1463///1464/// \param Deduced the deduced template arguments.1465///1466/// \returns the result of template argument deduction with the bases. "invalid"1467/// means no matches, "success" found a single item, and the1468/// "MiscellaneousDeductionFailure" result happens when the match is ambiguous.1469static TemplateDeductionResult1470DeduceTemplateBases(Sema &S, const CXXRecordDecl *RD,1471                    TemplateParameterList *TemplateParams, QualType P,1472                    TemplateDeductionInfo &Info, bool PartialOrdering,1473                    SmallVectorImpl<DeducedTemplateArgument> &Deduced,1474                    bool *HasDeducedAnyParam) {1475  // C++14 [temp.deduct.call] p4b3:1476  //   If P is a class and P has the form simple-template-id, then the1477  //   transformed A can be a derived class of the deduced A. Likewise if1478  //   P is a pointer to a class of the form simple-template-id, the1479  //   transformed A can be a pointer to a derived class pointed to by the1480  //   deduced A. However, if there is a class C that is a (direct or1481  //   indirect) base class of D and derived (directly or indirectly) from a1482  //   class B and that would be a valid deduced A, the deduced A cannot be1483  //   B or pointer to B, respectively.1484  //1485  //   These alternatives are considered only if type deduction would1486  //   otherwise fail. If they yield more than one possible deduced A, the1487  //   type deduction fails.1488 1489  // Use a breadth-first search through the bases to collect the set of1490  // successful matches. Visited contains the set of nodes we have already1491  // visited, while ToVisit is our stack of records that we still need to1492  // visit.  Matches contains a list of matches that have yet to be1493  // disqualified.1494  llvm::SmallPtrSet<const CXXRecordDecl *, 8> Visited;1495  SmallVector<QualType, 8> ToVisit;1496  // We iterate over this later, so we have to use MapVector to ensure1497  // determinism.1498  struct MatchValue {1499    SmallVector<DeducedTemplateArgument, 8> Deduced;1500    bool HasDeducedAnyParam;1501  };1502  llvm::MapVector<const CXXRecordDecl *, MatchValue> Matches;1503 1504  auto AddBases = [&Visited, &ToVisit](const CXXRecordDecl *RD) {1505    for (const auto &Base : RD->bases()) {1506      QualType T = Base.getType();1507      assert(T->isRecordType() && "Base class that isn't a record?");1508      if (Visited.insert(T->getAsCXXRecordDecl()).second)1509        ToVisit.push_back(T);1510    }1511  };1512 1513  // Set up the loop by adding all the bases.1514  AddBases(RD);1515 1516  // Search each path of bases until we either run into a successful match1517  // (where all bases of it are invalid), or we run out of bases.1518  while (!ToVisit.empty()) {1519    QualType NextT = ToVisit.pop_back_val();1520 1521    SmallVector<DeducedTemplateArgument, 8> DeducedCopy(Deduced.begin(),1522                                                        Deduced.end());1523    TemplateDeductionInfo BaseInfo(TemplateDeductionInfo::ForBase, Info);1524    bool HasDeducedAnyParamCopy = false;1525    TemplateDeductionResult BaseResult = DeduceTemplateSpecArguments(1526        S, TemplateParams, P, NextT, BaseInfo, PartialOrdering, DeducedCopy,1527        &HasDeducedAnyParamCopy);1528 1529    // If this was a successful deduction, add it to the list of matches,1530    // otherwise we need to continue searching its bases.1531    const CXXRecordDecl *RD = NextT->getAsCXXRecordDecl();1532    if (BaseResult == TemplateDeductionResult::Success)1533      Matches.insert({RD, {DeducedCopy, HasDeducedAnyParamCopy}});1534    else1535      AddBases(RD);1536  }1537 1538  // At this point, 'Matches' contains a list of seemingly valid bases, however1539  // in the event that we have more than 1 match, it is possible that the base1540  // of one of the matches might be disqualified for being a base of another1541  // valid match. We can count on cyclical instantiations being invalid to1542  // simplify the disqualifications.  That is, if A & B are both matches, and B1543  // inherits from A (disqualifying A), we know that A cannot inherit from B.1544  if (Matches.size() > 1) {1545    Visited.clear();1546    for (const auto &Match : Matches)1547      AddBases(Match.first);1548 1549    // We can give up once we have a single item (or have run out of things to1550    // search) since cyclical inheritance isn't valid.1551    while (Matches.size() > 1 && !ToVisit.empty()) {1552      const CXXRecordDecl *RD = ToVisit.pop_back_val()->getAsCXXRecordDecl();1553      Matches.erase(RD);1554 1555      // Always add all bases, since the inheritance tree can contain1556      // disqualifications for multiple matches.1557      AddBases(RD);1558    }1559  }1560 1561  if (Matches.empty())1562    return TemplateDeductionResult::Invalid;1563  if (Matches.size() > 1)1564    return TemplateDeductionResult::MiscellaneousDeductionFailure;1565 1566  std::swap(Matches.front().second.Deduced, Deduced);1567  if (bool HasDeducedAnyParamCopy = Matches.front().second.HasDeducedAnyParam;1568      HasDeducedAnyParamCopy && HasDeducedAnyParam)1569    *HasDeducedAnyParam = HasDeducedAnyParamCopy;1570  return TemplateDeductionResult::Success;1571}1572 1573/// When propagating a partial ordering kind into a NonCall context,1574/// this is used to downgrade a 'Call' into a 'NonCall', so that1575/// the kind still reflects whether we are in a partial ordering context.1576static PartialOrderingKind1577degradeCallPartialOrderingKind(PartialOrderingKind POK) {1578  return std::min(POK, PartialOrderingKind::NonCall);1579}1580 1581/// Deduce the template arguments by comparing the parameter type and1582/// the argument type (C++ [temp.deduct.type]).1583///1584/// \param S the semantic analysis object within which we are deducing1585///1586/// \param TemplateParams the template parameters that we are deducing1587///1588/// \param P the parameter type1589///1590/// \param A the argument type1591///1592/// \param Info information about the template argument deduction itself1593///1594/// \param Deduced the deduced template arguments1595///1596/// \param TDF bitwise OR of the TemplateDeductionFlags bits that describe1597/// how template argument deduction is performed.1598///1599/// \param PartialOrdering Whether we're performing template argument deduction1600/// in the context of partial ordering (C++0x [temp.deduct.partial]).1601///1602/// \returns the result of template argument deduction so far. Note that a1603/// "success" result means that template argument deduction has not yet failed,1604/// but it may still fail, later, for other reasons.1605static TemplateDeductionResult DeduceTemplateArgumentsByTypeMatch(1606    Sema &S, TemplateParameterList *TemplateParams, QualType P, QualType A,1607    TemplateDeductionInfo &Info,1608    SmallVectorImpl<DeducedTemplateArgument> &Deduced, unsigned TDF,1609    PartialOrderingKind POK, bool DeducedFromArrayBound,1610    bool *HasDeducedAnyParam) {1611 1612  // If the argument type is a pack expansion, look at its pattern.1613  // This isn't explicitly called out1614  if (const auto *AExp = dyn_cast<PackExpansionType>(A))1615    A = AExp->getPattern();1616  assert(!isa<PackExpansionType>(A.getCanonicalType()));1617 1618  if (POK == PartialOrderingKind::Call) {1619    // C++11 [temp.deduct.partial]p5:1620    //   Before the partial ordering is done, certain transformations are1621    //   performed on the types used for partial ordering:1622    //     - If P is a reference type, P is replaced by the type referred to.1623    const ReferenceType *PRef = P->getAs<ReferenceType>();1624    if (PRef)1625      P = PRef->getPointeeType();1626 1627    //     - If A is a reference type, A is replaced by the type referred to.1628    const ReferenceType *ARef = A->getAs<ReferenceType>();1629    if (ARef)1630      A = A->getPointeeType();1631 1632    if (PRef && ARef && S.Context.hasSameUnqualifiedType(P, A)) {1633      // C++11 [temp.deduct.partial]p9:1634      //   If, for a given type, deduction succeeds in both directions (i.e.,1635      //   the types are identical after the transformations above) and both1636      //   P and A were reference types [...]:1637      //     - if [one type] was an lvalue reference and [the other type] was1638      //       not, [the other type] is not considered to be at least as1639      //       specialized as [the first type]1640      //     - if [one type] is more cv-qualified than [the other type],1641      //       [the other type] is not considered to be at least as specialized1642      //       as [the first type]1643      // Objective-C ARC adds:1644      //     - [one type] has non-trivial lifetime, [the other type] has1645      //       __unsafe_unretained lifetime, and the types are otherwise1646      //       identical1647      //1648      // A is "considered to be at least as specialized" as P iff deduction1649      // succeeds, so we model this as a deduction failure. Note that1650      // [the first type] is P and [the other type] is A here; the standard1651      // gets this backwards.1652      Qualifiers PQuals = P.getQualifiers(), AQuals = A.getQualifiers();1653      if ((PRef->isLValueReferenceType() && !ARef->isLValueReferenceType()) ||1654          PQuals.isStrictSupersetOf(AQuals) ||1655          (PQuals.hasNonTrivialObjCLifetime() &&1656           AQuals.getObjCLifetime() == Qualifiers::OCL_ExplicitNone &&1657           PQuals.withoutObjCLifetime() == AQuals.withoutObjCLifetime())) {1658        Info.FirstArg = TemplateArgument(P);1659        Info.SecondArg = TemplateArgument(A);1660        return TemplateDeductionResult::NonDeducedMismatch;1661      }1662    }1663    Qualifiers DiscardedQuals;1664    // C++11 [temp.deduct.partial]p7:1665    //   Remove any top-level cv-qualifiers:1666    //     - If P is a cv-qualified type, P is replaced by the cv-unqualified1667    //       version of P.1668    P = S.Context.getUnqualifiedArrayType(P, DiscardedQuals);1669    //     - If A is a cv-qualified type, A is replaced by the cv-unqualified1670    //       version of A.1671    A = S.Context.getUnqualifiedArrayType(A, DiscardedQuals);1672  } else {1673    // C++0x [temp.deduct.call]p4 bullet 1:1674    //   - If the original P is a reference type, the deduced A (i.e., the type1675    //     referred to by the reference) can be more cv-qualified than the1676    //     transformed A.1677    if (TDF & TDF_ParamWithReferenceType) {1678      Qualifiers Quals;1679      QualType UnqualP = S.Context.getUnqualifiedArrayType(P, Quals);1680      Quals.setCVRQualifiers(Quals.getCVRQualifiers() & A.getCVRQualifiers());1681      P = S.Context.getQualifiedType(UnqualP, Quals);1682    }1683 1684    if ((TDF & TDF_TopLevelParameterTypeList) && !P->isFunctionType()) {1685      // C++0x [temp.deduct.type]p10:1686      //   If P and A are function types that originated from deduction when1687      //   taking the address of a function template (14.8.2.2) or when deducing1688      //   template arguments from a function declaration (14.8.2.6) and Pi and1689      //   Ai are parameters of the top-level parameter-type-list of P and A,1690      //   respectively, Pi is adjusted if it is a forwarding reference and Ai1691      //   is an lvalue reference, in1692      //   which case the type of Pi is changed to be the template parameter1693      //   type (i.e., T&& is changed to simply T). [ Note: As a result, when1694      //   Pi is T&& and Ai is X&, the adjusted Pi will be T, causing T to be1695      //   deduced as X&. - end note ]1696      TDF &= ~TDF_TopLevelParameterTypeList;1697      if (isForwardingReference(P, /*FirstInnerIndex=*/0) &&1698          A->isLValueReferenceType())1699        P = P->getPointeeType();1700    }1701  }1702 1703  // C++ [temp.deduct.type]p9:1704  //   A template type argument T, a template template argument TT or a1705  //   template non-type argument i can be deduced if P and A have one of1706  //   the following forms:1707  //1708  //     T1709  //     cv-list T1710  if (const auto *TTP = P->getAsCanonical<TemplateTypeParmType>()) {1711    // Just skip any attempts to deduce from a placeholder type or a parameter1712    // at a different depth.1713    if (A->isPlaceholderType() || Info.getDeducedDepth() != TTP->getDepth())1714      return TemplateDeductionResult::Success;1715 1716    unsigned Index = TTP->getIndex();1717 1718    // If the argument type is an array type, move the qualifiers up to the1719    // top level, so they can be matched with the qualifiers on the parameter.1720    if (A->isArrayType()) {1721      Qualifiers Quals;1722      A = S.Context.getUnqualifiedArrayType(A, Quals);1723      if (Quals)1724        A = S.Context.getQualifiedType(A, Quals);1725    }1726 1727    // The argument type can not be less qualified than the parameter1728    // type.1729    if (!(TDF & TDF_IgnoreQualifiers) &&1730        hasInconsistentOrSupersetQualifiersOf(P, A)) {1731      Info.Param = cast<TemplateTypeParmDecl>(TemplateParams->getParam(Index));1732      Info.FirstArg = TemplateArgument(P);1733      Info.SecondArg = TemplateArgument(A);1734      return TemplateDeductionResult::Underqualified;1735    }1736 1737    // Do not match a function type with a cv-qualified type.1738    // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#15841739    if (A->isFunctionType() && P.hasQualifiers())1740      return TemplateDeductionResult::NonDeducedMismatch;1741 1742    assert(TTP->getDepth() == Info.getDeducedDepth() &&1743           "saw template type parameter with wrong depth");1744    assert(A->getCanonicalTypeInternal() != S.Context.OverloadTy &&1745           "Unresolved overloaded function");1746    QualType DeducedType = A;1747 1748    // Remove any qualifiers on the parameter from the deduced type.1749    // We checked the qualifiers for consistency above.1750    Qualifiers DeducedQs = DeducedType.getQualifiers();1751    Qualifiers ParamQs = P.getQualifiers();1752    DeducedQs.removeCVRQualifiers(ParamQs.getCVRQualifiers());1753    if (ParamQs.hasObjCGCAttr())1754      DeducedQs.removeObjCGCAttr();1755    if (ParamQs.hasAddressSpace())1756      DeducedQs.removeAddressSpace();1757    if (ParamQs.hasObjCLifetime())1758      DeducedQs.removeObjCLifetime();1759 1760    // Objective-C ARC:1761    //   If template deduction would produce a lifetime qualifier on a type1762    //   that is not a lifetime type, template argument deduction fails.1763    if (ParamQs.hasObjCLifetime() && !DeducedType->isObjCLifetimeType() &&1764        !DeducedType->isDependentType()) {1765      Info.Param = cast<TemplateTypeParmDecl>(TemplateParams->getParam(Index));1766      Info.FirstArg = TemplateArgument(P);1767      Info.SecondArg = TemplateArgument(A);1768      return TemplateDeductionResult::Underqualified;1769    }1770 1771    // Objective-C ARC:1772    //   If template deduction would produce an argument type with lifetime type1773    //   but no lifetime qualifier, the __strong lifetime qualifier is inferred.1774    if (S.getLangOpts().ObjCAutoRefCount && DeducedType->isObjCLifetimeType() &&1775        !DeducedQs.hasObjCLifetime())1776      DeducedQs.setObjCLifetime(Qualifiers::OCL_Strong);1777 1778    DeducedType =1779        S.Context.getQualifiedType(DeducedType.getUnqualifiedType(), DeducedQs);1780 1781    DeducedTemplateArgument NewDeduced(DeducedType, DeducedFromArrayBound);1782    DeducedTemplateArgument Result =1783        checkDeducedTemplateArguments(S.Context, Deduced[Index], NewDeduced);1784    if (Result.isNull()) {1785      // We can also get inconsistencies when matching NTTP type.1786      switch (NamedDecl *Param = TemplateParams->getParam(Index);1787              Param->getKind()) {1788      case Decl::TemplateTypeParm:1789        Info.Param = cast<TemplateTypeParmDecl>(Param);1790        break;1791      case Decl::NonTypeTemplateParm:1792        Info.Param = cast<NonTypeTemplateParmDecl>(Param);1793        break;1794      case Decl::TemplateTemplateParm:1795        Info.Param = cast<TemplateTemplateParmDecl>(Param);1796        break;1797      default:1798        llvm_unreachable("unexpected kind");1799      }1800      Info.FirstArg = Deduced[Index];1801      Info.SecondArg = NewDeduced;1802      return TemplateDeductionResult::Inconsistent;1803    }1804 1805    Deduced[Index] = Result;1806    if (HasDeducedAnyParam)1807      *HasDeducedAnyParam = true;1808    return TemplateDeductionResult::Success;1809  }1810 1811  // Set up the template argument deduction information for a failure.1812  Info.FirstArg = TemplateArgument(P);1813  Info.SecondArg = TemplateArgument(A);1814 1815  // If the parameter is an already-substituted template parameter1816  // pack, do nothing: we don't know which of its arguments to look1817  // at, so we have to wait until all of the parameter packs in this1818  // expansion have arguments.1819  if (P->getAs<SubstTemplateTypeParmPackType>())1820    return TemplateDeductionResult::Success;1821 1822  // Check the cv-qualifiers on the parameter and argument types.1823  if (!(TDF & TDF_IgnoreQualifiers)) {1824    if (TDF & TDF_ParamWithReferenceType) {1825      if (hasInconsistentOrSupersetQualifiersOf(P, A))1826        return TemplateDeductionResult::NonDeducedMismatch;1827    } else if (TDF & TDF_ArgWithReferenceType) {1828      // C++ [temp.deduct.conv]p4:1829      //   If the original A is a reference type, A can be more cv-qualified1830      //   than the deduced A1831      if (!A.getQualifiers().compatiblyIncludes(P.getQualifiers(),1832                                                S.getASTContext()))1833        return TemplateDeductionResult::NonDeducedMismatch;1834 1835      // Strip out all extra qualifiers from the argument to figure out the1836      // type we're converting to, prior to the qualification conversion.1837      Qualifiers Quals;1838      A = S.Context.getUnqualifiedArrayType(A, Quals);1839      A = S.Context.getQualifiedType(A, P.getQualifiers());1840    } else if (!IsPossiblyOpaquelyQualifiedType(P)) {1841      if (P.getCVRQualifiers() != A.getCVRQualifiers())1842        return TemplateDeductionResult::NonDeducedMismatch;1843    }1844  }1845 1846  // If the parameter type is not dependent, there is nothing to deduce.1847  if (!P->isDependentType()) {1848    if (TDF & TDF_SkipNonDependent)1849      return TemplateDeductionResult::Success;1850    if ((TDF & TDF_IgnoreQualifiers) ? S.Context.hasSameUnqualifiedType(P, A)1851                                     : S.Context.hasSameType(P, A))1852      return TemplateDeductionResult::Success;1853    if (TDF & TDF_AllowCompatibleFunctionType &&1854        S.isSameOrCompatibleFunctionType(P, A))1855      return TemplateDeductionResult::Success;1856    if (!(TDF & TDF_IgnoreQualifiers))1857      return TemplateDeductionResult::NonDeducedMismatch;1858    // Otherwise, when ignoring qualifiers, the types not having the same1859    // unqualified type does not mean they do not match, so in this case we1860    // must keep going and analyze with a non-dependent parameter type.1861  }1862 1863  switch (P.getCanonicalType()->getTypeClass()) {1864    // Non-canonical types cannot appear here.1865#define NON_CANONICAL_TYPE(Class, Base) \1866  case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class);1867#define TYPE(Class, Base)1868#include "clang/AST/TypeNodes.inc"1869 1870    case Type::TemplateTypeParm:1871    case Type::SubstTemplateTypeParmPack:1872    case Type::SubstBuiltinTemplatePack:1873      llvm_unreachable("Type nodes handled above");1874 1875    case Type::Auto:1876      // C++23 [temp.deduct.funcaddr]/3:1877      //   A placeholder type in the return type of a function template is a1878      //   non-deduced context.1879      // There's no corresponding wording for [temp.deduct.decl], but we treat1880      // it the same to match other compilers.1881      if (P->isDependentType())1882        return TemplateDeductionResult::Success;1883      [[fallthrough]];1884    case Type::Builtin:1885    case Type::VariableArray:1886    case Type::Vector:1887    case Type::FunctionNoProto:1888    case Type::Record:1889    case Type::Enum:1890    case Type::ObjCObject:1891    case Type::ObjCInterface:1892    case Type::ObjCObjectPointer:1893    case Type::BitInt:1894      return (TDF & TDF_SkipNonDependent) ||1895                     ((TDF & TDF_IgnoreQualifiers)1896                          ? S.Context.hasSameUnqualifiedType(P, A)1897                          : S.Context.hasSameType(P, A))1898                 ? TemplateDeductionResult::Success1899                 : TemplateDeductionResult::NonDeducedMismatch;1900 1901    //     _Complex T   [placeholder extension]1902    case Type::Complex: {1903      const auto *CP = P->castAs<ComplexType>(), *CA = A->getAs<ComplexType>();1904      if (!CA)1905        return TemplateDeductionResult::NonDeducedMismatch;1906      return DeduceTemplateArgumentsByTypeMatch(1907          S, TemplateParams, CP->getElementType(), CA->getElementType(), Info,1908          Deduced, TDF, degradeCallPartialOrderingKind(POK),1909          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1910    }1911 1912    //     _Atomic T   [extension]1913    case Type::Atomic: {1914      const auto *PA = P->castAs<AtomicType>(), *AA = A->getAs<AtomicType>();1915      if (!AA)1916        return TemplateDeductionResult::NonDeducedMismatch;1917      return DeduceTemplateArgumentsByTypeMatch(1918          S, TemplateParams, PA->getValueType(), AA->getValueType(), Info,1919          Deduced, TDF, degradeCallPartialOrderingKind(POK),1920          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1921    }1922 1923    //     T *1924    case Type::Pointer: {1925      QualType PointeeType;1926      if (const auto *PA = A->getAs<PointerType>()) {1927        PointeeType = PA->getPointeeType();1928      } else if (const auto *PA = A->getAs<ObjCObjectPointerType>()) {1929        PointeeType = PA->getPointeeType();1930      } else {1931        return TemplateDeductionResult::NonDeducedMismatch;1932      }1933      return DeduceTemplateArgumentsByTypeMatch(1934          S, TemplateParams, P->castAs<PointerType>()->getPointeeType(),1935          PointeeType, Info, Deduced,1936          TDF & (TDF_IgnoreQualifiers | TDF_DerivedClass),1937          degradeCallPartialOrderingKind(POK),1938          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1939    }1940 1941    //     T &1942    case Type::LValueReference: {1943      const auto *RP = P->castAs<LValueReferenceType>(),1944                 *RA = A->getAs<LValueReferenceType>();1945      if (!RA)1946        return TemplateDeductionResult::NonDeducedMismatch;1947 1948      return DeduceTemplateArgumentsByTypeMatch(1949          S, TemplateParams, RP->getPointeeType(), RA->getPointeeType(), Info,1950          Deduced, 0, degradeCallPartialOrderingKind(POK),1951          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1952    }1953 1954    //     T && [C++0x]1955    case Type::RValueReference: {1956      const auto *RP = P->castAs<RValueReferenceType>(),1957                 *RA = A->getAs<RValueReferenceType>();1958      if (!RA)1959        return TemplateDeductionResult::NonDeducedMismatch;1960 1961      return DeduceTemplateArgumentsByTypeMatch(1962          S, TemplateParams, RP->getPointeeType(), RA->getPointeeType(), Info,1963          Deduced, 0, degradeCallPartialOrderingKind(POK),1964          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1965    }1966 1967    //     T [] (implied, but not stated explicitly)1968    case Type::IncompleteArray: {1969      const auto *IAA = S.Context.getAsIncompleteArrayType(A);1970      if (!IAA)1971        return TemplateDeductionResult::NonDeducedMismatch;1972 1973      const auto *IAP = S.Context.getAsIncompleteArrayType(P);1974      assert(IAP && "Template parameter not of incomplete array type");1975 1976      return DeduceTemplateArgumentsByTypeMatch(1977          S, TemplateParams, IAP->getElementType(), IAA->getElementType(), Info,1978          Deduced, TDF & TDF_IgnoreQualifiers,1979          degradeCallPartialOrderingKind(POK),1980          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1981    }1982 1983    //     T [integer-constant]1984    case Type::ConstantArray: {1985      const auto *CAA = S.Context.getAsConstantArrayType(A),1986                 *CAP = S.Context.getAsConstantArrayType(P);1987      assert(CAP);1988      if (!CAA || CAA->getSize() != CAP->getSize())1989        return TemplateDeductionResult::NonDeducedMismatch;1990 1991      return DeduceTemplateArgumentsByTypeMatch(1992          S, TemplateParams, CAP->getElementType(), CAA->getElementType(), Info,1993          Deduced, TDF & TDF_IgnoreQualifiers,1994          degradeCallPartialOrderingKind(POK),1995          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);1996    }1997 1998    //     type [i]1999    case Type::DependentSizedArray: {2000      const auto *AA = S.Context.getAsArrayType(A);2001      if (!AA)2002        return TemplateDeductionResult::NonDeducedMismatch;2003 2004      // Check the element type of the arrays2005      const auto *DAP = S.Context.getAsDependentSizedArrayType(P);2006      assert(DAP);2007      if (auto Result = DeduceTemplateArgumentsByTypeMatch(2008              S, TemplateParams, DAP->getElementType(), AA->getElementType(),2009              Info, Deduced, TDF & TDF_IgnoreQualifiers,2010              degradeCallPartialOrderingKind(POK),2011              /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2012          Result != TemplateDeductionResult::Success)2013        return Result;2014 2015      // Determine the array bound is something we can deduce.2016      NonTypeOrVarTemplateParmDecl NTTP =2017          getDeducedNTTParameterFromExpr(Info, DAP->getSizeExpr());2018      if (!NTTP)2019        return TemplateDeductionResult::Success;2020 2021      // We can perform template argument deduction for the given non-type2022      // template parameter.2023      assert(NTTP.getDepth() == Info.getDeducedDepth() &&2024             "saw non-type template parameter with wrong depth");2025      if (const auto *CAA = dyn_cast<ConstantArrayType>(AA)) {2026        llvm::APSInt Size(CAA->getSize());2027        return DeduceNonTypeTemplateArgument(2028            S, TemplateParams, NTTP, Size, S.Context.getSizeType(),2029            /*ArrayBound=*/true, Info, POK != PartialOrderingKind::None,2030            Deduced, HasDeducedAnyParam);2031      }2032      if (const auto *DAA = dyn_cast<DependentSizedArrayType>(AA))2033        if (DAA->getSizeExpr())2034          return DeduceNonTypeTemplateArgument(2035              S, TemplateParams, NTTP, DAA->getSizeExpr(), Info,2036              POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2037 2038      // Incomplete type does not match a dependently-sized array type2039      return TemplateDeductionResult::NonDeducedMismatch;2040    }2041 2042    //     type(*)(T)2043    //     T(*)()2044    //     T(*)(T)2045    case Type::FunctionProto: {2046      const auto *FPP = P->castAs<FunctionProtoType>(),2047                 *FPA = A->getAs<FunctionProtoType>();2048      if (!FPA)2049        return TemplateDeductionResult::NonDeducedMismatch;2050 2051      if (FPP->getMethodQuals() != FPA->getMethodQuals() ||2052          FPP->getRefQualifier() != FPA->getRefQualifier() ||2053          FPP->isVariadic() != FPA->isVariadic())2054        return TemplateDeductionResult::NonDeducedMismatch;2055 2056      // Check return types.2057      if (auto Result = DeduceTemplateArgumentsByTypeMatch(2058              S, TemplateParams, FPP->getReturnType(), FPA->getReturnType(),2059              Info, Deduced, 0, degradeCallPartialOrderingKind(POK),2060              /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2061          Result != TemplateDeductionResult::Success)2062        return Result;2063 2064      // Check parameter types.2065      if (auto Result = DeduceTemplateArguments(2066              S, TemplateParams, FPP->param_types(), FPA->param_types(), Info,2067              Deduced, TDF & TDF_TopLevelParameterTypeList, POK,2068              HasDeducedAnyParam,2069              /*HasDeducedParam=*/nullptr);2070          Result != TemplateDeductionResult::Success)2071        return Result;2072 2073      if (TDF & TDF_AllowCompatibleFunctionType)2074        return TemplateDeductionResult::Success;2075 2076      // FIXME: Per core-2016/10/1019 (no corresponding core issue yet), permit2077      // deducing through the noexcept-specifier if it's part of the canonical2078      // type. libstdc++ relies on this.2079      Expr *NoexceptExpr = FPP->getNoexceptExpr();2080      if (NonTypeOrVarTemplateParmDecl NTTP =2081              NoexceptExpr ? getDeducedNTTParameterFromExpr(Info, NoexceptExpr)2082                           : nullptr) {2083        assert(NTTP.getDepth() == Info.getDeducedDepth() &&2084               "saw non-type template parameter with wrong depth");2085 2086        llvm::APSInt Noexcept(1);2087        switch (FPA->canThrow()) {2088        case CT_Cannot:2089          Noexcept = 1;2090          [[fallthrough]];2091 2092        case CT_Can:2093          // We give E in noexcept(E) the "deduced from array bound" treatment.2094          // FIXME: Should we?2095          return DeduceNonTypeTemplateArgument(2096              S, TemplateParams, NTTP, Noexcept, S.Context.BoolTy,2097              /*DeducedFromArrayBound=*/true, Info,2098              POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2099 2100        case CT_Dependent:2101          if (Expr *ArgNoexceptExpr = FPA->getNoexceptExpr())2102            return DeduceNonTypeTemplateArgument(2103                S, TemplateParams, NTTP, ArgNoexceptExpr, Info,2104                POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2105          // Can't deduce anything from throw(T...).2106          break;2107        }2108      }2109      // FIXME: Detect non-deduced exception specification mismatches?2110      //2111      // Careful about [temp.deduct.call] and [temp.deduct.conv], which allow2112      // top-level differences in noexcept-specifications.2113 2114      return TemplateDeductionResult::Success;2115    }2116 2117    case Type::InjectedClassName:2118      // Treat a template's injected-class-name as if the template2119      // specialization type had been used.2120 2121    //     template-name<T> (where template-name refers to a class template)2122    //     template-name<i>2123    //     TT<T>2124    //     TT<i>2125    //     TT<>2126    case Type::TemplateSpecialization: {2127      // When Arg cannot be a derived class, we can just try to deduce template2128      // arguments from the template-id.2129      if (!(TDF & TDF_DerivedClass) || !A->isRecordType())2130        return DeduceTemplateSpecArguments(S, TemplateParams, P, A, Info,2131                                           POK != PartialOrderingKind::None,2132                                           Deduced, HasDeducedAnyParam);2133 2134      SmallVector<DeducedTemplateArgument, 8> DeducedOrig(Deduced.begin(),2135                                                          Deduced.end());2136 2137      auto Result = DeduceTemplateSpecArguments(2138          S, TemplateParams, P, A, Info, POK != PartialOrderingKind::None,2139          Deduced, HasDeducedAnyParam);2140      if (Result == TemplateDeductionResult::Success)2141        return Result;2142 2143      // We cannot inspect base classes as part of deduction when the type2144      // is incomplete, so either instantiate any templates necessary to2145      // complete the type, or skip over it if it cannot be completed.2146      if (!S.isCompleteType(Info.getLocation(), A))2147        return Result;2148 2149      const CXXRecordDecl *RD = A->getAsCXXRecordDecl();2150      if (RD->isInvalidDecl())2151        return Result;2152 2153      // Reset the incorrectly deduced argument from above.2154      Deduced = DeducedOrig;2155 2156      // Check bases according to C++14 [temp.deduct.call] p4b3:2157      auto BaseResult = DeduceTemplateBases(S, RD, TemplateParams, P, Info,2158                                            POK != PartialOrderingKind::None,2159                                            Deduced, HasDeducedAnyParam);2160      return BaseResult != TemplateDeductionResult::Invalid ? BaseResult2161                                                            : Result;2162    }2163 2164    //     T type::*2165    //     T T::*2166    //     T (type::*)()2167    //     type (T::*)()2168    //     type (type::*)(T)2169    //     type (T::*)(T)2170    //     T (type::*)(T)2171    //     T (T::*)()2172    //     T (T::*)(T)2173    case Type::MemberPointer: {2174      const auto *MPP = P->castAs<MemberPointerType>(),2175                 *MPA = A->getAs<MemberPointerType>();2176      if (!MPA)2177        return TemplateDeductionResult::NonDeducedMismatch;2178 2179      QualType PPT = MPP->getPointeeType();2180      if (PPT->isFunctionType())2181        S.adjustMemberFunctionCC(PPT, /*HasThisPointer=*/false,2182                                 /*IsCtorOrDtor=*/false, Info.getLocation());2183      QualType APT = MPA->getPointeeType();2184      if (APT->isFunctionType())2185        S.adjustMemberFunctionCC(APT, /*HasThisPointer=*/false,2186                                 /*IsCtorOrDtor=*/false, Info.getLocation());2187 2188      unsigned SubTDF = TDF & TDF_IgnoreQualifiers;2189      if (auto Result = DeduceTemplateArgumentsByTypeMatch(2190              S, TemplateParams, PPT, APT, Info, Deduced, SubTDF,2191              degradeCallPartialOrderingKind(POK),2192              /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2193          Result != TemplateDeductionResult::Success)2194        return Result;2195 2196      QualType TP =2197          MPP->isSugared()2198              ? S.Context.getCanonicalTagType(MPP->getMostRecentCXXRecordDecl())2199              : QualType(MPP->getQualifier().getAsType(), 0);2200      assert(!TP.isNull() && "member pointer with non-type class");2201 2202      QualType TA =2203          MPA->isSugared()2204              ? S.Context.getCanonicalTagType(MPA->getMostRecentCXXRecordDecl())2205              : QualType(MPA->getQualifier().getAsType(), 0)2206                    .getUnqualifiedType();2207      assert(!TA.isNull() && "member pointer with non-type class");2208 2209      return DeduceTemplateArgumentsByTypeMatch(2210          S, TemplateParams, TP, TA, Info, Deduced, SubTDF,2211          degradeCallPartialOrderingKind(POK),2212          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2213    }2214 2215    //     (clang extension)2216    //2217    //     type(^)(T)2218    //     T(^)()2219    //     T(^)(T)2220    case Type::BlockPointer: {2221      const auto *BPP = P->castAs<BlockPointerType>(),2222                 *BPA = A->getAs<BlockPointerType>();2223      if (!BPA)2224        return TemplateDeductionResult::NonDeducedMismatch;2225      return DeduceTemplateArgumentsByTypeMatch(2226          S, TemplateParams, BPP->getPointeeType(), BPA->getPointeeType(), Info,2227          Deduced, 0, degradeCallPartialOrderingKind(POK),2228          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2229    }2230 2231    //     (clang extension)2232    //2233    //     T __attribute__(((ext_vector_type(<integral constant>))))2234    case Type::ExtVector: {2235      const auto *VP = P->castAs<ExtVectorType>();2236      QualType ElementType;2237      if (const auto *VA = A->getAs<ExtVectorType>()) {2238        // Make sure that the vectors have the same number of elements.2239        if (VP->getNumElements() != VA->getNumElements())2240          return TemplateDeductionResult::NonDeducedMismatch;2241        ElementType = VA->getElementType();2242      } else if (const auto *VA = A->getAs<DependentSizedExtVectorType>()) {2243        // We can't check the number of elements, since the argument has a2244        // dependent number of elements. This can only occur during partial2245        // ordering.2246        ElementType = VA->getElementType();2247      } else {2248        return TemplateDeductionResult::NonDeducedMismatch;2249      }2250      // Perform deduction on the element types.2251      return DeduceTemplateArgumentsByTypeMatch(2252          S, TemplateParams, VP->getElementType(), ElementType, Info, Deduced,2253          TDF, degradeCallPartialOrderingKind(POK),2254          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2255    }2256 2257    case Type::DependentVector: {2258      const auto *VP = P->castAs<DependentVectorType>();2259 2260      if (const auto *VA = A->getAs<VectorType>()) {2261        // Perform deduction on the element types.2262        if (auto Result = DeduceTemplateArgumentsByTypeMatch(2263                S, TemplateParams, VP->getElementType(), VA->getElementType(),2264                Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),2265                /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2266            Result != TemplateDeductionResult::Success)2267          return Result;2268 2269        // Perform deduction on the vector size, if we can.2270        NonTypeOrVarTemplateParmDecl NTTP =2271            getDeducedNTTParameterFromExpr(Info, VP->getSizeExpr());2272        if (!NTTP)2273          return TemplateDeductionResult::Success;2274 2275        llvm::APSInt ArgSize(S.Context.getTypeSize(S.Context.IntTy), false);2276        ArgSize = VA->getNumElements();2277        // Note that we use the "array bound" rules here; just like in that2278        // case, we don't have any particular type for the vector size, but2279        // we can provide one if necessary.2280        return DeduceNonTypeTemplateArgument(2281            S, TemplateParams, NTTP, ArgSize, S.Context.UnsignedIntTy, true,2282            Info, POK != PartialOrderingKind::None, Deduced,2283            HasDeducedAnyParam);2284      }2285 2286      if (const auto *VA = A->getAs<DependentVectorType>()) {2287        // Perform deduction on the element types.2288        if (auto Result = DeduceTemplateArgumentsByTypeMatch(2289                S, TemplateParams, VP->getElementType(), VA->getElementType(),2290                Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),2291                /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2292            Result != TemplateDeductionResult::Success)2293          return Result;2294 2295        // Perform deduction on the vector size, if we can.2296        NonTypeOrVarTemplateParmDecl NTTP =2297            getDeducedNTTParameterFromExpr(Info, VP->getSizeExpr());2298        if (!NTTP)2299          return TemplateDeductionResult::Success;2300 2301        return DeduceNonTypeTemplateArgument(2302            S, TemplateParams, NTTP, VA->getSizeExpr(), Info,2303            POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2304      }2305 2306      return TemplateDeductionResult::NonDeducedMismatch;2307    }2308 2309    //     (clang extension)2310    //2311    //     T __attribute__(((ext_vector_type(N))))2312    case Type::DependentSizedExtVector: {2313      const auto *VP = P->castAs<DependentSizedExtVectorType>();2314 2315      if (const auto *VA = A->getAs<ExtVectorType>()) {2316        // Perform deduction on the element types.2317        if (auto Result = DeduceTemplateArgumentsByTypeMatch(2318                S, TemplateParams, VP->getElementType(), VA->getElementType(),2319                Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),2320                /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2321            Result != TemplateDeductionResult::Success)2322          return Result;2323 2324        // Perform deduction on the vector size, if we can.2325        NonTypeOrVarTemplateParmDecl NTTP =2326            getDeducedNTTParameterFromExpr(Info, VP->getSizeExpr());2327        if (!NTTP)2328          return TemplateDeductionResult::Success;2329 2330        llvm::APSInt ArgSize(S.Context.getTypeSize(S.Context.IntTy), false);2331        ArgSize = VA->getNumElements();2332        // Note that we use the "array bound" rules here; just like in that2333        // case, we don't have any particular type for the vector size, but2334        // we can provide one if necessary.2335        return DeduceNonTypeTemplateArgument(2336            S, TemplateParams, NTTP, ArgSize, S.Context.IntTy, true, Info,2337            POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2338      }2339 2340      if (const auto *VA = A->getAs<DependentSizedExtVectorType>()) {2341        // Perform deduction on the element types.2342        if (auto Result = DeduceTemplateArgumentsByTypeMatch(2343                S, TemplateParams, VP->getElementType(), VA->getElementType(),2344                Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),2345                /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2346            Result != TemplateDeductionResult::Success)2347          return Result;2348 2349        // Perform deduction on the vector size, if we can.2350        NonTypeOrVarTemplateParmDecl NTTP =2351            getDeducedNTTParameterFromExpr(Info, VP->getSizeExpr());2352        if (!NTTP)2353          return TemplateDeductionResult::Success;2354 2355        return DeduceNonTypeTemplateArgument(2356            S, TemplateParams, NTTP, VA->getSizeExpr(), Info,2357            POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2358      }2359 2360      return TemplateDeductionResult::NonDeducedMismatch;2361    }2362 2363    //     (clang extension)2364    //2365    //     T __attribute__((matrix_type(<integral constant>,2366    //                                  <integral constant>)))2367    case Type::ConstantMatrix: {2368      const auto *MP = P->castAs<ConstantMatrixType>(),2369                 *MA = A->getAs<ConstantMatrixType>();2370      if (!MA)2371        return TemplateDeductionResult::NonDeducedMismatch;2372 2373      // Check that the dimensions are the same2374      if (MP->getNumRows() != MA->getNumRows() ||2375          MP->getNumColumns() != MA->getNumColumns()) {2376        return TemplateDeductionResult::NonDeducedMismatch;2377      }2378      // Perform deduction on element types.2379      return DeduceTemplateArgumentsByTypeMatch(2380          S, TemplateParams, MP->getElementType(), MA->getElementType(), Info,2381          Deduced, TDF, degradeCallPartialOrderingKind(POK),2382          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2383    }2384 2385    case Type::DependentSizedMatrix: {2386      const auto *MP = P->castAs<DependentSizedMatrixType>();2387      const auto *MA = A->getAs<MatrixType>();2388      if (!MA)2389        return TemplateDeductionResult::NonDeducedMismatch;2390 2391      // Check the element type of the matrixes.2392      if (auto Result = DeduceTemplateArgumentsByTypeMatch(2393              S, TemplateParams, MP->getElementType(), MA->getElementType(),2394              Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),2395              /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2396          Result != TemplateDeductionResult::Success)2397        return Result;2398 2399      // Try to deduce a matrix dimension.2400      auto DeduceMatrixArg =2401          [&S, &Info, &Deduced, &TemplateParams, &HasDeducedAnyParam, POK](2402              Expr *ParamExpr, const MatrixType *A,2403              unsigned (ConstantMatrixType::*GetArgDimension)() const,2404              Expr *(DependentSizedMatrixType::*GetArgDimensionExpr)() const) {2405            const auto *ACM = dyn_cast<ConstantMatrixType>(A);2406            const auto *ADM = dyn_cast<DependentSizedMatrixType>(A);2407            if (!ParamExpr->isValueDependent()) {2408              std::optional<llvm::APSInt> ParamConst =2409                  ParamExpr->getIntegerConstantExpr(S.Context);2410              if (!ParamConst)2411                return TemplateDeductionResult::NonDeducedMismatch;2412 2413              if (ACM) {2414                if ((ACM->*GetArgDimension)() == *ParamConst)2415                  return TemplateDeductionResult::Success;2416                return TemplateDeductionResult::NonDeducedMismatch;2417              }2418 2419              Expr *ArgExpr = (ADM->*GetArgDimensionExpr)();2420              if (std::optional<llvm::APSInt> ArgConst =2421                      ArgExpr->getIntegerConstantExpr(S.Context))2422                if (*ArgConst == *ParamConst)2423                  return TemplateDeductionResult::Success;2424              return TemplateDeductionResult::NonDeducedMismatch;2425            }2426 2427            NonTypeOrVarTemplateParmDecl NTTP =2428                getDeducedNTTParameterFromExpr(Info, ParamExpr);2429            if (!NTTP)2430              return TemplateDeductionResult::Success;2431 2432            if (ACM) {2433              llvm::APSInt ArgConst(2434                  S.Context.getTypeSize(S.Context.getSizeType()));2435              ArgConst = (ACM->*GetArgDimension)();2436              return DeduceNonTypeTemplateArgument(2437                  S, TemplateParams, NTTP, ArgConst, S.Context.getSizeType(),2438                  /*ArrayBound=*/true, Info, POK != PartialOrderingKind::None,2439                  Deduced, HasDeducedAnyParam);2440            }2441 2442            return DeduceNonTypeTemplateArgument(2443                S, TemplateParams, NTTP, (ADM->*GetArgDimensionExpr)(), Info,2444                POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2445          };2446 2447      if (auto Result = DeduceMatrixArg(MP->getRowExpr(), MA,2448                                        &ConstantMatrixType::getNumRows,2449                                        &DependentSizedMatrixType::getRowExpr);2450          Result != TemplateDeductionResult::Success)2451        return Result;2452 2453      return DeduceMatrixArg(MP->getColumnExpr(), MA,2454                             &ConstantMatrixType::getNumColumns,2455                             &DependentSizedMatrixType::getColumnExpr);2456    }2457 2458    //     (clang extension)2459    //2460    //     T __attribute__(((address_space(N))))2461    case Type::DependentAddressSpace: {2462      const auto *ASP = P->castAs<DependentAddressSpaceType>();2463 2464      if (const auto *ASA = A->getAs<DependentAddressSpaceType>()) {2465        // Perform deduction on the pointer type.2466        if (auto Result = DeduceTemplateArgumentsByTypeMatch(2467                S, TemplateParams, ASP->getPointeeType(), ASA->getPointeeType(),2468                Info, Deduced, TDF, degradeCallPartialOrderingKind(POK),2469                /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2470            Result != TemplateDeductionResult::Success)2471          return Result;2472 2473        // Perform deduction on the address space, if we can.2474        NonTypeOrVarTemplateParmDecl NTTP =2475            getDeducedNTTParameterFromExpr(Info, ASP->getAddrSpaceExpr());2476        if (!NTTP)2477          return TemplateDeductionResult::Success;2478 2479        return DeduceNonTypeTemplateArgument(2480            S, TemplateParams, NTTP, ASA->getAddrSpaceExpr(), Info,2481            POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2482      }2483 2484      if (isTargetAddressSpace(A.getAddressSpace())) {2485        llvm::APSInt ArgAddressSpace(S.Context.getTypeSize(S.Context.IntTy),2486                                     false);2487        ArgAddressSpace = toTargetAddressSpace(A.getAddressSpace());2488 2489        // Perform deduction on the pointer types.2490        if (auto Result = DeduceTemplateArgumentsByTypeMatch(2491                S, TemplateParams, ASP->getPointeeType(),2492                S.Context.removeAddrSpaceQualType(A), Info, Deduced, TDF,2493                degradeCallPartialOrderingKind(POK),2494                /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2495            Result != TemplateDeductionResult::Success)2496          return Result;2497 2498        // Perform deduction on the address space, if we can.2499        NonTypeOrVarTemplateParmDecl NTTP =2500            getDeducedNTTParameterFromExpr(Info, ASP->getAddrSpaceExpr());2501        if (!NTTP)2502          return TemplateDeductionResult::Success;2503 2504        return DeduceNonTypeTemplateArgument(2505            S, TemplateParams, NTTP, ArgAddressSpace, S.Context.IntTy, true,2506            Info, POK != PartialOrderingKind::None, Deduced,2507            HasDeducedAnyParam);2508      }2509 2510      return TemplateDeductionResult::NonDeducedMismatch;2511    }2512    case Type::DependentBitInt: {2513      const auto *IP = P->castAs<DependentBitIntType>();2514 2515      if (const auto *IA = A->getAs<BitIntType>()) {2516        if (IP->isUnsigned() != IA->isUnsigned())2517          return TemplateDeductionResult::NonDeducedMismatch;2518 2519        NonTypeOrVarTemplateParmDecl NTTP =2520            getDeducedNTTParameterFromExpr(Info, IP->getNumBitsExpr());2521        if (!NTTP)2522          return TemplateDeductionResult::Success;2523 2524        llvm::APSInt ArgSize(S.Context.getTypeSize(S.Context.IntTy), false);2525        ArgSize = IA->getNumBits();2526 2527        return DeduceNonTypeTemplateArgument(2528            S, TemplateParams, NTTP, ArgSize, S.Context.IntTy, true, Info,2529            POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);2530      }2531 2532      if (const auto *IA = A->getAs<DependentBitIntType>()) {2533        if (IP->isUnsigned() != IA->isUnsigned())2534          return TemplateDeductionResult::NonDeducedMismatch;2535        return TemplateDeductionResult::Success;2536      }2537 2538      return TemplateDeductionResult::NonDeducedMismatch;2539    }2540 2541    case Type::TypeOfExpr:2542    case Type::TypeOf:2543    case Type::DependentName:2544    case Type::UnresolvedUsing:2545    case Type::Decltype:2546    case Type::UnaryTransform:2547    case Type::DeducedTemplateSpecialization:2548    case Type::PackExpansion:2549    case Type::Pipe:2550    case Type::ArrayParameter:2551    case Type::HLSLAttributedResource:2552    case Type::HLSLInlineSpirv:2553      // No template argument deduction for these types2554      return TemplateDeductionResult::Success;2555 2556    case Type::PackIndexing: {2557      const PackIndexingType *PIT = P->getAs<PackIndexingType>();2558      if (PIT->hasSelectedType()) {2559        return DeduceTemplateArgumentsByTypeMatch(2560            S, TemplateParams, PIT->getSelectedType(), A, Info, Deduced, TDF,2561            degradeCallPartialOrderingKind(POK),2562            /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2563      }2564      return TemplateDeductionResult::IncompletePack;2565    }2566    }2567 2568  llvm_unreachable("Invalid Type Class!");2569}2570 2571static TemplateDeductionResult2572DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,2573                        const TemplateArgument &P, TemplateArgument A,2574                        TemplateDeductionInfo &Info, bool PartialOrdering,2575                        SmallVectorImpl<DeducedTemplateArgument> &Deduced,2576                        bool *HasDeducedAnyParam) {2577  // If the template argument is a pack expansion, perform template argument2578  // deduction against the pattern of that expansion. This only occurs during2579  // partial ordering.2580  if (A.isPackExpansion())2581    A = A.getPackExpansionPattern();2582 2583  switch (P.getKind()) {2584  case TemplateArgument::Null:2585    llvm_unreachable("Null template argument in parameter list");2586 2587  case TemplateArgument::Type:2588    if (A.getKind() == TemplateArgument::Type)2589      return DeduceTemplateArgumentsByTypeMatch(2590          S, TemplateParams, P.getAsType(), A.getAsType(), Info, Deduced, 0,2591          PartialOrdering ? PartialOrderingKind::NonCall2592                          : PartialOrderingKind::None,2593          /*DeducedFromArrayBound=*/false, HasDeducedAnyParam);2594    Info.FirstArg = P;2595    Info.SecondArg = A;2596    return TemplateDeductionResult::NonDeducedMismatch;2597 2598  case TemplateArgument::Template:2599    // PartialOrdering does not matter here, since template specializations are2600    // not being deduced.2601    if (A.getKind() == TemplateArgument::Template)2602      return DeduceTemplateArguments(2603          S, TemplateParams, P.getAsTemplate(), A.getAsTemplate(), Info,2604          /*DefaultArguments=*/{}, /*PartialOrdering=*/false, Deduced,2605          HasDeducedAnyParam);2606    Info.FirstArg = P;2607    Info.SecondArg = A;2608    return TemplateDeductionResult::NonDeducedMismatch;2609 2610  case TemplateArgument::TemplateExpansion:2611    llvm_unreachable("caller should handle pack expansions");2612 2613  case TemplateArgument::Declaration:2614    if (A.getKind() == TemplateArgument::Declaration &&2615        isSameDeclaration(P.getAsDecl(), A.getAsDecl()))2616      return TemplateDeductionResult::Success;2617 2618    Info.FirstArg = P;2619    Info.SecondArg = A;2620    return TemplateDeductionResult::NonDeducedMismatch;2621 2622  case TemplateArgument::NullPtr:2623    // 'nullptr' has only one possible value, so it always matches.2624    if (A.getKind() == TemplateArgument::NullPtr)2625      return TemplateDeductionResult::Success;2626    Info.FirstArg = P;2627    Info.SecondArg = A;2628    return TemplateDeductionResult::NonDeducedMismatch;2629 2630  case TemplateArgument::Integral:2631    if (A.getKind() == TemplateArgument::Integral) {2632      if (llvm::APSInt::isSameValue(P.getAsIntegral(), A.getAsIntegral()))2633        return TemplateDeductionResult::Success;2634    }2635    Info.FirstArg = P;2636    Info.SecondArg = A;2637    return TemplateDeductionResult::NonDeducedMismatch;2638 2639  case TemplateArgument::StructuralValue:2640    // FIXME: structural equality will also compare types,2641    // but they should match iff they have the same value.2642    if (A.getKind() == TemplateArgument::StructuralValue &&2643        A.structurallyEquals(P))2644      return TemplateDeductionResult::Success;2645 2646    Info.FirstArg = P;2647    Info.SecondArg = A;2648    return TemplateDeductionResult::NonDeducedMismatch;2649 2650  case TemplateArgument::Expression:2651    if (NonTypeOrVarTemplateParmDecl NTTP =2652            getDeducedNTTParameterFromExpr(Info, P.getAsExpr())) {2653      switch (A.getKind()) {2654      case TemplateArgument::Expression: {2655        // The type of the value is the type of the expression as written.2656        return DeduceNonTypeTemplateArgument(2657            S, TemplateParams, NTTP, DeducedTemplateArgument(A),2658            A.getAsExpr()->IgnoreImplicitAsWritten()->getType(), Info,2659            PartialOrdering, Deduced, HasDeducedAnyParam);2660      }2661      case TemplateArgument::Integral:2662      case TemplateArgument::StructuralValue:2663        return DeduceNonTypeTemplateArgument(2664            S, TemplateParams, NTTP, DeducedTemplateArgument(A),2665            A.getNonTypeTemplateArgumentType(), Info, PartialOrdering, Deduced,2666            HasDeducedAnyParam);2667 2668      case TemplateArgument::NullPtr:2669        return DeduceNullPtrTemplateArgument(2670            S, TemplateParams, NTTP, A.getNullPtrType(), Info, PartialOrdering,2671            Deduced, HasDeducedAnyParam);2672 2673      case TemplateArgument::Declaration:2674        return DeduceNonTypeTemplateArgument(2675            S, TemplateParams, NTTP, A.getAsDecl(), A.getParamTypeForDecl(),2676            Info, PartialOrdering, Deduced, HasDeducedAnyParam);2677 2678      case TemplateArgument::Null:2679      case TemplateArgument::Type:2680      case TemplateArgument::Template:2681      case TemplateArgument::TemplateExpansion:2682      case TemplateArgument::Pack:2683        Info.FirstArg = P;2684        Info.SecondArg = A;2685        return TemplateDeductionResult::NonDeducedMismatch;2686      }2687      llvm_unreachable("Unknown template argument kind");2688    }2689    // Can't deduce anything, but that's okay.2690    return TemplateDeductionResult::Success;2691  case TemplateArgument::Pack:2692    llvm_unreachable("Argument packs should be expanded by the caller!");2693  }2694 2695  llvm_unreachable("Invalid TemplateArgument Kind!");2696}2697 2698/// Determine whether there is a template argument to be used for2699/// deduction.2700///2701/// This routine "expands" argument packs in-place, overriding its input2702/// parameters so that \c Args[ArgIdx] will be the available template argument.2703///2704/// \returns true if there is another template argument (which will be at2705/// \c Args[ArgIdx]), false otherwise.2706static bool hasTemplateArgumentForDeduction(ArrayRef<TemplateArgument> &Args,2707                                            unsigned &ArgIdx) {2708  if (ArgIdx == Args.size())2709    return false;2710 2711  const TemplateArgument &Arg = Args[ArgIdx];2712  if (Arg.getKind() != TemplateArgument::Pack)2713    return true;2714 2715  assert(ArgIdx == Args.size() - 1 && "Pack not at the end of argument list?");2716  Args = Arg.pack_elements();2717  ArgIdx = 0;2718  return ArgIdx < Args.size();2719}2720 2721/// Determine whether the given set of template arguments has a pack2722/// expansion that is not the last template argument.2723static bool hasPackExpansionBeforeEnd(ArrayRef<TemplateArgument> Args) {2724  bool FoundPackExpansion = false;2725  for (const auto &A : Args) {2726    if (FoundPackExpansion)2727      return true;2728 2729    if (A.getKind() == TemplateArgument::Pack)2730      return hasPackExpansionBeforeEnd(A.pack_elements());2731 2732    // FIXME: If this is a fixed-arity pack expansion from an outer level of2733    // templates, it should not be treated as a pack expansion.2734    if (A.isPackExpansion())2735      FoundPackExpansion = true;2736  }2737 2738  return false;2739}2740 2741static TemplateDeductionResult2742DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams,2743                        ArrayRef<TemplateArgument> Ps,2744                        ArrayRef<TemplateArgument> As,2745                        TemplateDeductionInfo &Info,2746                        SmallVectorImpl<DeducedTemplateArgument> &Deduced,2747                        bool NumberOfArgumentsMustMatch, bool PartialOrdering,2748                        PackFold PackFold, bool *HasDeducedAnyParam) {2749  bool FoldPackParameter = PackFold == PackFold::ParameterToArgument ||2750                           PackFold == PackFold::Both,2751       FoldPackArgument = PackFold == PackFold::ArgumentToParameter ||2752                          PackFold == PackFold::Both;2753 2754  // C++0x [temp.deduct.type]p9:2755  //   If the template argument list of P contains a pack expansion that is not2756  //   the last template argument, the entire template argument list is a2757  //   non-deduced context.2758  if (FoldPackParameter && hasPackExpansionBeforeEnd(Ps))2759    return TemplateDeductionResult::Success;2760 2761  // C++0x [temp.deduct.type]p9:2762  //   If P has a form that contains <T> or <i>, then each argument Pi of the2763  //   respective template argument list P is compared with the corresponding2764  //   argument Ai of the corresponding template argument list of A.2765  for (unsigned ArgIdx = 0, ParamIdx = 0; /**/; /**/) {2766    if (!hasTemplateArgumentForDeduction(Ps, ParamIdx))2767      return !FoldPackParameter && hasTemplateArgumentForDeduction(As, ArgIdx)2768                 ? TemplateDeductionResult::MiscellaneousDeductionFailure2769                 : TemplateDeductionResult::Success;2770 2771    if (!Ps[ParamIdx].isPackExpansion()) {2772      // The simple case: deduce template arguments by matching Pi and Ai.2773 2774      // Check whether we have enough arguments.2775      if (!hasTemplateArgumentForDeduction(As, ArgIdx))2776        return !FoldPackArgument && NumberOfArgumentsMustMatch2777                   ? TemplateDeductionResult::MiscellaneousDeductionFailure2778                   : TemplateDeductionResult::Success;2779 2780      if (As[ArgIdx].isPackExpansion()) {2781        // C++1z [temp.deduct.type]p9:2782        //   During partial ordering, if Ai was originally a pack expansion2783        //   [and] Pi is not a pack expansion, template argument deduction2784        //   fails.2785        if (!FoldPackArgument)2786          return TemplateDeductionResult::MiscellaneousDeductionFailure;2787 2788        TemplateArgument Pattern = As[ArgIdx].getPackExpansionPattern();2789        for (;;) {2790          // Deduce template parameters from the pattern.2791          if (auto Result = DeduceTemplateArguments(2792                  S, TemplateParams, Ps[ParamIdx], Pattern, Info,2793                  PartialOrdering, Deduced, HasDeducedAnyParam);2794              Result != TemplateDeductionResult::Success)2795            return Result;2796 2797          ++ParamIdx;2798          if (!hasTemplateArgumentForDeduction(Ps, ParamIdx))2799            return TemplateDeductionResult::Success;2800          if (Ps[ParamIdx].isPackExpansion())2801            break;2802        }2803      } else {2804        // Perform deduction for this Pi/Ai pair.2805        if (auto Result = DeduceTemplateArguments(2806                S, TemplateParams, Ps[ParamIdx], As[ArgIdx], Info,2807                PartialOrdering, Deduced, HasDeducedAnyParam);2808            Result != TemplateDeductionResult::Success)2809          return Result;2810 2811        ++ArgIdx;2812        ++ParamIdx;2813        continue;2814      }2815    }2816 2817    // The parameter is a pack expansion.2818 2819    // C++0x [temp.deduct.type]p9:2820    //   If Pi is a pack expansion, then the pattern of Pi is compared with2821    //   each remaining argument in the template argument list of A. Each2822    //   comparison deduces template arguments for subsequent positions in the2823    //   template parameter packs expanded by Pi.2824    TemplateArgument Pattern = Ps[ParamIdx].getPackExpansionPattern();2825 2826    // Prepare to deduce the packs within the pattern.2827    PackDeductionScope PackScope(S, TemplateParams, Deduced, Info, Pattern);2828 2829    // Keep track of the deduced template arguments for each parameter pack2830    // expanded by this pack expansion (the outer index) and for each2831    // template argument (the inner SmallVectors).2832    for (; hasTemplateArgumentForDeduction(As, ArgIdx) &&2833           PackScope.hasNextElement();2834         ++ArgIdx) {2835      if (!As[ArgIdx].isPackExpansion()) {2836        if (!FoldPackParameter)2837          return TemplateDeductionResult::MiscellaneousDeductionFailure;2838        if (FoldPackArgument)2839          Info.setStrictPackMatch();2840      }2841      // Deduce template arguments from the pattern.2842      if (auto Result = DeduceTemplateArguments(2843              S, TemplateParams, Pattern, As[ArgIdx], Info, PartialOrdering,2844              Deduced, HasDeducedAnyParam);2845          Result != TemplateDeductionResult::Success)2846        return Result;2847 2848      PackScope.nextPackElement();2849    }2850 2851    // Build argument packs for each of the parameter packs expanded by this2852    // pack expansion.2853    return PackScope.finish();2854  }2855}2856 2857TemplateDeductionResult Sema::DeduceTemplateArguments(2858    TemplateParameterList *TemplateParams, ArrayRef<TemplateArgument> Ps,2859    ArrayRef<TemplateArgument> As, sema::TemplateDeductionInfo &Info,2860    SmallVectorImpl<DeducedTemplateArgument> &Deduced,2861    bool NumberOfArgumentsMustMatch) {2862  return ::DeduceTemplateArguments(2863      *this, TemplateParams, Ps, As, Info, Deduced, NumberOfArgumentsMustMatch,2864      /*PartialOrdering=*/false, PackFold::ParameterToArgument,2865      /*HasDeducedAnyParam=*/nullptr);2866}2867 2868TemplateArgumentLoc2869Sema::getTrivialTemplateArgumentLoc(const TemplateArgument &Arg,2870                                    QualType NTTPType, SourceLocation Loc,2871                                    NamedDecl *TemplateParam) {2872  switch (Arg.getKind()) {2873  case TemplateArgument::Null:2874    llvm_unreachable("Can't get a NULL template argument here");2875 2876  case TemplateArgument::Type:2877    return TemplateArgumentLoc(2878        Arg, Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));2879 2880  case TemplateArgument::Declaration: {2881    if (NTTPType.isNull())2882      NTTPType = Arg.getParamTypeForDecl();2883    Expr *E = BuildExpressionFromDeclTemplateArgument(Arg, NTTPType, Loc,2884                                                      TemplateParam)2885                  .getAs<Expr>();2886    return TemplateArgumentLoc(TemplateArgument(E, /*IsCanonical=*/false), E);2887  }2888 2889  case TemplateArgument::NullPtr: {2890    if (NTTPType.isNull())2891      NTTPType = Arg.getNullPtrType();2892    Expr *E = BuildExpressionFromDeclTemplateArgument(Arg, NTTPType, Loc)2893                  .getAs<Expr>();2894    return TemplateArgumentLoc(TemplateArgument(NTTPType, /*isNullPtr*/true),2895                               E);2896  }2897 2898  case TemplateArgument::Integral:2899  case TemplateArgument::StructuralValue: {2900    Expr *E = BuildExpressionFromNonTypeTemplateArgument(Arg, Loc).get();2901    return TemplateArgumentLoc(TemplateArgument(E, /*IsCanonical=*/false), E);2902  }2903 2904    case TemplateArgument::Template:2905    case TemplateArgument::TemplateExpansion: {2906      NestedNameSpecifierLocBuilder Builder;2907      TemplateName Template = Arg.getAsTemplateOrTemplatePattern();2908      Builder.MakeTrivial(Context, Template.getQualifier(), Loc);2909      return TemplateArgumentLoc(2910          Context, Arg, Loc, Builder.getWithLocInContext(Context), Loc,2911          /*EllipsisLoc=*/Arg.getKind() == TemplateArgument::TemplateExpansion2912              ? Loc2913              : SourceLocation());2914    }2915 2916  case TemplateArgument::Expression:2917    return TemplateArgumentLoc(Arg, Arg.getAsExpr());2918 2919  case TemplateArgument::Pack:2920    return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());2921  }2922 2923  llvm_unreachable("Invalid TemplateArgument Kind!");2924}2925 2926TemplateArgumentLoc2927Sema::getIdentityTemplateArgumentLoc(NamedDecl *TemplateParm,2928                                     SourceLocation Location) {2929  return getTrivialTemplateArgumentLoc(2930      Context.getInjectedTemplateArg(TemplateParm), QualType(), Location);2931}2932 2933/// Convert the given deduced template argument and add it to the set of2934/// fully-converted template arguments.2935static bool2936ConvertDeducedTemplateArgument(Sema &S, NamedDecl *Param,2937                               DeducedTemplateArgument Arg, NamedDecl *Template,2938                               TemplateDeductionInfo &Info, bool IsDeduced,2939                               Sema::CheckTemplateArgumentInfo &CTAI) {2940  auto ConvertArg = [&](DeducedTemplateArgument Arg,2941                        unsigned ArgumentPackIndex) {2942    // Convert the deduced template argument into a template2943    // argument that we can check, almost as if the user had written2944    // the template argument explicitly.2945    TemplateArgumentLoc ArgLoc = S.getTrivialTemplateArgumentLoc(2946        Arg, QualType(), Info.getLocation(), Param);2947 2948    SaveAndRestore _1(CTAI.MatchingTTP, false);2949    SaveAndRestore _2(CTAI.StrictPackMatch, false);2950    // Check the template argument, converting it as necessary.2951    auto Res = S.CheckTemplateArgument(2952        Param, ArgLoc, Template, Template->getLocation(),2953        Template->getSourceRange().getEnd(), ArgumentPackIndex, CTAI,2954        IsDeduced2955            ? (Arg.wasDeducedFromArrayBound() ? Sema::CTAK_DeducedFromArrayBound2956                                              : Sema::CTAK_Deduced)2957            : Sema::CTAK_Specified);2958    if (CTAI.StrictPackMatch)2959      Info.setStrictPackMatch();2960    return Res;2961  };2962 2963  if (Arg.getKind() == TemplateArgument::Pack) {2964    // This is a template argument pack, so check each of its arguments against2965    // the template parameter.2966    SmallVector<TemplateArgument, 2> SugaredPackedArgsBuilder,2967        CanonicalPackedArgsBuilder;2968    for (const auto &P : Arg.pack_elements()) {2969      // When converting the deduced template argument, append it to the2970      // general output list. We need to do this so that the template argument2971      // checking logic has all of the prior template arguments available.2972      DeducedTemplateArgument InnerArg(P);2973      InnerArg.setDeducedFromArrayBound(Arg.wasDeducedFromArrayBound());2974      assert(InnerArg.getKind() != TemplateArgument::Pack &&2975             "deduced nested pack");2976      if (P.isNull()) {2977        // We deduced arguments for some elements of this pack, but not for2978        // all of them. This happens if we get a conditionally-non-deduced2979        // context in a pack expansion (such as an overload set in one of the2980        // arguments).2981        S.Diag(Param->getLocation(),2982               diag::err_template_arg_deduced_incomplete_pack)2983          << Arg << Param;2984        return true;2985      }2986      if (ConvertArg(InnerArg, SugaredPackedArgsBuilder.size()))2987        return true;2988 2989      // Move the converted template argument into our argument pack.2990      SugaredPackedArgsBuilder.push_back(CTAI.SugaredConverted.pop_back_val());2991      CanonicalPackedArgsBuilder.push_back(2992          CTAI.CanonicalConverted.pop_back_val());2993    }2994 2995    // If the pack is empty, we still need to substitute into the parameter2996    // itself, in case that substitution fails.2997    if (SugaredPackedArgsBuilder.empty()) {2998      LocalInstantiationScope Scope(S);2999      MultiLevelTemplateArgumentList Args(Template, CTAI.SugaredConverted,3000                                          /*Final=*/true);3001      Sema::ArgPackSubstIndexRAII OnlySubstNonPackExpansion(S, std::nullopt);3002 3003      if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {3004        Sema::InstantiatingTemplate Inst(S, Template->getLocation(), Template,3005                                         NTTP, CTAI.SugaredConverted,3006                                         Template->getSourceRange());3007        if (Inst.isInvalid() ||3008            S.SubstType(NTTP->getType(), Args, NTTP->getLocation(),3009                        NTTP->getDeclName()).isNull())3010          return true;3011      } else if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Param)) {3012        Sema::InstantiatingTemplate Inst(S, Template->getLocation(), Template,3013                                         TTP, CTAI.SugaredConverted,3014                                         Template->getSourceRange());3015        if (Inst.isInvalid() || !S.SubstDecl(TTP, S.CurContext, Args))3016          return true;3017      }3018      // For type parameters, no substitution is ever required.3019    }3020 3021    // Create the resulting argument pack.3022    CTAI.SugaredConverted.push_back(3023        TemplateArgument::CreatePackCopy(S.Context, SugaredPackedArgsBuilder));3024    CTAI.CanonicalConverted.push_back(TemplateArgument::CreatePackCopy(3025        S.Context, CanonicalPackedArgsBuilder));3026    return false;3027  }3028 3029  return ConvertArg(Arg, 0);3030}3031 3032/// \param IsIncomplete When used, we only consider template parameters that3033/// were deduced, disregarding any default arguments. After the function3034/// finishes, the object pointed at will contain a value indicating if the3035/// conversion was actually incomplete.3036static TemplateDeductionResult ConvertDeducedTemplateArguments(3037    Sema &S, NamedDecl *Template, TemplateParameterList *TemplateParams,3038    bool IsDeduced, SmallVectorImpl<DeducedTemplateArgument> &Deduced,3039    TemplateDeductionInfo &Info, Sema::CheckTemplateArgumentInfo &CTAI,3040    LocalInstantiationScope *CurrentInstantiationScope,3041    unsigned NumAlreadyConverted, bool *IsIncomplete) {3042  for (unsigned I = 0, N = TemplateParams->size(); I != N; ++I) {3043    NamedDecl *Param = TemplateParams->getParam(I);3044 3045    // C++0x [temp.arg.explicit]p3:3046    //    A trailing template parameter pack (14.5.3) not otherwise deduced will3047    //    be deduced to an empty sequence of template arguments.3048    // FIXME: Where did the word "trailing" come from?3049    if (Deduced[I].isNull() && Param->isTemplateParameterPack()) {3050      if (auto Result =3051              PackDeductionScope(S, TemplateParams, Deduced, Info, I).finish();3052          Result != TemplateDeductionResult::Success)3053        return Result;3054    }3055 3056    if (!Deduced[I].isNull()) {3057      if (I < NumAlreadyConverted) {3058        // We may have had explicitly-specified template arguments for a3059        // template parameter pack (that may or may not have been extended3060        // via additional deduced arguments).3061        if (Param->isParameterPack() && CurrentInstantiationScope &&3062            CurrentInstantiationScope->getPartiallySubstitutedPack() == Param) {3063          // Forget the partially-substituted pack; its substitution is now3064          // complete.3065          CurrentInstantiationScope->ResetPartiallySubstitutedPack();3066          // We still need to check the argument in case it was extended by3067          // deduction.3068        } else {3069          // We have already fully type-checked and converted this3070          // argument, because it was explicitly-specified. Just record the3071          // presence of this argument.3072          CTAI.SugaredConverted.push_back(Deduced[I]);3073          CTAI.CanonicalConverted.push_back(3074              S.Context.getCanonicalTemplateArgument(Deduced[I]));3075          continue;3076        }3077      }3078 3079      // We may have deduced this argument, so it still needs to be3080      // checked and converted.3081      if (ConvertDeducedTemplateArgument(S, Param, Deduced[I], Template, Info,3082                                         IsDeduced, CTAI)) {3083        Info.Param = makeTemplateParameter(Param);3084        // FIXME: These template arguments are temporary. Free them!3085        Info.reset(3086            TemplateArgumentList::CreateCopy(S.Context, CTAI.SugaredConverted),3087            TemplateArgumentList::CreateCopy(S.Context,3088                                             CTAI.CanonicalConverted));3089        return TemplateDeductionResult::SubstitutionFailure;3090      }3091 3092      continue;3093    }3094 3095    // [C++26][temp.deduct.partial]p12 - When partial ordering, it's ok for3096    // template parameters to remain not deduced. As a provisional fix for a3097    // core issue that does not exist yet, which may be related to CWG2160, only3098    // consider template parameters that were deduced, disregarding any default3099    // arguments.3100    if (IsIncomplete) {3101      *IsIncomplete = true;3102      CTAI.SugaredConverted.push_back({});3103      CTAI.CanonicalConverted.push_back({});3104      continue;3105    }3106 3107    // Substitute into the default template argument, if available.3108    bool HasDefaultArg = false;3109    TemplateDecl *TD = dyn_cast<TemplateDecl>(Template);3110    if (!TD) {3111      assert(isa<ClassTemplatePartialSpecializationDecl>(Template) ||3112             isa<VarTemplatePartialSpecializationDecl>(Template));3113      return TemplateDeductionResult::Incomplete;3114    }3115 3116    TemplateArgumentLoc DefArg;3117    {3118      Qualifiers ThisTypeQuals;3119      CXXRecordDecl *ThisContext = nullptr;3120      if (auto *Rec = dyn_cast<CXXRecordDecl>(TD->getDeclContext()))3121        if (Rec->isLambda())3122          if (auto *Method = dyn_cast<CXXMethodDecl>(Rec->getDeclContext())) {3123            ThisContext = Method->getParent();3124            ThisTypeQuals = Method->getMethodQualifiers();3125          }3126 3127      Sema::CXXThisScopeRAII ThisScope(S, ThisContext, ThisTypeQuals,3128                                       S.getLangOpts().CPlusPlus17);3129 3130      DefArg = S.SubstDefaultTemplateArgumentIfAvailable(3131          TD, /*TemplateKWLoc=*/SourceLocation(), TD->getLocation(),3132          TD->getSourceRange().getEnd(), Param, CTAI.SugaredConverted,3133          CTAI.CanonicalConverted, HasDefaultArg);3134    }3135 3136    // If there was no default argument, deduction is incomplete.3137    if (DefArg.getArgument().isNull()) {3138      Info.Param = makeTemplateParameter(TemplateParams->getParam(I));3139      Info.reset(3140          TemplateArgumentList::CreateCopy(S.Context, CTAI.SugaredConverted),3141          TemplateArgumentList::CreateCopy(S.Context, CTAI.CanonicalConverted));3142 3143      return HasDefaultArg ? TemplateDeductionResult::SubstitutionFailure3144                           : TemplateDeductionResult::Incomplete;3145    }3146 3147    SaveAndRestore _1(CTAI.PartialOrdering, false);3148    SaveAndRestore _2(CTAI.MatchingTTP, false);3149    SaveAndRestore _3(CTAI.StrictPackMatch, false);3150    // Check whether we can actually use the default argument.3151    if (S.CheckTemplateArgument(3152            Param, DefArg, TD, TD->getLocation(), TD->getSourceRange().getEnd(),3153            /*ArgumentPackIndex=*/0, CTAI, Sema::CTAK_Specified)) {3154      Info.Param = makeTemplateParameter(TemplateParams->getParam(I));3155      // FIXME: These template arguments are temporary. Free them!3156      Info.reset(3157          TemplateArgumentList::CreateCopy(S.Context, CTAI.SugaredConverted),3158          TemplateArgumentList::CreateCopy(S.Context, CTAI.CanonicalConverted));3159      return TemplateDeductionResult::SubstitutionFailure;3160    }3161 3162    // If we get here, we successfully used the default template argument.3163  }3164 3165  return TemplateDeductionResult::Success;3166}3167 3168static DeclContext *getAsDeclContextOrEnclosing(Decl *D) {3169  if (auto *DC = dyn_cast<DeclContext>(D))3170    return DC;3171  return D->getDeclContext();3172}3173 3174template<typename T> struct IsPartialSpecialization {3175  static constexpr bool value = false;3176};3177template<>3178struct IsPartialSpecialization<ClassTemplatePartialSpecializationDecl> {3179  static constexpr bool value = true;3180};3181template<>3182struct IsPartialSpecialization<VarTemplatePartialSpecializationDecl> {3183  static constexpr bool value = true;3184};3185 3186static TemplateDeductionResult3187CheckDeducedArgumentConstraints(Sema &S, NamedDecl *Template,3188                                ArrayRef<TemplateArgument> SugaredDeducedArgs,3189                                ArrayRef<TemplateArgument> CanonicalDeducedArgs,3190                                TemplateDeductionInfo &Info) {3191  llvm::SmallVector<AssociatedConstraint, 3> AssociatedConstraints;3192  bool DeducedArgsNeedReplacement = false;3193  if (auto *TD = dyn_cast<ClassTemplatePartialSpecializationDecl>(Template)) {3194    TD->getAssociatedConstraints(AssociatedConstraints);3195    DeducedArgsNeedReplacement = !TD->isClassScopeExplicitSpecialization();3196  } else if (auto *TD =3197                 dyn_cast<VarTemplatePartialSpecializationDecl>(Template)) {3198    TD->getAssociatedConstraints(AssociatedConstraints);3199    DeducedArgsNeedReplacement = !TD->isClassScopeExplicitSpecialization();3200  } else {3201    cast<TemplateDecl>(Template)->getAssociatedConstraints(3202        AssociatedConstraints);3203  }3204 3205  std::optional<ArrayRef<TemplateArgument>> Innermost;3206  // If we don't need to replace the deduced template arguments,3207  // we can add them immediately as the inner-most argument list.3208  if (!DeducedArgsNeedReplacement)3209    Innermost = SugaredDeducedArgs;3210 3211  MultiLevelTemplateArgumentList MLTAL = S.getTemplateInstantiationArgs(3212      Template, Template->getDeclContext(), /*Final=*/false, Innermost,3213      /*RelativeToPrimary=*/true, /*Pattern=*/3214      nullptr, /*ForConstraintInstantiation=*/true);3215 3216  // getTemplateInstantiationArgs picks up the non-deduced version of the3217  // template args when this is a variable template partial specialization and3218  // not class-scope explicit specialization, so replace with Deduced Args3219  // instead of adding to inner-most.3220  if (!Innermost)3221    MLTAL.replaceInnermostTemplateArguments(Template, SugaredDeducedArgs);3222 3223  if (S.CheckConstraintSatisfaction(Template, AssociatedConstraints, MLTAL,3224                                    Info.getLocation(),3225                                    Info.AssociatedConstraintsSatisfaction) ||3226      !Info.AssociatedConstraintsSatisfaction.IsSatisfied) {3227    Info.reset(3228        TemplateArgumentList::CreateCopy(S.Context, SugaredDeducedArgs),3229        TemplateArgumentList::CreateCopy(S.Context, CanonicalDeducedArgs));3230    return TemplateDeductionResult::ConstraintsNotSatisfied;3231  }3232  return TemplateDeductionResult::Success;3233}3234 3235/// Complete template argument deduction.3236static TemplateDeductionResult FinishTemplateArgumentDeduction(3237    Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL,3238    TemplateDecl *Template, bool PartialOrdering,3239    ArrayRef<TemplateArgumentLoc> Ps, ArrayRef<TemplateArgument> As,3240    SmallVectorImpl<DeducedTemplateArgument> &Deduced,3241    TemplateDeductionInfo &Info, bool CopyDeducedArgs) {3242  Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(Entity));3243 3244  // C++ [temp.deduct.type]p2:3245  //   [...] or if any template argument remains neither deduced nor3246  //   explicitly specified, template argument deduction fails.3247  Sema::CheckTemplateArgumentInfo CTAI(PartialOrdering);3248  if (auto Result = ConvertDeducedTemplateArguments(3249          S, Entity, EntityTPL, /*IsDeduced=*/PartialOrdering, Deduced, Info,3250          CTAI,3251          /*CurrentInstantiationScope=*/nullptr,3252          /*NumAlreadyConverted=*/0U, /*IsIncomplete=*/nullptr);3253      Result != TemplateDeductionResult::Success)3254    return Result;3255 3256  if (CopyDeducedArgs) {3257    // Form the template argument list from the deduced template arguments.3258    TemplateArgumentList *SugaredDeducedArgumentList =3259        TemplateArgumentList::CreateCopy(S.Context, CTAI.SugaredConverted);3260    TemplateArgumentList *CanonicalDeducedArgumentList =3261        TemplateArgumentList::CreateCopy(S.Context, CTAI.CanonicalConverted);3262    Info.reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);3263  }3264 3265  TemplateParameterList *TPL = Template->getTemplateParameters();3266  TemplateArgumentListInfo InstArgs(TPL->getLAngleLoc(), TPL->getRAngleLoc());3267  MultiLevelTemplateArgumentList MLTAL(Entity, CTAI.SugaredConverted,3268                                       /*Final=*/true);3269  MLTAL.addOuterRetainedLevels(TPL->getDepth());3270 3271  if (S.SubstTemplateArguments(Ps, MLTAL, InstArgs)) {3272    unsigned ArgIdx = InstArgs.size(), ParamIdx = ArgIdx;3273    if (ParamIdx >= TPL->size())3274      ParamIdx = TPL->size() - 1;3275 3276    Decl *Param = TPL->getParam(ParamIdx);3277    Info.Param = makeTemplateParameter(Param);3278    Info.FirstArg = Ps[ArgIdx].getArgument();3279    return TemplateDeductionResult::SubstitutionFailure;3280  }3281 3282  bool ConstraintsNotSatisfied;3283  Sema::CheckTemplateArgumentInfo InstCTAI;3284  if (S.CheckTemplateArgumentList(Template, Template->getLocation(), InstArgs,3285                                  /*DefaultArgs=*/{}, false, InstCTAI,3286                                  /*UpdateArgsWithConversions=*/true,3287                                  &ConstraintsNotSatisfied))3288    return ConstraintsNotSatisfied3289               ? TemplateDeductionResult::ConstraintsNotSatisfied3290               : TemplateDeductionResult::SubstitutionFailure;3291 3292  // Check that we produced the correct argument list.3293  SmallVector<ArrayRef<TemplateArgument>, 4> PsStack{InstCTAI.SugaredConverted},3294      AsStack{As};3295  for (;;) {3296    auto take = [](SmallVectorImpl<ArrayRef<TemplateArgument>> &Stack)3297        -> std::tuple<ArrayRef<TemplateArgument> &, TemplateArgument> {3298      while (!Stack.empty()) {3299        auto &Xs = Stack.back();3300        if (Xs.empty()) {3301          Stack.pop_back();3302          continue;3303        }3304        auto &X = Xs.front();3305        if (X.getKind() == TemplateArgument::Pack) {3306          Stack.emplace_back(X.getPackAsArray());3307          Xs = Xs.drop_front();3308          continue;3309        }3310        assert(!X.isNull());3311        return {Xs, X};3312      }3313      static constexpr ArrayRef<TemplateArgument> None;3314      return {const_cast<ArrayRef<TemplateArgument> &>(None),3315              TemplateArgument()};3316    };3317    auto [Ps, P] = take(PsStack);3318    auto [As, A] = take(AsStack);3319    if (P.isNull() && A.isNull())3320      break;3321    TemplateArgument PP = P.isPackExpansion() ? P.getPackExpansionPattern() : P,3322                     PA = A.isPackExpansion() ? A.getPackExpansionPattern() : A;3323    if (!S.Context.isSameTemplateArgument(PP, PA)) {3324      if (!P.isPackExpansion() && !A.isPackExpansion()) {3325        Info.Param = makeTemplateParameter(TPL->getParam(3326            (AsStack.empty() ? As.end() : AsStack.back().begin()) -3327            As.begin()));3328        Info.FirstArg = P;3329        Info.SecondArg = A;3330        return TemplateDeductionResult::NonDeducedMismatch;3331      }3332      if (P.isPackExpansion()) {3333        Ps = Ps.drop_front();3334        continue;3335      }3336      if (A.isPackExpansion()) {3337        As = As.drop_front();3338        continue;3339      }3340    }3341    Ps = Ps.drop_front(P.isPackExpansion() ? 0 : 1);3342    As = As.drop_front(A.isPackExpansion() && !P.isPackExpansion() ? 0 : 1);3343  }3344  assert(PsStack.empty());3345  assert(AsStack.empty());3346 3347  if (!PartialOrdering) {3348    if (auto Result = CheckDeducedArgumentConstraints(3349            S, Entity, CTAI.SugaredConverted, CTAI.CanonicalConverted, Info);3350        Result != TemplateDeductionResult::Success)3351      return Result;3352  }3353 3354  return TemplateDeductionResult::Success;3355}3356static TemplateDeductionResult FinishTemplateArgumentDeduction(3357    Sema &S, NamedDecl *Entity, TemplateParameterList *EntityTPL,3358    TemplateDecl *Template, bool PartialOrdering, ArrayRef<TemplateArgument> Ps,3359    ArrayRef<TemplateArgument> As,3360    SmallVectorImpl<DeducedTemplateArgument> &Deduced,3361    TemplateDeductionInfo &Info, bool CopyDeducedArgs) {3362  TemplateParameterList *TPL = Template->getTemplateParameters();3363  SmallVector<TemplateArgumentLoc, 8> PsLoc(Ps.size());3364  for (unsigned I = 0, N = Ps.size(); I != N; ++I)3365    PsLoc[I] = S.getTrivialTemplateArgumentLoc(Ps[I], QualType(),3366                                               TPL->getParam(I)->getLocation());3367  return FinishTemplateArgumentDeduction(S, Entity, EntityTPL, Template,3368                                         PartialOrdering, PsLoc, As, Deduced,3369                                         Info, CopyDeducedArgs);3370}3371 3372/// Complete template argument deduction for DeduceTemplateArgumentsFromType.3373/// FIXME: this is mostly duplicated with the above two versions. Deduplicate3374/// the three implementations.3375static TemplateDeductionResult FinishTemplateArgumentDeduction(3376    Sema &S, TemplateDecl *TD,3377    SmallVectorImpl<DeducedTemplateArgument> &Deduced,3378    TemplateDeductionInfo &Info) {3379  Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(TD));3380 3381  // C++ [temp.deduct.type]p2:3382  //   [...] or if any template argument remains neither deduced nor3383  //   explicitly specified, template argument deduction fails.3384  Sema::CheckTemplateArgumentInfo CTAI;3385  if (auto Result = ConvertDeducedTemplateArguments(3386          S, TD, TD->getTemplateParameters(), /*IsDeduced=*/false, Deduced,3387          Info, CTAI,3388          /*CurrentInstantiationScope=*/nullptr, /*NumAlreadyConverted=*/0,3389          /*IsIncomplete=*/nullptr);3390      Result != TemplateDeductionResult::Success)3391    return Result;3392 3393  return ::CheckDeducedArgumentConstraints(S, TD, CTAI.SugaredConverted,3394                                           CTAI.CanonicalConverted, Info);3395}3396 3397/// Perform template argument deduction to determine whether the given template3398/// arguments match the given class or variable template partial specialization3399/// per C++ [temp.class.spec.match].3400template <typename T>3401static std::enable_if_t<IsPartialSpecialization<T>::value,3402                        TemplateDeductionResult>3403DeduceTemplateArguments(Sema &S, T *Partial,3404                        ArrayRef<TemplateArgument> TemplateArgs,3405                        TemplateDeductionInfo &Info) {3406  if (Partial->isInvalidDecl())3407    return TemplateDeductionResult::Invalid;3408 3409  // C++ [temp.class.spec.match]p2:3410  //   A partial specialization matches a given actual template3411  //   argument list if the template arguments of the partial3412  //   specialization can be deduced from the actual template argument3413  //   list (14.8.2).3414 3415  // Unevaluated SFINAE context.3416  EnterExpressionEvaluationContext Unevaluated(3417      S, Sema::ExpressionEvaluationContext::Unevaluated);3418  Sema::SFINAETrap Trap(S, Info);3419 3420  // This deduction has no relation to any outer instantiation we might be3421  // performing.3422  LocalInstantiationScope InstantiationScope(S);3423 3424  SmallVector<DeducedTemplateArgument, 4> Deduced;3425  Deduced.resize(Partial->getTemplateParameters()->size());3426  if (TemplateDeductionResult Result = ::DeduceTemplateArguments(3427          S, Partial->getTemplateParameters(),3428          Partial->getTemplateArgs().asArray(), TemplateArgs, Info, Deduced,3429          /*NumberOfArgumentsMustMatch=*/false, /*PartialOrdering=*/false,3430          PackFold::ParameterToArgument,3431          /*HasDeducedAnyParam=*/nullptr);3432      Result != TemplateDeductionResult::Success)3433    return Result;3434 3435  SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());3436  Sema::InstantiatingTemplate Inst(S, Info.getLocation(), Partial, DeducedArgs);3437  if (Inst.isInvalid())3438    return TemplateDeductionResult::InstantiationDepth;3439 3440  TemplateDeductionResult Result;3441  S.runWithSufficientStackSpace(Info.getLocation(), [&] {3442    Result = ::FinishTemplateArgumentDeduction(3443        S, Partial, Partial->getTemplateParameters(),3444        Partial->getSpecializedTemplate(),3445        /*IsPartialOrdering=*/false,3446        Partial->getTemplateArgsAsWritten()->arguments(), TemplateArgs, Deduced,3447        Info, /*CopyDeducedArgs=*/true);3448  });3449 3450  if (Result != TemplateDeductionResult::Success)3451    return Result;3452 3453  if (Trap.hasErrorOccurred())3454    return TemplateDeductionResult::SubstitutionFailure;3455 3456  return TemplateDeductionResult::Success;3457}3458 3459TemplateDeductionResult3460Sema::DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial,3461                              ArrayRef<TemplateArgument> TemplateArgs,3462                              TemplateDeductionInfo &Info) {3463  return ::DeduceTemplateArguments(*this, Partial, TemplateArgs, Info);3464}3465TemplateDeductionResult3466Sema::DeduceTemplateArguments(VarTemplatePartialSpecializationDecl *Partial,3467                              ArrayRef<TemplateArgument> TemplateArgs,3468                              TemplateDeductionInfo &Info) {3469  return ::DeduceTemplateArguments(*this, Partial, TemplateArgs, Info);3470}3471 3472TemplateDeductionResult3473Sema::DeduceTemplateArgumentsFromType(TemplateDecl *TD, QualType FromType,3474                                      sema::TemplateDeductionInfo &Info) {3475  if (TD->isInvalidDecl())3476    return TemplateDeductionResult::Invalid;3477 3478  QualType PType;3479  if (const auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {3480    // Use the InjectedClassNameType.3481    PType = Context.getCanonicalTagType(CTD->getTemplatedDecl());3482  } else if (const auto *AliasTemplate = dyn_cast<TypeAliasTemplateDecl>(TD)) {3483    PType = AliasTemplate->getTemplatedDecl()->getUnderlyingType();3484  } else {3485    assert(false && "Expected a class or alias template");3486  }3487 3488  // Unevaluated SFINAE context.3489  EnterExpressionEvaluationContext Unevaluated(3490      *this, Sema::ExpressionEvaluationContext::Unevaluated);3491  SFINAETrap Trap(*this, Info);3492 3493  // This deduction has no relation to any outer instantiation we might be3494  // performing.3495  LocalInstantiationScope InstantiationScope(*this);3496 3497  SmallVector<DeducedTemplateArgument> Deduced(3498      TD->getTemplateParameters()->size());3499  SmallVector<TemplateArgument> PArgs = {TemplateArgument(PType)};3500  SmallVector<TemplateArgument> AArgs = {TemplateArgument(FromType)};3501  if (auto DeducedResult = DeduceTemplateArguments(3502          TD->getTemplateParameters(), PArgs, AArgs, Info, Deduced, false);3503      DeducedResult != TemplateDeductionResult::Success) {3504    return DeducedResult;3505  }3506 3507  SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());3508  InstantiatingTemplate Inst(*this, Info.getLocation(), TD, DeducedArgs);3509  if (Inst.isInvalid())3510    return TemplateDeductionResult::InstantiationDepth;3511 3512  TemplateDeductionResult Result;3513  runWithSufficientStackSpace(Info.getLocation(), [&] {3514    Result = ::FinishTemplateArgumentDeduction(*this, TD, Deduced, Info);3515  });3516 3517  if (Result != TemplateDeductionResult::Success)3518    return Result;3519 3520  if (Trap.hasErrorOccurred())3521    return TemplateDeductionResult::SubstitutionFailure;3522 3523  return TemplateDeductionResult::Success;3524}3525 3526/// Determine whether the given type T is a simple-template-id type.3527static bool isSimpleTemplateIdType(QualType T) {3528  if (const TemplateSpecializationType *Spec3529        = T->getAs<TemplateSpecializationType>())3530    return Spec->getTemplateName().getAsTemplateDecl() != nullptr;3531 3532  // C++17 [temp.local]p2:3533  //   the injected-class-name [...] is equivalent to the template-name followed3534  //   by the template-arguments of the class template specialization or partial3535  //   specialization enclosed in <>3536  // ... which means it's equivalent to a simple-template-id.3537  //3538  // This only arises during class template argument deduction for a copy3539  // deduction candidate, where it permits slicing.3540  if (isa<InjectedClassNameType>(T.getCanonicalType()))3541    return true;3542 3543  return false;3544}3545 3546TemplateDeductionResult Sema::SubstituteExplicitTemplateArguments(3547    FunctionTemplateDecl *FunctionTemplate,3548    TemplateArgumentListInfo &ExplicitTemplateArgs,3549    SmallVectorImpl<DeducedTemplateArgument> &Deduced,3550    SmallVectorImpl<QualType> &ParamTypes, QualType *FunctionType,3551    TemplateDeductionInfo &Info) {3552  assert(isSFINAEContext());3553  assert(isUnevaluatedContext());3554 3555  FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();3556  TemplateParameterList *TemplateParams3557    = FunctionTemplate->getTemplateParameters();3558 3559  if (ExplicitTemplateArgs.size() == 0) {3560    // No arguments to substitute; just copy over the parameter types and3561    // fill in the function type.3562    for (auto *P : Function->parameters())3563      ParamTypes.push_back(P->getType());3564 3565    if (FunctionType)3566      *FunctionType = Function->getType();3567    return TemplateDeductionResult::Success;3568  }3569 3570  // C++ [temp.arg.explicit]p3:3571  //   Template arguments that are present shall be specified in the3572  //   declaration order of their corresponding template-parameters. The3573  //   template argument list shall not specify more template-arguments than3574  //   there are corresponding template-parameters.3575 3576  // Enter a new template instantiation context where we check the3577  // explicitly-specified template arguments against this function template,3578  // and then substitute them into the function parameter types.3579  SmallVector<TemplateArgument, 4> DeducedArgs;3580  InstantiatingTemplate Inst(3581      *this, Info.getLocation(), FunctionTemplate, DeducedArgs,3582      CodeSynthesisContext::ExplicitTemplateArgumentSubstitution);3583  if (Inst.isInvalid())3584    return TemplateDeductionResult::InstantiationDepth;3585 3586  CheckTemplateArgumentInfo CTAI;3587  if (CheckTemplateArgumentList(FunctionTemplate, SourceLocation(),3588                                ExplicitTemplateArgs, /*DefaultArgs=*/{},3589                                /*PartialTemplateArgs=*/true, CTAI,3590                                /*UpdateArgsWithConversions=*/false)) {3591    unsigned Index = CTAI.SugaredConverted.size();3592    if (Index >= TemplateParams->size())3593      return TemplateDeductionResult::SubstitutionFailure;3594    Info.Param = makeTemplateParameter(TemplateParams->getParam(Index));3595    return TemplateDeductionResult::InvalidExplicitArguments;3596  }3597 3598  // Form the template argument list from the explicitly-specified3599  // template arguments.3600  TemplateArgumentList *SugaredExplicitArgumentList =3601      TemplateArgumentList::CreateCopy(Context, CTAI.SugaredConverted);3602  TemplateArgumentList *CanonicalExplicitArgumentList =3603      TemplateArgumentList::CreateCopy(Context, CTAI.CanonicalConverted);3604  Info.setExplicitArgs(SugaredExplicitArgumentList,3605                       CanonicalExplicitArgumentList);3606 3607  // Template argument deduction and the final substitution should be3608  // done in the context of the templated declaration.  Explicit3609  // argument substitution, on the other hand, needs to happen in the3610  // calling context.3611  ContextRAII SavedContext(*this, FunctionTemplate->getTemplatedDecl());3612 3613  // If we deduced template arguments for a template parameter pack,3614  // note that the template argument pack is partially substituted and record3615  // the explicit template arguments. They'll be used as part of deduction3616  // for this template parameter pack.3617  unsigned PartiallySubstitutedPackIndex = -1u;3618  if (!CTAI.SugaredConverted.empty()) {3619    const TemplateArgument &Arg = CTAI.SugaredConverted.back();3620    if (Arg.getKind() == TemplateArgument::Pack) {3621      auto *Param = TemplateParams->getParam(CTAI.SugaredConverted.size() - 1);3622      // If this is a fully-saturated fixed-size pack, it should be3623      // fully-substituted, not partially-substituted.3624      UnsignedOrNone Expansions = getExpandedPackSize(Param);3625      if (!Expansions || Arg.pack_size() < *Expansions) {3626        PartiallySubstitutedPackIndex = CTAI.SugaredConverted.size() - 1;3627        CurrentInstantiationScope->SetPartiallySubstitutedPack(3628            Param, Arg.pack_begin(), Arg.pack_size());3629      }3630    }3631  }3632 3633  const FunctionProtoType *Proto3634    = Function->getType()->getAs<FunctionProtoType>();3635  assert(Proto && "Function template does not have a prototype?");3636 3637  // Isolate our substituted parameters from our caller.3638  LocalInstantiationScope InstScope(*this, /*MergeWithOuterScope*/true);3639 3640  ExtParameterInfoBuilder ExtParamInfos;3641 3642  MultiLevelTemplateArgumentList MLTAL(FunctionTemplate,3643                                       SugaredExplicitArgumentList->asArray(),3644                                       /*Final=*/true);3645 3646  // Instantiate the types of each of the function parameters given the3647  // explicitly-specified template arguments. If the function has a trailing3648  // return type, substitute it after the arguments to ensure we substitute3649  // in lexical order.3650  if (Proto->hasTrailingReturn()) {3651    if (SubstParmTypes(Function->getLocation(), Function->parameters(),3652                       Proto->getExtParameterInfosOrNull(), MLTAL, ParamTypes,3653                       /*params=*/nullptr, ExtParamInfos))3654      return TemplateDeductionResult::SubstitutionFailure;3655  }3656 3657  // Instantiate the return type.3658  QualType ResultType;3659  {3660    // C++11 [expr.prim.general]p3:3661    //   If a declaration declares a member function or member function3662    //   template of a class X, the expression this is a prvalue of type3663    //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq3664    //   and the end of the function-definition, member-declarator, or3665    //   declarator.3666    Qualifiers ThisTypeQuals;3667    CXXRecordDecl *ThisContext = nullptr;3668    if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Function)) {3669      ThisContext = Method->getParent();3670      ThisTypeQuals = Method->getMethodQualifiers();3671    }3672 3673    CXXThisScopeRAII ThisScope(*this, ThisContext, ThisTypeQuals,3674                               getLangOpts().CPlusPlus11);3675 3676    ResultType =3677        SubstType(Proto->getReturnType(), MLTAL,3678                  Function->getTypeSpecStartLoc(), Function->getDeclName());3679    if (ResultType.isNull())3680      return TemplateDeductionResult::SubstitutionFailure;3681    // CUDA: Kernel function must have 'void' return type.3682    if (getLangOpts().CUDA)3683      if (Function->hasAttr<CUDAGlobalAttr>() && !ResultType->isVoidType()) {3684        Diag(Function->getLocation(), diag::err_kern_type_not_void_return)3685            << Function->getType() << Function->getSourceRange();3686        return TemplateDeductionResult::SubstitutionFailure;3687      }3688  }3689 3690  // Instantiate the types of each of the function parameters given the3691  // explicitly-specified template arguments if we didn't do so earlier.3692  if (!Proto->hasTrailingReturn() &&3693      SubstParmTypes(Function->getLocation(), Function->parameters(),3694                     Proto->getExtParameterInfosOrNull(), MLTAL, ParamTypes,3695                     /*params*/ nullptr, ExtParamInfos))3696    return TemplateDeductionResult::SubstitutionFailure;3697 3698  if (FunctionType) {3699    auto EPI = Proto->getExtProtoInfo();3700    EPI.ExtParameterInfos = ExtParamInfos.getPointerOrNull(ParamTypes.size());3701    *FunctionType = BuildFunctionType(ResultType, ParamTypes,3702                                      Function->getLocation(),3703                                      Function->getDeclName(),3704                                      EPI);3705    if (FunctionType->isNull())3706      return TemplateDeductionResult::SubstitutionFailure;3707  }3708 3709  // C++ [temp.arg.explicit]p2:3710  //   Trailing template arguments that can be deduced (14.8.2) may be3711  //   omitted from the list of explicit template-arguments. If all of the3712  //   template arguments can be deduced, they may all be omitted; in this3713  //   case, the empty template argument list <> itself may also be omitted.3714  //3715  // Take all of the explicitly-specified arguments and put them into3716  // the set of deduced template arguments. The partially-substituted3717  // parameter pack, however, will be set to NULL since the deduction3718  // mechanism handles the partially-substituted argument pack directly.3719  Deduced.reserve(TemplateParams->size());3720  for (unsigned I = 0, N = SugaredExplicitArgumentList->size(); I != N; ++I) {3721    const TemplateArgument &Arg = SugaredExplicitArgumentList->get(I);3722    if (I == PartiallySubstitutedPackIndex)3723      Deduced.push_back(DeducedTemplateArgument());3724    else3725      Deduced.push_back(Arg);3726  }3727 3728  return TemplateDeductionResult::Success;3729}3730 3731/// Check whether the deduced argument type for a call to a function3732/// template matches the actual argument type per C++ [temp.deduct.call]p4.3733static TemplateDeductionResult3734CheckOriginalCallArgDeduction(Sema &S, TemplateDeductionInfo &Info,3735                              Sema::OriginalCallArg OriginalArg,3736                              QualType DeducedA) {3737  ASTContext &Context = S.Context;3738 3739  auto Failed = [&]() -> TemplateDeductionResult {3740    Info.FirstArg = TemplateArgument(DeducedA);3741    Info.SecondArg = TemplateArgument(OriginalArg.OriginalArgType);3742    Info.CallArgIndex = OriginalArg.ArgIdx;3743    return OriginalArg.DecomposedParam3744               ? TemplateDeductionResult::DeducedMismatchNested3745               : TemplateDeductionResult::DeducedMismatch;3746  };3747 3748  QualType A = OriginalArg.OriginalArgType;3749  QualType OriginalParamType = OriginalArg.OriginalParamType;3750 3751  // Check for type equality (top-level cv-qualifiers are ignored).3752  if (Context.hasSameUnqualifiedType(A, DeducedA))3753    return TemplateDeductionResult::Success;3754 3755  // Strip off references on the argument types; they aren't needed for3756  // the following checks.3757  if (const ReferenceType *DeducedARef = DeducedA->getAs<ReferenceType>())3758    DeducedA = DeducedARef->getPointeeType();3759  if (const ReferenceType *ARef = A->getAs<ReferenceType>())3760    A = ARef->getPointeeType();3761 3762  // C++ [temp.deduct.call]p4:3763  //   [...] However, there are three cases that allow a difference:3764  //     - If the original P is a reference type, the deduced A (i.e., the3765  //       type referred to by the reference) can be more cv-qualified than3766  //       the transformed A.3767  if (const ReferenceType *OriginalParamRef3768      = OriginalParamType->getAs<ReferenceType>()) {3769    // We don't want to keep the reference around any more.3770    OriginalParamType = OriginalParamRef->getPointeeType();3771 3772    // FIXME: Resolve core issue (no number yet): if the original P is a3773    // reference type and the transformed A is function type "noexcept F",3774    // the deduced A can be F.3775    if (A->isFunctionType() && S.IsFunctionConversion(A, DeducedA))3776      return TemplateDeductionResult::Success;3777 3778    Qualifiers AQuals = A.getQualifiers();3779    Qualifiers DeducedAQuals = DeducedA.getQualifiers();3780 3781    // Under Objective-C++ ARC, the deduced type may have implicitly3782    // been given strong or (when dealing with a const reference)3783    // unsafe_unretained lifetime. If so, update the original3784    // qualifiers to include this lifetime.3785    if (S.getLangOpts().ObjCAutoRefCount &&3786        ((DeducedAQuals.getObjCLifetime() == Qualifiers::OCL_Strong &&3787          AQuals.getObjCLifetime() == Qualifiers::OCL_None) ||3788         (DeducedAQuals.hasConst() &&3789          DeducedAQuals.getObjCLifetime() == Qualifiers::OCL_ExplicitNone))) {3790      AQuals.setObjCLifetime(DeducedAQuals.getObjCLifetime());3791    }3792 3793    if (AQuals == DeducedAQuals) {3794      // Qualifiers match; there's nothing to do.3795    } else if (!DeducedAQuals.compatiblyIncludes(AQuals, S.getASTContext())) {3796      return Failed();3797    } else {3798      // Qualifiers are compatible, so have the argument type adopt the3799      // deduced argument type's qualifiers as if we had performed the3800      // qualification conversion.3801      A = Context.getQualifiedType(A.getUnqualifiedType(), DeducedAQuals);3802    }3803  }3804 3805  //    - The transformed A can be another pointer or pointer to member3806  //      type that can be converted to the deduced A via a function pointer3807  //      conversion and/or a qualification conversion.3808  //3809  // Also allow conversions which merely strip __attribute__((noreturn)) from3810  // function types (recursively).3811  bool ObjCLifetimeConversion = false;3812  if ((A->isAnyPointerType() || A->isMemberPointerType()) &&3813      (S.IsQualificationConversion(A, DeducedA, false,3814                                   ObjCLifetimeConversion) ||3815       S.IsFunctionConversion(A, DeducedA)))3816    return TemplateDeductionResult::Success;3817 3818  //    - If P is a class and P has the form simple-template-id, then the3819  //      transformed A can be a derived class of the deduced A. [...]3820  //     [...] Likewise, if P is a pointer to a class of the form3821  //      simple-template-id, the transformed A can be a pointer to a3822  //      derived class pointed to by the deduced A.3823  if (const PointerType *OriginalParamPtr3824      = OriginalParamType->getAs<PointerType>()) {3825    if (const PointerType *DeducedAPtr = DeducedA->getAs<PointerType>()) {3826      if (const PointerType *APtr = A->getAs<PointerType>()) {3827        if (A->getPointeeType()->isRecordType()) {3828          OriginalParamType = OriginalParamPtr->getPointeeType();3829          DeducedA = DeducedAPtr->getPointeeType();3830          A = APtr->getPointeeType();3831        }3832      }3833    }3834  }3835 3836  if (Context.hasSameUnqualifiedType(A, DeducedA))3837    return TemplateDeductionResult::Success;3838 3839  if (A->isRecordType() && isSimpleTemplateIdType(OriginalParamType) &&3840      S.IsDerivedFrom(Info.getLocation(), A, DeducedA))3841    return TemplateDeductionResult::Success;3842 3843  return Failed();3844}3845 3846/// Find the pack index for a particular parameter index in an instantiation of3847/// a function template with specific arguments.3848///3849/// \return The pack index for whichever pack produced this parameter, or -13850///         if this was not produced by a parameter. Intended to be used as the3851///         ArgumentPackSubstitutionIndex for further substitutions.3852// FIXME: We should track this in OriginalCallArgs so we don't need to3853// reconstruct it here.3854static UnsignedOrNone3855getPackIndexForParam(Sema &S, FunctionTemplateDecl *FunctionTemplate,3856                     const MultiLevelTemplateArgumentList &Args,3857                     unsigned ParamIdx) {3858  unsigned Idx = 0;3859  for (auto *PD : FunctionTemplate->getTemplatedDecl()->parameters()) {3860    if (PD->isParameterPack()) {3861      UnsignedOrNone NumArgs =3862          S.getNumArgumentsInExpansion(PD->getType(), Args);3863      unsigned NumExpansions = NumArgs ? *NumArgs : 1;3864      if (Idx + NumExpansions > ParamIdx)3865        return ParamIdx - Idx;3866      Idx += NumExpansions;3867    } else {3868      if (Idx == ParamIdx)3869        return std::nullopt; // Not a pack expansion3870      ++Idx;3871    }3872  }3873 3874  llvm_unreachable("parameter index would not be produced from template");3875}3876 3877// if `Specialization` is a `CXXConstructorDecl` or `CXXConversionDecl`,3878// we'll try to instantiate and update its explicit specifier after constraint3879// checking.3880static TemplateDeductionResult instantiateExplicitSpecifierDeferred(3881    Sema &S, FunctionDecl *Specialization,3882    const MultiLevelTemplateArgumentList &SubstArgs,3883    TemplateDeductionInfo &Info, FunctionTemplateDecl *FunctionTemplate,3884    ArrayRef<TemplateArgument> DeducedArgs) {3885  auto GetExplicitSpecifier = [](FunctionDecl *D) {3886    return isa<CXXConstructorDecl>(D)3887               ? cast<CXXConstructorDecl>(D)->getExplicitSpecifier()3888               : cast<CXXConversionDecl>(D)->getExplicitSpecifier();3889  };3890  auto SetExplicitSpecifier = [](FunctionDecl *D, ExplicitSpecifier ES) {3891    isa<CXXConstructorDecl>(D)3892        ? cast<CXXConstructorDecl>(D)->setExplicitSpecifier(ES)3893        : cast<CXXConversionDecl>(D)->setExplicitSpecifier(ES);3894  };3895 3896  ExplicitSpecifier ES = GetExplicitSpecifier(Specialization);3897  Expr *ExplicitExpr = ES.getExpr();3898  if (!ExplicitExpr)3899    return TemplateDeductionResult::Success;3900  if (!ExplicitExpr->isValueDependent())3901    return TemplateDeductionResult::Success;3902 3903  // By this point, FinishTemplateArgumentDeduction will have been reverted back3904  // to a regular non-SFINAE template instantiation context, so setup a new3905  // SFINAE context.3906  Sema::InstantiatingTemplate Inst(3907      S, Info.getLocation(), FunctionTemplate, DeducedArgs,3908      Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution);3909  if (Inst.isInvalid())3910    return TemplateDeductionResult::InstantiationDepth;3911  Sema::SFINAETrap Trap(S, Info);3912  const ExplicitSpecifier InstantiatedES =3913      S.instantiateExplicitSpecifier(SubstArgs, ES);3914  if (InstantiatedES.isInvalid() || Trap.hasErrorOccurred()) {3915    Specialization->setInvalidDecl(true);3916    return TemplateDeductionResult::SubstitutionFailure;3917  }3918  SetExplicitSpecifier(Specialization, InstantiatedES);3919  return TemplateDeductionResult::Success;3920}3921 3922TemplateDeductionResult Sema::FinishTemplateArgumentDeduction(3923    FunctionTemplateDecl *FunctionTemplate,3924    SmallVectorImpl<DeducedTemplateArgument> &Deduced,3925    unsigned NumExplicitlySpecified, FunctionDecl *&Specialization,3926    TemplateDeductionInfo &Info,3927    SmallVectorImpl<OriginalCallArg> const *OriginalCallArgs,3928    bool PartialOverloading, bool PartialOrdering,3929    bool ForOverloadSetAddressResolution,3930    llvm::function_ref<bool(bool)> CheckNonDependent) {3931  // Enter a new template instantiation context while we instantiate the3932  // actual function declaration.3933  SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());3934  InstantiatingTemplate Inst(3935      *this, Info.getLocation(), FunctionTemplate, DeducedArgs,3936      CodeSynthesisContext::DeducedTemplateArgumentSubstitution);3937  if (Inst.isInvalid())3938    return TemplateDeductionResult::InstantiationDepth;3939 3940  ContextRAII SavedContext(*this, FunctionTemplate->getTemplatedDecl());3941 3942  // C++ [temp.deduct.type]p2:3943  //   [...] or if any template argument remains neither deduced nor3944  //   explicitly specified, template argument deduction fails.3945  bool IsIncomplete = false;3946  CheckTemplateArgumentInfo CTAI(PartialOrdering);3947  if (auto Result = ConvertDeducedTemplateArguments(3948          *this, FunctionTemplate, FunctionTemplate->getTemplateParameters(),3949          /*IsDeduced=*/true, Deduced, Info, CTAI, CurrentInstantiationScope,3950          NumExplicitlySpecified, PartialOverloading ? &IsIncomplete : nullptr);3951      Result != TemplateDeductionResult::Success)3952    return Result;3953 3954  // Form the template argument list from the deduced template arguments.3955  TemplateArgumentList *SugaredDeducedArgumentList =3956      TemplateArgumentList::CreateCopy(Context, CTAI.SugaredConverted);3957  TemplateArgumentList *CanonicalDeducedArgumentList =3958      TemplateArgumentList::CreateCopy(Context, CTAI.CanonicalConverted);3959  Info.reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);3960 3961  // Substitute the deduced template arguments into the function template3962  // declaration to produce the function template specialization.3963  DeclContext *Owner = FunctionTemplate->getDeclContext();3964  if (FunctionTemplate->getFriendObjectKind())3965    Owner = FunctionTemplate->getLexicalDeclContext();3966  FunctionDecl *FD = FunctionTemplate->getTemplatedDecl();3967 3968  if (CheckNonDependent(/*OnlyInitializeNonUserDefinedConversions=*/true))3969    return TemplateDeductionResult::NonDependentConversionFailure;3970 3971  // C++20 [temp.deduct.general]p5: [CWG2369]3972  //   If the function template has associated constraints, those constraints3973  //   are checked for satisfaction. If the constraints are not satisfied, type3974  //   deduction fails.3975  //3976  // FIXME: We haven't implemented CWG2369 for lambdas yet, because we need3977  // to figure out how to instantiate lambda captures to the scope without3978  // first instantiating the lambda.3979  bool IsLambda = isLambdaCallOperator(FD) || isLambdaConversionOperator(FD);3980  if (!IsLambda && !IsIncomplete) {3981    if (CheckFunctionTemplateConstraints(3982            Info.getLocation(),3983            FunctionTemplate->getCanonicalDecl()->getTemplatedDecl(),3984            CTAI.SugaredConverted, Info.AssociatedConstraintsSatisfaction))3985      return TemplateDeductionResult::MiscellaneousDeductionFailure;3986    if (!Info.AssociatedConstraintsSatisfaction.IsSatisfied) {3987      Info.reset(3988          TemplateArgumentList::CreateCopy(Context, CTAI.SugaredConverted),3989          Info.takeCanonical());3990      return TemplateDeductionResult::ConstraintsNotSatisfied;3991    }3992  }3993  // C++ [temp.deduct.call]p10: [CWG1391]3994  //   If deduction succeeds for all parameters that contain3995  //   template-parameters that participate in template argument deduction,3996  //   and all template arguments are explicitly specified, deduced, or3997  //   obtained from default template arguments, remaining parameters are then3998  //   compared with the corresponding arguments. For each remaining parameter3999  //   P with a type that was non-dependent before substitution of any4000  //   explicitly-specified template arguments, if the corresponding argument4001  //   A cannot be implicitly converted to P, deduction fails.4002  if (CheckNonDependent(/*OnlyInitializeNonUserDefinedConversions=*/false))4003    return TemplateDeductionResult::NonDependentConversionFailure;4004 4005  MultiLevelTemplateArgumentList SubstArgs(4006      FunctionTemplate, CanonicalDeducedArgumentList->asArray(),4007      /*Final=*/false);4008  Specialization = cast_or_null<FunctionDecl>(4009      SubstDecl(FD, Owner, SubstArgs));4010  if (!Specialization || Specialization->isInvalidDecl())4011    return TemplateDeductionResult::SubstitutionFailure;4012 4013  assert(isSameDeclaration(Specialization->getPrimaryTemplate(),4014                           FunctionTemplate));4015 4016  // If the template argument list is owned by the function template4017  // specialization, release it.4018  if (Specialization->getTemplateSpecializationArgs() ==4019      CanonicalDeducedArgumentList)4020    Info.takeCanonical();4021 4022  // C++2a [temp.deduct]p54023  //   [...] When all template arguments have been deduced [...] all uses of4024  //   template parameters [...] are replaced with the corresponding deduced4025  //   or default argument values.4026  //   [...] If the function template has associated constraints4027  //   ([temp.constr.decl]), those constraints are checked for satisfaction4028  //   ([temp.constr.constr]). If the constraints are not satisfied, type4029  //   deduction fails.4030  if (IsLambda && !IsIncomplete) {4031    if (CheckFunctionTemplateConstraints(4032            Info.getLocation(), Specialization, CTAI.CanonicalConverted,4033            Info.AssociatedConstraintsSatisfaction))4034      return TemplateDeductionResult::MiscellaneousDeductionFailure;4035 4036    if (!Info.AssociatedConstraintsSatisfaction.IsSatisfied) {4037      Info.reset(Info.takeSugared(), TemplateArgumentList::CreateCopy(4038                                         Context, CTAI.CanonicalConverted));4039      return TemplateDeductionResult::ConstraintsNotSatisfied;4040    }4041  }4042 4043  // We skipped the instantiation of the explicit-specifier during the4044  // substitution of `FD` before. So, we try to instantiate it back if4045  // `Specialization` is either a constructor or a conversion function.4046  if (isa<CXXConstructorDecl, CXXConversionDecl>(Specialization)) {4047    if (TemplateDeductionResult::Success !=4048        instantiateExplicitSpecifierDeferred(*this, Specialization, SubstArgs,4049                                             Info, FunctionTemplate,4050                                             DeducedArgs)) {4051      return TemplateDeductionResult::SubstitutionFailure;4052    }4053  }4054 4055  if (OriginalCallArgs) {4056    // C++ [temp.deduct.call]p4:4057    //   In general, the deduction process attempts to find template argument4058    //   values that will make the deduced A identical to A (after the type A4059    //   is transformed as described above). [...]4060    llvm::SmallDenseMap<std::pair<unsigned, QualType>, QualType> DeducedATypes;4061    for (unsigned I = 0, N = OriginalCallArgs->size(); I != N; ++I) {4062      OriginalCallArg OriginalArg = (*OriginalCallArgs)[I];4063 4064      auto ParamIdx = OriginalArg.ArgIdx;4065      unsigned ExplicitOffset =4066          (Specialization->hasCXXExplicitFunctionObjectParameter() &&4067           !ForOverloadSetAddressResolution)4068              ? 14069              : 0;4070      if (ParamIdx >= Specialization->getNumParams() - ExplicitOffset)4071        // FIXME: This presumably means a pack ended up smaller than we4072        // expected while deducing. Should this not result in deduction4073        // failure? Can it even happen?4074        continue;4075 4076      QualType DeducedA;4077      if (!OriginalArg.DecomposedParam) {4078        // P is one of the function parameters, just look up its substituted4079        // type.4080        DeducedA =4081            Specialization->getParamDecl(ParamIdx + ExplicitOffset)->getType();4082      } else {4083        // P is a decomposed element of a parameter corresponding to a4084        // braced-init-list argument. Substitute back into P to find the4085        // deduced A.4086        QualType &CacheEntry =4087            DeducedATypes[{ParamIdx, OriginalArg.OriginalParamType}];4088        if (CacheEntry.isNull()) {4089          ArgPackSubstIndexRAII PackIndex(4090              *this, getPackIndexForParam(*this, FunctionTemplate, SubstArgs,4091                                          ParamIdx));4092          CacheEntry =4093              SubstType(OriginalArg.OriginalParamType, SubstArgs,4094                        Specialization->getTypeSpecStartLoc(),4095                        Specialization->getDeclName());4096        }4097        DeducedA = CacheEntry;4098      }4099 4100      if (auto TDK =4101              CheckOriginalCallArgDeduction(*this, Info, OriginalArg, DeducedA);4102          TDK != TemplateDeductionResult::Success)4103        return TDK;4104    }4105  }4106 4107  // If we suppressed any diagnostics while performing template argument4108  // deduction, and if we haven't already instantiated this declaration,4109  // keep track of these diagnostics. They'll be emitted if this specialization4110  // is actually used.4111  if (Info.diag_begin() != Info.diag_end()) {4112    auto [Pos, Inserted] =4113        SuppressedDiagnostics.try_emplace(Specialization->getCanonicalDecl());4114    if (Inserted)4115      Pos->second.append(Info.diag_begin(), Info.diag_end());4116  }4117 4118  return TemplateDeductionResult::Success;4119}4120 4121/// Gets the type of a function for template-argument-deducton4122/// purposes when it's considered as part of an overload set.4123static QualType GetTypeOfFunction(Sema &S, const OverloadExpr::FindResult &R,4124                                  FunctionDecl *Fn) {4125  // We may need to deduce the return type of the function now.4126  if (S.getLangOpts().CPlusPlus14 && Fn->getReturnType()->isUndeducedType() &&4127      S.DeduceReturnType(Fn, R.Expression->getExprLoc(), /*Diagnose*/ false))4128    return {};4129 4130  if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(Fn))4131    if (Method->isImplicitObjectMemberFunction()) {4132      // An instance method that's referenced in a form that doesn't4133      // look like a member pointer is just invalid.4134      if (!R.HasFormOfMemberPointer)4135        return {};4136 4137      return S.Context.getMemberPointerType(4138          Fn->getType(), /*Qualifier=*/std::nullopt, Method->getParent());4139    }4140 4141  if (!R.IsAddressOfOperand) return Fn->getType();4142  return S.Context.getPointerType(Fn->getType());4143}4144 4145/// Apply the deduction rules for overload sets.4146///4147/// \return the null type if this argument should be treated as an4148/// undeduced context4149static QualType4150ResolveOverloadForDeduction(Sema &S, TemplateParameterList *TemplateParams,4151                            Expr *Arg, QualType ParamType,4152                            bool ParamWasReference,4153                            TemplateSpecCandidateSet *FailedTSC = nullptr) {4154 4155  OverloadExpr::FindResult R = OverloadExpr::find(Arg);4156 4157  OverloadExpr *Ovl = R.Expression;4158 4159  // C++0x [temp.deduct.call]p44160  unsigned TDF = 0;4161  if (ParamWasReference)4162    TDF |= TDF_ParamWithReferenceType;4163  if (R.IsAddressOfOperand)4164    TDF |= TDF_IgnoreQualifiers;4165 4166  // C++0x [temp.deduct.call]p6:4167  //   When P is a function type, pointer to function type, or pointer4168  //   to member function type:4169 4170  if (!ParamType->isFunctionType() &&4171      !ParamType->isFunctionPointerType() &&4172      !ParamType->isMemberFunctionPointerType()) {4173    if (Ovl->hasExplicitTemplateArgs()) {4174      // But we can still look for an explicit specialization.4175      if (FunctionDecl *ExplicitSpec =4176              S.ResolveSingleFunctionTemplateSpecialization(4177                  Ovl, /*Complain=*/false,4178                  /*Found=*/nullptr, FailedTSC,4179                  /*ForTypeDeduction=*/true))4180        return GetTypeOfFunction(S, R, ExplicitSpec);4181    }4182 4183    DeclAccessPair DAP;4184    if (FunctionDecl *Viable =4185            S.resolveAddressOfSingleOverloadCandidate(Arg, DAP))4186      return GetTypeOfFunction(S, R, Viable);4187 4188    return {};4189  }4190 4191  // Gather the explicit template arguments, if any.4192  TemplateArgumentListInfo ExplicitTemplateArgs;4193  if (Ovl->hasExplicitTemplateArgs())4194    Ovl->copyTemplateArgumentsInto(ExplicitTemplateArgs);4195  QualType Match;4196  for (UnresolvedSetIterator I = Ovl->decls_begin(),4197         E = Ovl->decls_end(); I != E; ++I) {4198    NamedDecl *D = (*I)->getUnderlyingDecl();4199 4200    if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D)) {4201      //   - If the argument is an overload set containing one or more4202      //     function templates, the parameter is treated as a4203      //     non-deduced context.4204      if (!Ovl->hasExplicitTemplateArgs())4205        return {};4206 4207      // Otherwise, see if we can resolve a function type4208      FunctionDecl *Specialization = nullptr;4209      TemplateDeductionInfo Info(Ovl->getNameLoc());4210      if (S.DeduceTemplateArguments(FunTmpl, &ExplicitTemplateArgs,4211                                    Specialization,4212                                    Info) != TemplateDeductionResult::Success)4213        continue;4214 4215      D = Specialization;4216    }4217 4218    FunctionDecl *Fn = cast<FunctionDecl>(D);4219    QualType ArgType = GetTypeOfFunction(S, R, Fn);4220    if (ArgType.isNull()) continue;4221 4222    // Function-to-pointer conversion.4223    if (!ParamWasReference && ParamType->isPointerType() &&4224        ArgType->isFunctionType())4225      ArgType = S.Context.getPointerType(ArgType);4226 4227    //   - If the argument is an overload set (not containing function4228    //     templates), trial argument deduction is attempted using each4229    //     of the members of the set. If deduction succeeds for only one4230    //     of the overload set members, that member is used as the4231    //     argument value for the deduction. If deduction succeeds for4232    //     more than one member of the overload set the parameter is4233    //     treated as a non-deduced context.4234 4235    // We do all of this in a fresh context per C++0x [temp.deduct.type]p2:4236    //   Type deduction is done independently for each P/A pair, and4237    //   the deduced template argument values are then combined.4238    // So we do not reject deductions which were made elsewhere.4239    SmallVector<DeducedTemplateArgument, 8>4240      Deduced(TemplateParams->size());4241    TemplateDeductionInfo Info(Ovl->getNameLoc());4242    TemplateDeductionResult Result = DeduceTemplateArgumentsByTypeMatch(4243        S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF,4244        PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,4245        /*HasDeducedAnyParam=*/nullptr);4246    if (Result != TemplateDeductionResult::Success)4247      continue;4248    // C++ [temp.deduct.call]p6:4249    //   [...] If all successful deductions yield the same deduced A, that4250    //   deduced A is the result of deduction; otherwise, the parameter is4251    //   treated as a non-deduced context. [...]4252    if (!Match.isNull() && !S.isSameOrCompatibleFunctionType(Match, ArgType))4253      return {};4254    Match = ArgType;4255  }4256 4257  return Match;4258}4259 4260/// Perform the adjustments to the parameter and argument types4261/// described in C++ [temp.deduct.call].4262///4263/// \returns true if the caller should not attempt to perform any template4264/// argument deduction based on this P/A pair because the argument is an4265/// overloaded function set that could not be resolved.4266static bool AdjustFunctionParmAndArgTypesForDeduction(4267    Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex,4268    QualType &ParamType, QualType &ArgType,4269    Expr::Classification ArgClassification, Expr *Arg, unsigned &TDF,4270    TemplateSpecCandidateSet *FailedTSC = nullptr) {4271  // C++0x [temp.deduct.call]p3:4272  //   If P is a cv-qualified type, the top level cv-qualifiers of P's type4273  //   are ignored for type deduction.4274  if (ParamType.hasQualifiers())4275    ParamType = ParamType.getUnqualifiedType();4276 4277  //   [...] If P is a reference type, the type referred to by P is4278  //   used for type deduction.4279  const ReferenceType *ParamRefType = ParamType->getAs<ReferenceType>();4280  if (ParamRefType)4281    ParamType = ParamRefType->getPointeeType();4282 4283  // Overload sets usually make this parameter an undeduced context,4284  // but there are sometimes special circumstances.  Typically4285  // involving a template-id-expr.4286  if (ArgType == S.Context.OverloadTy) {4287    assert(Arg && "expected a non-null arg expression");4288    ArgType = ResolveOverloadForDeduction(S, TemplateParams, Arg, ParamType,4289                                          ParamRefType != nullptr, FailedTSC);4290    if (ArgType.isNull())4291      return true;4292  }4293 4294  if (ParamRefType) {4295    // If the argument has incomplete array type, try to complete its type.4296    if (ArgType->isIncompleteArrayType()) {4297      assert(Arg && "expected a non-null arg expression");4298      ArgType = S.getCompletedType(Arg);4299    }4300 4301    // C++1z [temp.deduct.call]p3:4302    //   If P is a forwarding reference and the argument is an lvalue, the type4303    //   "lvalue reference to A" is used in place of A for type deduction.4304    if (isForwardingReference(QualType(ParamRefType, 0), FirstInnerIndex) &&4305        ArgClassification.isLValue()) {4306      if (S.getLangOpts().OpenCL && !ArgType.hasAddressSpace())4307        ArgType = S.Context.getAddrSpaceQualType(4308            ArgType, S.Context.getDefaultOpenCLPointeeAddrSpace());4309      ArgType = S.Context.getLValueReferenceType(ArgType);4310    }4311  } else {4312    // C++ [temp.deduct.call]p2:4313    //   If P is not a reference type:4314    //   - If A is an array type, the pointer type produced by the4315    //     array-to-pointer standard conversion (4.2) is used in place of4316    //     A for type deduction; otherwise,4317    //   - If A is a function type, the pointer type produced by the4318    //     function-to-pointer standard conversion (4.3) is used in place4319    //     of A for type deduction; otherwise,4320    if (ArgType->canDecayToPointerType())4321      ArgType = S.Context.getDecayedType(ArgType);4322    else {4323      // - If A is a cv-qualified type, the top level cv-qualifiers of A's4324      //   type are ignored for type deduction.4325      ArgType = ArgType.getUnqualifiedType();4326    }4327  }4328 4329  // C++0x [temp.deduct.call]p4:4330  //   In general, the deduction process attempts to find template argument4331  //   values that will make the deduced A identical to A (after the type A4332  //   is transformed as described above). [...]4333  TDF = TDF_SkipNonDependent;4334 4335  //     - If the original P is a reference type, the deduced A (i.e., the4336  //       type referred to by the reference) can be more cv-qualified than4337  //       the transformed A.4338  if (ParamRefType)4339    TDF |= TDF_ParamWithReferenceType;4340  //     - The transformed A can be another pointer or pointer to member4341  //       type that can be converted to the deduced A via a qualification4342  //       conversion (4.4).4343  if (ArgType->isPointerType() || ArgType->isMemberPointerType() ||4344      ArgType->isObjCObjectPointerType())4345    TDF |= TDF_IgnoreQualifiers;4346  //     - If P is a class and P has the form simple-template-id, then the4347  //       transformed A can be a derived class of the deduced A. Likewise,4348  //       if P is a pointer to a class of the form simple-template-id, the4349  //       transformed A can be a pointer to a derived class pointed to by4350  //       the deduced A.4351  if (isSimpleTemplateIdType(ParamType) ||4352      (ParamType->getAs<PointerType>() &&4353       isSimpleTemplateIdType(4354           ParamType->castAs<PointerType>()->getPointeeType())))4355    TDF |= TDF_DerivedClass;4356 4357  return false;4358}4359 4360static bool4361hasDeducibleTemplateParameters(Sema &S, FunctionTemplateDecl *FunctionTemplate,4362                               QualType T);4363 4364static TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument(4365    Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex,4366    QualType ParamType, QualType ArgType,4367    Expr::Classification ArgClassification, Expr *Arg,4368    TemplateDeductionInfo &Info,4369    SmallVectorImpl<DeducedTemplateArgument> &Deduced,4370    SmallVectorImpl<Sema::OriginalCallArg> &OriginalCallArgs,4371    bool DecomposedParam, unsigned ArgIdx, unsigned TDF,4372    TemplateSpecCandidateSet *FailedTSC = nullptr);4373 4374/// Attempt template argument deduction from an initializer list4375///        deemed to be an argument in a function call.4376static TemplateDeductionResult DeduceFromInitializerList(4377    Sema &S, TemplateParameterList *TemplateParams, QualType AdjustedParamType,4378    InitListExpr *ILE, TemplateDeductionInfo &Info,4379    SmallVectorImpl<DeducedTemplateArgument> &Deduced,4380    SmallVectorImpl<Sema::OriginalCallArg> &OriginalCallArgs, unsigned ArgIdx,4381    unsigned TDF) {4382  // C++ [temp.deduct.call]p1: (CWG 1591)4383  //   If removing references and cv-qualifiers from P gives4384  //   std::initializer_list<P0> or P0[N] for some P0 and N and the argument is4385  //   a non-empty initializer list, then deduction is performed instead for4386  //   each element of the initializer list, taking P0 as a function template4387  //   parameter type and the initializer element as its argument4388  //4389  // We've already removed references and cv-qualifiers here.4390  if (!ILE->getNumInits())4391    return TemplateDeductionResult::Success;4392 4393  QualType ElTy;4394  auto *ArrTy = S.Context.getAsArrayType(AdjustedParamType);4395  if (ArrTy)4396    ElTy = ArrTy->getElementType();4397  else if (!S.isStdInitializerList(AdjustedParamType, &ElTy)) {4398    //   Otherwise, an initializer list argument causes the parameter to be4399    //   considered a non-deduced context4400    return TemplateDeductionResult::Success;4401  }4402 4403  // Resolving a core issue: a braced-init-list containing any designators is4404  // a non-deduced context.4405  for (Expr *E : ILE->inits())4406    if (isa<DesignatedInitExpr>(E))4407      return TemplateDeductionResult::Success;4408 4409  // Deduction only needs to be done for dependent types.4410  if (ElTy->isDependentType()) {4411    for (Expr *E : ILE->inits()) {4412      if (auto Result = DeduceTemplateArgumentsFromCallArgument(4413              S, TemplateParams, 0, ElTy, E->getType(),4414              E->Classify(S.getASTContext()), E, Info, Deduced,4415              OriginalCallArgs, true, ArgIdx, TDF);4416          Result != TemplateDeductionResult::Success)4417        return Result;4418    }4419  }4420 4421  //   in the P0[N] case, if N is a non-type template parameter, N is deduced4422  //   from the length of the initializer list.4423  if (auto *DependentArrTy = dyn_cast_or_null<DependentSizedArrayType>(ArrTy)) {4424    // Determine the array bound is something we can deduce.4425    if (NonTypeOrVarTemplateParmDecl NTTP = getDeducedNTTParameterFromExpr(4426            Info, DependentArrTy->getSizeExpr())) {4427      // We can perform template argument deduction for the given non-type4428      // template parameter.4429      // C++ [temp.deduct.type]p13:4430      //   The type of N in the type T[N] is std::size_t.4431      QualType T = S.Context.getSizeType();4432      llvm::APInt Size(S.Context.getIntWidth(T),4433                       ILE->getNumInitsWithEmbedExpanded());4434      if (auto Result = DeduceNonTypeTemplateArgument(4435              S, TemplateParams, NTTP, llvm::APSInt(Size), T,4436              /*ArrayBound=*/true, Info, /*PartialOrdering=*/false, Deduced,4437              /*HasDeducedAnyParam=*/nullptr);4438          Result != TemplateDeductionResult::Success)4439        return Result;4440    }4441  }4442 4443  return TemplateDeductionResult::Success;4444}4445 4446/// Perform template argument deduction per [temp.deduct.call] for a4447///        single parameter / argument pair.4448static TemplateDeductionResult DeduceTemplateArgumentsFromCallArgument(4449    Sema &S, TemplateParameterList *TemplateParams, unsigned FirstInnerIndex,4450    QualType ParamType, QualType ArgType,4451    Expr::Classification ArgClassification, Expr *Arg,4452    TemplateDeductionInfo &Info,4453    SmallVectorImpl<DeducedTemplateArgument> &Deduced,4454    SmallVectorImpl<Sema::OriginalCallArg> &OriginalCallArgs,4455    bool DecomposedParam, unsigned ArgIdx, unsigned TDF,4456    TemplateSpecCandidateSet *FailedTSC) {4457 4458  QualType OrigParamType = ParamType;4459 4460  //   If P is a reference type [...]4461  //   If P is a cv-qualified type [...]4462  if (AdjustFunctionParmAndArgTypesForDeduction(4463          S, TemplateParams, FirstInnerIndex, ParamType, ArgType,4464          ArgClassification, Arg, TDF, FailedTSC))4465    return TemplateDeductionResult::Success;4466 4467  //   If [...] the argument is a non-empty initializer list [...]4468  if (InitListExpr *ILE = dyn_cast_if_present<InitListExpr>(Arg))4469    return DeduceFromInitializerList(S, TemplateParams, ParamType, ILE, Info,4470                                     Deduced, OriginalCallArgs, ArgIdx, TDF);4471 4472  //   [...] the deduction process attempts to find template argument values4473  //   that will make the deduced A identical to A4474  //4475  // Keep track of the argument type and corresponding parameter index,4476  // so we can check for compatibility between the deduced A and A.4477  if (Arg)4478    OriginalCallArgs.push_back(4479        Sema::OriginalCallArg(OrigParamType, DecomposedParam, ArgIdx, ArgType));4480  return DeduceTemplateArgumentsByTypeMatch(4481      S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF,4482      PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,4483      /*HasDeducedAnyParam=*/nullptr);4484}4485 4486TemplateDeductionResult Sema::DeduceTemplateArguments(4487    FunctionTemplateDecl *FunctionTemplate,4488    TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef<Expr *> Args,4489    FunctionDecl *&Specialization, TemplateDeductionInfo &Info,4490    bool PartialOverloading, bool AggregateDeductionCandidate,4491    bool PartialOrdering, QualType ObjectType,4492    Expr::Classification ObjectClassification,4493    bool ForOverloadSetAddressResolution,4494    llvm::function_ref<bool(ArrayRef<QualType>, bool)> CheckNonDependent) {4495  if (FunctionTemplate->isInvalidDecl())4496    return TemplateDeductionResult::Invalid;4497 4498  FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();4499  unsigned NumParams = Function->getNumParams();4500  bool HasExplicitObject = false;4501  int ExplicitObjectOffset = 0;4502 4503  // [C++26] [over.call.func]p34504  // If the primary-expression is the address of an overload set,4505  // the argument list is the same as the expression-list in the call.4506  // Otherwise, the argument list is the expression-list in the call augmented4507  // by the addition of an implied object argument as in a qualified function4508  // call.4509  if (!ForOverloadSetAddressResolution &&4510      Function->hasCXXExplicitFunctionObjectParameter()) {4511    HasExplicitObject = true;4512    ExplicitObjectOffset = 1;4513  }4514 4515  unsigned FirstInnerIndex = getFirstInnerIndex(FunctionTemplate);4516 4517  // C++ [temp.deduct.call]p1:4518  //   Template argument deduction is done by comparing each function template4519  //   parameter type (call it P) with the type of the corresponding argument4520  //   of the call (call it A) as described below.4521  if (Args.size() < Function->getMinRequiredExplicitArguments() &&4522      !PartialOverloading)4523    return TemplateDeductionResult::TooFewArguments;4524  else if (TooManyArguments(NumParams, Args.size() + ExplicitObjectOffset,4525                            PartialOverloading)) {4526    const auto *Proto = Function->getType()->castAs<FunctionProtoType>();4527    if (Proto->isTemplateVariadic())4528      /* Do nothing */;4529    else if (!Proto->isVariadic())4530      return TemplateDeductionResult::TooManyArguments;4531  }4532 4533  EnterExpressionEvaluationContext Unevaluated(4534      *this, Sema::ExpressionEvaluationContext::Unevaluated);4535  Sema::SFINAETrap Trap(*this, Info);4536 4537  // The types of the parameters from which we will perform template argument4538  // deduction.4539  LocalInstantiationScope InstScope(*this);4540  TemplateParameterList *TemplateParams4541    = FunctionTemplate->getTemplateParameters();4542  SmallVector<DeducedTemplateArgument, 4> Deduced;4543  SmallVector<QualType, 8> ParamTypes;4544  unsigned NumExplicitlySpecified = 0;4545  if (ExplicitTemplateArgs) {4546    TemplateDeductionResult Result;4547    runWithSufficientStackSpace(Info.getLocation(), [&] {4548      Result = SubstituteExplicitTemplateArguments(4549          FunctionTemplate, *ExplicitTemplateArgs, Deduced, ParamTypes, nullptr,4550          Info);4551    });4552    if (Result != TemplateDeductionResult::Success)4553      return Result;4554    if (Trap.hasErrorOccurred())4555      return TemplateDeductionResult::SubstitutionFailure;4556 4557    NumExplicitlySpecified = Deduced.size();4558  } else {4559    // Just fill in the parameter types from the function declaration.4560    for (unsigned I = 0; I != NumParams; ++I)4561      ParamTypes.push_back(Function->getParamDecl(I)->getType());4562  }4563 4564  SmallVector<OriginalCallArg, 8> OriginalCallArgs;4565 4566  // Deduce an argument of type ParamType from an expression with index ArgIdx.4567  auto DeduceCallArgument = [&](QualType ParamType, unsigned ArgIdx,4568                                bool ExplicitObjectArgument) {4569    // C++ [demp.deduct.call]p1: (DR1391)4570    //   Template argument deduction is done by comparing each function template4571    //   parameter that contains template-parameters that participate in4572    //   template argument deduction ...4573    if (!hasDeducibleTemplateParameters(*this, FunctionTemplate, ParamType))4574      return TemplateDeductionResult::Success;4575 4576    if (ExplicitObjectArgument) {4577      //   ... with the type of the corresponding argument4578      return DeduceTemplateArgumentsFromCallArgument(4579          *this, TemplateParams, FirstInnerIndex, ParamType, ObjectType,4580          ObjectClassification,4581          /*Arg=*/nullptr, Info, Deduced, OriginalCallArgs,4582          /*Decomposed*/ false, ArgIdx, /*TDF*/ 0);4583    }4584 4585    //   ... with the type of the corresponding argument4586    return DeduceTemplateArgumentsFromCallArgument(4587        *this, TemplateParams, FirstInnerIndex, ParamType,4588        Args[ArgIdx]->getType(), Args[ArgIdx]->Classify(getASTContext()),4589        Args[ArgIdx], Info, Deduced, OriginalCallArgs, /*Decomposed*/ false,4590        ArgIdx, /*TDF*/ 0);4591  };4592 4593  // Deduce template arguments from the function parameters.4594  Deduced.resize(TemplateParams->size());4595  SmallVector<QualType, 8> ParamTypesForArgChecking;4596  for (unsigned ParamIdx = 0, NumParamTypes = ParamTypes.size(), ArgIdx = 0;4597       ParamIdx != NumParamTypes; ++ParamIdx) {4598    QualType ParamType = ParamTypes[ParamIdx];4599 4600    const PackExpansionType *ParamExpansion =4601        dyn_cast<PackExpansionType>(ParamType);4602    if (!ParamExpansion) {4603      // Simple case: matching a function parameter to a function argument.4604      if (ArgIdx >= Args.size() && !(HasExplicitObject && ParamIdx == 0))4605        break;4606 4607      ParamTypesForArgChecking.push_back(ParamType);4608 4609      if (ParamIdx == 0 && HasExplicitObject) {4610        if (ObjectType.isNull())4611          return TemplateDeductionResult::InvalidExplicitArguments;4612 4613        if (auto Result = DeduceCallArgument(ParamType, 0,4614                                             /*ExplicitObjectArgument=*/true);4615            Result != TemplateDeductionResult::Success)4616          return Result;4617        continue;4618      }4619 4620      if (auto Result = DeduceCallArgument(ParamType, ArgIdx++,4621                                           /*ExplicitObjectArgument=*/false);4622          Result != TemplateDeductionResult::Success)4623        return Result;4624 4625      continue;4626    }4627 4628    bool IsTrailingPack = ParamIdx + 1 == NumParamTypes;4629 4630    QualType ParamPattern = ParamExpansion->getPattern();4631    PackDeductionScope PackScope(*this, TemplateParams, Deduced, Info,4632                                 ParamPattern,4633                                 AggregateDeductionCandidate && IsTrailingPack);4634 4635    // C++0x [temp.deduct.call]p1:4636    //   For a function parameter pack that occurs at the end of the4637    //   parameter-declaration-list, the type A of each remaining argument of4638    //   the call is compared with the type P of the declarator-id of the4639    //   function parameter pack. Each comparison deduces template arguments4640    //   for subsequent positions in the template parameter packs expanded by4641    //   the function parameter pack. When a function parameter pack appears4642    //   in a non-deduced context [not at the end of the list], the type of4643    //   that parameter pack is never deduced.4644    //4645    // FIXME: The above rule allows the size of the parameter pack to change4646    // after we skip it (in the non-deduced case). That makes no sense, so4647    // we instead notionally deduce the pack against N arguments, where N is4648    // the length of the explicitly-specified pack if it's expanded by the4649    // parameter pack and 0 otherwise, and we treat each deduction as a4650    // non-deduced context.4651    if (IsTrailingPack || PackScope.hasFixedArity()) {4652      for (; ArgIdx < Args.size() && PackScope.hasNextElement();4653           PackScope.nextPackElement(), ++ArgIdx) {4654        ParamTypesForArgChecking.push_back(ParamPattern);4655        if (auto Result = DeduceCallArgument(ParamPattern, ArgIdx,4656                                             /*ExplicitObjectArgument=*/false);4657            Result != TemplateDeductionResult::Success)4658          return Result;4659      }4660    } else {4661      // If the parameter type contains an explicitly-specified pack that we4662      // could not expand, skip the number of parameters notionally created4663      // by the expansion.4664      UnsignedOrNone NumExpansions = ParamExpansion->getNumExpansions();4665      if (NumExpansions && !PackScope.isPartiallyExpanded()) {4666        for (unsigned I = 0; I != *NumExpansions && ArgIdx < Args.size();4667             ++I, ++ArgIdx) {4668          ParamTypesForArgChecking.push_back(ParamPattern);4669          // FIXME: Should we add OriginalCallArgs for these? What if the4670          // corresponding argument is a list?4671          PackScope.nextPackElement();4672        }4673      } else if (!IsTrailingPack && !PackScope.isPartiallyExpanded() &&4674                 PackScope.isDeducedFromEarlierParameter()) {4675        // [temp.deduct.general#3]4676        // When all template arguments have been deduced4677        // or obtained from default template arguments, all uses of template4678        // parameters in the template parameter list of the template are4679        // replaced with the corresponding deduced or default argument values4680        //4681        // If we have a trailing parameter pack, that has been deduced4682        // previously we substitute the pack here in a similar fashion as4683        // above with the trailing parameter packs. The main difference here is4684        // that, in this case we are not processing all of the remaining4685        // arguments. We are only process as many arguments as we have in4686        // the already deduced parameter.4687        UnsignedOrNone ArgPosAfterSubstitution =4688            PackScope.getSavedPackSizeIfAllEqual();4689        if (!ArgPosAfterSubstitution)4690          continue;4691 4692        unsigned PackArgEnd = ArgIdx + *ArgPosAfterSubstitution;4693        for (; ArgIdx < PackArgEnd && ArgIdx < Args.size(); ArgIdx++) {4694          ParamTypesForArgChecking.push_back(ParamPattern);4695          if (auto Result =4696                  DeduceCallArgument(ParamPattern, ArgIdx,4697                                     /*ExplicitObjectArgument=*/false);4698              Result != TemplateDeductionResult::Success)4699            return Result;4700 4701          PackScope.nextPackElement();4702        }4703      }4704    }4705 4706    // Build argument packs for each of the parameter packs expanded by this4707    // pack expansion.4708    if (auto Result = PackScope.finish();4709        Result != TemplateDeductionResult::Success)4710      return Result;4711  }4712 4713  // Capture the context in which the function call is made. This is the context4714  // that is needed when the accessibility of template arguments is checked.4715  DeclContext *CallingCtx = CurContext;4716 4717  TemplateDeductionResult Result;4718  runWithSufficientStackSpace(Info.getLocation(), [&] {4719    Result = FinishTemplateArgumentDeduction(4720        FunctionTemplate, Deduced, NumExplicitlySpecified, Specialization, Info,4721        &OriginalCallArgs, PartialOverloading, PartialOrdering,4722        ForOverloadSetAddressResolution,4723        [&, CallingCtx](bool OnlyInitializeNonUserDefinedConversions) {4724          ContextRAII SavedContext(*this, CallingCtx);4725          return CheckNonDependent(ParamTypesForArgChecking,4726                                   OnlyInitializeNonUserDefinedConversions);4727        });4728  });4729  if (Trap.hasErrorOccurred()) {4730    if (Specialization)4731      Specialization->setInvalidDecl(true);4732    return TemplateDeductionResult::SubstitutionFailure;4733  }4734  return Result;4735}4736 4737QualType Sema::adjustCCAndNoReturn(QualType ArgFunctionType,4738                                   QualType FunctionType,4739                                   bool AdjustExceptionSpec) {4740  if (ArgFunctionType.isNull())4741    return ArgFunctionType;4742 4743  const auto *FunctionTypeP = FunctionType->castAs<FunctionProtoType>();4744  const auto *ArgFunctionTypeP = ArgFunctionType->castAs<FunctionProtoType>();4745  FunctionProtoType::ExtProtoInfo EPI = ArgFunctionTypeP->getExtProtoInfo();4746  bool Rebuild = false;4747 4748  CallingConv CC = FunctionTypeP->getCallConv();4749  if (EPI.ExtInfo.getCC() != CC) {4750    EPI.ExtInfo = EPI.ExtInfo.withCallingConv(CC);4751    Rebuild = true;4752  }4753 4754  bool NoReturn = FunctionTypeP->getNoReturnAttr();4755  if (EPI.ExtInfo.getNoReturn() != NoReturn) {4756    EPI.ExtInfo = EPI.ExtInfo.withNoReturn(NoReturn);4757    Rebuild = true;4758  }4759 4760  if (AdjustExceptionSpec && (FunctionTypeP->hasExceptionSpec() ||4761                              ArgFunctionTypeP->hasExceptionSpec())) {4762    EPI.ExceptionSpec = FunctionTypeP->getExtProtoInfo().ExceptionSpec;4763    Rebuild = true;4764  }4765 4766  if (!Rebuild)4767    return ArgFunctionType;4768 4769  return Context.getFunctionType(ArgFunctionTypeP->getReturnType(),4770                                 ArgFunctionTypeP->getParamTypes(), EPI);4771}4772 4773TemplateDeductionResult Sema::DeduceTemplateArguments(4774    FunctionTemplateDecl *FunctionTemplate,4775    TemplateArgumentListInfo *ExplicitTemplateArgs, QualType ArgFunctionType,4776    FunctionDecl *&Specialization, TemplateDeductionInfo &Info,4777    bool IsAddressOfFunction) {4778  if (FunctionTemplate->isInvalidDecl())4779    return TemplateDeductionResult::Invalid;4780 4781  FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();4782  TemplateParameterList *TemplateParams4783    = FunctionTemplate->getTemplateParameters();4784  QualType FunctionType = Function->getType();4785 4786  bool PotentiallyEvaluated =4787      currentEvaluationContext().isPotentiallyEvaluated();4788 4789  // Unevaluated SFINAE context.4790  EnterExpressionEvaluationContext Unevaluated(4791      *this, Sema::ExpressionEvaluationContext::Unevaluated);4792  SFINAETrap Trap(*this, Info);4793 4794  // Substitute any explicit template arguments.4795  LocalInstantiationScope InstScope(*this);4796  SmallVector<DeducedTemplateArgument, 4> Deduced;4797  unsigned NumExplicitlySpecified = 0;4798  SmallVector<QualType, 4> ParamTypes;4799  if (ExplicitTemplateArgs) {4800    TemplateDeductionResult Result;4801    runWithSufficientStackSpace(Info.getLocation(), [&] {4802      Result = SubstituteExplicitTemplateArguments(4803          FunctionTemplate, *ExplicitTemplateArgs, Deduced, ParamTypes,4804          &FunctionType, Info);4805    });4806    if (Result != TemplateDeductionResult::Success)4807      return Result;4808    if (Trap.hasErrorOccurred())4809      return TemplateDeductionResult::SubstitutionFailure;4810 4811    NumExplicitlySpecified = Deduced.size();4812  }4813 4814  // When taking the address of a function, we require convertibility of4815  // the resulting function type. Otherwise, we allow arbitrary mismatches4816  // of calling convention and noreturn.4817  if (!IsAddressOfFunction)4818    ArgFunctionType = adjustCCAndNoReturn(ArgFunctionType, FunctionType,4819                                          /*AdjustExceptionSpec*/false);4820 4821  Deduced.resize(TemplateParams->size());4822 4823  // If the function has a deduced return type, substitute it for a dependent4824  // type so that we treat it as a non-deduced context in what follows.4825  bool HasDeducedReturnType = false;4826  if (getLangOpts().CPlusPlus14 &&4827      Function->getReturnType()->getContainedAutoType()) {4828    FunctionType = SubstAutoTypeDependent(FunctionType);4829    HasDeducedReturnType = true;4830  }4831 4832  if (!ArgFunctionType.isNull() && !FunctionType.isNull()) {4833    unsigned TDF =4834        TDF_TopLevelParameterTypeList | TDF_AllowCompatibleFunctionType;4835    // Deduce template arguments from the function type.4836    if (TemplateDeductionResult Result = DeduceTemplateArgumentsByTypeMatch(4837            *this, TemplateParams, FunctionType, ArgFunctionType, Info, Deduced,4838            TDF, PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,4839            /*HasDeducedAnyParam=*/nullptr);4840        Result != TemplateDeductionResult::Success)4841      return Result;4842  }4843 4844  TemplateDeductionResult Result;4845  runWithSufficientStackSpace(Info.getLocation(), [&] {4846    Result = FinishTemplateArgumentDeduction(4847        FunctionTemplate, Deduced, NumExplicitlySpecified, Specialization, Info,4848        /*OriginalCallArgs=*/nullptr, /*PartialOverloading=*/false,4849        /*PartialOrdering=*/true, IsAddressOfFunction);4850  });4851  if (Result != TemplateDeductionResult::Success)4852    return Result;4853 4854  // If the function has a deduced return type, deduce it now, so we can check4855  // that the deduced function type matches the requested type.4856  if (HasDeducedReturnType && IsAddressOfFunction &&4857      Specialization->getReturnType()->isUndeducedType() &&4858      DeduceReturnType(Specialization, Info.getLocation(), false))4859    return TemplateDeductionResult::MiscellaneousDeductionFailure;4860 4861  // [C++26][expr.const]/p174862  // An expression or conversion is immediate-escalating if it is not initially4863  // in an immediate function context and it is [...]4864  // a potentially-evaluated id-expression that denotes an immediate function.4865  if (IsAddressOfFunction && getLangOpts().CPlusPlus20 &&4866      Specialization->isImmediateEscalating() && PotentiallyEvaluated &&4867      CheckIfFunctionSpecializationIsImmediate(Specialization,4868                                               Info.getLocation()))4869    return TemplateDeductionResult::MiscellaneousDeductionFailure;4870 4871  // Adjust the exception specification of the argument to match the4872  // substituted and resolved type we just formed. (Calling convention and4873  // noreturn can't be dependent, so we don't actually need this for them4874  // right now.)4875  QualType SpecializationType = Specialization->getType();4876  if (!IsAddressOfFunction) {4877    ArgFunctionType = adjustCCAndNoReturn(ArgFunctionType, SpecializationType,4878                                          /*AdjustExceptionSpec*/true);4879 4880    // Revert placeholder types in the return type back to undeduced types so4881    // that the comparison below compares the declared return types.4882    if (HasDeducedReturnType) {4883      SpecializationType = SubstAutoType(SpecializationType, QualType());4884      ArgFunctionType = SubstAutoType(ArgFunctionType, QualType());4885    }4886  }4887 4888  // If the requested function type does not match the actual type of the4889  // specialization with respect to arguments of compatible pointer to function4890  // types, template argument deduction fails.4891  if (!ArgFunctionType.isNull()) {4892    if (IsAddressOfFunction ? !isSameOrCompatibleFunctionType(4893                                  SpecializationType, ArgFunctionType)4894                            : !Context.hasSameFunctionTypeIgnoringExceptionSpec(4895                                  SpecializationType, ArgFunctionType)) {4896      Info.FirstArg = TemplateArgument(SpecializationType);4897      Info.SecondArg = TemplateArgument(ArgFunctionType);4898      return TemplateDeductionResult::NonDeducedMismatch;4899    }4900  }4901 4902  return TemplateDeductionResult::Success;4903}4904 4905TemplateDeductionResult Sema::DeduceTemplateArguments(4906    FunctionTemplateDecl *ConversionTemplate, QualType ObjectType,4907    Expr::Classification ObjectClassification, QualType A,4908    CXXConversionDecl *&Specialization, TemplateDeductionInfo &Info) {4909  if (ConversionTemplate->isInvalidDecl())4910    return TemplateDeductionResult::Invalid;4911 4912  CXXConversionDecl *ConversionGeneric4913    = cast<CXXConversionDecl>(ConversionTemplate->getTemplatedDecl());4914 4915  QualType P = ConversionGeneric->getConversionType();4916  bool IsReferenceP = P->isReferenceType();4917  bool IsReferenceA = A->isReferenceType();4918 4919  // C++0x [temp.deduct.conv]p2:4920  //   If P is a reference type, the type referred to by P is used for4921  //   type deduction.4922  if (const ReferenceType *PRef = P->getAs<ReferenceType>())4923    P = PRef->getPointeeType();4924 4925  // C++0x [temp.deduct.conv]p4:4926  //   [...] If A is a reference type, the type referred to by A is used4927  //   for type deduction.4928  if (const ReferenceType *ARef = A->getAs<ReferenceType>()) {4929    A = ARef->getPointeeType();4930    // We work around a defect in the standard here: cv-qualifiers are also4931    // removed from P and A in this case, unless P was a reference type. This4932    // seems to mostly match what other compilers are doing.4933    if (!IsReferenceP) {4934      A = A.getUnqualifiedType();4935      P = P.getUnqualifiedType();4936    }4937 4938  // C++ [temp.deduct.conv]p3:4939  //4940  //   If A is not a reference type:4941  } else {4942    assert(!A->isReferenceType() && "Reference types were handled above");4943 4944    //   - If P is an array type, the pointer type produced by the4945    //     array-to-pointer standard conversion (4.2) is used in place4946    //     of P for type deduction; otherwise,4947    if (P->isArrayType())4948      P = Context.getArrayDecayedType(P);4949    //   - If P is a function type, the pointer type produced by the4950    //     function-to-pointer standard conversion (4.3) is used in4951    //     place of P for type deduction; otherwise,4952    else if (P->isFunctionType())4953      P = Context.getPointerType(P);4954    //   - If P is a cv-qualified type, the top level cv-qualifiers of4955    //     P's type are ignored for type deduction.4956    else4957      P = P.getUnqualifiedType();4958 4959    // C++0x [temp.deduct.conv]p4:4960    //   If A is a cv-qualified type, the top level cv-qualifiers of A's4961    //   type are ignored for type deduction. If A is a reference type, the type4962    //   referred to by A is used for type deduction.4963    A = A.getUnqualifiedType();4964  }4965 4966  // Unevaluated SFINAE context.4967  EnterExpressionEvaluationContext Unevaluated(4968      *this, Sema::ExpressionEvaluationContext::Unevaluated);4969  SFINAETrap Trap(*this, Info);4970 4971  // C++ [temp.deduct.conv]p1:4972  //   Template argument deduction is done by comparing the return4973  //   type of the template conversion function (call it P) with the4974  //   type that is required as the result of the conversion (call it4975  //   A) as described in 14.8.2.4.4976  TemplateParameterList *TemplateParams4977    = ConversionTemplate->getTemplateParameters();4978  SmallVector<DeducedTemplateArgument, 4> Deduced;4979  Deduced.resize(TemplateParams->size());4980 4981  // C++0x [temp.deduct.conv]p4:4982  //   In general, the deduction process attempts to find template4983  //   argument values that will make the deduced A identical to4984  //   A. However, there are two cases that allow a difference:4985  unsigned TDF = 0;4986  //     - If the original A is a reference type, A can be more4987  //       cv-qualified than the deduced A (i.e., the type referred to4988  //       by the reference)4989  if (IsReferenceA)4990    TDF |= TDF_ArgWithReferenceType;4991  //     - The deduced A can be another pointer or pointer to member4992  //       type that can be converted to A via a qualification4993  //       conversion.4994  //4995  // (C++0x [temp.deduct.conv]p6 clarifies that this only happens when4996  // both P and A are pointers or member pointers. In this case, we4997  // just ignore cv-qualifiers completely).4998  if ((P->isPointerType() && A->isPointerType()) ||4999      (P->isMemberPointerType() && A->isMemberPointerType()))5000    TDF |= TDF_IgnoreQualifiers;5001 5002  SmallVector<Sema::OriginalCallArg, 1> OriginalCallArgs;5003  if (ConversionGeneric->isExplicitObjectMemberFunction()) {5004    QualType ParamType = ConversionGeneric->getParamDecl(0)->getType();5005    if (TemplateDeductionResult Result =5006            DeduceTemplateArgumentsFromCallArgument(5007                *this, TemplateParams, getFirstInnerIndex(ConversionTemplate),5008                ParamType, ObjectType, ObjectClassification,5009                /*Arg=*/nullptr, Info, Deduced, OriginalCallArgs,5010                /*Decomposed*/ false, 0, /*TDF*/ 0);5011        Result != TemplateDeductionResult::Success)5012      return Result;5013  }5014 5015  if (TemplateDeductionResult Result = DeduceTemplateArgumentsByTypeMatch(5016          *this, TemplateParams, P, A, Info, Deduced, TDF,5017          PartialOrderingKind::None, /*DeducedFromArrayBound=*/false,5018          /*HasDeducedAnyParam=*/nullptr);5019      Result != TemplateDeductionResult::Success)5020    return Result;5021 5022  // Create an Instantiation Scope for finalizing the operator.5023  LocalInstantiationScope InstScope(*this);5024  // Finish template argument deduction.5025  FunctionDecl *ConversionSpecialized = nullptr;5026  TemplateDeductionResult Result;5027  runWithSufficientStackSpace(Info.getLocation(), [&] {5028    Result = FinishTemplateArgumentDeduction(5029        ConversionTemplate, Deduced, 0, ConversionSpecialized, Info,5030        &OriginalCallArgs, /*PartialOverloading=*/false,5031        /*PartialOrdering=*/false, /*ForOverloadSetAddressResolution*/ false);5032  });5033  Specialization = cast_or_null<CXXConversionDecl>(ConversionSpecialized);5034  return Result;5035}5036 5037TemplateDeductionResult5038Sema::DeduceTemplateArguments(FunctionTemplateDecl *FunctionTemplate,5039                              TemplateArgumentListInfo *ExplicitTemplateArgs,5040                              FunctionDecl *&Specialization,5041                              TemplateDeductionInfo &Info,5042                              bool IsAddressOfFunction) {5043  return DeduceTemplateArguments(FunctionTemplate, ExplicitTemplateArgs,5044                                 QualType(), Specialization, Info,5045                                 IsAddressOfFunction);5046}5047 5048namespace {5049  struct DependentAuto { bool IsPack; };5050 5051  /// Substitute the 'auto' specifier or deduced template specialization type5052  /// specifier within a type for a given replacement type.5053  class SubstituteDeducedTypeTransform :5054      public TreeTransform<SubstituteDeducedTypeTransform> {5055    QualType Replacement;5056    bool ReplacementIsPack;5057    bool UseTypeSugar;5058    using inherited = TreeTransform<SubstituteDeducedTypeTransform>;5059 5060  public:5061    SubstituteDeducedTypeTransform(Sema &SemaRef, DependentAuto DA)5062        : TreeTransform<SubstituteDeducedTypeTransform>(SemaRef),5063          ReplacementIsPack(DA.IsPack), UseTypeSugar(true) {}5064 5065    SubstituteDeducedTypeTransform(Sema &SemaRef, QualType Replacement,5066                                   bool UseTypeSugar = true)5067        : TreeTransform<SubstituteDeducedTypeTransform>(SemaRef),5068          Replacement(Replacement), ReplacementIsPack(false),5069          UseTypeSugar(UseTypeSugar) {}5070 5071    QualType TransformDesugared(TypeLocBuilder &TLB, DeducedTypeLoc TL) {5072      assert(isa<TemplateTypeParmType>(Replacement) &&5073             "unexpected unsugared replacement kind");5074      QualType Result = Replacement;5075      TemplateTypeParmTypeLoc NewTL = TLB.push<TemplateTypeParmTypeLoc>(Result);5076      NewTL.setNameLoc(TL.getNameLoc());5077      return Result;5078    }5079 5080    QualType TransformAutoType(TypeLocBuilder &TLB, AutoTypeLoc TL) {5081      // If we're building the type pattern to deduce against, don't wrap the5082      // substituted type in an AutoType. Certain template deduction rules5083      // apply only when a template type parameter appears directly (and not if5084      // the parameter is found through desugaring). For instance:5085      //   auto &&lref = lvalue;5086      // must transform into "rvalue reference to T" not "rvalue reference to5087      // auto type deduced as T" in order for [temp.deduct.call]p3 to apply.5088      //5089      // FIXME: Is this still necessary?5090      if (!UseTypeSugar)5091        return TransformDesugared(TLB, TL);5092 5093      QualType Result = SemaRef.Context.getAutoType(5094          Replacement, TL.getTypePtr()->getKeyword(), Replacement.isNull(),5095          ReplacementIsPack, TL.getTypePtr()->getTypeConstraintConcept(),5096          TL.getTypePtr()->getTypeConstraintArguments());5097      auto NewTL = TLB.push<AutoTypeLoc>(Result);5098      NewTL.copy(TL);5099      return Result;5100    }5101 5102    QualType TransformDeducedTemplateSpecializationType(5103        TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {5104      if (!UseTypeSugar)5105        return TransformDesugared(TLB, TL);5106 5107      QualType Result = SemaRef.Context.getDeducedTemplateSpecializationType(5108          TL.getTypePtr()->getKeyword(), TL.getTypePtr()->getTemplateName(),5109          Replacement, Replacement.isNull());5110      auto NewTL = TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);5111      NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());5112      NewTL.setNameLoc(TL.getNameLoc());5113      NewTL.setQualifierLoc(TL.getQualifierLoc());5114      return Result;5115    }5116 5117    ExprResult TransformLambdaExpr(LambdaExpr *E) {5118      // Lambdas never need to be transformed.5119      return E;5120    }5121    bool TransformExceptionSpec(SourceLocation Loc,5122                                FunctionProtoType::ExceptionSpecInfo &ESI,5123                                SmallVectorImpl<QualType> &Exceptions,5124                                bool &Changed) {5125      if (ESI.Type == EST_Uninstantiated) {5126        ESI.instantiate();5127        Changed = true;5128      }5129      return inherited::TransformExceptionSpec(Loc, ESI, Exceptions, Changed);5130    }5131 5132    QualType Apply(TypeLoc TL) {5133      // Create some scratch storage for the transformed type locations.5134      // FIXME: We're just going to throw this information away. Don't build it.5135      TypeLocBuilder TLB;5136      TLB.reserve(TL.getFullDataSize());5137      return TransformType(TLB, TL);5138    }5139  };5140 5141} // namespace5142 5143static bool CheckDeducedPlaceholderConstraints(Sema &S, const AutoType &Type,5144                                               AutoTypeLoc TypeLoc,5145                                               QualType Deduced) {5146  ConstraintSatisfaction Satisfaction;5147  ConceptDecl *Concept = cast<ConceptDecl>(Type.getTypeConstraintConcept());5148  TemplateArgumentListInfo TemplateArgs(TypeLoc.getLAngleLoc(),5149                                        TypeLoc.getRAngleLoc());5150  TemplateArgs.addArgument(5151      TemplateArgumentLoc(TemplateArgument(Deduced),5152                          S.Context.getTrivialTypeSourceInfo(5153                              Deduced, TypeLoc.getNameLoc())));5154  for (unsigned I = 0, C = TypeLoc.getNumArgs(); I != C; ++I)5155    TemplateArgs.addArgument(TypeLoc.getArgLoc(I));5156 5157  Sema::CheckTemplateArgumentInfo CTAI;5158  if (S.CheckTemplateArgumentList(Concept, TypeLoc.getNameLoc(), TemplateArgs,5159                                  /*DefaultArgs=*/{},5160                                  /*PartialTemplateArgs=*/false, CTAI))5161    return true;5162  MultiLevelTemplateArgumentList MLTAL(Concept, CTAI.SugaredConverted,5163                                       /*Final=*/true);5164  // Build up an EvaluationContext with an ImplicitConceptSpecializationDecl so5165  // that the template arguments of the constraint can be preserved. For5166  // example:5167  //5168  //  template <class T>5169  //  concept C = []<D U = void>() { return true; }();5170  //5171  // We need the argument for T while evaluating type constraint D in5172  // building the CallExpr to the lambda.5173  EnterExpressionEvaluationContext EECtx(5174      S, Sema::ExpressionEvaluationContext::Unevaluated,5175      ImplicitConceptSpecializationDecl::Create(5176          S.getASTContext(), Concept->getDeclContext(), Concept->getLocation(),5177          CTAI.SugaredConverted));5178  if (S.CheckConstraintSatisfaction(5179          Concept, AssociatedConstraint(Concept->getConstraintExpr()), MLTAL,5180          TypeLoc.getLocalSourceRange(), Satisfaction))5181    return true;5182  if (!Satisfaction.IsSatisfied) {5183    std::string Buf;5184    llvm::raw_string_ostream OS(Buf);5185    OS << "'" << Concept->getName();5186    if (TypeLoc.hasExplicitTemplateArgs()) {5187      printTemplateArgumentList(5188          OS, Type.getTypeConstraintArguments(), S.getPrintingPolicy(),5189          Type.getTypeConstraintConcept()->getTemplateParameters());5190    }5191    OS << "'";5192    S.Diag(TypeLoc.getConceptNameLoc(),5193           diag::err_placeholder_constraints_not_satisfied)5194        << Deduced << Buf << TypeLoc.getLocalSourceRange();5195    S.DiagnoseUnsatisfiedConstraint(Satisfaction);5196    return true;5197  }5198  return false;5199}5200 5201TemplateDeductionResult5202Sema::DeduceAutoType(TypeLoc Type, Expr *Init, QualType &Result,5203                     TemplateDeductionInfo &Info, bool DependentDeduction,5204                     bool IgnoreConstraints,5205                     TemplateSpecCandidateSet *FailedTSC) {5206  assert(DependentDeduction || Info.getDeducedDepth() == 0);5207  if (Init->containsErrors())5208    return TemplateDeductionResult::AlreadyDiagnosed;5209 5210  const AutoType *AT = Type.getType()->getContainedAutoType();5211  assert(AT);5212 5213  if (Init->getType()->isNonOverloadPlaceholderType() || AT->isDecltypeAuto()) {5214    ExprResult NonPlaceholder = CheckPlaceholderExpr(Init);5215    if (NonPlaceholder.isInvalid())5216      return TemplateDeductionResult::AlreadyDiagnosed;5217    Init = NonPlaceholder.get();5218  }5219 5220  DependentAuto DependentResult = {5221      /*.IsPack = */ (bool)Type.getAs<PackExpansionTypeLoc>()};5222 5223  if (!DependentDeduction &&5224      (Type.getType()->isDependentType() || Init->isTypeDependent() ||5225       Init->containsUnexpandedParameterPack())) {5226    Result = SubstituteDeducedTypeTransform(*this, DependentResult).Apply(Type);5227    assert(!Result.isNull() && "substituting DependentTy can't fail");5228    return TemplateDeductionResult::Success;5229  }5230 5231  // Make sure that we treat 'char[]' equaly as 'char*' in C23 mode.5232  auto *String = dyn_cast<StringLiteral>(Init);5233  if (getLangOpts().C23 && String && Type.getType()->isArrayType()) {5234    Diag(Type.getBeginLoc(), diag::ext_c23_auto_non_plain_identifier);5235    TypeLoc TL = TypeLoc(Init->getType(), Type.getOpaqueData());5236    Result = SubstituteDeducedTypeTransform(*this, DependentResult).Apply(TL);5237    assert(!Result.isNull() && "substituting DependentTy can't fail");5238    return TemplateDeductionResult::Success;5239  }5240 5241  // Emit a warning if 'auto*' is used in pedantic and in C23 mode.5242  if (getLangOpts().C23 && Type.getType()->isPointerType()) {5243    Diag(Type.getBeginLoc(), diag::ext_c23_auto_non_plain_identifier);5244  }5245 5246  auto *InitList = dyn_cast<InitListExpr>(Init);5247  if (!getLangOpts().CPlusPlus && InitList) {5248    Diag(Init->getBeginLoc(), diag::err_auto_init_list_from_c)5249        << (int)AT->getKeyword() << getLangOpts().C23;5250    return TemplateDeductionResult::AlreadyDiagnosed;5251  }5252 5253  // Deduce type of TemplParam in Func(Init)5254  SmallVector<DeducedTemplateArgument, 1> Deduced;5255  Deduced.resize(1);5256 5257  SmallVector<OriginalCallArg, 4> OriginalCallArgs;5258 5259  QualType DeducedType;5260  // If this is a 'decltype(auto)' specifier, do the decltype dance.5261  if (AT->isDecltypeAuto()) {5262    if (InitList) {5263      Diag(Init->getBeginLoc(), diag::err_decltype_auto_initializer_list);5264      return TemplateDeductionResult::AlreadyDiagnosed;5265    }5266 5267    DeducedType = getDecltypeForExpr(Init);5268    assert(!DeducedType.isNull());5269  } else {5270    LocalInstantiationScope InstScope(*this);5271 5272    // Build template<class TemplParam> void Func(FuncParam);5273    SourceLocation Loc = Init->getExprLoc();5274    TemplateTypeParmDecl *TemplParam = TemplateTypeParmDecl::Create(5275        Context, nullptr, SourceLocation(), Loc, Info.getDeducedDepth(), 0,5276        nullptr, false, false, false);5277    QualType TemplArg = QualType(TemplParam->getTypeForDecl(), 0);5278    NamedDecl *TemplParamPtr = TemplParam;5279    FixedSizeTemplateParameterListStorage<1, false> TemplateParamsSt(5280        Context, Loc, Loc, TemplParamPtr, Loc, nullptr);5281 5282    if (InitList) {5283      // Notionally, we substitute std::initializer_list<T> for 'auto' and5284      // deduce against that. Such deduction only succeeds if removing5285      // cv-qualifiers and references results in std::initializer_list<T>.5286      if (!Type.getType().getNonReferenceType()->getAs<AutoType>())5287        return TemplateDeductionResult::Invalid;5288 5289      SourceRange DeducedFromInitRange;5290      for (Expr *Init : InitList->inits()) {5291        // Resolving a core issue: a braced-init-list containing any designators5292        // is a non-deduced context.5293        if (isa<DesignatedInitExpr>(Init))5294          return TemplateDeductionResult::Invalid;5295        if (auto TDK = DeduceTemplateArgumentsFromCallArgument(5296                *this, TemplateParamsSt.get(), 0, TemplArg, Init->getType(),5297                Init->Classify(getASTContext()), Init, Info, Deduced,5298                OriginalCallArgs,5299                /*Decomposed=*/true,5300                /*ArgIdx=*/0, /*TDF=*/0);5301            TDK != TemplateDeductionResult::Success) {5302          if (TDK == TemplateDeductionResult::Inconsistent) {5303            Diag(Info.getLocation(), diag::err_auto_inconsistent_deduction)5304                << Info.FirstArg << Info.SecondArg << DeducedFromInitRange5305                << Init->getSourceRange();5306            return TemplateDeductionResult::AlreadyDiagnosed;5307          }5308          return TDK;5309        }5310 5311        if (DeducedFromInitRange.isInvalid() &&5312            Deduced[0].getKind() != TemplateArgument::Null)5313          DeducedFromInitRange = Init->getSourceRange();5314      }5315    } else {5316      if (!getLangOpts().CPlusPlus && Init->refersToBitField()) {5317        Diag(Loc, diag::err_auto_bitfield);5318        return TemplateDeductionResult::AlreadyDiagnosed;5319      }5320      QualType FuncParam =5321          SubstituteDeducedTypeTransform(*this, TemplArg).Apply(Type);5322      assert(!FuncParam.isNull() &&5323             "substituting template parameter for 'auto' failed");5324      if (auto TDK = DeduceTemplateArgumentsFromCallArgument(5325              *this, TemplateParamsSt.get(), 0, FuncParam, Init->getType(),5326              Init->Classify(getASTContext()), Init, Info, Deduced,5327              OriginalCallArgs,5328              /*Decomposed=*/false, /*ArgIdx=*/0, /*TDF=*/0, FailedTSC);5329          TDK != TemplateDeductionResult::Success)5330        return TDK;5331    }5332 5333    // Could be null if somehow 'auto' appears in a non-deduced context.5334    if (Deduced[0].getKind() != TemplateArgument::Type)5335      return TemplateDeductionResult::Incomplete;5336    DeducedType = Deduced[0].getAsType();5337 5338    if (InitList) {5339      DeducedType = BuildStdInitializerList(DeducedType, Loc);5340      if (DeducedType.isNull())5341        return TemplateDeductionResult::AlreadyDiagnosed;5342    }5343  }5344 5345  if (!Result.isNull()) {5346    if (!Context.hasSameType(DeducedType, Result)) {5347      Info.FirstArg = Result;5348      Info.SecondArg = DeducedType;5349      return TemplateDeductionResult::Inconsistent;5350    }5351    DeducedType = Context.getCommonSugaredType(Result, DeducedType);5352  }5353 5354  if (AT->isConstrained() && !IgnoreConstraints &&5355      CheckDeducedPlaceholderConstraints(5356          *this, *AT, Type.getContainedAutoTypeLoc(), DeducedType))5357    return TemplateDeductionResult::AlreadyDiagnosed;5358 5359  Result = SubstituteDeducedTypeTransform(*this, DeducedType).Apply(Type);5360  if (Result.isNull())5361    return TemplateDeductionResult::AlreadyDiagnosed;5362 5363  // Check that the deduced argument type is compatible with the original5364  // argument type per C++ [temp.deduct.call]p4.5365  QualType DeducedA = InitList ? Deduced[0].getAsType() : Result;5366  for (const OriginalCallArg &OriginalArg : OriginalCallArgs) {5367    assert((bool)InitList == OriginalArg.DecomposedParam &&5368           "decomposed non-init-list in auto deduction?");5369    if (auto TDK =5370            CheckOriginalCallArgDeduction(*this, Info, OriginalArg, DeducedA);5371        TDK != TemplateDeductionResult::Success) {5372      Result = QualType();5373      return TDK;5374    }5375  }5376 5377  return TemplateDeductionResult::Success;5378}5379 5380QualType Sema::SubstAutoType(QualType TypeWithAuto,5381                             QualType TypeToReplaceAuto) {5382  assert(TypeToReplaceAuto != Context.DependentTy);5383  return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto)5384      .TransformType(TypeWithAuto);5385}5386 5387TypeSourceInfo *Sema::SubstAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto,5388                                              QualType TypeToReplaceAuto) {5389  assert(TypeToReplaceAuto != Context.DependentTy);5390  return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto)5391      .TransformType(TypeWithAuto);5392}5393 5394QualType Sema::SubstAutoTypeDependent(QualType TypeWithAuto) {5395  return SubstituteDeducedTypeTransform(5396             *this,5397             DependentAuto{/*IsPack=*/isa<PackExpansionType>(TypeWithAuto)})5398      .TransformType(TypeWithAuto);5399}5400 5401TypeSourceInfo *5402Sema::SubstAutoTypeSourceInfoDependent(TypeSourceInfo *TypeWithAuto) {5403  return SubstituteDeducedTypeTransform(5404             *this, DependentAuto{/*IsPack=*/isa<PackExpansionType>(5405                        TypeWithAuto->getType())})5406      .TransformType(TypeWithAuto);5407}5408 5409QualType Sema::ReplaceAutoType(QualType TypeWithAuto,5410                               QualType TypeToReplaceAuto) {5411  return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto,5412                                        /*UseTypeSugar*/ false)5413      .TransformType(TypeWithAuto);5414}5415 5416TypeSourceInfo *Sema::ReplaceAutoTypeSourceInfo(TypeSourceInfo *TypeWithAuto,5417                                                QualType TypeToReplaceAuto) {5418  return SubstituteDeducedTypeTransform(*this, TypeToReplaceAuto,5419                                        /*UseTypeSugar*/ false)5420      .TransformType(TypeWithAuto);5421}5422 5423void Sema::DiagnoseAutoDeductionFailure(const VarDecl *VDecl,5424                                        const Expr *Init) {5425  if (isa<InitListExpr>(Init))5426    Diag(VDecl->getLocation(),5427         VDecl->isInitCapture()5428             ? diag::err_init_capture_deduction_failure_from_init_list5429             : diag::err_auto_var_deduction_failure_from_init_list)5430      << VDecl->getDeclName() << VDecl->getType() << Init->getSourceRange();5431  else5432    Diag(VDecl->getLocation(),5433         VDecl->isInitCapture() ? diag::err_init_capture_deduction_failure5434                                : diag::err_auto_var_deduction_failure)5435      << VDecl->getDeclName() << VDecl->getType() << Init->getType()5436      << Init->getSourceRange();5437}5438 5439bool Sema::DeduceReturnType(FunctionDecl *FD, SourceLocation Loc,5440                            bool Diagnose) {5441  assert(FD->getReturnType()->isUndeducedType());5442 5443  // For a lambda's conversion operator, deduce any 'auto' or 'decltype(auto)'5444  // within the return type from the call operator's type.5445  if (isLambdaConversionOperator(FD)) {5446    CXXRecordDecl *Lambda = cast<CXXMethodDecl>(FD)->getParent();5447    FunctionDecl *CallOp = Lambda->getLambdaCallOperator();5448 5449    // For a generic lambda, instantiate the call operator if needed.5450    if (auto *Args = FD->getTemplateSpecializationArgs()) {5451      CallOp = InstantiateFunctionDeclaration(5452          CallOp->getDescribedFunctionTemplate(), Args, Loc);5453      if (!CallOp || CallOp->isInvalidDecl())5454        return true;5455 5456      // We might need to deduce the return type by instantiating the definition5457      // of the operator() function.5458      if (CallOp->getReturnType()->isUndeducedType()) {5459        runWithSufficientStackSpace(Loc, [&] {5460          InstantiateFunctionDefinition(Loc, CallOp);5461        });5462      }5463    }5464 5465    if (CallOp->isInvalidDecl())5466      return true;5467    assert(!CallOp->getReturnType()->isUndeducedType() &&5468           "failed to deduce lambda return type");5469 5470    // Build the new return type from scratch.5471    CallingConv RetTyCC = FD->getReturnType()5472                              ->getPointeeType()5473                              ->castAs<FunctionType>()5474                              ->getCallConv();5475    QualType RetType = getLambdaConversionFunctionResultType(5476        CallOp->getType()->castAs<FunctionProtoType>(), RetTyCC);5477    if (FD->getReturnType()->getAs<PointerType>())5478      RetType = Context.getPointerType(RetType);5479    else {5480      assert(FD->getReturnType()->getAs<BlockPointerType>());5481      RetType = Context.getBlockPointerType(RetType);5482    }5483    Context.adjustDeducedFunctionResultType(FD, RetType);5484    return false;5485  }5486 5487  if (FD->getTemplateInstantiationPattern()) {5488    runWithSufficientStackSpace(Loc, [&] {5489      InstantiateFunctionDefinition(Loc, FD);5490    });5491  }5492 5493  bool StillUndeduced = FD->getReturnType()->isUndeducedType();5494  if (StillUndeduced && Diagnose && !FD->isInvalidDecl()) {5495    Diag(Loc, diag::err_auto_fn_used_before_defined) << FD;5496    Diag(FD->getLocation(), diag::note_callee_decl) << FD;5497  }5498 5499  return StillUndeduced;5500}5501 5502bool Sema::CheckIfFunctionSpecializationIsImmediate(FunctionDecl *FD,5503                                                    SourceLocation Loc) {5504  assert(FD->isImmediateEscalating());5505 5506  if (isLambdaConversionOperator(FD)) {5507    CXXRecordDecl *Lambda = cast<CXXMethodDecl>(FD)->getParent();5508    FunctionDecl *CallOp = Lambda->getLambdaCallOperator();5509 5510    // For a generic lambda, instantiate the call operator if needed.5511    if (auto *Args = FD->getTemplateSpecializationArgs()) {5512      CallOp = InstantiateFunctionDeclaration(5513          CallOp->getDescribedFunctionTemplate(), Args, Loc);5514      if (!CallOp || CallOp->isInvalidDecl())5515        return true;5516      runWithSufficientStackSpace(5517          Loc, [&] { InstantiateFunctionDefinition(Loc, CallOp); });5518    }5519    return CallOp->isInvalidDecl();5520  }5521 5522  if (FD->getTemplateInstantiationPattern()) {5523    runWithSufficientStackSpace(5524        Loc, [&] { InstantiateFunctionDefinition(Loc, FD); });5525  }5526  return false;5527}5528 5529static QualType GetImplicitObjectParameterType(ASTContext &Context,5530                                               const CXXMethodDecl *Method,5531                                               QualType RawType,5532                                               bool IsOtherRvr) {5533  // C++20 [temp.func.order]p3.1, p3.2:5534  //  - The type X(M) is "rvalue reference to cv A" if the optional5535  //    ref-qualifier of M is && or if M has no ref-qualifier and the5536  //    positionally-corresponding parameter of the other transformed template5537  //    has rvalue reference type; if this determination depends recursively5538  //    upon whether X(M) is an rvalue reference type, it is not considered to5539  //    have rvalue reference type.5540  //5541  //  - Otherwise, X(M) is "lvalue reference to cv A".5542  assert(Method && !Method->isExplicitObjectMemberFunction() &&5543         "expected a member function with no explicit object parameter");5544 5545  RawType = Context.getQualifiedType(RawType, Method->getMethodQualifiers());5546  if (Method->getRefQualifier() == RQ_RValue ||5547      (IsOtherRvr && Method->getRefQualifier() == RQ_None))5548    return Context.getRValueReferenceType(RawType);5549  return Context.getLValueReferenceType(RawType);5550}5551 5552static TemplateDeductionResult CheckDeductionConsistency(5553    Sema &S, FunctionTemplateDecl *FTD, UnsignedOrNone ArgIdx, QualType P,5554    QualType A, ArrayRef<TemplateArgument> DeducedArgs, bool CheckConsistency) {5555  MultiLevelTemplateArgumentList MLTAL(FTD, DeducedArgs,5556                                       /*Final=*/true);5557  Sema::ArgPackSubstIndexRAII PackIndex(5558      S,5559      ArgIdx ? ::getPackIndexForParam(S, FTD, MLTAL, *ArgIdx) : std::nullopt);5560  bool IsIncompleteSubstitution = false;5561  // FIXME: A substitution can be incomplete on a non-structural part of the5562  // type. Use the canonical type for now, until the TemplateInstantiator can5563  // deal with that.5564 5565  // Workaround: Implicit deduction guides use InjectedClassNameTypes, whereas5566  // the explicit guides don't. The substitution doesn't transform these types,5567  // so let it transform their specializations instead.5568  bool IsDeductionGuide = isa<CXXDeductionGuideDecl>(FTD->getTemplatedDecl());5569  if (IsDeductionGuide) {5570    if (auto *Injected = P->getAsCanonical<InjectedClassNameType>())5571      P = Injected->getDecl()->getCanonicalTemplateSpecializationType(5572          S.Context);5573  }5574  QualType InstP = S.SubstType(P.getCanonicalType(), MLTAL, FTD->getLocation(),5575                               FTD->getDeclName(), &IsIncompleteSubstitution);5576  if (InstP.isNull() && !IsIncompleteSubstitution)5577    return TemplateDeductionResult::SubstitutionFailure;5578  if (!CheckConsistency)5579    return TemplateDeductionResult::Success;5580  if (IsIncompleteSubstitution)5581    return TemplateDeductionResult::Incomplete;5582 5583  // [temp.deduct.call]/4 - Check we produced a consistent deduction.5584  // This handles just the cases that can appear when partial ordering.5585  if (auto *PA = dyn_cast<PackExpansionType>(A);5586      PA && !isa<PackExpansionType>(InstP))5587    A = PA->getPattern();5588  auto T1 = S.Context.getUnqualifiedArrayType(InstP.getNonReferenceType());5589  auto T2 = S.Context.getUnqualifiedArrayType(A.getNonReferenceType());5590  if (IsDeductionGuide) {5591    if (auto *Injected = T1->getAsCanonical<InjectedClassNameType>())5592      T1 = Injected->getDecl()->getCanonicalTemplateSpecializationType(5593          S.Context);5594    if (auto *Injected = T2->getAsCanonical<InjectedClassNameType>())5595      T2 = Injected->getDecl()->getCanonicalTemplateSpecializationType(5596          S.Context);5597  }5598  if (!S.Context.hasSameType(T1, T2))5599    return TemplateDeductionResult::NonDeducedMismatch;5600  return TemplateDeductionResult::Success;5601}5602 5603template <class T>5604static TemplateDeductionResult FinishTemplateArgumentDeduction(5605    Sema &S, FunctionTemplateDecl *FTD,5606    SmallVectorImpl<DeducedTemplateArgument> &Deduced,5607    TemplateDeductionInfo &Info, T &&CheckDeductionConsistency) {5608  Sema::ContextRAII SavedContext(S, getAsDeclContextOrEnclosing(FTD));5609 5610  // C++26 [temp.deduct.type]p2:5611  //   [...] or if any template argument remains neither deduced nor5612  //   explicitly specified, template argument deduction fails.5613  bool IsIncomplete = false;5614  Sema::CheckTemplateArgumentInfo CTAI(/*PartialOrdering=*/true);5615  if (auto Result = ConvertDeducedTemplateArguments(5616          S, FTD, FTD->getTemplateParameters(), /*IsDeduced=*/true, Deduced,5617          Info, CTAI,5618          /*CurrentInstantiationScope=*/nullptr,5619          /*NumAlreadyConverted=*/0, &IsIncomplete);5620      Result != TemplateDeductionResult::Success)5621    return Result;5622 5623  // Form the template argument list from the deduced template arguments.5624  TemplateArgumentList *SugaredDeducedArgumentList =5625      TemplateArgumentList::CreateCopy(S.Context, CTAI.SugaredConverted);5626  TemplateArgumentList *CanonicalDeducedArgumentList =5627      TemplateArgumentList::CreateCopy(S.Context, CTAI.CanonicalConverted);5628 5629  Info.reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);5630 5631  // Substitute the deduced template arguments into the argument5632  // and verify that the instantiated argument is both valid5633  // and equivalent to the parameter.5634  LocalInstantiationScope InstScope(S);5635  return CheckDeductionConsistency(S, FTD, CTAI.SugaredConverted);5636}5637 5638/// Determine whether the function template \p FT1 is at least as5639/// specialized as \p FT2.5640static bool isAtLeastAsSpecializedAs(5641    Sema &S, SourceLocation Loc, FunctionTemplateDecl *FT1,5642    FunctionTemplateDecl *FT2, TemplatePartialOrderingContext TPOC,5643    ArrayRef<QualType> Args1, ArrayRef<QualType> Args2, bool Args1Offset) {5644  FunctionDecl *FD1 = FT1->getTemplatedDecl();5645  FunctionDecl *FD2 = FT2->getTemplatedDecl();5646  const FunctionProtoType *Proto1 = FD1->getType()->getAs<FunctionProtoType>();5647  const FunctionProtoType *Proto2 = FD2->getType()->getAs<FunctionProtoType>();5648  assert(Proto1 && Proto2 && "Function templates must have prototypes");5649 5650  // C++26 [temp.deduct.partial]p3:5651  //   The types used to determine the ordering depend on the context in which5652  //   the partial ordering is done:5653  //   - In the context of a function call, the types used are those function5654  //     parameter types for which the function call has arguments.5655  //   - In the context of a call to a conversion operator, the return types5656  //     of the conversion function templates are used.5657  //   - In other contexts (14.6.6.2) the function template's function type5658  //     is used.5659 5660  if (TPOC == TPOC_Other) {5661    // We wouldn't be partial ordering these candidates if these didn't match.5662    assert(Proto1->getMethodQuals() == Proto2->getMethodQuals() &&5663           Proto1->getRefQualifier() == Proto2->getRefQualifier() &&5664           Proto1->isVariadic() == Proto2->isVariadic() &&5665           "shouldn't partial order functions with different qualifiers in a "5666           "context where the function type is used");5667 5668    assert(Args1.empty() && Args2.empty() &&5669           "Only call context should have arguments");5670    Args1 = Proto1->getParamTypes();5671    Args2 = Proto2->getParamTypes();5672  }5673 5674  TemplateParameterList *TemplateParams = FT2->getTemplateParameters();5675  SmallVector<DeducedTemplateArgument, 4> Deduced(TemplateParams->size());5676  TemplateDeductionInfo Info(Loc);5677 5678  bool HasDeducedAnyParamFromReturnType = false;5679  if (TPOC != TPOC_Call) {5680    if (DeduceTemplateArgumentsByTypeMatch(5681            S, TemplateParams, Proto2->getReturnType(), Proto1->getReturnType(),5682            Info, Deduced, TDF_None, PartialOrderingKind::Call,5683            /*DeducedFromArrayBound=*/false,5684            &HasDeducedAnyParamFromReturnType) !=5685        TemplateDeductionResult::Success)5686      return false;5687  }5688 5689  llvm::SmallBitVector HasDeducedParam;5690  if (TPOC != TPOC_Conversion) {5691    HasDeducedParam.resize(Args2.size());5692    if (DeduceTemplateArguments(S, TemplateParams, Args2, Args1, Info, Deduced,5693                                TDF_None, PartialOrderingKind::Call,5694                                /*HasDeducedAnyParam=*/nullptr,5695                                &HasDeducedParam) !=5696        TemplateDeductionResult::Success)5697      return false;5698  }5699 5700  SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());5701  EnterExpressionEvaluationContext Unevaluated(5702      S, Sema::ExpressionEvaluationContext::Unevaluated);5703  Sema::SFINAETrap Trap(S, Info);5704  Sema::InstantiatingTemplate Inst(5705      S, Info.getLocation(), FT2, DeducedArgs,5706      Sema::CodeSynthesisContext::DeducedTemplateArgumentSubstitution);5707  if (Inst.isInvalid())5708    return false;5709 5710  bool AtLeastAsSpecialized;5711  S.runWithSufficientStackSpace(Info.getLocation(), [&] {5712    AtLeastAsSpecialized =5713        ::FinishTemplateArgumentDeduction(5714            S, FT2, Deduced, Info,5715            [&](Sema &S, FunctionTemplateDecl *FTD,5716                ArrayRef<TemplateArgument> DeducedArgs) {5717              // As a provisional fix for a core issue that does not5718              // exist yet, which may be related to CWG2160, only check the5719              // consistency of parameters and return types which participated5720              // in deduction. We will still try to substitute them though.5721              if (TPOC != TPOC_Call) {5722                if (auto TDR = ::CheckDeductionConsistency(5723                        S, FTD, /*ArgIdx=*/std::nullopt,5724                        Proto2->getReturnType(), Proto1->getReturnType(),5725                        DeducedArgs,5726                        /*CheckConsistency=*/HasDeducedAnyParamFromReturnType);5727                    TDR != TemplateDeductionResult::Success)5728                  return TDR;5729              }5730 5731              if (TPOC == TPOC_Conversion)5732                return TemplateDeductionResult::Success;5733 5734              return ::DeduceForEachType(5735                  S, TemplateParams, Args2, Args1, Info, Deduced,5736                  PartialOrderingKind::Call, /*FinishingDeduction=*/true,5737                  [&](Sema &S, TemplateParameterList *, int ParamIdx,5738                      UnsignedOrNone ArgIdx, QualType P, QualType A,5739                      TemplateDeductionInfo &Info,5740                      SmallVectorImpl<DeducedTemplateArgument> &Deduced,5741                      PartialOrderingKind) {5742                    if (ArgIdx && *ArgIdx >= static_cast<unsigned>(Args1Offset))5743                      ArgIdx = *ArgIdx - Args1Offset;5744                    else5745                      ArgIdx = std::nullopt;5746                    return ::CheckDeductionConsistency(5747                        S, FTD, ArgIdx, P, A, DeducedArgs,5748                        /*CheckConsistency=*/HasDeducedParam[ParamIdx]);5749                  });5750            }) == TemplateDeductionResult::Success;5751  });5752  if (!AtLeastAsSpecialized || Trap.hasErrorOccurred())5753    return false;5754 5755  // C++0x [temp.deduct.partial]p11:5756  //   In most cases, all template parameters must have values in order for5757  //   deduction to succeed, but for partial ordering purposes a template5758  //   parameter may remain without a value provided it is not used in the5759  //   types being used for partial ordering. [ Note: a template parameter used5760  //   in a non-deduced context is considered used. -end note]5761  unsigned ArgIdx = 0, NumArgs = Deduced.size();5762  for (; ArgIdx != NumArgs; ++ArgIdx)5763    if (Deduced[ArgIdx].isNull())5764      break;5765 5766  if (ArgIdx == NumArgs) {5767    // All template arguments were deduced. FT1 is at least as specialized5768    // as FT2.5769    return true;5770  }5771 5772  // Figure out which template parameters were used.5773  llvm::SmallBitVector UsedParameters(TemplateParams->size());5774  switch (TPOC) {5775  case TPOC_Call:5776    for (unsigned I = 0, N = Args2.size(); I != N; ++I)5777      ::MarkUsedTemplateParameters(S.Context, Args2[I], /*OnlyDeduced=*/false,5778                                   TemplateParams->getDepth(), UsedParameters);5779    break;5780 5781  case TPOC_Conversion:5782    ::MarkUsedTemplateParameters(S.Context, Proto2->getReturnType(),5783                                 /*OnlyDeduced=*/false,5784                                 TemplateParams->getDepth(), UsedParameters);5785    break;5786 5787  case TPOC_Other:5788    // We do not deduce template arguments from the exception specification5789    // when determining the primary template of a function template5790    // specialization or when taking the address of a function template.5791    // Therefore, we do not mark template parameters in the exception5792    // specification as used during partial ordering to prevent the following5793    // from being ambiguous:5794    //5795    //   template<typename T, typename U>5796    //   void f(U) noexcept(noexcept(T())); // #15797    //5798    //   template<typename T>5799    //   void f(T*) noexcept; // #25800    //5801    //   template<>5802    //   void f<int>(int*) noexcept; // explicit specialization of #25803    //5804    // Although there is no corresponding wording in the standard, this seems5805    // to be the intended behavior given the definition of5806    // 'deduction substitution loci' in [temp.deduct].5807    ::MarkUsedTemplateParameters(5808        S.Context,5809        S.Context.getFunctionTypeWithExceptionSpec(FD2->getType(), EST_None),5810        /*OnlyDeduced=*/false, TemplateParams->getDepth(), UsedParameters);5811    break;5812  }5813 5814  for (; ArgIdx != NumArgs; ++ArgIdx)5815    // If this argument had no value deduced but was used in one of the types5816    // used for partial ordering, then deduction fails.5817    if (Deduced[ArgIdx].isNull() && UsedParameters[ArgIdx])5818      return false;5819 5820  return true;5821}5822 5823enum class MoreSpecializedTrailingPackTieBreakerResult { Equal, Less, More };5824 5825// This a speculative fix for CWG1432 (Similar to the fix for CWG1395) that5826// there is no wording or even resolution for this issue.5827static MoreSpecializedTrailingPackTieBreakerResult5828getMoreSpecializedTrailingPackTieBreaker(5829    const TemplateSpecializationType *TST1,5830    const TemplateSpecializationType *TST2) {5831  ArrayRef<TemplateArgument> As1 = TST1->template_arguments(),5832                             As2 = TST2->template_arguments();5833  const TemplateArgument &TA1 = As1.back(), &TA2 = As2.back();5834  bool IsPack = TA1.getKind() == TemplateArgument::Pack;5835  assert(IsPack == (TA2.getKind() == TemplateArgument::Pack));5836  if (!IsPack)5837    return MoreSpecializedTrailingPackTieBreakerResult::Equal;5838  assert(As1.size() == As2.size());5839 5840  unsigned PackSize1 = TA1.pack_size(), PackSize2 = TA2.pack_size();5841  bool IsPackExpansion1 =5842      PackSize1 && TA1.pack_elements().back().isPackExpansion();5843  bool IsPackExpansion2 =5844      PackSize2 && TA2.pack_elements().back().isPackExpansion();5845  if (PackSize1 == PackSize2 && IsPackExpansion1 == IsPackExpansion2)5846    return MoreSpecializedTrailingPackTieBreakerResult::Equal;5847  if (PackSize1 > PackSize2 && IsPackExpansion1)5848    return MoreSpecializedTrailingPackTieBreakerResult::More;5849  if (PackSize1 < PackSize2 && IsPackExpansion2)5850    return MoreSpecializedTrailingPackTieBreakerResult::Less;5851  return MoreSpecializedTrailingPackTieBreakerResult::Equal;5852}5853 5854FunctionTemplateDecl *Sema::getMoreSpecializedTemplate(5855    FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc,5856    TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1,5857    QualType RawObj1Ty, QualType RawObj2Ty, bool Reversed,5858    bool PartialOverloading) {5859  SmallVector<QualType> Args1;5860  SmallVector<QualType> Args2;5861  const FunctionDecl *FD1 = FT1->getTemplatedDecl();5862  const FunctionDecl *FD2 = FT2->getTemplatedDecl();5863  bool ShouldConvert1 = false;5864  bool ShouldConvert2 = false;5865  bool Args1Offset = false;5866  bool Args2Offset = false;5867  QualType Obj1Ty;5868  QualType Obj2Ty;5869  if (TPOC == TPOC_Call) {5870    const FunctionProtoType *Proto1 =5871        FD1->getType()->castAs<FunctionProtoType>();5872    const FunctionProtoType *Proto2 =5873        FD2->getType()->castAs<FunctionProtoType>();5874 5875    //   - In the context of a function call, the function parameter types are5876    //     used.5877    const CXXMethodDecl *Method1 = dyn_cast<CXXMethodDecl>(FD1);5878    const CXXMethodDecl *Method2 = dyn_cast<CXXMethodDecl>(FD2);5879    // C++20 [temp.func.order]p35880    //   [...] Each function template M that is a member function is5881    //   considered to have a new first parameter of type5882    //   X(M), described below, inserted in its function parameter list.5883    //5884    // Note that we interpret "that is a member function" as5885    // "that is a member function with no expicit object argument".5886    // Otherwise the ordering rules for methods with expicit objet arguments5887    // against anything else make no sense.5888 5889    bool NonStaticMethod1 = Method1 && !Method1->isStatic(),5890         NonStaticMethod2 = Method2 && !Method2->isStatic();5891 5892    auto Params1Begin = Proto1->param_type_begin(),5893         Params2Begin = Proto2->param_type_begin();5894 5895    size_t NumComparedArguments = NumCallArguments1;5896 5897    if (auto OO = FD1->getOverloadedOperator();5898        (NonStaticMethod1 && NonStaticMethod2) ||5899        (OO != OO_None && OO != OO_Call && OO != OO_Subscript)) {5900      ShouldConvert1 =5901          NonStaticMethod1 && !Method1->hasCXXExplicitFunctionObjectParameter();5902      ShouldConvert2 =5903          NonStaticMethod2 && !Method2->hasCXXExplicitFunctionObjectParameter();5904      NumComparedArguments += 1;5905 5906      if (ShouldConvert1) {5907        bool IsRValRef2 =5908            ShouldConvert25909                ? Method2->getRefQualifier() == RQ_RValue5910                : Proto2->param_type_begin()[0]->isRValueReferenceType();5911        // Compare 'this' from Method1 against first parameter from Method2.5912        Obj1Ty = GetImplicitObjectParameterType(this->Context, Method1,5913                                                RawObj1Ty, IsRValRef2);5914        Args1.push_back(Obj1Ty);5915        Args1Offset = true;5916      }5917      if (ShouldConvert2) {5918        bool IsRValRef1 =5919            ShouldConvert15920                ? Method1->getRefQualifier() == RQ_RValue5921                : Proto1->param_type_begin()[0]->isRValueReferenceType();5922        // Compare 'this' from Method2 against first parameter from Method1.5923        Obj2Ty = GetImplicitObjectParameterType(this->Context, Method2,5924                                                RawObj2Ty, IsRValRef1);5925        Args2.push_back(Obj2Ty);5926        Args2Offset = true;5927      }5928    } else {5929      if (NonStaticMethod1 && Method1->hasCXXExplicitFunctionObjectParameter())5930        Params1Begin += 1;5931      if (NonStaticMethod2 && Method2->hasCXXExplicitFunctionObjectParameter())5932        Params2Begin += 1;5933    }5934    Args1.insert(Args1.end(), Params1Begin, Proto1->param_type_end());5935    Args2.insert(Args2.end(), Params2Begin, Proto2->param_type_end());5936 5937    // C++ [temp.func.order]p5:5938    //   The presence of unused ellipsis and default arguments has no effect on5939    //   the partial ordering of function templates.5940    Args1.resize(std::min(Args1.size(), NumComparedArguments));5941    Args2.resize(std::min(Args2.size(), NumComparedArguments));5942 5943    if (Reversed)5944      std::reverse(Args2.begin(), Args2.end());5945  } else {5946    assert(!Reversed && "Only call context could have reversed arguments");5947  }5948  bool Better1 = isAtLeastAsSpecializedAs(*this, Loc, FT1, FT2, TPOC, Args1,5949                                          Args2, Args2Offset);5950  bool Better2 = isAtLeastAsSpecializedAs(*this, Loc, FT2, FT1, TPOC, Args2,5951                                          Args1, Args1Offset);5952  // C++ [temp.deduct.partial]p10:5953  //   F is more specialized than G if F is at least as specialized as G and G5954  //   is not at least as specialized as F.5955  if (Better1 != Better2) // We have a clear winner5956    return Better1 ? FT1 : FT2;5957 5958  if (!Better1 && !Better2) // Neither is better than the other5959    return nullptr;5960 5961  // C++ [temp.deduct.partial]p11:5962  //   ... and if G has a trailing function parameter pack for which F does not5963  //   have a corresponding parameter, and if F does not have a trailing5964  //   function parameter pack, then F is more specialized than G.5965 5966  SmallVector<QualType> Param1;5967  Param1.reserve(FD1->param_size() + ShouldConvert1);5968  if (ShouldConvert1)5969    Param1.push_back(Obj1Ty);5970  for (const auto &P : FD1->parameters())5971    Param1.push_back(P->getType());5972 5973  SmallVector<QualType> Param2;5974  Param2.reserve(FD2->param_size() + ShouldConvert2);5975  if (ShouldConvert2)5976    Param2.push_back(Obj2Ty);5977  for (const auto &P : FD2->parameters())5978    Param2.push_back(P->getType());5979 5980  unsigned NumParams1 = Param1.size();5981  unsigned NumParams2 = Param2.size();5982 5983  bool Variadic1 =5984      FD1->param_size() && FD1->parameters().back()->isParameterPack();5985  bool Variadic2 =5986      FD2->param_size() && FD2->parameters().back()->isParameterPack();5987  if (Variadic1 != Variadic2) {5988    if (Variadic1 && NumParams1 > NumParams2)5989      return FT2;5990    if (Variadic2 && NumParams2 > NumParams1)5991      return FT1;5992  }5993 5994  // Skip this tie breaker if we are performing overload resolution with partial5995  // arguments, as this breaks some assumptions about how closely related the5996  // candidates are.5997  for (int i = 0, e = std::min(NumParams1, NumParams2);5998       !PartialOverloading && i < e; ++i) {5999    QualType T1 = Param1[i].getCanonicalType();6000    QualType T2 = Param2[i].getCanonicalType();6001    auto *TST1 = dyn_cast<TemplateSpecializationType>(T1);6002    auto *TST2 = dyn_cast<TemplateSpecializationType>(T2);6003    if (!TST1 || !TST2)6004      continue;6005    switch (getMoreSpecializedTrailingPackTieBreaker(TST1, TST2)) {6006    case MoreSpecializedTrailingPackTieBreakerResult::Less:6007      return FT1;6008    case MoreSpecializedTrailingPackTieBreakerResult::More:6009      return FT2;6010    case MoreSpecializedTrailingPackTieBreakerResult::Equal:6011      continue;6012    }6013    llvm_unreachable(6014        "unknown MoreSpecializedTrailingPackTieBreakerResult value");6015  }6016 6017  if (!Context.getLangOpts().CPlusPlus20)6018    return nullptr;6019 6020  // Match GCC on not implementing [temp.func.order]p6.2.1.6021 6022  // C++20 [temp.func.order]p6:6023  //   If deduction against the other template succeeds for both transformed6024  //   templates, constraints can be considered as follows:6025 6026  // C++20 [temp.func.order]p6.1:6027  //   If their template-parameter-lists (possibly including template-parameters6028  //   invented for an abbreviated function template ([dcl.fct])) or function6029  //   parameter lists differ in length, neither template is more specialized6030  //   than the other.6031  TemplateParameterList *TPL1 = FT1->getTemplateParameters();6032  TemplateParameterList *TPL2 = FT2->getTemplateParameters();6033  if (TPL1->size() != TPL2->size() || NumParams1 != NumParams2)6034    return nullptr;6035 6036  // C++20 [temp.func.order]p6.2.2:6037  //   Otherwise, if the corresponding template-parameters of the6038  //   template-parameter-lists are not equivalent ([temp.over.link]) or if the6039  //   function parameters that positionally correspond between the two6040  //   templates are not of the same type, neither template is more specialized6041  //   than the other.6042  if (!TemplateParameterListsAreEqual(TPL1, TPL2, false,6043                                      Sema::TPL_TemplateParamsEquivalent))6044    return nullptr;6045 6046  // [dcl.fct]p5:6047  // Any top-level cv-qualifiers modifying a parameter type are deleted when6048  // forming the function type.6049  for (unsigned i = 0; i < NumParams1; ++i)6050    if (!Context.hasSameUnqualifiedType(Param1[i], Param2[i]))6051      return nullptr;6052 6053  // C++20 [temp.func.order]p6.3:6054  //   Otherwise, if the context in which the partial ordering is done is6055  //   that of a call to a conversion function and the return types of the6056  //   templates are not the same, then neither template is more specialized6057  //   than the other.6058  if (TPOC == TPOC_Conversion &&6059      !Context.hasSameType(FD1->getReturnType(), FD2->getReturnType()))6060    return nullptr;6061 6062  llvm::SmallVector<AssociatedConstraint, 3> AC1, AC2;6063  FT1->getAssociatedConstraints(AC1);6064  FT2->getAssociatedConstraints(AC2);6065  bool AtLeastAsConstrained1, AtLeastAsConstrained2;6066  if (IsAtLeastAsConstrained(FT1, AC1, FT2, AC2, AtLeastAsConstrained1))6067    return nullptr;6068  if (IsAtLeastAsConstrained(FT2, AC2, FT1, AC1, AtLeastAsConstrained2))6069    return nullptr;6070  if (AtLeastAsConstrained1 == AtLeastAsConstrained2)6071    return nullptr;6072  return AtLeastAsConstrained1 ? FT1 : FT2;6073}6074 6075UnresolvedSetIterator Sema::getMostSpecialized(6076    UnresolvedSetIterator SpecBegin, UnresolvedSetIterator SpecEnd,6077    TemplateSpecCandidateSet &FailedCandidates,6078    SourceLocation Loc, const PartialDiagnostic &NoneDiag,6079    const PartialDiagnostic &AmbigDiag, const PartialDiagnostic &CandidateDiag,6080    bool Complain, QualType TargetType) {6081  if (SpecBegin == SpecEnd) {6082    if (Complain) {6083      Diag(Loc, NoneDiag);6084      FailedCandidates.NoteCandidates(*this, Loc);6085    }6086    return SpecEnd;6087  }6088 6089  if (SpecBegin + 1 == SpecEnd)6090    return SpecBegin;6091 6092  // Find the function template that is better than all of the templates it6093  // has been compared to.6094  UnresolvedSetIterator Best = SpecBegin;6095  FunctionTemplateDecl *BestTemplate6096    = cast<FunctionDecl>(*Best)->getPrimaryTemplate();6097  assert(BestTemplate && "Not a function template specialization?");6098  for (UnresolvedSetIterator I = SpecBegin + 1; I != SpecEnd; ++I) {6099    FunctionTemplateDecl *Challenger6100      = cast<FunctionDecl>(*I)->getPrimaryTemplate();6101    assert(Challenger && "Not a function template specialization?");6102    if (declaresSameEntity(getMoreSpecializedTemplate(BestTemplate, Challenger,6103                                                      Loc, TPOC_Other, 0),6104                           Challenger)) {6105      Best = I;6106      BestTemplate = Challenger;6107    }6108  }6109 6110  // Make sure that the "best" function template is more specialized than all6111  // of the others.6112  bool Ambiguous = false;6113  for (UnresolvedSetIterator I = SpecBegin; I != SpecEnd; ++I) {6114    FunctionTemplateDecl *Challenger6115      = cast<FunctionDecl>(*I)->getPrimaryTemplate();6116    if (I != Best &&6117        !declaresSameEntity(getMoreSpecializedTemplate(BestTemplate, Challenger,6118                                                       Loc, TPOC_Other, 0),6119                            BestTemplate)) {6120      Ambiguous = true;6121      break;6122    }6123  }6124 6125  if (!Ambiguous) {6126    // We found an answer. Return it.6127    return Best;6128  }6129 6130  // Diagnose the ambiguity.6131  if (Complain) {6132    Diag(Loc, AmbigDiag);6133 6134    // FIXME: Can we order the candidates in some sane way?6135    for (UnresolvedSetIterator I = SpecBegin; I != SpecEnd; ++I) {6136      PartialDiagnostic PD = CandidateDiag;6137      const auto *FD = cast<FunctionDecl>(*I);6138      PD << FD << getTemplateArgumentBindingsText(6139                      FD->getPrimaryTemplate()->getTemplateParameters(),6140                      *FD->getTemplateSpecializationArgs());6141      if (!TargetType.isNull())6142        HandleFunctionTypeMismatch(PD, FD->getType(), TargetType);6143      Diag((*I)->getLocation(), PD);6144    }6145  }6146 6147  return SpecEnd;6148}6149 6150FunctionDecl *Sema::getMoreConstrainedFunction(FunctionDecl *FD1,6151                                               FunctionDecl *FD2) {6152  assert(!FD1->getDescribedTemplate() && !FD2->getDescribedTemplate() &&6153         "not for function templates");6154  assert(!FD1->isFunctionTemplateSpecialization() ||6155         (isa<CXXConversionDecl, CXXConstructorDecl>(FD1)));6156  assert(!FD2->isFunctionTemplateSpecialization() ||6157         (isa<CXXConversionDecl, CXXConstructorDecl>(FD2)));6158 6159  FunctionDecl *F1 = FD1;6160  if (FunctionDecl *P = FD1->getTemplateInstantiationPattern(false))6161    F1 = P;6162 6163  FunctionDecl *F2 = FD2;6164  if (FunctionDecl *P = FD2->getTemplateInstantiationPattern(false))6165    F2 = P;6166 6167  llvm::SmallVector<AssociatedConstraint, 1> AC1, AC2;6168  F1->getAssociatedConstraints(AC1);6169  F2->getAssociatedConstraints(AC2);6170  bool AtLeastAsConstrained1, AtLeastAsConstrained2;6171  if (IsAtLeastAsConstrained(F1, AC1, F2, AC2, AtLeastAsConstrained1))6172    return nullptr;6173  if (IsAtLeastAsConstrained(F2, AC2, F1, AC1, AtLeastAsConstrained2))6174    return nullptr;6175  if (AtLeastAsConstrained1 == AtLeastAsConstrained2)6176    return nullptr;6177  return AtLeastAsConstrained1 ? FD1 : FD2;6178}6179 6180/// Determine whether one template specialization, P1, is at least as6181/// specialized than another, P2.6182///6183/// \tparam TemplateLikeDecl The kind of P2, which must be a6184/// TemplateDecl or {Class,Var}TemplatePartialSpecializationDecl.6185/// \param T1 The injected-class-name of P1 (faked for a variable template).6186/// \param T2 The injected-class-name of P2 (faked for a variable template).6187/// \param Template The primary template of P2, in case it is a partial6188/// specialization, the same as P2 otherwise.6189template <typename TemplateLikeDecl>6190static bool isAtLeastAsSpecializedAs(Sema &S, QualType T1, QualType T2,6191                                     TemplateLikeDecl *P2,6192                                     TemplateDecl *Template,6193                                     TemplateDeductionInfo &Info) {6194  // C++ [temp.class.order]p1:6195  //   For two class template partial specializations, the first is at least as6196  //   specialized as the second if, given the following rewrite to two6197  //   function templates, the first function template is at least as6198  //   specialized as the second according to the ordering rules for function6199  //   templates (14.6.6.2):6200  //     - the first function template has the same template parameters as the6201  //       first partial specialization and has a single function parameter6202  //       whose type is a class template specialization with the template6203  //       arguments of the first partial specialization, and6204  //     - the second function template has the same template parameters as the6205  //       second partial specialization and has a single function parameter6206  //       whose type is a class template specialization with the template6207  //       arguments of the second partial specialization.6208  //6209  // Rather than synthesize function templates, we merely perform the6210  // equivalent partial ordering by performing deduction directly on6211  // the template arguments of the class template partial6212  // specializations. This computation is slightly simpler than the6213  // general problem of function template partial ordering, because6214  // class template partial specializations are more constrained. We6215  // know that every template parameter is deducible from the class6216  // template partial specialization's template arguments, for6217  // example.6218  SmallVector<DeducedTemplateArgument, 4> Deduced;6219 6220  // Determine whether P1 is at least as specialized as P2.6221  Deduced.resize(P2->getTemplateParameters()->size());6222  if (DeduceTemplateArgumentsByTypeMatch(6223          S, P2->getTemplateParameters(), T2, T1, Info, Deduced, TDF_None,6224          PartialOrderingKind::Call, /*DeducedFromArrayBound=*/false,6225          /*HasDeducedAnyParam=*/nullptr) != TemplateDeductionResult::Success)6226    return false;6227 6228  SmallVector<TemplateArgument, 4> DeducedArgs(Deduced.begin(), Deduced.end());6229  EnterExpressionEvaluationContext Unevaluated(6230      S, Sema::ExpressionEvaluationContext::Unevaluated);6231  Sema::SFINAETrap Trap(S, Info);6232  Sema::InstantiatingTemplate Inst(S, Info.getLocation(), P2, DeducedArgs);6233  if (Inst.isInvalid())6234    return false;6235 6236  ArrayRef<TemplateArgument>6237      Ps = cast<TemplateSpecializationType>(T2)->template_arguments(),6238      As = cast<TemplateSpecializationType>(T1)->template_arguments();6239 6240  TemplateDeductionResult Result;6241  S.runWithSufficientStackSpace(Info.getLocation(), [&] {6242    Result = ::FinishTemplateArgumentDeduction(6243        S, P2, P2->getTemplateParameters(), Template,6244        /*IsPartialOrdering=*/true, Ps, As, Deduced, Info,6245        /*CopyDeducedArgs=*/false);6246  });6247  return Result == TemplateDeductionResult::Success && !Trap.hasErrorOccurred();6248}6249 6250namespace {6251// A dummy class to return nullptr instead of P2 when performing "more6252// specialized than primary" check.6253struct GetP2 {6254  template <typename T1, typename T2,6255            std::enable_if_t<std::is_same_v<T1, T2>, bool> = true>6256  T2 *operator()(T1 *, T2 *P2) {6257    return P2;6258  }6259  template <typename T1, typename T2,6260            std::enable_if_t<!std::is_same_v<T1, T2>, bool> = true>6261  T1 *operator()(T1 *, T2 *) {6262    return nullptr;6263  }6264};6265 6266// The assumption is that two template argument lists have the same size.6267struct TemplateArgumentListAreEqual {6268  ASTContext &Ctx;6269  TemplateArgumentListAreEqual(ASTContext &Ctx) : Ctx(Ctx) {}6270 6271  template <typename T1, typename T2,6272            std::enable_if_t<std::is_same_v<T1, T2>, bool> = true>6273  bool operator()(T1 *PS1, T2 *PS2) {6274    ArrayRef<TemplateArgument> Args1 = PS1->getTemplateArgs().asArray(),6275                               Args2 = PS2->getTemplateArgs().asArray();6276 6277    for (unsigned I = 0, E = Args1.size(); I < E; ++I) {6278      // We use profile, instead of structural comparison of the arguments,6279      // because canonicalization can't do the right thing for dependent6280      // expressions.6281      llvm::FoldingSetNodeID IDA, IDB;6282      Args1[I].Profile(IDA, Ctx);6283      Args2[I].Profile(IDB, Ctx);6284      if (IDA != IDB)6285        return false;6286    }6287    return true;6288  }6289 6290  template <typename T1, typename T2,6291            std::enable_if_t<!std::is_same_v<T1, T2>, bool> = true>6292  bool operator()(T1 *Spec, T2 *Primary) {6293    ArrayRef<TemplateArgument> Args1 = Spec->getTemplateArgs().asArray(),6294                               Args2 = Primary->getInjectedTemplateArgs(Ctx);6295 6296    for (unsigned I = 0, E = Args1.size(); I < E; ++I) {6297      // We use profile, instead of structural comparison of the arguments,6298      // because canonicalization can't do the right thing for dependent6299      // expressions.6300      llvm::FoldingSetNodeID IDA, IDB;6301      Args1[I].Profile(IDA, Ctx);6302      // Unlike the specialization arguments, the injected arguments are not6303      // always canonical.6304      Ctx.getCanonicalTemplateArgument(Args2[I]).Profile(IDB, Ctx);6305      if (IDA != IDB)6306        return false;6307    }6308    return true;6309  }6310};6311} // namespace6312 6313/// Returns the more specialized template specialization between T1/P1 and6314/// T2/P2.6315/// - If IsMoreSpecialThanPrimaryCheck is true, T1/P1 is the partial6316///   specialization and T2/P2 is the primary template.6317/// - otherwise, both T1/P1 and T2/P2 are the partial specialization.6318///6319/// \param T1 the type of the first template partial specialization6320///6321/// \param T2 if IsMoreSpecialThanPrimaryCheck is true, the type of the second6322///           template partial specialization; otherwise, the type of the6323///           primary template.6324///6325/// \param P1 the first template partial specialization6326///6327/// \param P2 if IsMoreSpecialThanPrimaryCheck is true, the second template6328///           partial specialization; otherwise, the primary template.6329///6330/// \returns - If IsMoreSpecialThanPrimaryCheck is true, returns P1 if P1 is6331///            more specialized, returns nullptr if P1 is not more specialized.6332///          - otherwise, returns the more specialized template partial6333///            specialization. If neither partial specialization is more6334///            specialized, returns NULL.6335template <typename TemplateLikeDecl, typename PrimaryDel>6336static TemplateLikeDecl *6337getMoreSpecialized(Sema &S, QualType T1, QualType T2, TemplateLikeDecl *P1,6338                   PrimaryDel *P2, TemplateDeductionInfo &Info) {6339  constexpr bool IsMoreSpecialThanPrimaryCheck =6340      !std::is_same_v<TemplateLikeDecl, PrimaryDel>;6341 6342  TemplateDecl *P2T;6343  if constexpr (IsMoreSpecialThanPrimaryCheck)6344    P2T = P2;6345  else6346    P2T = P2->getSpecializedTemplate();6347 6348  bool Better1 = isAtLeastAsSpecializedAs(S, T1, T2, P2, P2T, Info);6349  if (IsMoreSpecialThanPrimaryCheck && !Better1)6350    return nullptr;6351 6352  bool Better2 = isAtLeastAsSpecializedAs(S, T2, T1, P1,6353                                          P1->getSpecializedTemplate(), Info);6354  if (IsMoreSpecialThanPrimaryCheck && !Better2)6355    return P1;6356 6357  // C++ [temp.deduct.partial]p10:6358  //   F is more specialized than G if F is at least as specialized as G and G6359  //   is not at least as specialized as F.6360  if (Better1 != Better2) // We have a clear winner6361    return Better1 ? P1 : GetP2()(P1, P2);6362 6363  if (!Better1 && !Better2)6364    return nullptr;6365 6366  switch (getMoreSpecializedTrailingPackTieBreaker(6367      cast<TemplateSpecializationType>(T1),6368      cast<TemplateSpecializationType>(T2))) {6369  case MoreSpecializedTrailingPackTieBreakerResult::Less:6370    return P1;6371  case MoreSpecializedTrailingPackTieBreakerResult::More:6372    return GetP2()(P1, P2);6373  case MoreSpecializedTrailingPackTieBreakerResult::Equal:6374    break;6375  }6376 6377  if (!S.Context.getLangOpts().CPlusPlus20)6378    return nullptr;6379 6380  // Match GCC on not implementing [temp.func.order]p6.2.1.6381 6382  // C++20 [temp.func.order]p6:6383  //   If deduction against the other template succeeds for both transformed6384  //   templates, constraints can be considered as follows:6385 6386  TemplateParameterList *TPL1 = P1->getTemplateParameters();6387  TemplateParameterList *TPL2 = P2->getTemplateParameters();6388  if (TPL1->size() != TPL2->size())6389    return nullptr;6390 6391  // C++20 [temp.func.order]p6.2.2:6392  // Otherwise, if the corresponding template-parameters of the6393  // template-parameter-lists are not equivalent ([temp.over.link]) or if the6394  // function parameters that positionally correspond between the two6395  // templates are not of the same type, neither template is more specialized6396  // than the other.6397  if (!S.TemplateParameterListsAreEqual(TPL1, TPL2, false,6398                                        Sema::TPL_TemplateParamsEquivalent))6399    return nullptr;6400 6401  if (!TemplateArgumentListAreEqual(S.getASTContext())(P1, P2))6402    return nullptr;6403 6404  llvm::SmallVector<AssociatedConstraint, 3> AC1, AC2;6405  P1->getAssociatedConstraints(AC1);6406  P2->getAssociatedConstraints(AC2);6407  bool AtLeastAsConstrained1, AtLeastAsConstrained2;6408  if (S.IsAtLeastAsConstrained(P1, AC1, P2, AC2, AtLeastAsConstrained1) ||6409      (IsMoreSpecialThanPrimaryCheck && !AtLeastAsConstrained1))6410    return nullptr;6411  if (S.IsAtLeastAsConstrained(P2, AC2, P1, AC1, AtLeastAsConstrained2))6412    return nullptr;6413  if (AtLeastAsConstrained1 == AtLeastAsConstrained2)6414    return nullptr;6415  return AtLeastAsConstrained1 ? P1 : GetP2()(P1, P2);6416}6417 6418ClassTemplatePartialSpecializationDecl *6419Sema::getMoreSpecializedPartialSpecialization(6420                                  ClassTemplatePartialSpecializationDecl *PS1,6421                                  ClassTemplatePartialSpecializationDecl *PS2,6422                                              SourceLocation Loc) {6423  QualType PT1 = PS1->getCanonicalInjectedSpecializationType(Context);6424  QualType PT2 = PS2->getCanonicalInjectedSpecializationType(Context);6425 6426  TemplateDeductionInfo Info(Loc);6427  return getMoreSpecialized(*this, PT1, PT2, PS1, PS2, Info);6428}6429 6430bool Sema::isMoreSpecializedThanPrimary(6431    ClassTemplatePartialSpecializationDecl *Spec, TemplateDeductionInfo &Info) {6432  ClassTemplateDecl *Primary = Spec->getSpecializedTemplate();6433  QualType PrimaryT = Primary->getCanonicalInjectedSpecializationType(Context);6434  QualType PartialT = Spec->getCanonicalInjectedSpecializationType(Context);6435 6436  ClassTemplatePartialSpecializationDecl *MaybeSpec =6437      getMoreSpecialized(*this, PartialT, PrimaryT, Spec, Primary, Info);6438  if (MaybeSpec)6439    Info.clearSFINAEDiagnostic();6440  return MaybeSpec;6441}6442 6443VarTemplatePartialSpecializationDecl *6444Sema::getMoreSpecializedPartialSpecialization(6445    VarTemplatePartialSpecializationDecl *PS1,6446    VarTemplatePartialSpecializationDecl *PS2, SourceLocation Loc) {6447  // Pretend the variable template specializations are class template6448  // specializations and form a fake injected class name type for comparison.6449  assert(PS1->getSpecializedTemplate() == PS2->getSpecializedTemplate() &&6450         "the partial specializations being compared should specialize"6451         " the same template.");6452  TemplateName Name(PS1->getSpecializedTemplate()->getCanonicalDecl());6453  QualType PT1 = Context.getCanonicalTemplateSpecializationType(6454      ElaboratedTypeKeyword::None, Name, PS1->getTemplateArgs().asArray());6455  QualType PT2 = Context.getCanonicalTemplateSpecializationType(6456      ElaboratedTypeKeyword::None, Name, PS2->getTemplateArgs().asArray());6457 6458  TemplateDeductionInfo Info(Loc);6459  return getMoreSpecialized(*this, PT1, PT2, PS1, PS2, Info);6460}6461 6462bool Sema::isMoreSpecializedThanPrimary(6463    VarTemplatePartialSpecializationDecl *Spec, TemplateDeductionInfo &Info) {6464  VarTemplateDecl *Primary = Spec->getSpecializedTemplate();6465  TemplateName Name(Primary->getCanonicalDecl());6466 6467  SmallVector<TemplateArgument, 8> PrimaryCanonArgs(6468      Primary->getInjectedTemplateArgs(Context));6469  Context.canonicalizeTemplateArguments(PrimaryCanonArgs);6470 6471  QualType PrimaryT = Context.getCanonicalTemplateSpecializationType(6472      ElaboratedTypeKeyword::None, Name, PrimaryCanonArgs);6473  QualType PartialT = Context.getCanonicalTemplateSpecializationType(6474      ElaboratedTypeKeyword::None, Name, Spec->getTemplateArgs().asArray());6475 6476  VarTemplatePartialSpecializationDecl *MaybeSpec =6477      getMoreSpecialized(*this, PartialT, PrimaryT, Spec, Primary, Info);6478  if (MaybeSpec)6479    Info.clearSFINAEDiagnostic();6480  return MaybeSpec;6481}6482 6483bool Sema::isTemplateTemplateParameterAtLeastAsSpecializedAs(6484    TemplateParameterList *P, TemplateDecl *PArg, TemplateDecl *AArg,6485    const DefaultArguments &DefaultArgs, SourceLocation ArgLoc,6486    bool PartialOrdering, bool *StrictPackMatch) {6487  // C++1z [temp.arg.template]p4: (DR 150)6488  //   A template template-parameter P is at least as specialized as a6489  //   template template-argument A if, given the following rewrite to two6490  //   function templates...6491 6492  // Rather than synthesize function templates, we merely perform the6493  // equivalent partial ordering by performing deduction directly on6494  // the template parameter lists of the template template parameters.6495  //6496  TemplateParameterList *A = AArg->getTemplateParameters();6497 6498  Sema::InstantiatingTemplate Inst(6499      *this, ArgLoc, Sema::InstantiatingTemplate::PartialOrderingTTP(), PArg,6500      SourceRange(P->getTemplateLoc(), P->getRAngleLoc()));6501  if (Inst.isInvalid())6502    return false;6503 6504  //   Given an invented class template X with the template parameter list of6505  //   A (including default arguments):6506  //    - Each function template has a single function parameter whose type is6507  //      a specialization of X with template arguments corresponding to the6508  //      template parameters from the respective function template6509  SmallVector<TemplateArgument, 8> AArgs(A->getInjectedTemplateArgs(Context));6510 6511  // Check P's arguments against A's parameter list. This will fill in default6512  // template arguments as needed. AArgs are already correct by construction.6513  // We can't just use CheckTemplateIdType because that will expand alias6514  // templates.6515  SmallVector<TemplateArgument, 4> PArgs(P->getInjectedTemplateArgs(Context));6516  {6517    TemplateArgumentListInfo PArgList(P->getLAngleLoc(),6518                                      P->getRAngleLoc());6519    for (unsigned I = 0, N = P->size(); I != N; ++I) {6520      // Unwrap packs that getInjectedTemplateArgs wrapped around pack6521      // expansions, to form an "as written" argument list.6522      TemplateArgument Arg = PArgs[I];6523      if (Arg.getKind() == TemplateArgument::Pack) {6524        assert(Arg.pack_size() == 1 && Arg.pack_begin()->isPackExpansion());6525        Arg = *Arg.pack_begin();6526      }6527      PArgList.addArgument(getTrivialTemplateArgumentLoc(6528          Arg, QualType(), P->getParam(I)->getLocation()));6529    }6530    PArgs.clear();6531 6532    // C++1z [temp.arg.template]p3:6533    //   If the rewrite produces an invalid type, then P is not at least as6534    //   specialized as A.6535    CheckTemplateArgumentInfo CTAI(6536        /*PartialOrdering=*/false, /*MatchingTTP=*/true);6537    CTAI.SugaredConverted = std::move(PArgs);6538    if (CheckTemplateArgumentList(AArg, ArgLoc, PArgList, DefaultArgs,6539                                  /*PartialTemplateArgs=*/false, CTAI,6540                                  /*UpdateArgsWithConversions=*/true,6541                                  /*ConstraintsNotSatisfied=*/nullptr))6542      return false;6543    PArgs = std::move(CTAI.SugaredConverted);6544    if (StrictPackMatch)6545      *StrictPackMatch |= CTAI.StrictPackMatch;6546  }6547 6548  // Determine whether P1 is at least as specialized as P2.6549  TemplateDeductionInfo Info(ArgLoc, A->getDepth());6550  SmallVector<DeducedTemplateArgument, 4> Deduced;6551  Deduced.resize(A->size());6552 6553  //   ... the function template corresponding to P is at least as specialized6554  //   as the function template corresponding to A according to the partial6555  //   ordering rules for function templates.6556 6557  // Provisional resolution for CWG2398: Regarding temp.arg.template]p4, when6558  // applying the partial ordering rules for function templates on6559  // the rewritten template template parameters:6560  //   - In a deduced context, the matching of packs versus fixed-size needs to6561  //   be inverted between Ps and As. On non-deduced context, matching needs to6562  //   happen both ways, according to [temp.arg.template]p3, but this is6563  //   currently implemented as a special case elsewhere.6564  switch (::DeduceTemplateArguments(6565      *this, A, AArgs, PArgs, Info, Deduced,6566      /*NumberOfArgumentsMustMatch=*/false, /*PartialOrdering=*/true,6567      PartialOrdering ? PackFold::ArgumentToParameter : PackFold::Both,6568      /*HasDeducedAnyParam=*/nullptr)) {6569  case clang::TemplateDeductionResult::Success:6570    if (StrictPackMatch && Info.hasStrictPackMatch())6571      *StrictPackMatch = true;6572    break;6573 6574  case TemplateDeductionResult::MiscellaneousDeductionFailure:6575    Diag(AArg->getLocation(), diag::err_template_param_list_different_arity)6576        << (A->size() > P->size()) << /*isTemplateTemplateParameter=*/true6577        << SourceRange(A->getTemplateLoc(), P->getRAngleLoc());6578    return false;6579  case TemplateDeductionResult::NonDeducedMismatch:6580    Diag(AArg->getLocation(), diag::err_non_deduced_mismatch)6581        << Info.FirstArg << Info.SecondArg;6582    return false;6583  case TemplateDeductionResult::Inconsistent:6584    Diag(getAsNamedDecl(Info.Param)->getLocation(),6585         diag::err_inconsistent_deduction)6586        << Info.FirstArg << Info.SecondArg;6587    return false;6588  case TemplateDeductionResult::AlreadyDiagnosed:6589    return false;6590 6591  // None of these should happen for a plain deduction.6592  case TemplateDeductionResult::Invalid:6593  case TemplateDeductionResult::InstantiationDepth:6594  case TemplateDeductionResult::Incomplete:6595  case TemplateDeductionResult::IncompletePack:6596  case TemplateDeductionResult::Underqualified:6597  case TemplateDeductionResult::SubstitutionFailure:6598  case TemplateDeductionResult::DeducedMismatch:6599  case TemplateDeductionResult::DeducedMismatchNested:6600  case TemplateDeductionResult::TooManyArguments:6601  case TemplateDeductionResult::TooFewArguments:6602  case TemplateDeductionResult::InvalidExplicitArguments:6603  case TemplateDeductionResult::NonDependentConversionFailure:6604  case TemplateDeductionResult::ConstraintsNotSatisfied:6605  case TemplateDeductionResult::CUDATargetMismatch:6606    llvm_unreachable("Unexpected Result");6607  }6608 6609  TemplateDeductionResult TDK;6610  runWithSufficientStackSpace(Info.getLocation(), [&] {6611    TDK = ::FinishTemplateArgumentDeduction(6612        *this, AArg, AArg->getTemplateParameters(), AArg, PartialOrdering,6613        AArgs, PArgs, Deduced, Info, /*CopyDeducedArgs=*/false);6614  });6615  switch (TDK) {6616  case TemplateDeductionResult::Success:6617    return true;6618 6619  // It doesn't seem possible to get a non-deduced mismatch when partial6620  // ordering TTPs, except with an invalid template parameter list which has6621  // a parameter after a pack.6622  case TemplateDeductionResult::NonDeducedMismatch:6623    assert(PArg->isInvalidDecl() && "Unexpected NonDeducedMismatch");6624    return false;6625 6626  // Substitution failures should have already been diagnosed.6627  case TemplateDeductionResult::AlreadyDiagnosed:6628  case TemplateDeductionResult::SubstitutionFailure:6629  case TemplateDeductionResult::InstantiationDepth:6630    return false;6631 6632  // None of these should happen when just converting deduced arguments.6633  case TemplateDeductionResult::Invalid:6634  case TemplateDeductionResult::Incomplete:6635  case TemplateDeductionResult::IncompletePack:6636  case TemplateDeductionResult::Inconsistent:6637  case TemplateDeductionResult::Underqualified:6638  case TemplateDeductionResult::DeducedMismatch:6639  case TemplateDeductionResult::DeducedMismatchNested:6640  case TemplateDeductionResult::TooManyArguments:6641  case TemplateDeductionResult::TooFewArguments:6642  case TemplateDeductionResult::InvalidExplicitArguments:6643  case TemplateDeductionResult::NonDependentConversionFailure:6644  case TemplateDeductionResult::ConstraintsNotSatisfied:6645  case TemplateDeductionResult::MiscellaneousDeductionFailure:6646  case TemplateDeductionResult::CUDATargetMismatch:6647    llvm_unreachable("Unexpected Result");6648  }6649  llvm_unreachable("Unexpected TDK");6650}6651 6652namespace {6653struct MarkUsedTemplateParameterVisitor : DynamicRecursiveASTVisitor {6654  llvm::SmallBitVector &Used;6655  unsigned Depth;6656  bool VisitDeclRefTypes = true;6657 6658  MarkUsedTemplateParameterVisitor(llvm::SmallBitVector &Used, unsigned Depth,6659                                   bool VisitDeclRefTypes = true)6660      : Used(Used), Depth(Depth), VisitDeclRefTypes(VisitDeclRefTypes) {}6661 6662  bool VisitTemplateTypeParmType(TemplateTypeParmType *T) override {6663    if (T->getDepth() == Depth)6664      Used[T->getIndex()] = true;6665    return true;6666  }6667 6668  bool TraverseTemplateName(TemplateName Template) override {6669    if (auto *TTP = llvm::dyn_cast_or_null<TemplateTemplateParmDecl>(6670            Template.getAsTemplateDecl()))6671      if (TTP->getDepth() == Depth)6672        Used[TTP->getIndex()] = true;6673    DynamicRecursiveASTVisitor::TraverseTemplateName(Template);6674    return true;6675  }6676 6677  bool VisitDeclRefExpr(DeclRefExpr *E) override {6678    if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(E->getDecl()))6679      if (NTTP->getDepth() == Depth)6680        Used[NTTP->getIndex()] = true;6681    if (VisitDeclRefTypes)6682      DynamicRecursiveASTVisitor::TraverseType(E->getType());6683    return true;6684  }6685 6686  bool VisitUnresolvedLookupExpr(UnresolvedLookupExpr *ULE) override {6687    if (ULE->isConceptReference() || ULE->isVarDeclReference()) {6688      if (auto *TTP = ULE->getTemplateTemplateDecl()) {6689        if (TTP->getDepth() == Depth)6690          Used[TTP->getIndex()] = true;6691      }6692      for (auto &TLoc : ULE->template_arguments())6693        DynamicRecursiveASTVisitor::TraverseTemplateArgumentLoc(TLoc);6694    }6695    return true;6696  }6697 6698  bool TraverseSizeOfPackExpr(SizeOfPackExpr *SOPE) override {6699    return TraverseDecl(SOPE->getPack());6700  }6701};6702}6703 6704/// Mark the template parameters that are used by the given6705/// expression.6706static void6707MarkUsedTemplateParameters(ASTContext &Ctx,6708                           const Expr *E,6709                           bool OnlyDeduced,6710                           unsigned Depth,6711                           llvm::SmallBitVector &Used) {6712  if (!OnlyDeduced) {6713    MarkUsedTemplateParameterVisitor(Used, Depth)6714        .TraverseStmt(const_cast<Expr *>(E));6715    return;6716  }6717 6718  // We can deduce from a pack expansion.6719  if (const PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(E))6720    E = Expansion->getPattern();6721 6722  E = unwrapExpressionForDeduction(E);6723  if (const auto *ULE = dyn_cast<UnresolvedLookupExpr>(E);6724      ULE && (ULE->isConceptReference() || ULE->isVarDeclReference())) {6725    if (const auto *TTP = ULE->getTemplateTemplateDecl())6726      Used[TTP->getIndex()] = true;6727    for (auto &TLoc : ULE->template_arguments())6728      MarkUsedTemplateParameters(Ctx, TLoc.getArgument(), OnlyDeduced, Depth,6729                                 Used);6730    return;6731  }6732 6733  const NonTypeOrVarTemplateParmDecl NTTP =6734      getDeducedNTTParameterFromExpr(E, Depth);6735  if (!NTTP)6736    return;6737  if (NTTP.getDepth() == Depth)6738    Used[NTTP.getIndex()] = true;6739 6740  // In C++17 mode, additional arguments may be deduced from the type of a6741  // non-type argument.6742  if (Ctx.getLangOpts().CPlusPlus17)6743    MarkUsedTemplateParameters(Ctx, NTTP.getType(), OnlyDeduced, Depth, Used);6744}6745 6746/// Mark the template parameters that are used by the given6747/// nested name specifier.6748static void MarkUsedTemplateParameters(ASTContext &Ctx, NestedNameSpecifier NNS,6749                                       bool OnlyDeduced, unsigned Depth,6750                                       llvm::SmallBitVector &Used) {6751  if (NNS.getKind() != NestedNameSpecifier::Kind::Type)6752    return;6753  MarkUsedTemplateParameters(Ctx, QualType(NNS.getAsType(), 0), OnlyDeduced,6754                             Depth, Used);6755}6756 6757/// Mark the template parameters that are used by the given6758/// template name.6759static void6760MarkUsedTemplateParameters(ASTContext &Ctx,6761                           TemplateName Name,6762                           bool OnlyDeduced,6763                           unsigned Depth,6764                           llvm::SmallBitVector &Used) {6765  if (TemplateDecl *Template = Name.getAsTemplateDecl()) {6766    if (TemplateTemplateParmDecl *TTP6767          = dyn_cast<TemplateTemplateParmDecl>(Template)) {6768      if (TTP->getDepth() == Depth)6769        Used[TTP->getIndex()] = true;6770    }6771    return;6772  }6773 6774  if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName())6775    MarkUsedTemplateParameters(Ctx, QTN->getQualifier(), OnlyDeduced,6776                               Depth, Used);6777  if (DependentTemplateName *DTN = Name.getAsDependentTemplateName())6778    MarkUsedTemplateParameters(Ctx, DTN->getQualifier(), OnlyDeduced,6779                               Depth, Used);6780}6781 6782/// Mark the template parameters that are used by the given6783/// type.6784static void6785MarkUsedTemplateParameters(ASTContext &Ctx, QualType T,6786                           bool OnlyDeduced,6787                           unsigned Depth,6788                           llvm::SmallBitVector &Used) {6789  if (T.isNull())6790    return;6791 6792  // Non-dependent types have nothing deducible6793  if (!T->isDependentType())6794    return;6795 6796  T = Ctx.getCanonicalType(T);6797  switch (T->getTypeClass()) {6798  case Type::Pointer:6799    MarkUsedTemplateParameters(Ctx,6800                               cast<PointerType>(T)->getPointeeType(),6801                               OnlyDeduced,6802                               Depth,6803                               Used);6804    break;6805 6806  case Type::BlockPointer:6807    MarkUsedTemplateParameters(Ctx,6808                               cast<BlockPointerType>(T)->getPointeeType(),6809                               OnlyDeduced,6810                               Depth,6811                               Used);6812    break;6813 6814  case Type::LValueReference:6815  case Type::RValueReference:6816    MarkUsedTemplateParameters(Ctx,6817                               cast<ReferenceType>(T)->getPointeeType(),6818                               OnlyDeduced,6819                               Depth,6820                               Used);6821    break;6822 6823  case Type::MemberPointer: {6824    const MemberPointerType *MemPtr = cast<MemberPointerType>(T.getTypePtr());6825    MarkUsedTemplateParameters(Ctx, MemPtr->getPointeeType(), OnlyDeduced,6826                               Depth, Used);6827    MarkUsedTemplateParameters(Ctx,6828                               QualType(MemPtr->getQualifier().getAsType(), 0),6829                               OnlyDeduced, Depth, Used);6830    break;6831  }6832 6833  case Type::DependentSizedArray:6834    MarkUsedTemplateParameters(Ctx,6835                               cast<DependentSizedArrayType>(T)->getSizeExpr(),6836                               OnlyDeduced, Depth, Used);6837    // Fall through to check the element type6838    [[fallthrough]];6839 6840  case Type::ConstantArray:6841  case Type::IncompleteArray:6842  case Type::ArrayParameter:6843    MarkUsedTemplateParameters(Ctx,6844                               cast<ArrayType>(T)->getElementType(),6845                               OnlyDeduced, Depth, Used);6846    break;6847  case Type::Vector:6848  case Type::ExtVector:6849    MarkUsedTemplateParameters(Ctx,6850                               cast<VectorType>(T)->getElementType(),6851                               OnlyDeduced, Depth, Used);6852    break;6853 6854  case Type::DependentVector: {6855    const auto *VecType = cast<DependentVectorType>(T);6856    MarkUsedTemplateParameters(Ctx, VecType->getElementType(), OnlyDeduced,6857                               Depth, Used);6858    MarkUsedTemplateParameters(Ctx, VecType->getSizeExpr(), OnlyDeduced, Depth,6859                               Used);6860    break;6861  }6862  case Type::DependentSizedExtVector: {6863    const DependentSizedExtVectorType *VecType6864      = cast<DependentSizedExtVectorType>(T);6865    MarkUsedTemplateParameters(Ctx, VecType->getElementType(), OnlyDeduced,6866                               Depth, Used);6867    MarkUsedTemplateParameters(Ctx, VecType->getSizeExpr(), OnlyDeduced,6868                               Depth, Used);6869    break;6870  }6871 6872  case Type::DependentAddressSpace: {6873    const DependentAddressSpaceType *DependentASType =6874        cast<DependentAddressSpaceType>(T);6875    MarkUsedTemplateParameters(Ctx, DependentASType->getPointeeType(),6876                               OnlyDeduced, Depth, Used);6877    MarkUsedTemplateParameters(Ctx,6878                               DependentASType->getAddrSpaceExpr(),6879                               OnlyDeduced, Depth, Used);6880    break;6881  }6882 6883  case Type::ConstantMatrix: {6884    const ConstantMatrixType *MatType = cast<ConstantMatrixType>(T);6885    MarkUsedTemplateParameters(Ctx, MatType->getElementType(), OnlyDeduced,6886                               Depth, Used);6887    break;6888  }6889 6890  case Type::DependentSizedMatrix: {6891    const DependentSizedMatrixType *MatType = cast<DependentSizedMatrixType>(T);6892    MarkUsedTemplateParameters(Ctx, MatType->getElementType(), OnlyDeduced,6893                               Depth, Used);6894    MarkUsedTemplateParameters(Ctx, MatType->getRowExpr(), OnlyDeduced, Depth,6895                               Used);6896    MarkUsedTemplateParameters(Ctx, MatType->getColumnExpr(), OnlyDeduced,6897                               Depth, Used);6898    break;6899  }6900 6901  case Type::FunctionProto: {6902    const FunctionProtoType *Proto = cast<FunctionProtoType>(T);6903    MarkUsedTemplateParameters(Ctx, Proto->getReturnType(), OnlyDeduced, Depth,6904                               Used);6905    for (unsigned I = 0, N = Proto->getNumParams(); I != N; ++I) {6906      // C++17 [temp.deduct.type]p5:6907      //   The non-deduced contexts are: [...]6908      //   -- A function parameter pack that does not occur at the end of the6909      //      parameter-declaration-list.6910      if (!OnlyDeduced || I + 1 == N ||6911          !Proto->getParamType(I)->getAs<PackExpansionType>()) {6912        MarkUsedTemplateParameters(Ctx, Proto->getParamType(I), OnlyDeduced,6913                                   Depth, Used);6914      } else {6915        // FIXME: C++17 [temp.deduct.call]p1:6916        //   When a function parameter pack appears in a non-deduced context,6917        //   the type of that pack is never deduced.6918        //6919        // We should also track a set of "never deduced" parameters, and6920        // subtract that from the list of deduced parameters after marking.6921      }6922    }6923    if (auto *E = Proto->getNoexceptExpr())6924      MarkUsedTemplateParameters(Ctx, E, OnlyDeduced, Depth, Used);6925    break;6926  }6927 6928  case Type::TemplateTypeParm: {6929    const TemplateTypeParmType *TTP = cast<TemplateTypeParmType>(T);6930    if (TTP->getDepth() == Depth)6931      Used[TTP->getIndex()] = true;6932    break;6933  }6934 6935  case Type::SubstTemplateTypeParmPack: {6936    const SubstTemplateTypeParmPackType *Subst6937      = cast<SubstTemplateTypeParmPackType>(T);6938    if (Subst->getReplacedParameter()->getDepth() == Depth)6939      Used[Subst->getIndex()] = true;6940    MarkUsedTemplateParameters(Ctx, Subst->getArgumentPack(), OnlyDeduced,6941                               Depth, Used);6942    break;6943  }6944  case Type::SubstBuiltinTemplatePack: {6945    MarkUsedTemplateParameters(Ctx, cast<SubstPackType>(T)->getArgumentPack(),6946                               OnlyDeduced, Depth, Used);6947    break;6948  }6949 6950  case Type::InjectedClassName:6951    T = cast<InjectedClassNameType>(T)6952            ->getDecl()6953            ->getCanonicalTemplateSpecializationType(Ctx);6954    [[fallthrough]];6955 6956  case Type::TemplateSpecialization: {6957    const TemplateSpecializationType *Spec6958      = cast<TemplateSpecializationType>(T);6959 6960    TemplateName Name = Spec->getTemplateName();6961    if (OnlyDeduced && Name.getAsDependentTemplateName())6962      break;6963 6964    MarkUsedTemplateParameters(Ctx, Name, OnlyDeduced, Depth, Used);6965 6966    // C++0x [temp.deduct.type]p9:6967    //   If the template argument list of P contains a pack expansion that is6968    //   not the last template argument, the entire template argument list is a6969    //   non-deduced context.6970    if (OnlyDeduced &&6971        hasPackExpansionBeforeEnd(Spec->template_arguments()))6972      break;6973 6974    for (const auto &Arg : Spec->template_arguments())6975      MarkUsedTemplateParameters(Ctx, Arg, OnlyDeduced, Depth, Used);6976    break;6977  }6978 6979  case Type::Complex:6980    if (!OnlyDeduced)6981      MarkUsedTemplateParameters(Ctx,6982                                 cast<ComplexType>(T)->getElementType(),6983                                 OnlyDeduced, Depth, Used);6984    break;6985 6986  case Type::Atomic:6987    if (!OnlyDeduced)6988      MarkUsedTemplateParameters(Ctx,6989                                 cast<AtomicType>(T)->getValueType(),6990                                 OnlyDeduced, Depth, Used);6991    break;6992 6993  case Type::DependentName:6994    if (!OnlyDeduced)6995      MarkUsedTemplateParameters(Ctx,6996                                 cast<DependentNameType>(T)->getQualifier(),6997                                 OnlyDeduced, Depth, Used);6998    break;6999 7000  case Type::TypeOf:7001    if (!OnlyDeduced)7002      MarkUsedTemplateParameters(Ctx, cast<TypeOfType>(T)->getUnmodifiedType(),7003                                 OnlyDeduced, Depth, Used);7004    break;7005 7006  case Type::TypeOfExpr:7007    if (!OnlyDeduced)7008      MarkUsedTemplateParameters(Ctx,7009                                 cast<TypeOfExprType>(T)->getUnderlyingExpr(),7010                                 OnlyDeduced, Depth, Used);7011    break;7012 7013  case Type::Decltype:7014    if (!OnlyDeduced)7015      MarkUsedTemplateParameters(Ctx,7016                                 cast<DecltypeType>(T)->getUnderlyingExpr(),7017                                 OnlyDeduced, Depth, Used);7018    break;7019 7020  case Type::PackIndexing:7021    if (!OnlyDeduced) {7022      MarkUsedTemplateParameters(Ctx, cast<PackIndexingType>(T)->getPattern(),7023                                 OnlyDeduced, Depth, Used);7024      MarkUsedTemplateParameters(Ctx, cast<PackIndexingType>(T)->getIndexExpr(),7025                                 OnlyDeduced, Depth, Used);7026    }7027    break;7028 7029  case Type::UnaryTransform:7030    if (!OnlyDeduced) {7031      auto *UTT = cast<UnaryTransformType>(T);7032      auto Next = UTT->getUnderlyingType();7033      if (Next.isNull())7034        Next = UTT->getBaseType();7035      MarkUsedTemplateParameters(Ctx, Next, OnlyDeduced, Depth, Used);7036    }7037    break;7038 7039  case Type::PackExpansion:7040    MarkUsedTemplateParameters(Ctx,7041                               cast<PackExpansionType>(T)->getPattern(),7042                               OnlyDeduced, Depth, Used);7043    break;7044 7045  case Type::Auto:7046  case Type::DeducedTemplateSpecialization:7047    MarkUsedTemplateParameters(Ctx,7048                               cast<DeducedType>(T)->getDeducedType(),7049                               OnlyDeduced, Depth, Used);7050    break;7051  case Type::DependentBitInt:7052    MarkUsedTemplateParameters(Ctx,7053                               cast<DependentBitIntType>(T)->getNumBitsExpr(),7054                               OnlyDeduced, Depth, Used);7055    break;7056 7057  case Type::HLSLAttributedResource:7058    MarkUsedTemplateParameters(7059        Ctx, cast<HLSLAttributedResourceType>(T)->getWrappedType(), OnlyDeduced,7060        Depth, Used);7061    if (cast<HLSLAttributedResourceType>(T)->hasContainedType())7062      MarkUsedTemplateParameters(7063          Ctx, cast<HLSLAttributedResourceType>(T)->getContainedType(),7064          OnlyDeduced, Depth, Used);7065    break;7066 7067  // None of these types have any template parameters in them.7068  case Type::Builtin:7069  case Type::VariableArray:7070  case Type::FunctionNoProto:7071  case Type::Record:7072  case Type::Enum:7073  case Type::ObjCInterface:7074  case Type::ObjCObject:7075  case Type::ObjCObjectPointer:7076  case Type::UnresolvedUsing:7077  case Type::Pipe:7078  case Type::BitInt:7079  case Type::HLSLInlineSpirv:7080#define TYPE(Class, Base)7081#define ABSTRACT_TYPE(Class, Base)7082#define DEPENDENT_TYPE(Class, Base)7083#define NON_CANONICAL_TYPE(Class, Base) case Type::Class:7084#include "clang/AST/TypeNodes.inc"7085    break;7086  }7087}7088 7089/// Mark the template parameters that are used by this7090/// template argument.7091static void7092MarkUsedTemplateParameters(ASTContext &Ctx,7093                           const TemplateArgument &TemplateArg,7094                           bool OnlyDeduced,7095                           unsigned Depth,7096                           llvm::SmallBitVector &Used) {7097  switch (TemplateArg.getKind()) {7098  case TemplateArgument::Null:7099  case TemplateArgument::Integral:7100  case TemplateArgument::Declaration:7101  case TemplateArgument::NullPtr:7102  case TemplateArgument::StructuralValue:7103    break;7104 7105  case TemplateArgument::Type:7106    MarkUsedTemplateParameters(Ctx, TemplateArg.getAsType(), OnlyDeduced,7107                               Depth, Used);7108    break;7109 7110  case TemplateArgument::Template:7111  case TemplateArgument::TemplateExpansion:7112    MarkUsedTemplateParameters(Ctx,7113                               TemplateArg.getAsTemplateOrTemplatePattern(),7114                               OnlyDeduced, Depth, Used);7115    break;7116 7117  case TemplateArgument::Expression:7118    MarkUsedTemplateParameters(Ctx, TemplateArg.getAsExpr(), OnlyDeduced,7119                               Depth, Used);7120    break;7121 7122  case TemplateArgument::Pack:7123    for (const auto &P : TemplateArg.pack_elements())7124      MarkUsedTemplateParameters(Ctx, P, OnlyDeduced, Depth, Used);7125    break;7126  }7127}7128 7129void7130Sema::MarkUsedTemplateParameters(const Expr *E, bool OnlyDeduced,7131                                 unsigned Depth,7132                                 llvm::SmallBitVector &Used) {7133  ::MarkUsedTemplateParameters(Context, E, OnlyDeduced, Depth, Used);7134}7135 7136void Sema::MarkUsedTemplateParametersForSubsumptionParameterMapping(7137    const Expr *E, unsigned Depth, llvm::SmallBitVector &Used) {7138  MarkUsedTemplateParameterVisitor(Used, Depth, /*VisitDeclRefTypes=*/false)7139      .TraverseStmt(const_cast<Expr *>(E));7140}7141 7142void7143Sema::MarkUsedTemplateParameters(const TemplateArgumentList &TemplateArgs,7144                                 bool OnlyDeduced, unsigned Depth,7145                                 llvm::SmallBitVector &Used) {7146  // C++0x [temp.deduct.type]p9:7147  //   If the template argument list of P contains a pack expansion that is not7148  //   the last template argument, the entire template argument list is a7149  //   non-deduced context.7150  if (OnlyDeduced &&7151      hasPackExpansionBeforeEnd(TemplateArgs.asArray()))7152    return;7153 7154  for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)7155    ::MarkUsedTemplateParameters(Context, TemplateArgs[I], OnlyDeduced,7156                                 Depth, Used);7157}7158 7159void Sema::MarkUsedTemplateParameters(ArrayRef<TemplateArgument> TemplateArgs,7160                                      unsigned Depth,7161                                      llvm::SmallBitVector &Used) {7162  for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)7163    ::MarkUsedTemplateParameters(Context, TemplateArgs[I],7164                                 /*OnlyDeduced=*/false, Depth, Used);7165}7166 7167void Sema::MarkUsedTemplateParameters(7168    ArrayRef<TemplateArgumentLoc> TemplateArgs, unsigned Depth,7169    llvm::SmallBitVector &Used) {7170  for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)7171    ::MarkUsedTemplateParameters(Context, TemplateArgs[I].getArgument(),7172                                 /*OnlyDeduced=*/false, Depth, Used);7173}7174 7175void Sema::MarkDeducedTemplateParameters(7176    ASTContext &Ctx, const FunctionTemplateDecl *FunctionTemplate,7177    llvm::SmallBitVector &Deduced) {7178  TemplateParameterList *TemplateParams7179    = FunctionTemplate->getTemplateParameters();7180  Deduced.clear();7181  Deduced.resize(TemplateParams->size());7182 7183  FunctionDecl *Function = FunctionTemplate->getTemplatedDecl();7184  for (unsigned I = 0, N = Function->getNumParams(); I != N; ++I)7185    ::MarkUsedTemplateParameters(Ctx, Function->getParamDecl(I)->getType(),7186                                 true, TemplateParams->getDepth(), Deduced);7187}7188 7189bool hasDeducibleTemplateParameters(Sema &S,7190                                    FunctionTemplateDecl *FunctionTemplate,7191                                    QualType T) {7192  if (!T->isDependentType())7193    return false;7194 7195  TemplateParameterList *TemplateParams7196    = FunctionTemplate->getTemplateParameters();7197  llvm::SmallBitVector Deduced(TemplateParams->size());7198  ::MarkUsedTemplateParameters(S.Context, T, true, TemplateParams->getDepth(),7199                               Deduced);7200 7201  return Deduced.any();7202}7203