36#include "llvm/Support/TimeProfiler.h"
47 return cast<CXXRecordDecl>(DC)->isLocalClass();
52template<
typename DeclT>
55 if (!OldDecl->getQualifierLoc())
58 assert((NewDecl->getFriendObjectKind() ||
59 !OldDecl->getLexicalDeclContext()->isDependentContext()) &&
60 "non-friend with qualified name defined in dependent context");
63 const_cast<DeclContext *
>(NewDecl->getFriendObjectKind()
64 ? NewDecl->getLexicalDeclContext()
65 : OldDecl->getLexicalDeclContext()));
74 NewDecl->setQualifierInfo(NewQualifierLoc);
80 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
85 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
89#include "clang/Sema/AttrTemplateInstantiate.inc"
93 const AlignedAttr *Aligned,
Decl *New,
bool IsPackExpansion) {
94 if (Aligned->isAlignmentExpr()) {
103 S.
SubstType(Aligned->getAlignmentType(), TemplateArgs,
106 Aligned->getLocation(),
107 Result->getTypeLoc().getSourceRange()))
115 const AlignedAttr *Aligned,
Decl *New) {
116 if (!Aligned->isPackExpansion()) {
122 if (Aligned->isAlignmentExpr())
128 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
131 bool Expand =
true, RetainExpansion =
false;
132 std::optional<unsigned> NumExpansions;
136 Unexpanded, TemplateArgs, Expand,
137 RetainExpansion, NumExpansions))
144 for (
unsigned I = 0; I != *NumExpansions; ++I) {
153 const AssumeAlignedAttr *Aligned,
Decl *New) {
158 Expr *
E, *OE =
nullptr;
164 if (Aligned->getOffset()) {
176 const AlignValueAttr *Aligned,
Decl *New) {
187 const AllocAlignAttr *Align,
Decl *New) {
190 llvm::APInt(64, Align->getParamIndex().getSourceIndex()),
197 const AnnotateAttr *
Attr,
Decl *New) {
203 bool HasDelayedArgs =
Attr->delayedArgs_size();
212 false, TemplateArgs, Args))
215 StringRef Str =
Attr->getAnnotation();
216 if (HasDelayedArgs) {
217 if (Args.size() < 1) {
227 ActualArgs.insert(ActualArgs.begin(), Args.begin() + 1, Args.end());
228 std::swap(Args, ActualArgs);
239 Expr *Cond =
nullptr;
253 Cond = Converted.
get();
259 S.
Diag(A->
getLocation(), diag::err_attr_cond_never_constant_expr) << A;
260 for (
const auto &
P : Diags)
261 S.
Diag(
P.first,
P.second);
271 S, TemplateArgs, EIA, EIA->getCond(), Tmpl, New);
275 Cond, EIA->getMessage()));
282 S, TemplateArgs, DIA, DIA->getCond(), Tmpl, New);
287 DIA->getDiagnosticType(), DIA->getArgDependent(), New));
294 const CUDALaunchBoundsAttr &
Attr,
Decl *New) {
304 Expr *MinBlocks =
nullptr;
305 if (
Attr.getMinBlocks()) {
312 Expr *MaxBlocks =
nullptr;
313 if (
Attr.getMaxBlocks()) {
334 const OMPDeclareSimdDeclAttr &
Attr,
Decl *New) {
336 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(New))
337 New = FTD->getTemplatedDecl();
338 auto *FD = cast<FunctionDecl>(New);
339 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
345 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
348 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
349 Local.InstantiatedLocal(
350 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
354 FD->isCXXInstanceMember());
370 if (
auto *
E =
Attr.getSimdlen())
373 if (
Attr.uniforms_size() > 0) {
374 for(
auto *
E :
Attr.uniforms()) {
378 Uniforms.push_back(Inst.
get());
382 auto AI =
Attr.alignments_begin();
383 for (
auto *
E :
Attr.aligneds()) {
387 Aligneds.push_back(Inst.
get());
391 Alignments.push_back(Inst.
get());
395 auto SI =
Attr.steps_begin();
396 for (
auto *
E :
Attr.linears()) {
400 Linears.push_back(Inst.
get());
404 Steps.push_back(Inst.
get());
407 LinModifiers.append(
Attr.modifiers_begin(),
Attr.modifiers_end());
410 Uniforms, Aligneds, Alignments, Linears, LinModifiers, Steps,
417 const OMPDeclareVariantAttr &
Attr,
Decl *New) {
419 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(New))
420 New = FTD->getTemplatedDecl();
421 auto *FD = cast<FunctionDecl>(New);
422 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
424 auto &&SubstExpr = [FD, ThisContext, &S, &TemplateArgs](
Expr *
E) {
426 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
429 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
430 Local.InstantiatedLocal(
431 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
435 FD->isCXXInstanceMember());
441 auto &&Subst = [&SubstExpr, &S](
Expr *
E) {
451 if (
Expr *
E =
Attr.getVariantFuncRef()) {
456 VariantFuncRef = Subst(
E);
462 TI = *
Attr.getTraitInfos();
465 auto SubstScoreOrConditionExpr = [&S, Subst](
Expr *&
E,
bool) {
484 std::optional<std::pair<FunctionDecl *, Expr *>> DeclVarData =
492 E = DeclVarData->second;
493 FD = DeclVarData->first;
496 if (
auto *VariantFD = dyn_cast<FunctionDecl>(VariantDRE->getDecl())) {
497 if (
auto *VariantFTD = VariantFD->getDescribedFunctionTemplate()) {
498 if (!VariantFTD->isThisDeclarationADefinition())
509 SubstFD->getType(), FD->getType(),
517 SubstFD->setInstantiationIsPending(!SubstFD->isDefined());
521 SubstFD->getLocation(),
531 for (
Expr *
E :
Attr.adjustArgsNothing()) {
535 NothingExprs.push_back(ER.
get());
537 for (
Expr *
E :
Attr.adjustArgsNeedDevicePtr()) {
541 NeedDevicePtrExprs.push_back(ER.
get());
545 AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync);
549 FD,
E, TI, NothingExprs, NeedDevicePtrExprs, AppendArgs,
SourceLocation(),
555 const AMDGPUFlatWorkGroupSizeAttr &
Attr,
Decl *New) {
578 Expr *Cond =
nullptr;
586 Cond = SubstResult.
get();
596 const AMDGPUWavesPerEUAttr &
Attr,
Decl *New) {
606 Expr *MaxExpr =
nullptr;
607 if (
auto Max =
Attr.getMax()) {
619 const AMDGPUMaxNumWorkGroupsAttr &
Attr,
Decl *New) {
645 const SYCLKernelAttr &
Attr,
Decl *New) {
655 if (
const auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
657 const auto *RD = cast<CXXRecordDecl>(
D);
663 PNA->getTypedefType()))
668 if (
const auto *BA = dyn_cast<BuiltinAttr>(A)) {
670 switch (BA->getID()) {
671 case Builtin::BIforward:
681 case Builtin::BImove:
682 case Builtin::BImove_if_noexcept:
698 const HLSLParamModifierAttr *
Attr,
Decl *New) {
708 if (
NamedDecl *ND = dyn_cast<NamedDecl>(New)) {
712 for (
const auto *TmplAttr : Tmpl->
attrs()) {
719 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
723 TmplAttr,
Context, *
this, TemplateArgs);
733 case clang::attr::CFConsumed:
735 case clang::attr::OSConsumed:
737 case clang::attr::NSConsumed:
740 llvm_unreachable(
"Wrong argument supplied");
748 for (
const auto *TmplAttr : Tmpl->
attrs()) {
753 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
754 if (Aligned && Aligned->isAlignmentDependent()) {
759 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
764 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
769 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
774 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
779 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
781 cast<FunctionDecl>(New));
785 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
787 cast<FunctionDecl>(New));
791 if (
const auto *CUDALaunchBounds =
792 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
794 *CUDALaunchBounds, New);
798 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
803 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
808 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
813 if (
const auto *AMDGPUFlatWorkGroupSize =
814 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
816 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize, New);
819 if (
const auto *AMDGPUFlatWorkGroupSize =
820 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
822 *AMDGPUFlatWorkGroupSize, New);
825 if (
const auto *AMDGPUMaxNumWorkGroups =
826 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
828 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups, New);
831 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
838 if (TmplAttr->getKind() == attr::DLLExport ||
839 TmplAttr->getKind() == attr::DLLImport) {
840 if (New->
hasAttr<DLLExportAttr>() || New->
hasAttr<DLLImportAttr>()) {
845 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
850 if (isa<NSConsumedAttr>(TmplAttr) || isa<OSConsumedAttr>(TmplAttr) ||
851 isa<CFConsumedAttr>(TmplAttr)) {
858 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
859 if (!New->
hasAttr<PointerAttr>())
864 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
865 if (!New->
hasAttr<OwnerAttr>())
870 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
875 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
876 if (!New->
hasAttr<CUDAGridConstantAttr>())
881 assert(!TmplAttr->isPackExpansion());
882 if (TmplAttr->isLateParsed() && LateAttrs) {
891 auto *ND = cast<NamedDecl>(New);
892 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
894 ND->isCXXInstanceMember());
897 *
this, TemplateArgs);
905 for (
const auto *
Attr : Pattern->
attrs()) {
906 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
907 if (!Inst->
hasAttr<StrictFPAttr>())
920 DLLExportAttr *
Attr = Ctor->
getAttr<DLLExportAttr>();
923 for (
unsigned I = 0; I != NumParams; ++I) {
934template<
typename DeclT>
950 llvm_unreachable(
"Translation units cannot be instantiated");
954 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
959 llvm_unreachable(
"pragma comment cannot be instantiated");
962Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
964 llvm_unreachable(
"pragma comment cannot be instantiated");
969 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
973 llvm_unreachable(
"GUID declaration cannot be instantiated");
976Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
978 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
981Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
983 llvm_unreachable(
"template parameter objects cannot be instantiated");
987TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *
D) {
997 llvm_unreachable(
"Namespaces cannot be instantiated");
1004 D->getNamespaceLoc(),
1007 D->getQualifierLoc(),
1008 D->getTargetNameLoc(),
1020 DI = SemaRef.
SubstType(DI, TemplateArgs,
1041 D->getIdentifier() &&
D->getIdentifier()->isStr(
"type") &&
1060 if (
const TagType *oldTagType =
D->getUnderlyingType()->getAs<
TagType>()) {
1061 TagDecl *oldTag = oldTagType->getDecl();
1131 if (getPreviousDeclForInstantiation<TypedefNameDecl>(Pattern)) {
1133 if (!
Found.empty()) {
1134 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1145 D->getDeclName(), InstParams, AliasInst);
1147 if (PrevAliasTemplate)
1152 if (!PrevAliasTemplate)
1169 D->getIdentifier());
1178 for (
auto *OldBD :
D->bindings())
1179 NewBindings.push_back(cast<BindingDecl>(VisitBindingDecl(OldBD)));
1182 auto *NewDD = cast_or_null<DecompositionDecl>(
1185 if (!NewDD || NewDD->isInvalidDecl())
1186 for (
auto *NewBD : NewBindings)
1187 NewBD->setInvalidDecl();
1197 bool InstantiatingVarTemplate,
1202 D->getTypeSourceInfo(), TemplateArgs,
D->getTypeSpecStartLoc(),
1203 D->getDeclName(),
true);
1208 SemaRef.
Diag(
D->
getLocation(), diag::err_variable_instantiates_to_function)
1209 <<
D->isStaticDataMember() << DI->
getType();
1226 DI,
D->getStorageClass());
1241 StartingScope, InstantiatingVarTemplate);
1244 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1245 RT = F->getReturnType();
1246 else if (isa<BlockDecl>(DC))
1250 llvm_unreachable(
"Unknown context type");
1282 D->getAccessSpecifierLoc(),
D->getColonLoc());
1292 DI = SemaRef.
SubstType(DI, TemplateArgs,
1295 DI =
D->getTypeSourceInfo();
1312 Expr *BitWidth =
D->getBitWidth();
1315 else if (BitWidth) {
1321 = SemaRef.
SubstExpr(BitWidth, TemplateArgs);
1326 BitWidth = InstantiatedBitWidth.
getAs<
Expr>();
1331 cast<RecordDecl>(Owner),
1335 D->getInClassInitStyle(),
1336 D->getInnerLocStart(),
1346 if (
Field->hasAttrs())
1350 Field->setInvalidDecl();
1357 if (
Parent->isAnonymousStructOrUnion() &&
1358 Parent->getRedeclContext()->isFunctionOrMethod())
1378 DI = SemaRef.
SubstType(DI, TemplateArgs,
1381 DI =
D->getTypeSourceInfo();
1419 for (
auto *PI :
D->chain()) {
1425 NamedChain[i++] = Next;
1428 QualType T = cast<FieldDecl>(NamedChain[i-1])->getType();
1431 {NamedChain, D->getChainingSize()});
1438 Owner->
addDecl(IndirectField);
1439 return IndirectField;
1451 if (
D->isUnsupportedFriend()) {
1454 if (
D->isPackExpansion()) {
1457 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
1459 bool ShouldExpand =
true;
1460 bool RetainExpansion =
false;
1461 std::optional<unsigned> NumExpansions;
1464 TemplateArgs, ShouldExpand, RetainExpansion, NumExpansions))
1467 assert(!RetainExpansion &&
1468 "should never retain an expansion for a variadic friend decl");
1472 for (
unsigned I = 0; I != *NumExpansions; I++) {
1481 TSI,
D->getFriendLoc());
1485 Decls.push_back(FD);
1508 assert(ND &&
"friend decl must be a decl or a type!");
1515 if (!NewND)
return nullptr;
1519 cast<NamedDecl>(NewND),
D->getFriendLoc());
1527 Expr *AssertExpr =
D->getAssertExpr();
1534 = SemaRef.
SubstExpr(AssertExpr, TemplateArgs);
1539 SemaRef.
SubstExpr(
D->getMessage(), TemplateArgs);
1540 if (InstantiatedMessageExpr.
isInvalid())
1545 InstantiatedMessageExpr.
get(),
D->getRParenLoc(),
D->isFailed());
1554 if (!Prev)
return nullptr;
1555 PrevDecl = cast<EnumDecl>(Prev);
1561 D->isScoped(),
D->isScopedUsingClassTag(),
D->isFixed());
1573 Enum->setIntegerTypeSourceInfo(NewTI);
1575 assert(!
D->getIntegerType()->isDependentType()
1576 &&
"Dependent type without type source info");
1577 Enum->setIntegerType(
D->getIntegerType());
1599 if (Def && Def !=
D) {
1606 SemaRef.
SubstType(TI->getType(), TemplateArgs,
1609 DefnUnderlying,
true,
Enum);
1630 Enum->startDefinition();
1641 if (
Expr *UninstValue = EC->getInitExpr()) {
1651 if (
Value.isInvalid()) {
1664 Enum->setInvalidDecl();
1671 Enum->addDecl(EnumConst);
1672 Enumerators.push_back(EnumConst);
1673 LastEnumConst = EnumConst;
1676 !
Enum->isScoped()) {
1689 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
1694 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
1726 if (!
Found.empty()) {
1727 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
1728 if (PrevClassTemplate)
1741 SS.
Adopt(QualifierLoc);
1743 if (!DC)
return nullptr;
1757 if (R.isSingleResult()) {
1759 if (PrevClassTemplate)
1763 if (!PrevClassTemplate && QualifierLoc) {
1765 << llvm::to_underlying(
D->getTemplatedDecl()->getTagKind())
1783 D->getIdentifier(), InstParams, RecordInst);
1792 if (PrevClassTemplate) {
1823 if (!PrevClassTemplate)
1846 if (!PrevClassTemplate) {
1851 D->getPartialSpecializations(PartialSpecs);
1852 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
1853 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
1854 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
1861TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
1873 = dyn_cast<ClassTemplateDecl>(
Found.front());
1874 if (!InstClassTemplate)
1885 assert(
D->getTemplatedDecl()->isStaticDataMember() &&
1886 "Only static data member templates are allowed.");
1896 VarDecl *Pattern =
D->getTemplatedDecl();
1902 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
1908 if (!VarInst)
return nullptr;
1919 if (!PrevVarTemplate)
1929 if (!PrevVarTemplate) {
1934 D->getPartialSpecializations(PartialSpecs);
1935 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
1936 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
1937 OutOfLineVarPartialSpecs.push_back(
1938 std::make_pair(Inst, PartialSpecs[I]));
1944Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
1946 assert(
D->isStaticDataMember() &&
1947 "Only static data member templates are allowed.");
1953 assert(!
Found.empty() &&
"Instantiation found nothing?");
1956 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
1980 if (
CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(
D->getTemplatedDecl()))
1985 D->getTemplatedDecl(),
1996 assert(InstTemplate &&
1997 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2004 !(isFriend && !
D->getTemplatedDecl()->isThisDeclarationADefinition()))
2015 return InstTemplate;
2024 if (!Prev)
return nullptr;
2025 PrevDecl = cast<CXXRecordDecl>(Prev);
2029 bool IsInjectedClassName =
D->isInjectedClassName();
2033 D->getLambdaDependencyKind(),
D->isGenericLambda(),
2034 D->getLambdaCaptureDefault());
2038 D->getIdentifier(), PrevDecl,
2039 IsInjectedClassName);
2041 if (IsInjectedClassName)
2057 if (!IsInjectedClassName)
2063 Record->setObjectOfFriendDecl();
2066 if (
D->isAnonymousStructOrUnion())
2067 Record->setAnonymousStructOrUnion(
true);
2069 if (
D->isLocalClass())
2090 if (
D->isCompleteDefinition() &&
D->isLocalClass()) {
2099 if (!
D->isCXXClassMember())
2105 LocalInstantiations.perform();
2110 if (IsInjectedClassName)
2111 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2129 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2135 NewFunc->getParamTypes(), NewEPI);
2150 if (FunctionTemplate)
2166 if (FunctionTemplate && !TemplateParams) {
2169 void *InsertPos =
nullptr;
2178 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2180 !(isa<Decl>(Owner) &&
2181 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2185 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(
D)) {
2187 TemplateArgs, DGuide->getExplicitSpecifier());
2188 if (InstantiatedExplicitSpecifier.
isInvalid())
2198 if (TemplateParams && TemplateParams->
size()) {
2200 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2201 if (LastParam && LastParam->isImplicit() &&
2202 LastParam->hasTypeConstraint()) {
2223 Expr *TrailingRequiresClause =
D->getTrailingRequiresClause();
2232 }
else if (isFriend && QualifierLoc) {
2234 SS.
Adopt(QualifierLoc);
2236 if (!DC)
return nullptr;
2249 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(
D)) {
2251 SemaRef.
Context, DC,
D->getInnerLocStart(),
2252 InstantiatedExplicitSpecifier, NameInfo,
T, TInfo,
2254 DGuide->getDeductionCandidateKind(), TrailingRequiresClause);
2258 SemaRef.
Context, DC,
D->getInnerLocStart(), NameInfo,
T, TInfo,
2260 D->isInlineSpecified(),
D->hasWrittenPrototype(),
D->getConstexprKind(),
2261 TrailingRequiresClause);
2262 Function->setFriendConstraintRefersToEnclosingTemplate(
2263 D->FriendConstraintRefersToEnclosingTemplate());
2271 Function->setQualifierInfo(QualifierLoc);
2285 Function->setLexicalDeclContext(LexicalDC);
2288 for (
unsigned P = 0;
P < Params.size(); ++
P)
2293 if (TrailingRequiresClause)
2294 Function->setTrailingRequiresClause(TrailingRequiresClause);
2296 if (TemplateParams) {
2315 Function->setDescribedFunctionTemplate(FunctionTemplate);
2319 if (isFriend &&
D->isThisDeclarationADefinition()) {
2321 D->getDescribedFunctionTemplate());
2323 }
else if (FunctionTemplate &&
2328 Function->setFunctionTemplateSpecialization(FunctionTemplate,
2333 if (isFriend &&
D->isThisDeclarationADefinition()) {
2338 }
else if (!isFriend) {
2349 FT->setObjectOfFriendDecl();
2355 bool IsExplicitSpecialization =
false;
2365 D->getDependentSpecializationInfo()) {
2366 assert(isFriend &&
"dependent specialization info on "
2367 "non-member non-friend function?");
2371 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2372 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2373 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2390 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2394 IsExplicitSpecialization =
true;
2396 D->getTemplateSpecializationArgsAsWritten()) {
2402 ArgsWritten->getRAngleLoc());
2412 IsExplicitSpecialization =
true;
2413 }
else if (TemplateParams || !FunctionTemplate) {
2429 if (isFriend && !QualifierLoc) {
2449 if (
Function->isLocalExternDecl()) {
2451 if (!PVD->hasDefaultArg())
2457 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
2460 { UninstExpr }, UninstExpr->
getType());
2462 PVD->setDefaultArg(ErrorResult.
get());
2468 IsExplicitSpecialization,
2469 Function->isThisDeclarationADefinition());
2475 if (isFriend && TemplateParams && FunctionTemplate->
getPreviousDecl()) {
2479 Function->isThisDeclarationADefinition()
2488 if (isFriend &&
D->isThisDeclarationADefinition() &&
Function->isUsed(
false)) {
2490 Function->getMemberSpecializationInfo()) {
2491 if (MSInfo->getPointOfInstantiation().isInvalid()) {
2493 MSInfo->setPointOfInstantiation(
Loc);
2500 if (
D->isExplicitlyDefaulted()) {
2508 (TemplateParams ? cast<NamedDecl>(FunctionTemplate) :
Function);
2527 if (FunctionTemplate && !TemplateParams) {
2533 void *InsertPos =
nullptr;
2543 if (FunctionTemplate)
2548 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2549 !(isa<Decl>(Owner) &&
2550 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2558 unsigned NumTempParamLists = 0;
2559 if (isFriend && (NumTempParamLists =
D->getNumTemplateParameterLists())) {
2560 TempParamLists.resize(NumTempParamLists);
2561 for (
unsigned I = 0; I != NumTempParamLists; ++I) {
2566 TempParamLists[I] = InstParams;
2572 const bool CouldInstantiate =
2573 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
2574 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
2578 if (CouldInstantiate ||
2582 TemplateArgs, InstantiatedExplicitSpecifier);
2584 if (InstantiatedExplicitSpecifier.isInvalid())
2596 if (cast<CXXRecordDecl>(
D->getParent())->isLambda() &&
2597 !
D->getTypeSourceInfo() &&
2598 isa<CXXConstructorDecl, CXXDestructorDecl>(
D)) {
2601 D->setTypeSourceInfo(TSI);
2610 if (TemplateParams && TemplateParams->
size()) {
2612 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2613 if (LastParam && LastParam->isImplicit() &&
2614 LastParam->hasTypeConstraint()) {
2639 SS.
Adopt(QualifierLoc);
2649 if (!DC)
return nullptr;
2653 Expr *TrailingRequiresClause =
D->getTrailingRequiresClause();
2668 InstantiatedExplicitSpecifier, Constructor->UsesFPIntrin(),
2669 Constructor->isInlineSpecified(),
false,
2671 TrailingRequiresClause);
2677 Destructor->getConstexprKind(), TrailingRequiresClause);
2686 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
2687 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
2688 Conversion->getEndLoc(), TrailingRequiresClause);
2693 D->UsesFPIntrin(),
D->isInlineSpecified(),
D->getConstexprKind(),
2703 if (TemplateParams) {
2720 TemplateParams, Method);
2727 }
else if (FunctionTemplate) {
2743 if (NumTempParamLists)
2754 for (
unsigned P = 0;
P < Params.size(); ++
P)
2755 Params[
P]->setOwningFunction(Method);
2762 RedeclarationKind::ForExternalRedeclaration);
2764 bool IsExplicitSpecialization =
false;
2769 D->getDependentSpecializationInfo()) {
2772 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2773 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2774 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2790 Method, DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2794 IsExplicitSpecialization =
true;
2796 D->getTemplateSpecializationArgsAsWritten()) {
2800 ArgsWritten->getRAngleLoc());
2811 IsExplicitSpecialization =
true;
2812 }
else if (!FunctionTemplate || TemplateParams || isFriend) {
2839 for (
unsigned P = 0;
P < Params.size(); ++
P) {
2840 if (!Params[
P]->hasDefaultArg())
2846 Expr *UninstExpr = Params[
P]->getUninstantiatedDefaultArg();
2849 { UninstExpr }, UninstExpr->
getType());
2851 Params[
P]->setDefaultArg(ErrorResult.
get());
2857 IsExplicitSpecialization,
2860 if (
D->isPureVirtual())
2870 if (FunctionTemplate)
2876 if (
D->isExplicitlyDefaulted()) {
2880 if (
D->isDeletedAsWritten())
2882 D->getDeletedMessage());
2887 if (IsExplicitSpecialization && !isFriend)
2897 if (
auto *Constructor = dyn_cast<CXXConstructorDecl>(Method)) {
2898 if (Constructor->isDefaultConstructor() ||
2899 Constructor->isCopyOrMoveConstructor())
2907 if (FunctionTemplate) {
2915 }
else if (isFriend) {
2921 Record->makeDeclVisibleInContext(Method);
2932 if (Method->
hasAttr<UsedAttr>()) {
2933 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
2936 A->getMemberSpecializationInfo())
2937 Loc = MSInfo->getPointOfInstantiation();
2938 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
2939 Loc = Spec->getPointOfInstantiation();
2965Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
2967 assert(
D->getTypeForDecl()->isTemplateTypeParmType());
2969 std::optional<unsigned> NumExpanded;
2972 if (
D->isPackExpansion() && !
D->isExpandedParameterPack()) {
2973 assert(TC->getTemplateArgsAsWritten() &&
2974 "type parameter can only be an expansion when explicit arguments "
2980 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
2986 bool RetainExpansion =
false;
2988 cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint())
2991 TC->hasExplicitTemplateArgs() ?
2992 TC->getTemplateArgsAsWritten()->getRAngleLoc() :
2993 TC->getConceptNameInfo().getEndLoc()),
2994 Unexpanded, TemplateArgs, Expand, RetainExpansion, NumExpanded))
3003 D->hasTypeConstraint(), NumExpanded);
3007 if (
auto *TC =
D->getTypeConstraint()) {
3013 EvaluateConstraints))
3017 if (
D->hasDefaultArgument() && !
D->defaultArgumentWasInherited()) {
3031Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3034 TypeLoc TL =
D->getTypeSourceInfo()->getTypeLoc();
3037 bool IsExpandedParameterPack =
false;
3042 if (
D->isExpandedParameterPack()) {
3045 ExpandedParameterPackTypes.reserve(
D->getNumExpansionTypes());
3046 ExpandedParameterPackTypesAsWritten.reserve(
D->getNumExpansionTypes());
3047 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
3049 SemaRef.
SubstType(
D->getExpansionTypeSourceInfo(I), TemplateArgs,
3059 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
3060 ExpandedParameterPackTypes.push_back(NewT);
3063 IsExpandedParameterPack =
true;
3064 DI =
D->getTypeSourceInfo();
3066 }
else if (
D->isPackExpansion()) {
3078 bool RetainExpansion =
false;
3079 std::optional<unsigned> OrigNumExpansions =
3081 std::optional<unsigned> NumExpansions = OrigNumExpansions;
3083 Pattern.getSourceRange(),
3086 Expand, RetainExpansion,
3091 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3104 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
3105 ExpandedParameterPackTypes.push_back(NewT);
3111 IsExpandedParameterPack =
true;
3112 DI =
D->getTypeSourceInfo();
3134 DI = SemaRef.
SubstType(
D->getTypeSourceInfo(), TemplateArgs,
3148 if (IsExpandedParameterPack)
3152 D->getPosition(),
D->getIdentifier(),
T, DI, ExpandedParameterPackTypes,
3153 ExpandedParameterPackTypesAsWritten);
3161 if (AutoLoc.isConstrained()) {
3163 if (IsExpandedParameterPack)
3166 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
3167 D->getPlaceholderTypeConstraint()))
3168 EllipsisLoc = Constraint->getEllipsisLoc();
3182 if (
D->hasDefaultArgument() && !
D->defaultArgumentWasInherited()) {
3201 for (
const auto &
P : *Params) {
3202 if (
P->isTemplateParameterPack())
3214TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
3221 bool IsExpandedParameterPack =
false;
3223 if (
D->isExpandedParameterPack()) {
3227 ExpandedParams.reserve(
D->getNumExpansionTemplateParameters());
3228 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
3235 ExpandedParams.push_back(Expansion);
3238 IsExpandedParameterPack =
true;
3239 InstParams = TempParams;
3240 }
else if (
D->isPackExpansion()) {
3251 bool RetainExpansion =
false;
3252 std::optional<unsigned> NumExpansions;
3257 Expand, RetainExpansion,
3262 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3268 ExpandedParams.push_back(Expansion);
3274 IsExpandedParameterPack =
true;
3275 InstParams = TempParams;
3297 if (IsExpandedParameterPack)
3301 D->getPosition(),
D->getIdentifier(),
D->wasDeclaredWithTypename(),
3302 InstParams, ExpandedParams);
3308 D->wasDeclaredWithTypename(), InstParams);
3309 if (
D->hasDefaultArgument() && !
D->defaultArgumentWasInherited()) {
3311 D->getDefaultArgument().getTemplateQualifierLoc();
3315 QualifierLoc,
D->getDefaultArgument().getArgument().getAsTemplate(),
3316 D->getDefaultArgument().getTemplateNameLoc(), TemplateArgs);
3321 D->getDefaultArgument().getTemplateQualifierLoc(),
3322 D->getDefaultArgument().getTemplateNameLoc()));
3340 D->getNamespaceKeyLocation(),
3341 D->getQualifierLoc(),
3342 D->getIdentLocation(),
3343 D->getNominatedNamespace(),
3344 D->getCommonAncestor());
3360 for (
auto *Shadow :
D->shadows()) {
3364 NamedDecl *OldTarget = Shadow->getTargetDecl();
3365 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
3366 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
3367 OldTarget = BaseShadow;
3371 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
3373 SemaRef.
Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
3376 Shadow->getLocation(), OldTarget, TemplateArgs));
3388 Shadow->getLocation(), OldPrev, TemplateArgs));
3391 nullptr, Inst, InstTarget, PrevDecl);
3394 if (isFunctionScope)
3422 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
3428 bool CheckRedeclaration = Owner->
isRecord();
3430 RedeclarationKind::ForVisibleRedeclaration);
3439 SS.
Adopt(QualifierLoc);
3440 if (CheckRedeclaration) {
3441 Prev.setHideTags(
false);
3446 D->hasTypename(), SS,
3510Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
3516template <
typename T>
3517Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
3518 T *
D,
bool InstantiatingPackElement) {
3520 if (
D->isPackExpansion() && !InstantiatingPackElement) {
3528 bool RetainExpansion =
false;
3529 std::optional<unsigned> NumExpansions;
3532 Expand, RetainExpansion, NumExpansions))
3537 assert(!RetainExpansion &&
3538 "should never need to retain an expansion for UsingPackDecl");
3544 return instantiateUnresolvedUsingDecl(
D,
true);
3555 SemaRef.
Diag(
D->getEllipsisLoc(),
3556 diag::err_using_decl_redeclaration_expansion);
3562 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3564 Decl *Slice = instantiateUnresolvedUsingDecl(
D,
true);
3571 Expansions.push_back(cast<NamedDecl>(Slice));
3590 SS.
Adopt(QualifierLoc);
3597 bool InstantiatingSlice =
D->getEllipsisLoc().isValid() &&
3602 bool IsUsingIfExists =
D->template hasAttr<UsingIfExistsAttr>();
3605 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
3607 true, IsUsingIfExists);
3616Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
3618 return instantiateUnresolvedUsingDecl(
D);
3621Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
3623 return instantiateUnresolvedUsingDecl(
D);
3626Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
3628 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
3633 for (
auto *UD :
D->expansions()) {
3636 Expansions.push_back(NewUD);
3647Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
3650 for (
auto *I :
D->varlist()) {
3652 assert(isa<DeclRefExpr>(Var) &&
"threadprivate arg is not a DeclRefExpr");
3653 Vars.push_back(Var);
3667 for (
auto *I :
D->varlist()) {
3669 assert(isa<DeclRefExpr>(Var) &&
"allocate arg is not a DeclRefExpr");
3670 Vars.push_back(Var);
3676 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
3681 NewE.
get(), AC->getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
3682 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
3687 NewE.
get(), AC->getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
3692 Clauses.push_back(IC);
3697 if (Res.
get().isNull())
3699 return Res.
get().getSingleDecl();
3704 "Requires directive cannot be instantiated within a dependent context");
3707Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
3710 const bool RequiresInstantiation =
3711 D->getType()->isDependentType() ||
3712 D->getType()->isInstantiationDependentType() ||
3713 D->getType()->containsUnexpandedParameterPack();
3715 if (RequiresInstantiation) {
3721 SubstReductionType =
D->getType();
3723 if (SubstReductionType.
isNull())
3725 Expr *Combiner =
D->getCombiner();
3727 bool IsCorrect =
true;
3729 std::pair<QualType, SourceLocation> ReductionTypes[] = {
3731 auto *PrevDeclInScope =
D->getPrevDeclInScope();
3732 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
3733 PrevDeclInScope = cast<OMPDeclareReductionDecl>(
3738 nullptr, Owner,
D->getDeclName(), ReductionTypes,
D->
getAccess(),
3740 auto *NewDRD = cast<OMPDeclareReductionDecl>(DRD.get().getSingleDecl());
3742 Expr *SubstCombiner =
nullptr;
3743 Expr *SubstInitializer =
nullptr;
3749 cast<DeclRefExpr>(
D->getCombinerIn())->getDecl(),
3750 cast<DeclRefExpr>(NewDRD->getCombinerIn())->getDecl());
3752 cast<DeclRefExpr>(
D->getCombinerOut())->getDecl(),
3753 cast<DeclRefExpr>(NewDRD->getCombinerOut())->getDecl());
3754 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
3757 SubstCombiner = SemaRef.
SubstExpr(Combiner, TemplateArgs).
get();
3767 cast<DeclRefExpr>(
D->getInitOrig())->getDecl(),
3768 cast<DeclRefExpr>(NewDRD->getInitOrig())->getDecl());
3770 cast<DeclRefExpr>(
D->getInitPriv())->getDecl(),
3771 cast<DeclRefExpr>(NewDRD->getInitPriv())->getDecl());
3776 cast<VarDecl>(cast<DeclRefExpr>(
D->getInitPriv())->getDecl());
3777 IsCorrect = IsCorrect && OldPrivParm->hasInit();
3783 NewDRD, SubstInitializer, OmpPrivParm);
3785 IsCorrect = IsCorrect && SubstCombiner &&
3788 SubstInitializer) ||
3790 !SubstInitializer));
3801 const bool RequiresInstantiation =
3802 D->getType()->isDependentType() ||
3803 D->getType()->isInstantiationDependentType() ||
3804 D->getType()->containsUnexpandedParameterPack();
3807 if (RequiresInstantiation) {
3813 SubstMapperTy =
D->getType();
3815 if (SubstMapperTy.
isNull())
3818 auto *PrevDeclInScope =
D->getPrevDeclInScope();
3819 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
3820 PrevDeclInScope = cast<OMPDeclareMapperDecl>(
3824 bool IsCorrect =
true;
3830 (*
D->clauselist_begin())->getBeginLoc());
3835 cast<DeclRefExpr>(
D->getMapperVarRef())->getDecl(),
3836 cast<DeclRefExpr>(MapperVarRef.
get())->getDecl());
3837 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
3842 auto *OldC = cast<OMPMapClause>(
C);
3844 for (
Expr *OE : OldC->varlist()) {
3850 NewVars.push_back(NE);
3858 SS.
Adopt(NewQualifierLoc);
3864 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
3865 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
3866 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
3868 Clauses.push_back(NewC);
3874 nullptr, Owner,
D->getDeclName(), SubstMapperTy,
D->
getLocation(),
3875 VN,
D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
3876 Decl *NewDMD = DG.
get().getSingleDecl();
3881Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
3883 llvm_unreachable(
"Should not be met in templates");
3893 if (Inst && !
D->getDescribedFunctionTemplate())
3903 llvm_unreachable(
"There are only CXXRecordDecls in C++");
3907TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
3914 "can only instantiate an explicit specialization "
3915 "for a member class template");
3922 if (!InstClassTemplate)
3929 D->getTemplateArgsAsWritten()) {
3930 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
3931 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
3934 TemplateArgs, InstTemplateArgs))
3943 {},
false, SugaredConverted, CanonicalConverted,
3949 void *InsertPos =
nullptr;
3958 D->getSpecializationKind(),
3978 D->isThisDeclarationADefinition()) {
3981 diag::note_previous_definition);
3989 D->
getLocation(), InstClassTemplate, CanonicalConverted, PrevDecl);
4013 if (
D->isThisDeclarationADefinition() &&
4027 assert(VarTemplate &&
4028 "A template specialization without specialized template?");
4033 if (!InstVarTemplate)
4038 D->getTemplateArgsAsWritten()) {
4039 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4040 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4043 TemplateArgs, VarTemplateArgsInfo))
4050 InstVarTemplate,
D->
getLocation(), VarTemplateArgsInfo,
4051 {},
false, SugaredConverted, CanonicalConverted,
4056 void *InsertPos =
nullptr;
4070 InstVarTemplate,
D, VarTemplateArgsInfo, CanonicalConverted, PrevDecl);
4081 SemaRef.
SubstType(
D->getTypeSourceInfo(), TemplateArgs,
4082 D->getTypeSpecStartLoc(),
D->getDeclName());
4087 SemaRef.
Diag(
D->
getLocation(), diag::err_variable_instantiates_to_function)
4088 <<
D->isStaticDataMember() << DI->
getType();
4095 VarTemplate, DI->
getType(), DI,
D->getStorageClass(), Converted);
4098 void *InsertPos =
nullptr;
4111 StartingScope,
false, PrevDecl);
4117 llvm_unreachable(
"@defs is not supported in Objective-C++");
4124 "cannot instantiate %0 yet");
4132 llvm_unreachable(
"Concept definitions cannot reside inside a template");
4135Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
4137 llvm_unreachable(
"Concept specializations cannot reside inside a template");
4147 llvm_unreachable(
"Unexpected decl");
4158 SubstD = Instantiator.Visit(D);
4173 SemaRef.
Context.
BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
4184 assert(OldLoc &&
"type of function is not a function type?");
4186 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
4187 NewLoc.
setParam(I, OldLoc.getParam(I));
4197 if (Spaceship->isInvalidDecl())
4209 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
4214 assert(Spaceship->getFriendObjectKind() &&
4215 "defaulted spaceship is neither a member nor a friend");
4225 cast<NamedDecl>(R), Spaceship->getBeginLoc());
4229 return cast_or_null<FunctionDecl>(R);
4243 unsigned N = L->
size();
4247 for (
auto &
P : *L) {
4249 Params.push_back(
D);
4269 bool EvaluateConstraints) {
4316 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
4318 false, SugaredConverted, CanonicalConverted))
4324 CanonicalConverted))
4329 void *InsertPos =
nullptr;
4344 ClassTemplate, CanonicalConverted, CanonType,
4372 diag::err_partial_spec_redeclared)
4374 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
4386 return InstPartialSpec;
4430 InstTemplateArgs, {},
4432 SugaredConverted, CanonicalConverted))
4438 CanonicalConverted))
4443 void *InsertPos =
nullptr;
4457 diag::err_variable_instantiates_to_function)
4494 diag::err_var_partial_spec_redeclared)
4497 diag::note_var_prev_partial_spec_here);
4508 LateAttrs, Owner, StartingScope);
4510 return InstPartialSpec;
4517 assert(OldTInfo &&
"substituting function without type source info");
4518 assert(Params.empty() &&
"parameter vector is non-empty at start");
4523 ThisContext = cast<CXXRecordDecl>(Owner);
4524 ThisTypeQuals = Method->getFunctionObjectParameterType().getQualifiers();
4528 OldTInfo, TemplateArgs,
D->getTypeSpecStartLoc(),
D->getDeclName(),
4529 ThisContext, ThisTypeQuals, EvaluateConstraints);
4535 if (NewTInfo != OldTInfo) {
4539 unsigned NewIdx = 0;
4540 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
4541 OldIdx != NumOldParams; ++OldIdx) {
4542 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
4548 std::optional<unsigned> NumArgumentsInExpansion;
4550 NumArgumentsInExpansion =
4553 if (!NumArgumentsInExpansion) {
4557 Params.push_back(NewParam);
4558 Scope->InstantiatedLocal(OldParam, NewParam);
4561 Scope->MakeInstantiatedLocalArgPack(OldParam);
4562 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
4564 Params.push_back(NewParam);
4565 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
4574 cast<FunctionProtoType>(OldProtoLoc.getType());
4575 for (
unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
4585 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
4588 Params.push_back(Parm);
4605 TemplateArgs, ParamTypes, &Params,
4618 for (
auto *
decl : PatternDecl->
decls()) {
4619 if (!isa<VarDecl>(
decl) || isa<ParmVarDecl>(
decl))
4625 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
4626 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
4627 return InstVD && InstVD->isLocalVarDecl() &&
4628 InstVD->getIdentifier() == II;
4634 Scope.InstantiatedLocal(VD, *it);
4635 LSI->
addCapture(cast<VarDecl>(*it),
false,
false,
4641bool Sema::addInstantiatedParametersToScope(
4645 unsigned FParamIdx = 0;
4646 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
4650 assert(FParamIdx < Function->getNumParams());
4668 Scope.InstantiatedLocal(PatternParam, FunctionParam);
4674 Scope.MakeInstantiatedLocalArgPack(PatternParam);
4675 std::optional<unsigned> NumArgumentsInExpansion =
4677 if (NumArgumentsInExpansion) {
4680 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
4693 Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
4736 false, std::nullopt,