45#include "llvm/ADT/APInt.h"
46#include "llvm/ADT/APSInt.h"
47#include "llvm/ADT/ArrayRef.h"
48#include "llvm/ADT/DenseMap.h"
49#include "llvm/ADT/FoldingSet.h"
50#include "llvm/ADT/SmallBitVector.h"
51#include "llvm/ADT/SmallPtrSet.h"
52#include "llvm/ADT/SmallVector.h"
53#include "llvm/Support/Casting.h"
54#include "llvm/Support/Compiler.h"
55#include "llvm/Support/ErrorHandling.h"
113using namespace clang;
119 if (Y.getBitWidth() >
X.getBitWidth())
120 X =
X.extend(Y.getBitWidth());
121 else if (Y.getBitWidth() <
X.getBitWidth())
122 Y = Y.extend(
X.getBitWidth());
125 if (
X.isSigned() != Y.isSigned()) {
127 if ((Y.isSigned() && Y.isNegative()) || (
X.isSigned() &&
X.isNegative()))
146 bool *HasDeducedAnyParam);
160 bool OnlyDeduced,
unsigned Depth,
161 llvm::SmallBitVector &
Used);
164 bool OnlyDeduced,
unsigned Level,
165 llvm::SmallBitVector &Deduced);
175 if (
const auto *IC = dyn_cast<ImplicitCastExpr>(
E))
176 E = IC->getSubExpr();
177 else if (
const auto *CE = dyn_cast<ConstantExpr>(
E))
178 E = CE->getSubExpr();
179 else if (
const auto *Subst = dyn_cast<SubstNonTypeTemplateParmExpr>(
E))
180 E = Subst->getReplacement();
181 else if (
const auto *CCE = dyn_cast<CXXConstructExpr>(
E)) {
183 if (CCE->getParenOrBraceRange().isValid())
186 assert(CCE->getNumArgs() >= 1 &&
"implicit construct expr should have 1 arg");
192 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E))
193 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
194 if (NTTP->getDepth() == Depth)
209 X = NX->getUnderlyingDecl();
210 if (
NamedDecl *NY = dyn_cast<NamedDecl>(Y))
211 Y = NY->getUnderlyingDecl();
224 bool AggregateCandidateDeduction =
false) {
237 QualType XType =
X.getNonTypeTemplateArgumentType();
245 switch (
X.getKind()) {
247 llvm_unreachable(
"Non-deduced template arguments handled above");
254 X.wasDeducedFromArrayBound() ||
260 return X.wasDeducedFromArrayBound() ? Y :
X;
274 return X.wasDeducedFromArrayBound() ? Y :
X;
283 X.structurallyEquals(Y)))
311 llvm::FoldingSetNodeID ID1, ID2;
312 X.getAsExpr()->Profile(ID1, Context,
true);
315 return X.wasDeducedFromArrayBound() ? Y :
X;
322 assert(!
X.wasDeducedFromArrayBound());
335 X.getParamTypeForDecl());
372 (!AggregateCandidateDeduction &&
X.pack_size() != Y.
pack_size()))
384 if (Merged.isNull() && !(XA->isNull() && YA->isNull()))
386 NewPack.push_back(Merged);
389 NewPack.push_back(*XA);
399 llvm_unreachable(
"Invalid TemplateArgument Kind!");
412 bool *HasDeducedAnyParam) {
414 "deducing non-type template argument with wrong depth");
418 if (Result.isNull()) {
422 return TemplateDeductionResult::Inconsistent;
427 return TemplateDeductionResult::Success;
434 return TemplateDeductionResult::Success;
439 if (
auto *Expansion = dyn_cast<PackExpansionType>(ParamType))
440 ParamType = Expansion->getPattern();
454 S, TemplateParams, ParamType, ValueType, Info, Deduced,
468 bool *HasDeducedAnyParam) {
470 S, TemplateParams, NTTP,
472 DeducedFromArrayBound),
484 bool *HasDeducedAnyParam) {
506 bool *HasDeducedAnyParam) {
522 bool *HasDeducedAnyParam) {
534 bool *HasDeducedAnyParam) {
539 return TemplateDeductionResult::Success;
542 if (
auto *TempParam = dyn_cast<TemplateTemplateParmDecl>(ParamDecl)) {
545 return TemplateDeductionResult::Success;
549 unsigned StartPos = 0;
566 Arg, {StartPos, DefaultArguments.drop_front(StartPos)}))
570 S.
Context, Deduced[TempParam->getIndex()], NewDeduced);
571 if (Result.isNull()) {
572 Info.
Param = TempParam;
573 Info.
FirstArg = Deduced[TempParam->getIndex()];
575 return TemplateDeductionResult::Inconsistent;
578 Deduced[TempParam->getIndex()] = Result;
579 if (HasDeducedAnyParam)
580 *HasDeducedAnyParam =
true;
581 return TemplateDeductionResult::Success;
587 return TemplateDeductionResult::Success;
592 return TemplateDeductionResult::NonDeducedMismatch;
618 assert(TST &&
"Expected a TemplateSpecializationType");
630 bool *HasDeducedAnyParam) {
633 UP = IP->getInjectedSpecializationType();
641 return TemplateDeductionResult::Success;
648 ->template_arguments();
651 std::optional<NestedNameSpecifier *> NNS;
654 NNS = Elaborated->getQualifier();
656 UA = Injected->getInjectedSpecializationType();
667 return TemplateDeductionResult::Success;
674 ->template_arguments();
681 Result != TemplateDeductionResult::Success)
688 S, TemplateParams, PResolved, AResolved, Info, Deduced,
698 RA ? dyn_cast<ClassTemplateSpecializationDecl>(RA->getDecl()) :
nullptr;
702 return TemplateDeductionResult::NonDeducedMismatch;
708 *NNS,
false,
TemplateName(SA->getSpecializedTemplate()));
712 S, TemplateParams, TNP, TNA, Info,
714 Deduced, HasDeducedAnyParam);
715 Result != TemplateDeductionResult::Success)
720 SA->getTemplateArgs().asArray(), Info, Deduced,
730 case Type::TypeOfExpr:
732 case Type::DependentName:
734 case Type::PackIndexing:
735 case Type::UnresolvedUsing:
736 case Type::TemplateTypeParm:
740 case Type::ConstantArray:
741 case Type::IncompleteArray:
742 case Type::VariableArray:
743 case Type::DependentSizedArray:
745 cast<ArrayType>(
T)->getElementType().getTypePtr());
794class PackDeductionScope {
802 bool DeducePackIfNotAlreadyDeduced =
false,
803 bool FinishingDeduction =
false)
804 : S(S), TemplateParams(TemplateParams), Deduced(Deduced), Info(Info),
805 DeducePackIfNotAlreadyDeduced(DeducePackIfNotAlreadyDeduced),
806 FinishingDeduction(FinishingDeduction) {
807 unsigned NumNamedPacks = addPacks(Pattern);
808 finishConstruction(NumNamedPacks);
815 : S(S), TemplateParams(TemplateParams), Deduced(Deduced), Info(Info) {
817 finishConstruction(1);
821 void addPack(
unsigned Index) {
824 DeducedFromEarlierParameter = !Deduced[Index].isNull();
826 if (!FinishingDeduction) {
827 Pack.Saved = Deduced[Index];
834 if (std::optional<unsigned> ExpandedPackExpansions =
836 FixedNumExpansions = ExpandedPackExpansions;
838 Packs.push_back(Pack);
844 llvm::SmallBitVector SawIndices(TemplateParams->size());
847 auto AddPack = [&](
unsigned Index) {
848 if (SawIndices[Index])
850 SawIndices[Index] =
true;
857 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
858 TemplateParams->getParam(Index))) {
859 if (!NTTP->isExpandedParameterPack())
862 if (
auto *Expansion = dyn_cast<PackExpansionType>(
864 ExtraDeductions.push_back(Expansion->getPattern());
873 for (
unsigned I = 0, N = Unexpanded.size(); I != N; ++I) {
874 unsigned Depth, Index;
876 if (Depth == Info.getDeducedDepth())
883 assert(!Packs.empty() &&
"Pack expansion without unexpanded packs?");
885 unsigned NumNamedPacks = Packs.size();
889 while (!ExtraDeductions.empty())
890 Collect(ExtraDeductions.pop_back_val());
892 return NumNamedPacks;
895 void finishConstruction(
unsigned NumNamedPacks) {
898 unsigned NumPartialPackArgs = 0;
899 std::pair<unsigned, unsigned> PartialPackDepthIndex(-1u, -1u);
901 if (
auto *Partial =
Scope->getPartiallySubstitutedPack(
902 &PartialPackArgs, &NumPartialPackArgs))
908 bool IsExpanded =
true;
909 for (
unsigned I = 0; I != NumNamedPacks; ++I) {
910 if (Packs[I].Index >= Info.getNumExplicitArgs()) {
912 IsPartiallyExpanded =
false;
915 if (PartialPackDepthIndex ==
916 std::make_pair(Info.getDeducedDepth(), Packs[I].Index)) {
917 IsPartiallyExpanded =
true;
925 if (IsPartiallyExpanded)
926 PackElements += NumPartialPackArgs;
927 else if (IsExpanded && FixedNumExpansions)
928 PackElements += *FixedNumExpansions;
930 for (
auto &Pack : Packs) {
931 if (Info.PendingDeducedPacks.size() > Pack.Index)
932 Pack.Outer = Info.PendingDeducedPacks[Pack.Index];
934 Info.PendingDeducedPacks.resize(Pack.Index + 1);
935 Info.PendingDeducedPacks[Pack.Index] = &Pack;
937 if (PartialPackDepthIndex ==
938 std::make_pair(Info.getDeducedDepth(), Pack.Index)) {
939 Pack.New.append(PartialPackArgs, PartialPackArgs + NumPartialPackArgs);
948 if (!FinishingDeduction && !IsPartiallyExpanded)
949 Deduced[Pack.Index] = Pack.New[PackElements];
955 ~PackDeductionScope() {
956 for (
auto &Pack : Packs)
957 Info.PendingDeducedPacks[Pack.Index] = Pack.Outer;
961 std::optional<unsigned> getSavedPackSizeIfAllEqual()
const {
962 unsigned PackSize = Packs[0].Saved.pack_size();
964 if (std::all_of(Packs.begin() + 1, Packs.end(), [&PackSize](
const auto &
P) {
965 return P.Saved.pack_size() == PackSize;
973 bool isDeducedFromEarlierParameter()
const {
974 return DeducedFromEarlierParameter;
979 bool isPartiallyExpanded() {
return IsPartiallyExpanded; }
984 bool hasFixedArity() {
return FixedNumExpansions.has_value(); }
989 bool hasNextElement() {
990 return !FixedNumExpansions || *FixedNumExpansions > PackElements;
994 void nextPackElement() {
998 if (!FinishingDeduction) {
999 for (
auto &Pack : Packs) {
1001 if (!Pack.New.empty() || !DeducedArg.
isNull()) {
1002 while (Pack.New.size() < PackElements)
1004 if (Pack.New.size() == PackElements)
1005 Pack.New.push_back(DeducedArg);
1007 Pack.New[PackElements] = DeducedArg;
1008 DeducedArg = Pack.New.size() > PackElements + 1
1009 ? Pack.New[PackElements + 1]
1021 if (FinishingDeduction)
1022 return TemplateDeductionResult::Success;
1025 for (
auto &Pack : Packs) {
1027 if (!FinishingDeduction)
1028 Deduced[Pack.Index] = Pack.Saved;
1043 Pack.New.resize(PackElements);
1047 if (Pack.New.empty()) {
1053 std::copy(Pack.New.begin(), Pack.New.end(), ArgumentPack);
1061 Pack.New[0].wasDeducedFromArrayBound());
1067 if (Pack.Outer->DeferredDeduction.isNull()) {
1070 Pack.Outer->DeferredDeduction = NewPack;
1073 Loc = &Pack.Outer->DeferredDeduction;
1075 Loc = &Deduced[Pack.Index];
1081 S.
Context, OldPack, NewPack, DeducePackIfNotAlreadyDeduced);
1083 Info.AggregateDeductionCandidateHasMismatchedArity =
1089 if (!Result.isNull() && !Pack.DeferredDeduction.isNull()) {
1091 NewPack = Pack.DeferredDeduction;
1095 NamedDecl *Param = TemplateParams->getParam(Pack.Index);
1096 if (Result.isNull()) {
1098 Info.FirstArg = OldPack;
1099 Info.SecondArg = NewPack;
1100 return TemplateDeductionResult::Inconsistent;
1106 if (*Expansions != PackElements) {
1108 Info.FirstArg = Result;
1109 return TemplateDeductionResult::IncompletePack;
1116 return TemplateDeductionResult::Success;
1124 unsigned PackElements = 0;
1125 bool IsPartiallyExpanded =
false;
1126 bool DeducePackIfNotAlreadyDeduced =
false;
1127 bool DeducedFromEarlierParameter =
false;
1128 bool FinishingDeduction =
false;
1130 std::optional<unsigned> FixedNumExpansions;
1142 bool FinishingDeduction,
T &&DeductFunc) {
1152 = dyn_cast<PackExpansionType>(Params[
ParamIdx]);
1157 if (ArgIdx >= Args.size())
1158 return TemplateDeductionResult::MiscellaneousDeductionFailure;
1160 if (isa<PackExpansionType>(Args[ArgIdx])) {
1165 return TemplateDeductionResult::MiscellaneousDeductionFailure;
1169 DeductFunc(S, TemplateParams,
ParamIdx, ArgIdx,
1170 Params[
ParamIdx].getUnqualifiedType(),
1171 Args[ArgIdx].getUnqualifiedType(), Info, Deduced, POK);
1172 Result != TemplateDeductionResult::Success)
1187 PackDeductionScope PackScope(S, TemplateParams, Deduced, Info, Pattern,
1189 FinishingDeduction);
1193 if (
ParamIdx + 1 == Params.size() || PackScope.hasFixedArity()) {
1194 for (; ArgIdx < Args.size() && PackScope.hasNextElement(); ++ArgIdx) {
1197 S, TemplateParams,
ParamIdx, ArgIdx,
1199 Info, Deduced, POK);
1200 Result != TemplateDeductionResult::Success)
1202 PackScope.nextPackElement();
1223 if (NumExpansions && !PackScope.isPartiallyExpanded()) {
1224 for (
unsigned I = 0; I != *NumExpansions && ArgIdx < Args.size();
1226 PackScope.nextPackElement();
1232 if (
auto Result = PackScope.finish();
1233 Result != TemplateDeductionResult::Success)
1244 isa<PackExpansionType>(Args[ArgIdx]))
1245 return TemplateDeductionResult::Success;
1248 if (ArgIdx < Args.size())
1249 return TemplateDeductionResult::MiscellaneousDeductionFailure;
1251 return TemplateDeductionResult::Success;
1291 llvm::SmallBitVector *HasDeducedParam) {
1292 return ::DeduceForEachType(
1293 S, TemplateParams, Params, Args, Info, Deduced, POK,
1299 bool HasDeducedAnyParamCopy =
false;
1301 S, TemplateParams,
P, A, Info, Deduced, TDF, POK,
1302 false, &HasDeducedAnyParamCopy);
1303 if (HasDeducedAnyParam && HasDeducedAnyParamCopy)
1304 *HasDeducedAnyParam =
true;
1305 if (HasDeducedParam && HasDeducedAnyParamCopy)
1306 (*HasDeducedParam)[
ParamIdx] =
true;
1320 if (ParamQs == ArgQs)
1364 if (!Guide || !Guide->isImplicit())
1366 return Guide->getDeducedTemplate()->getTemplateParameters()->size();
1376 if (ParamRef->getPointeeType().getQualifiers())
1379 return TypeParm && TypeParm->
getIndex() >= FirstInnerIndex;
1407 bool *HasDeducedAnyParam) {
1433 bool HasDeducedAnyParam;
1435 llvm::MapVector<const CXXRecordDecl *, MatchValue> Matches;
1440 assert(
T->
isRecordType() &&
"Base class that isn't a record?");
1442 ToVisit.push_back(
T);
1451 while (!ToVisit.empty()) {
1452 QualType NextT = ToVisit.pop_back_val();
1457 bool HasDeducedAnyParamCopy =
false;
1460 &HasDeducedAnyParamCopy);
1466 Matches.insert({RD, {DeducedCopy, HasDeducedAnyParamCopy}});
1477 if (Matches.size() > 1) {
1479 for (
const auto &Match : Matches)
1480 AddBases(Match.first);
1484 while (Matches.size() > 1 && !ToVisit.empty()) {
1485 const CXXRecordDecl *RD = ToVisit.pop_back_val()->getAsCXXRecordDecl();
1494 if (Matches.empty())
1496 if (Matches.size() > 1)
1499 std::swap(Matches.front().second.Deduced, Deduced);
1500 if (
bool HasDeducedAnyParamCopy = Matches.front().second.HasDeducedAnyParam;
1501 HasDeducedAnyParamCopy && HasDeducedAnyParam)
1502 *HasDeducedAnyParam = HasDeducedAnyParamCopy;
1511 return std::min(POK, PartialOrderingKind::NonCall);
1543 bool *HasDeducedAnyParam) {
1547 if (
const auto *AExp = dyn_cast<PackExpansionType>(A))
1548 A = AExp->getPattern();
1551 if (POK == PartialOrderingKind::Call) {
1629 TDF &= ~TDF_TopLevelParameterTypeList;
1632 P =
P->getPointeeType();
1649 unsigned Index = TTP->getIndex();
1664 Info.
Param = cast<TemplateTypeParmDecl>(TemplateParams->
getParam(Index));
1676 "saw template type parameter with wrong depth");
1678 "Unresolved overloaded function");
1698 Info.
Param = cast<TemplateTypeParmDecl>(TemplateParams->
getParam(Index));
1718 Info.
Param = cast<TemplateTypeParmDecl>(TemplateParams->
getParam(Index));
1725 if (HasDeducedAnyParam)
1726 *HasDeducedAnyParam =
true;
1766 if (!
P->isDependentType()) {
1782 switch (
P.getCanonicalType()->getTypeClass()) {
1784#define NON_CANONICAL_TYPE(Class, Base) \
1785 case Type::Class: llvm_unreachable("deducing non-canonical type: " #Class);
1786#define TYPE(Class, Base)
1787#include "clang/AST/TypeNodes.inc"
1789 case Type::TemplateTypeParm:
1790 case Type::SubstTemplateTypeParmPack:
1791 llvm_unreachable(
"Type nodes handled above");
1799 if (
P->isDependentType())
1803 case Type::VariableArray:
1805 case Type::FunctionNoProto:
1808 case Type::ObjCObject:
1809 case Type::ObjCInterface:
1810 case Type::ObjCObjectPointer:
1820 case Type::Complex: {
1825 S, TemplateParams, CP->getElementType(), CA->getElementType(), Info,
1827 false, HasDeducedAnyParam);
1831 case Type::Atomic: {
1836 S, TemplateParams, PA->getValueType(), AA->getValueType(), Info,
1838 false, HasDeducedAnyParam);
1842 case Type::Pointer: {
1853 PointeeType, Info, Deduced,
1856 false, HasDeducedAnyParam);
1860 case Type::LValueReference: {
1867 S, TemplateParams, RP->getPointeeType(), RA->getPointeeType(), Info,
1869 false, HasDeducedAnyParam);
1873 case Type::RValueReference: {
1880 S, TemplateParams, RP->getPointeeType(), RA->getPointeeType(), Info,
1882 false, HasDeducedAnyParam);
1886 case Type::IncompleteArray: {
1892 assert(IAP &&
"Template parameter not of incomplete array type");
1895 S, TemplateParams, IAP->getElementType(), IAA->getElementType(), Info,
1898 false, HasDeducedAnyParam);
1902 case Type::ConstantArray: {
1906 if (!CAA || CAA->getSize() != CAP->getSize())
1910 S, TemplateParams, CAP->getElementType(), CAA->getElementType(), Info,
1913 false, HasDeducedAnyParam);
1917 case Type::DependentSizedArray: {
1926 S, TemplateParams, DAP->getElementType(), AA->getElementType(),
1929 false, HasDeducedAnyParam);
1942 "saw non-type template parameter with wrong depth");
1943 if (
const auto *CAA = dyn_cast<ConstantArrayType>(AA)) {
1944 llvm::APSInt Size(CAA->getSize());
1947 true, Info, POK != PartialOrderingKind::None,
1948 Deduced, HasDeducedAnyParam);
1950 if (
const auto *DAA = dyn_cast<DependentSizedArrayType>(AA))
1951 if (DAA->getSizeExpr())
1953 S, TemplateParams, NTTP, DAA->getSizeExpr(), Info,
1954 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
1963 case Type::FunctionProto: {
1969 if (FPP->getMethodQuals() != FPA->getMethodQuals() ||
1970 FPP->getRefQualifier() != FPA->getRefQualifier() ||
1971 FPP->isVariadic() != FPA->isVariadic())
1976 S, TemplateParams, FPP->getReturnType(), FPA->getReturnType(),
1978 false, HasDeducedAnyParam);
1984 S, TemplateParams, FPP->param_types(), FPA->param_types(), Info,
1997 Expr *NoexceptExpr = FPP->getNoexceptExpr();
2002 "saw non-type template parameter with wrong depth");
2004 llvm::APSInt Noexcept(1);
2005 switch (FPA->canThrow()) {
2016 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2019 if (
Expr *ArgNoexceptExpr = FPA->getNoexceptExpr())
2021 S, TemplateParams, NTTP, ArgNoexceptExpr, Info,
2022 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2035 case Type::InjectedClassName:
2044 case Type::TemplateSpecialization: {
2049 POK != PartialOrderingKind::None,
2050 Deduced, HasDeducedAnyParam);
2056 S, TemplateParams,
P, A, Info, POK != PartialOrderingKind::None,
2057 Deduced, HasDeducedAnyParam);
2072 Deduced = DeducedOrig;
2076 POK != PartialOrderingKind::None,
2077 Deduced, HasDeducedAnyParam);
2091 case Type::MemberPointer: {
2108 S, TemplateParams, PPT, APT, Info, Deduced, SubTDF,
2110 false, HasDeducedAnyParam);
2114 S, TemplateParams,
QualType(MPP->getClass(), 0),
2115 QualType(MPA->getClass(), 0), Info, Deduced, SubTDF,
2117 false, HasDeducedAnyParam);
2125 case Type::BlockPointer: {
2131 S, TemplateParams, BPP->getPointeeType(), BPA->getPointeeType(), Info,
2133 false, HasDeducedAnyParam);
2139 case Type::ExtVector: {
2144 if (VP->getNumElements() != VA->getNumElements())
2146 ElementType = VA->getElementType();
2151 ElementType = VA->getElementType();
2157 S, TemplateParams, VP->getElementType(), ElementType, Info, Deduced,
2159 false, HasDeducedAnyParam);
2162 case Type::DependentVector: {
2168 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2170 false, HasDeducedAnyParam);
2181 ArgSize = VA->getNumElements();
2187 Info, POK != PartialOrderingKind::None, Deduced,
2188 HasDeducedAnyParam);
2194 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2196 false, HasDeducedAnyParam);
2207 S, TemplateParams, NTTP, VA->getSizeExpr(), Info,
2208 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2217 case Type::DependentSizedExtVector: {
2223 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2225 false, HasDeducedAnyParam);
2236 ArgSize = VA->getNumElements();
2241 S, TemplateParams, NTTP, ArgSize, S.
Context.
IntTy,
true, Info,
2242 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2248 S, TemplateParams, VP->getElementType(), VA->getElementType(),
2250 false, HasDeducedAnyParam);
2261 S, TemplateParams, NTTP, VA->getSizeExpr(), Info,
2262 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2272 case Type::ConstantMatrix: {
2279 if (MP->getNumRows() != MA->getNumRows() ||
2280 MP->getNumColumns() != MA->getNumColumns()) {
2285 S, TemplateParams, MP->getElementType(), MA->getElementType(), Info,
2287 false, HasDeducedAnyParam);
2290 case Type::DependentSizedMatrix: {
2300 false, HasDeducedAnyParam);
2305 auto DeduceMatrixArg =
2306 [&S, &Info, &Deduced, &TemplateParams, &HasDeducedAnyParam, POK](
2310 const auto *ACM = dyn_cast<ConstantMatrixType>(A);
2311 const auto *ADM = dyn_cast<DependentSizedMatrixType>(A);
2312 if (!ParamExpr->isValueDependent()) {
2313 std::optional<llvm::APSInt> ParamConst =
2314 ParamExpr->getIntegerConstantExpr(S.
Context);
2319 if ((ACM->*GetArgDimension)() == *ParamConst)
2324 Expr *ArgExpr = (ADM->*GetArgDimensionExpr)();
2325 if (std::optional<llvm::APSInt> ArgConst =
2327 if (*ArgConst == *ParamConst)
2338 llvm::APSInt ArgConst(
2340 ArgConst = (ACM->*GetArgDimension)();
2343 true, Info, POK != PartialOrderingKind::None,
2344 Deduced, HasDeducedAnyParam);
2348 S, TemplateParams, NTTP, (ADM->*GetArgDimensionExpr)(), Info,
2349 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2352 if (
auto Result = DeduceMatrixArg(MP->getRowExpr(), MA,
2358 return DeduceMatrixArg(MP->getColumnExpr(), MA,
2366 case Type::DependentAddressSpace: {
2372 S, TemplateParams, ASP->getPointeeType(), ASA->getPointeeType(),
2374 false, HasDeducedAnyParam);
2385 S, TemplateParams, NTTP, ASA->getAddrSpaceExpr(), Info,
2386 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2396 S, TemplateParams, ASP->getPointeeType(),
2399 false, HasDeducedAnyParam);
2410 S, TemplateParams, NTTP, ArgAddressSpace, S.
Context.
IntTy,
true,
2411 Info, POK != PartialOrderingKind::None, Deduced,
2412 HasDeducedAnyParam);
2417 case Type::DependentBitInt: {
2421 if (IP->isUnsigned() != IA->isUnsigned())
2430 ArgSize = IA->getNumBits();
2433 S, TemplateParams, NTTP, ArgSize, S.
Context.
IntTy,
true, Info,
2434 POK != PartialOrderingKind::None, Deduced, HasDeducedAnyParam);
2438 if (IP->isUnsigned() != IA->isUnsigned())
2446 case Type::TypeOfExpr:
2448 case Type::DependentName:
2449 case Type::UnresolvedUsing:
2450 case Type::Decltype:
2451 case Type::UnaryTransform:
2452 case Type::DeducedTemplateSpecialization:
2453 case Type::DependentTemplateSpecialization:
2454 case Type::PackExpansion:
2456 case Type::ArrayParameter:
2457 case Type::HLSLAttributedResource:
2461 case Type::PackIndexing: {
2467 false, HasDeducedAnyParam);
2473 llvm_unreachable(
"Invalid Type Class!");
2481 bool *HasDeducedAnyParam) {
2488 switch (
P.getKind()) {
2490 llvm_unreachable(
"Null template argument in parameter list");
2495 S, TemplateParams,
P.getAsType(), A.
getAsType(), Info, Deduced, 0,
2497 : PartialOrderingKind::None,
2498 false, HasDeducedAnyParam);
2510 HasDeducedAnyParam);
2516 llvm_unreachable(
"caller should handle pack expansions");
2564 HasDeducedAnyParam);
2569 Deduced, HasDeducedAnyParam);
2585 llvm_unreachable(
"Unknown template argument kind");
2591 llvm_unreachable(
"Argument packs should be expanded by the caller!");
2594 llvm_unreachable(
"Invalid TemplateArgument Kind!");
2607 if (ArgIdx == Args.size())
2614 assert(ArgIdx == Args.size() - 1 &&
"Pack not at the end of argument list?");
2617 return ArgIdx < Args.size();
2623 bool FoundPackExpansion =
false;
2624 for (
const auto &A : Args) {
2625 if (FoundPackExpansion)
2633 if (A.isPackExpansion())
2634 FoundPackExpansion =
true;
2648 if (
PackFold == PackFold::ArgumentToParameter)
2664 if (!
P.isPackExpansion()) {
2669 return NumberOfArgumentsMustMatch
2676 if (As[ArgIdx].isPackExpansion())
2681 if (
PackFold == PackFold::ArgumentToParameter)
2685 HasDeducedAnyParam);
2704 PackDeductionScope PackScope(S, TemplateParams, Deduced, Info, Pattern);
2710 PackScope.hasNextElement();
2713 if (
PackFold == PackFold::ArgumentToParameter)
2718 HasDeducedAnyParam);
2722 PackScope.nextPackElement();
2727 if (
auto Result = PackScope.finish();
2739 bool NumberOfArgumentsMustMatch) {
2740 return ::DeduceTemplateArguments(
2741 *
this, TemplateParams, Ps, As, Info, Deduced, NumberOfArgumentsMustMatch,
2742 false, PackFold::ParameterToArgument,
2751 bool PackExpansionMatchesPack =
false) {
2754 if (PackExpansionMatchesPack &&
X.isPackExpansion() && !Y.
isPackExpansion())
2755 X =
X.getPackExpansionPattern();
2760 switch (
X.getKind()) {
2762 llvm_unreachable(
"Comparing NULL template argument");
2785 return X.structurallyEquals(Y);
2788 llvm::FoldingSetNodeID XID, YID;
2789 X.getAsExpr()->Profile(XID, Context,
true);
2795 unsigned PackIterationSize =
X.pack_size();
2804 bool XHasMoreArg =
X.pack_size() > Y.
pack_size();
2805 if (!(XHasMoreArg &&
X.pack_elements().back().isPackExpansion()) &&
2806 !(!XHasMoreArg && Y.
pack_elements().back().isPackExpansion()))
2815 for (
unsigned i = 0; i < PackIterationSize; ++i)
2817 PackExpansionMatchesPack))
2823 llvm_unreachable(
"Invalid TemplateArgument Kind!");
2832 llvm_unreachable(
"Can't get a NULL template argument here");
2867 Builder.MakeTrivial(
Context, DTN->getQualifier(),
Loc);
2870 Builder.MakeTrivial(
Context, QTN->getQualifier(),
Loc);
2887 llvm_unreachable(
"Invalid TemplateArgument Kind!");
2905 unsigned ArgumentPackIndex) {
2927 CanonicalPackedArgsBuilder;
2935 "deduced nested pack");
2942 diag::err_template_arg_deduced_incomplete_pack)
2946 if (ConvertArg(InnerArg, SugaredPackedArgsBuilder.size()))
2950 SugaredPackedArgsBuilder.push_back(SugaredOutput.pop_back_val());
2951 CanonicalPackedArgsBuilder.push_back(CanonicalOutput.pop_back_val());
2956 if (SugaredPackedArgsBuilder.empty()) {
2961 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2963 NTTP, SugaredOutput,
2966 S.
SubstType(NTTP->getType(), Args, NTTP->getLocation(),
2967 NTTP->getDeclName()).isNull())
2969 }
else if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2980 SugaredOutput.push_back(
2983 S.
Context, CanonicalPackedArgsBuilder));
2987 return ConvertArg(Arg, 0);
2997template <
typename TemplateDeclT>
2999 Sema &S, TemplateDeclT *Template,
bool IsDeduced,
3005 unsigned NumAlreadyConverted = 0,
bool *IsIncomplete =
nullptr) {
3008 for (
unsigned I = 0, N = TemplateParams->
size(); I != N; ++I) {
3017 PackDeductionScope(S, TemplateParams, Deduced, Info, I).finish();
3022 if (!Deduced[I].isNull()) {
3023 if (I < NumAlreadyConverted) {
3028 CurrentInstantiationScope->getPartiallySubstitutedPack() == Param) {
3031 CurrentInstantiationScope->ResetPartiallySubstitutedPack();
3038 SugaredBuilder.push_back(Deduced[I]);
3039 CanonicalBuilder.push_back(
3048 IsDeduced, SugaredBuilder,
3049 CanonicalBuilder)) {
3067 *IsIncomplete =
true;
3068 SugaredBuilder.push_back({});
3069 CanonicalBuilder.push_back({});
3074 bool HasDefaultArg =
false;
3077 assert(isa<ClassTemplatePartialSpecializationDecl>(Template) ||
3078 isa<VarTemplatePartialSpecializationDecl>(Template));
3087 if (Rec->isLambda())
3088 if (
auto *Method = dyn_cast<CXXMethodDecl>(Rec->getDeclContext())) {
3090 ThisTypeQuals = Method->getMethodQualifiers();
3098 SugaredBuilder, CanonicalBuilder, HasDefaultArg);
3131 if (
auto *DC = dyn_cast<DeclContext>(
D))
3137 static constexpr bool value =
false;
3141 static constexpr bool value =
true;
3145 static constexpr bool value =
true;
3147template <
typename TemplateDeclT>
3162template <
typename TemplateDeclT>
3169 Template->getAssociatedConstraints(AssociatedConstraints);
3171 std::optional<ArrayRef<TemplateArgument>> Innermost;
3175 Innermost = CanonicalDeducedArgs;
3178 Template, Template->getDeclContext(),
false, Innermost,
3202template <
typename T>
3203static std::enable_if_t<IsPartialSpecialization<T>::value,
3206 Sema &S,
T *Partial,
bool IsPartialOrdering,
3222 S, Partial, IsPartialOrdering, Deduced, Info, SugaredBuilder,
3233 Info.
reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);
3241 auto *Template = Partial->getSpecializedTemplate();
3243 Partial->getTemplateArgsAsWritten();
3254 if (
ParamIdx >= Partial->getTemplateParameters()->size())
3255 ParamIdx = Partial->getTemplateParameters()->size() - 1;
3258 Partial->getTemplateParameters()->getParam(
ParamIdx));
3260 Info.
FirstArg = (*PartialTemplArgInfo)[ArgIdx].getArgument();
3266 CanonicalConvertedInstArgs;
3268 Template, Partial->getLocation(), InstArgs, {},
false,
3269 SugaredConvertedInstArgs, CanonicalConvertedInstArgs,
3276 for (
unsigned I = 0,
E = TemplateParams->
size(); I !=
E; ++I) {
3279 IsPartialOrdering)) {
3290 if (!IsPartialOrdering) {
3292 S, Partial, SugaredBuilder, CanonicalBuilder, Info);
3321 SugaredBuilder, CanonicalBuilder,
3329 for (
unsigned I = 0,
E = TemplateParams->
size(); I !=
E; ++I) {
3345 S, Template, SugaredBuilder, CanonicalBuilder, Info);
3372 S, TD,
false, Deduced, Info, SugaredBuilder,
3381 CanonicalBuilder, Info);
3391template <
typename T>
3392static std::enable_if_t<IsPartialSpecialization<T>::value,
3397 if (Partial->isInvalidDecl())
3416 Deduced.resize(Partial->getTemplateParameters()->size());
3418 S, Partial->getTemplateParameters(),
3419 Partial->getTemplateArgs().asArray(), TemplateArgs, Info, Deduced,
3421 PackFold::ParameterToArgument,
3437 Result = ::FinishTemplateArgumentDeduction(S, Partial,
3439 TemplateArgs, Deduced, Info);
3448 return ::DeduceTemplateArguments(*
this, Partial, TemplateArgs, Info);
3454 return ::DeduceTemplateArguments(*
this, Partial, TemplateArgs, Info);
3464 if (
const auto *CTD = dyn_cast<ClassTemplateDecl>(TD)) {
3467 }
else if (
const auto *
AliasTemplate = dyn_cast<TypeAliasTemplateDecl>(TD)) {
3468 PType =
AliasTemplate->getTemplatedDecl()->getUnderlyingType();
3470 assert(
false &&
"Expected a class or alias template");
3489 return DeducedResult;
3502 Result = ::FinishTemplateArgumentDeduction(*this, TD, Deduced, Info);
3511 return Spec->getTemplateName().getAsTemplateDecl() !=
nullptr;
3537 if (ExplicitTemplateArgs.
size() == 0) {
3541 ParamTypes.push_back(
P->getType());
3571 ExplicitTemplateArgs, {},
true,
3572 SugaredBuilder, CanonicalBuilder,
3575 unsigned Index = SugaredBuilder.size();
3576 if (Index >= TemplateParams->
size())
3589 CanonicalExplicitArgumentList);
3601 unsigned PartiallySubstitutedPackIndex = -1u;
3602 if (!SugaredBuilder.empty()) {
3605 auto *Param = TemplateParams->
getParam(SugaredBuilder.size() - 1);
3609 if (!Expansions || Arg.
pack_size() < *Expansions) {
3610 PartiallySubstitutedPackIndex = SugaredBuilder.size() - 1;
3619 assert(Proto &&
"Function template does not have a prototype?");
3627 SugaredExplicitArgumentList->
asArray(),
3637 nullptr, ExtParamInfos))
3654 ThisTypeQuals = Method->getMethodQualifiers();
3668 Diag(
Function->getLocation(), diag::err_kern_type_not_void_return)
3679 nullptr, ExtParamInfos))
3703 Deduced.reserve(TemplateParams->
size());
3704 for (
unsigned I = 0, N = SugaredExplicitArgumentList->
size(); I != N; ++I) {
3706 if (I == PartiallySubstitutedPackIndex)
3709 Deduced.push_back(Arg);
3778 if (AQuals == DeducedAQuals) {
3796 bool ObjCLifetimeConversion =
false;
3800 ObjCLifetimeConversion) ||
3846 if (PD->isParameterPack()) {
3847 unsigned NumExpansions =
3849 if (Idx + NumExpansions >
ParamIdx)
3851 Idx += NumExpansions;
3859 llvm_unreachable(
"parameter index would not be produced from template");
3871 return isa<CXXConstructorDecl>(
D)
3872 ? cast<CXXConstructorDecl>(
D)->getExplicitSpecifier()
3873 : cast<CXXConversionDecl>(
D)->getExplicitSpecifier();
3876 isa<CXXConstructorDecl>(
D)
3877 ? cast<CXXConstructorDecl>(
D)->setExplicitSpecifier(ES)
3878 : cast<CXXConversionDecl>(
D)->setExplicitSpecifier(ES);
3889 S, Info.
getLocation(), FunctionTemplate, DeducedArgs,
3910 bool PartialOverloading, llvm::function_ref<
bool()> CheckNonDependent) {
3930 bool IsIncomplete =
false;
3935 NumExplicitlySpecified, PartialOverloading ? &IsIncomplete :
nullptr);
3944 Info.
reset(SugaredDeducedArgumentList, CanonicalDeducedArgumentList);
3977 if (!IsLambda && !IsIncomplete) {
3998 if (CheckNonDependent())
4015 CanonicalDeducedArgumentList &&
4035 if (IsLambda && !IsIncomplete) {
4051 if (isa<CXXConstructorDecl, CXXConversionDecl>(
Specialization)) {
4060 if (OriginalCallArgs) {
4065 llvm::SmallDenseMap<std::pair<unsigned, QualType>,
QualType> DeducedATypes;
4066 for (
unsigned I = 0, N = OriginalCallArgs->size(); I != N; ++I) {
4070 unsigned ExplicitOffset =
4090 if (CacheEntry.
isNull()) {
4099 DeducedA = CacheEntry;
4114 auto [Pos, Inserted] =
4128 if (S.
getLangOpts().CPlusPlus14 && Fn->getReturnType()->isUndeducedType() &&
4133 if (Method->isImplicitObjectMemberFunction()) {
4154 bool ParamWasReference,
4163 if (ParamWasReference)
4180 nullptr, FailedTSC))
4221 if (ArgType.
isNull())
continue;
4241 Deduced(TemplateParams->
size());
4244 S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF,
4245 PartialOrderingKind::None,
false,
4284 assert(Arg &&
"expected a non-null arg expression");
4286 ParamRefType !=
nullptr, FailedTSC);
4294 assert(Arg &&
"expected a non-null arg expression");
4349 (isa<PointerType>(ParamType) &&
4368 bool DecomposedParam,
unsigned ArgIdx,
unsigned TDF,
4393 ElTy = ArrTy->getElementType();
4403 if (isa<DesignatedInitExpr>(
E))
4410 S, TemplateParams, 0, ElTy,
E->
getType(),
4412 OriginalCallArgs,
true, ArgIdx, TDF);
4420 if (
auto *DependentArrTy = dyn_cast_or_null<DependentSizedArrayType>(ArrTy)) {
4431 S, TemplateParams, NTTP, llvm::APSInt(Size),
T,
4432 true, Info,
false, Deduced,
4451 bool DecomposedParam,
unsigned ArgIdx,
unsigned TDF,
4454 QualType OrigParamType = ParamType;
4459 S, TemplateParams, FirstInnerIndex, ParamType, ArgType,
4460 ArgClassification, Arg, TDF, FailedTSC))
4464 if (
InitListExpr *ILE = dyn_cast_if_present<InitListExpr>(Arg))
4466 Deduced, OriginalCallArgs, ArgIdx, TDF);
4474 OriginalCallArgs.push_back(
4477 S, TemplateParams, ParamType, ArgType, Info, Deduced, TDF,
4478 PartialOrderingKind::None,
false,
4486 bool PartialOverloading,
bool AggregateDeductionCandidate,
4493 unsigned NumParams =
Function->getNumParams();
4494 bool HasExplicitObject =
false;
4495 int ExplicitObjectOffset = 0;
4496 if (
Function->hasCXXExplicitFunctionObjectParameter()) {
4497 HasExplicitObject =
true;
4498 ExplicitObjectOffset = 1;
4507 if (Args.size() <
Function->getMinRequiredExplicitArguments() &&
4508 !PartialOverloading)
4511 PartialOverloading)) {
4513 if (Proto->isTemplateVariadic())
4515 else if (!Proto->isVariadic())
4526 unsigned NumExplicitlySpecified = 0;
4527 if (ExplicitTemplateArgs) {
4530 Result = SubstituteExplicitTemplateArguments(
4531 FunctionTemplate, *ExplicitTemplateArgs, Deduced, ParamTypes, nullptr,
4537 NumExplicitlySpecified = Deduced.size();
4540 for (
unsigned I = 0; I != NumParams; ++I)
4541 ParamTypes.push_back(
Function->getParamDecl(I)->getType());
4547 auto DeduceCallArgument = [&](
QualType ParamType,
unsigned ArgIdx,
4548 bool ExplicitObjectArgument) {
4556 if (ExplicitObjectArgument) {
4559 *
this, TemplateParams, FirstInnerIndex, ParamType, ObjectType,
4560 ObjectClassification,
4561 nullptr, Info, Deduced, OriginalCallArgs,
4567 *
this, TemplateParams, FirstInnerIndex, ParamType,
4568 Args[ArgIdx]->getType(), Args[ArgIdx]->Classify(
getASTContext()),
4569 Args[ArgIdx], Info, Deduced, OriginalCallArgs,
false,
4574 Deduced.resize(TemplateParams->
size());
4576 for (
unsigned ParamIdx = 0, NumParamTypes = ParamTypes.size(), ArgIdx = 0;
4581 dyn_cast<PackExpansionType>(ParamType);
4582 if (!ParamExpansion) {
4584 if (ArgIdx >= Args.size() && !(HasExplicitObject &&
ParamIdx == 0))
4587 ParamTypesForArgChecking.push_back(ParamType);
4589 if (
ParamIdx == 0 && HasExplicitObject) {
4593 if (
auto Result = DeduceCallArgument(ParamType, 0,
4600 if (
auto Result = DeduceCallArgument(ParamType, ArgIdx++,
4608 bool IsTrailingPack =
ParamIdx + 1 == NumParamTypes;
4611 PackDeductionScope PackScope(*
this, TemplateParams, Deduced, Info,
4613 AggregateDeductionCandidate && IsTrailingPack);
4631 if (IsTrailingPack || PackScope.hasFixedArity()) {
4632 for (; ArgIdx < Args.size() && PackScope.hasNextElement();
4633 PackScope.nextPackElement(), ++ArgIdx) {
4634 ParamTypesForArgChecking.push_back(ParamPattern);
4635 if (
auto Result = DeduceCallArgument(ParamPattern, ArgIdx,
4644 std::optional<unsigned> NumExpansions =
4646 if (NumExpansions && !PackScope.isPartiallyExpanded()) {
4647 for (
unsigned I = 0; I != *NumExpansions && ArgIdx < Args.size();
4649 ParamTypesForArgChecking.push_back(ParamPattern);
4652 PackScope.nextPackElement();
4654 }
else if (!IsTrailingPack && !PackScope.isPartiallyExpanded() &&
4655 PackScope.isDeducedFromEarlierParameter()) {
4668 std::optional<unsigned> ArgPosAfterSubstitution =
4669 PackScope.getSavedPackSizeIfAllEqual();
4670 if (!ArgPosAfterSubstitution)
4673 unsigned PackArgEnd = ArgIdx + *ArgPosAfterSubstitution;
4674 for (; ArgIdx < PackArgEnd && ArgIdx < Args.size(); ArgIdx++) {
4675 ParamTypesForArgChecking.push_back(ParamPattern);
4677 DeduceCallArgument(ParamPattern, ArgIdx,
4682 PackScope.nextPackElement();
4689 if (
auto Result = PackScope.finish();
4700 Result = FinishTemplateArgumentDeduction(
4701 FunctionTemplate, Deduced, NumExplicitlySpecified, Specialization, Info,
4702 &OriginalCallArgs, PartialOverloading, [&, CallingCtx]() {
4703 ContextRAII SavedContext(*this, CallingCtx);
4704 return CheckNonDependent(ParamTypesForArgChecking);
4712 bool AdjustExceptionSpec) {
4713 if (ArgFunctionType.
isNull())
4714 return ArgFunctionType;
4719 bool Rebuild =
false;
4722 if (EPI.ExtInfo.getCC() != CC) {
4723 EPI.
ExtInfo = EPI.ExtInfo.withCallingConv(CC);
4727 bool NoReturn = FunctionTypeP->getNoReturnAttr();
4728 if (EPI.ExtInfo.getNoReturn() != NoReturn) {
4729 EPI.ExtInfo = EPI.ExtInfo.withNoReturn(NoReturn);
4733 if (AdjustExceptionSpec && (FunctionTypeP->hasExceptionSpec() ||
4735 EPI.ExceptionSpec = FunctionTypeP->getExtProtoInfo().ExceptionSpec;
4740 return ArgFunctionType;
4750 bool IsAddressOfFunction) {
4762 unsigned NumExplicitlySpecified = 0;
4764 if (ExplicitTemplateArgs) {
4767 Result = SubstituteExplicitTemplateArguments(
4768 FunctionTemplate, *ExplicitTemplateArgs, Deduced, ParamTypes,
4769 &FunctionType, Info);
4774 NumExplicitlySpecified = Deduced.size();
4780 if (!IsAddressOfFunction)
4789 Deduced.resize(TemplateParams->
size());
4793 bool HasDeducedReturnType =
false;
4795 Function->getReturnType()->getContainedAutoType()) {
4797 HasDeducedReturnType =
true;
4805 *
this, TemplateParams,
FunctionType, ArgFunctionType, Info, Deduced,
4806 TDF, PartialOrderingKind::None,
false,
4814 Result = FinishTemplateArgumentDeduction(FunctionTemplate, Deduced,
4815 NumExplicitlySpecified,
4816 Specialization, Info);
4823 if (HasDeducedReturnType && IsAddressOfFunction &&
4844 if (!IsAddressOfFunction) {
4850 if (HasDeducedReturnType) {
4859 if (!ArgFunctionType.
isNull()) {
4861 SpecializationType, ArgFunctionType)
4863 SpecializationType, ArgFunctionType)) {