37#include "llvm/Support/TimeProfiler.h"
48 return cast<CXXRecordDecl>(DC)->isLocalClass();
53template<
typename DeclT>
56 if (!OldDecl->getQualifierLoc())
59 assert((NewDecl->getFriendObjectKind() ||
60 !OldDecl->getLexicalDeclContext()->isDependentContext()) &&
61 "non-friend with qualified name defined in dependent context");
64 const_cast<DeclContext *
>(NewDecl->getFriendObjectKind()
65 ? NewDecl->getLexicalDeclContext()
66 : OldDecl->getLexicalDeclContext()));
75 NewDecl->setQualifierInfo(NewQualifierLoc);
81 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
86 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
90#include "clang/Sema/AttrTemplateInstantiate.inc"
94 const AlignedAttr *Aligned,
Decl *New,
bool IsPackExpansion) {
95 if (Aligned->isAlignmentExpr()) {
104 S.
SubstType(Aligned->getAlignmentType(), TemplateArgs,
107 Aligned->getLocation(),
108 Result->getTypeLoc().getSourceRange()))
116 const AlignedAttr *Aligned,
Decl *New) {
117 if (!Aligned->isPackExpansion()) {
123 if (Aligned->isAlignmentExpr())
129 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
132 bool Expand =
true, RetainExpansion =
false;
133 std::optional<unsigned> NumExpansions;
137 Unexpanded, TemplateArgs, Expand,
138 RetainExpansion, NumExpansions))
145 for (
unsigned I = 0; I != *NumExpansions; ++I) {
154 const AssumeAlignedAttr *Aligned,
Decl *New) {
159 Expr *
E, *OE =
nullptr;
165 if (Aligned->getOffset()) {
177 const AlignValueAttr *Aligned,
Decl *New) {
188 const AllocAlignAttr *Align,
Decl *New) {
191 llvm::APInt(64, Align->getParamIndex().getSourceIndex()),
198 const AnnotateAttr *
Attr,
Decl *New) {
204 bool HasDelayedArgs =
Attr->delayedArgs_size();
213 false, TemplateArgs, Args))
216 StringRef Str =
Attr->getAnnotation();
217 if (HasDelayedArgs) {
218 if (Args.size() < 1) {
228 ActualArgs.insert(ActualArgs.begin(), Args.begin() + 1, Args.end());
229 std::swap(Args, ActualArgs);
240 Expr *Cond =
nullptr;
254 Cond = Converted.
get();
260 S.
Diag(A->
getLocation(), diag::err_attr_cond_never_constant_expr) << A;
261 for (
const auto &
P : Diags)
262 S.
Diag(
P.first,
P.second);
272 S, TemplateArgs, EIA, EIA->getCond(), Tmpl, New);
276 Cond, EIA->getMessage()));
283 S, TemplateArgs, DIA, DIA->getCond(), Tmpl, New);
288 DIA->getDefaultSeverity(), DIA->getWarningGroup(),
289 DIA->getArgDependent(), New));
296 const CUDALaunchBoundsAttr &
Attr,
Decl *New) {
306 Expr *MinBlocks =
nullptr;
307 if (
Attr.getMinBlocks()) {
314 Expr *MaxBlocks =
nullptr;
315 if (
Attr.getMaxBlocks()) {
336 const OMPDeclareSimdDeclAttr &
Attr,
Decl *New) {
338 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(New))
339 New = FTD->getTemplatedDecl();
340 auto *FD = cast<FunctionDecl>(New);
341 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
347 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
350 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
351 Local.InstantiatedLocal(
352 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
356 FD->isCXXInstanceMember());
372 if (
auto *
E =
Attr.getSimdlen())
375 if (
Attr.uniforms_size() > 0) {
376 for(
auto *
E :
Attr.uniforms()) {
380 Uniforms.push_back(Inst.
get());
384 auto AI =
Attr.alignments_begin();
385 for (
auto *
E :
Attr.aligneds()) {
389 Aligneds.push_back(Inst.
get());
393 Alignments.push_back(Inst.
get());
397 auto SI =
Attr.steps_begin();
398 for (
auto *
E :
Attr.linears()) {
402 Linears.push_back(Inst.
get());
406 Steps.push_back(Inst.
get());
409 LinModifiers.append(
Attr.modifiers_begin(),
Attr.modifiers_end());
412 Uniforms, Aligneds, Alignments, Linears, LinModifiers, Steps,
419 const OMPDeclareVariantAttr &
Attr,
Decl *New) {
421 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(New))
422 New = FTD->getTemplatedDecl();
423 auto *FD = cast<FunctionDecl>(New);
424 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
426 auto &&SubstExpr = [FD, ThisContext, &S, &TemplateArgs](
Expr *
E) {
428 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
431 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
432 Local.InstantiatedLocal(
433 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
437 FD->isCXXInstanceMember());
443 auto &&Subst = [&SubstExpr, &S](
Expr *
E) {
453 if (
Expr *
E =
Attr.getVariantFuncRef()) {
458 VariantFuncRef = Subst(
E);
464 TI = *
Attr.getTraitInfos();
467 auto SubstScoreOrConditionExpr = [&S, Subst](
Expr *&
E,
bool) {
486 std::optional<std::pair<FunctionDecl *, Expr *>> DeclVarData =
494 E = DeclVarData->second;
495 FD = DeclVarData->first;
498 if (
auto *VariantFD = dyn_cast<FunctionDecl>(VariantDRE->getDecl())) {
499 if (
auto *VariantFTD = VariantFD->getDescribedFunctionTemplate()) {
500 if (!VariantFTD->isThisDeclarationADefinition())
511 SubstFD->getType(), FD->getType(),
519 SubstFD->setInstantiationIsPending(!SubstFD->isDefined());
523 SubstFD->getLocation(),
533 for (
Expr *
E :
Attr.adjustArgsNothing()) {
537 NothingExprs.push_back(ER.
get());
539 for (
Expr *
E :
Attr.adjustArgsNeedDevicePtr()) {
543 NeedDevicePtrExprs.push_back(ER.
get());
547 AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync);
551 FD,
E, TI, NothingExprs, NeedDevicePtrExprs, AppendArgs,
SourceLocation(),
557 const AMDGPUFlatWorkGroupSizeAttr &
Attr,
Decl *New) {
580 Expr *Cond =
nullptr;
588 Cond = SubstResult.
get();
598 const AMDGPUWavesPerEUAttr &
Attr,
Decl *New) {
608 Expr *MaxExpr =
nullptr;
609 if (
auto Max =
Attr.getMax()) {
621 const AMDGPUMaxNumWorkGroupsAttr &
Attr,
Decl *New) {
647 const SYCLKernelAttr &
Attr,
Decl *New) {
657 if (
const auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
659 const auto *RD = cast<CXXRecordDecl>(
D);
665 PNA->getTypedefType()))
670 if (
const auto *BA = dyn_cast<BuiltinAttr>(A)) {
672 switch (BA->getID()) {
673 case Builtin::BIforward:
683 case Builtin::BImove:
684 case Builtin::BImove_if_noexcept:
700 const HLSLParamModifierAttr *
Attr,
Decl *New) {
710 if (
NamedDecl *ND = dyn_cast<NamedDecl>(New)) {
714 for (
const auto *TmplAttr : Tmpl->
attrs()) {
721 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
725 TmplAttr,
Context, *
this, TemplateArgs);
735 case clang::attr::CFConsumed:
737 case clang::attr::OSConsumed:
739 case clang::attr::NSConsumed:
742 llvm_unreachable(
"Wrong argument supplied");
750 for (
const auto *TmplAttr : Tmpl->
attrs()) {
755 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
756 if (Aligned && Aligned->isAlignmentDependent()) {
761 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
766 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
771 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
776 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
781 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
783 cast<FunctionDecl>(New));
787 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
789 cast<FunctionDecl>(New));
793 if (
const auto *CUDALaunchBounds =
794 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
796 *CUDALaunchBounds, New);
800 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
805 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
810 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
815 if (
const auto *AMDGPUFlatWorkGroupSize =
816 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
818 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize, New);
821 if (
const auto *AMDGPUFlatWorkGroupSize =
822 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
824 *AMDGPUFlatWorkGroupSize, New);
827 if (
const auto *AMDGPUMaxNumWorkGroups =
828 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
830 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups, New);
833 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
840 if (TmplAttr->getKind() == attr::DLLExport ||
841 TmplAttr->getKind() == attr::DLLImport) {
842 if (New->
hasAttr<DLLExportAttr>() || New->
hasAttr<DLLImportAttr>()) {
847 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
852 if (isa<NSConsumedAttr>(TmplAttr) || isa<OSConsumedAttr>(TmplAttr) ||
853 isa<CFConsumedAttr>(TmplAttr)) {
860 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
861 if (!New->
hasAttr<PointerAttr>())
866 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
867 if (!New->
hasAttr<OwnerAttr>())
872 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
877 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
878 if (!New->
hasAttr<CUDAGridConstantAttr>())
883 assert(!TmplAttr->isPackExpansion());
884 if (TmplAttr->isLateParsed() && LateAttrs) {
893 auto *ND = cast<NamedDecl>(New);
894 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
896 ND->isCXXInstanceMember());
899 *
this, TemplateArgs);
907 for (
const auto *
Attr : Pattern->
attrs()) {
908 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
909 if (!Inst->
hasAttr<StrictFPAttr>())
922 DLLExportAttr *
Attr = Ctor->
getAttr<DLLExportAttr>();
925 for (
unsigned I = 0; I != NumParams; ++I) {
936template<
typename DeclT>
952 llvm_unreachable(
"Translation units cannot be instantiated");
956 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
961 llvm_unreachable(
"pragma comment cannot be instantiated");
964Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
966 llvm_unreachable(
"pragma comment cannot be instantiated");
971 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
975 llvm_unreachable(
"GUID declaration cannot be instantiated");
978Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
980 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
983Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
985 llvm_unreachable(
"template parameter objects cannot be instantiated");
989TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *
D) {
999 llvm_unreachable(
"Namespaces cannot be instantiated");
1006 D->getNamespaceLoc(),
1009 D->getQualifierLoc(),
1010 D->getTargetNameLoc(),
1022 DI = SemaRef.
SubstType(DI, TemplateArgs,
1043 D->getIdentifier() &&
D->getIdentifier()->isStr(
"type") &&
1062 if (
const TagType *oldTagType =
D->getUnderlyingType()->getAs<
TagType>()) {
1063 TagDecl *oldTag = oldTagType->getDecl();
1133 if (getPreviousDeclForInstantiation<TypedefNameDecl>(Pattern)) {
1135 if (!
Found.empty()) {
1136 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1147 D->getDeclName(), InstParams, AliasInst);
1149 if (PrevAliasTemplate)
1154 if (!PrevAliasTemplate)
1171 D->getIdentifier(),
D->getType());
1183 for (
auto *OldBD :
D->bindings()) {
1184 Expr *BindingExpr = OldBD->getBinding();
1186 dyn_cast_if_present<ResolvedUnexpandedPackExpr>(BindingExpr)) {
1187 assert(!OldResolvedPack &&
"no more than one pack is allowed");
1188 OldResolvedPack = RP;
1190 NewBindings.push_back(cast<BindingDecl>(VisitBindingDecl(OldBD)));
1194 auto *NewDD = cast_if_present<DecompositionDecl>(
1197 if (!NewDD || NewDD->isInvalidDecl())
1198 for (
auto *NewBD : NewBindings)
1199 NewBD->setInvalidDecl();
1201 if (OldResolvedPack) {
1205 auto BPack = llvm::find_if(
1207 auto *NewResolvedPack =
1208 cast<ResolvedUnexpandedPackExpr>((*BPack)->getBinding());
1209 auto OldExprs = OldResolvedPack->
getExprs();
1210 auto NewExprs = NewResolvedPack->getExprs();
1211 assert(OldExprs.size() == NewExprs.size());
1212 for (
unsigned I = 0; I < OldResolvedPack->
getNumExprs(); I++) {
1213 DeclRefExpr *OldDRE = cast<DeclRefExpr>(OldExprs[I]);
1215 DeclRefExpr *NewDRE = cast<DeclRefExpr>(NewExprs[I]);
1230 bool InstantiatingVarTemplate,
1235 D->getTypeSourceInfo(), TemplateArgs,
D->getTypeSpecStartLoc(),
1236 D->getDeclName(),
true);
1241 SemaRef.
Diag(
D->
getLocation(), diag::err_variable_instantiates_to_function)
1242 <<
D->isStaticDataMember() << DI->
getType();
1259 DI,
D->getStorageClass());
1274 StartingScope, InstantiatingVarTemplate);
1277 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1278 RT = F->getReturnType();
1279 else if (isa<BlockDecl>(DC))
1283 llvm_unreachable(
"Unknown context type");
1315 D->getAccessSpecifierLoc(),
D->getColonLoc());
1325 DI = SemaRef.
SubstType(DI, TemplateArgs,
1328 DI =
D->getTypeSourceInfo();
1345 Expr *BitWidth =
D->getBitWidth();
1348 else if (BitWidth) {
1354 = SemaRef.
SubstExpr(BitWidth, TemplateArgs);
1359 BitWidth = InstantiatedBitWidth.
getAs<
Expr>();
1364 cast<RecordDecl>(Owner),
1368 D->getInClassInitStyle(),
1369 D->getInnerLocStart(),
1379 if (
Field->hasAttrs())
1383 Field->setInvalidDecl();
1390 if (
Parent->isAnonymousStructOrUnion() &&
1391 Parent->getRedeclContext()->isFunctionOrMethod())
1411 DI = SemaRef.
SubstType(DI, TemplateArgs,
1414 DI =
D->getTypeSourceInfo();
1452 for (
auto *PI :
D->chain()) {
1458 NamedChain[i++] = Next;
1461 QualType T = cast<FieldDecl>(NamedChain[i-1])->getType();
1464 {NamedChain, D->getChainingSize()});
1471 Owner->
addDecl(IndirectField);
1472 return IndirectField;
1484 if (
D->isUnsupportedFriend()) {
1487 if (
D->isPackExpansion()) {
1490 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
1492 bool ShouldExpand =
true;
1493 bool RetainExpansion =
false;
1494 std::optional<unsigned> NumExpansions;
1497 TemplateArgs, ShouldExpand, RetainExpansion, NumExpansions))
1500 assert(!RetainExpansion &&
1501 "should never retain an expansion for a variadic friend decl");
1505 for (
unsigned I = 0; I != *NumExpansions; I++) {
1514 TSI,
D->getFriendLoc());
1518 Decls.push_back(FD);
1541 assert(ND &&
"friend decl must be a decl or a type!");
1548 if (!NewND)
return nullptr;
1552 cast<NamedDecl>(NewND),
D->getFriendLoc());
1560 Expr *AssertExpr =
D->getAssertExpr();
1567 = SemaRef.
SubstExpr(AssertExpr, TemplateArgs);
1572 SemaRef.
SubstExpr(
D->getMessage(), TemplateArgs);
1573 if (InstantiatedMessageExpr.
isInvalid())
1578 InstantiatedMessageExpr.
get(),
D->getRParenLoc(),
D->isFailed());
1587 if (!Prev)
return nullptr;
1588 PrevDecl = cast<EnumDecl>(Prev);
1594 D->isScoped(),
D->isScopedUsingClassTag(),
D->isFixed());
1606 Enum->setIntegerTypeSourceInfo(NewTI);
1616 Enum->setPromotionType(
1621 assert(!
D->getIntegerType()->isDependentType()
1622 &&
"Dependent type without type source info");
1623 Enum->setIntegerType(
D->getIntegerType());
1645 if (Def && Def !=
D) {
1652 SemaRef.
SubstType(TI->getType(), TemplateArgs,
1655 DefnUnderlying,
true,
Enum);
1670 if (PrevDecl ==
nullptr) {
1681 Enum->startDefinition();
1692 if (
Expr *UninstValue = EC->getInitExpr()) {
1702 if (
Value.isInvalid()) {
1715 Enum->setInvalidDecl();
1722 Enum->addDecl(EnumConst);
1723 Enumerators.push_back(EnumConst);
1724 LastEnumConst = EnumConst;
1727 !
Enum->isScoped()) {
1740 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
1745 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
1777 if (!
Found.empty()) {
1778 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
1779 if (PrevClassTemplate)
1792 SS.
Adopt(QualifierLoc);
1794 if (!DC)
return nullptr;
1808 if (R.isSingleResult()) {
1810 if (PrevClassTemplate)
1814 if (!PrevClassTemplate && QualifierLoc) {
1816 << llvm::to_underlying(
D->getTemplatedDecl()->getTagKind())
1834 D->getIdentifier(), InstParams, RecordInst);
1843 if (PrevClassTemplate) {
1874 if (!PrevClassTemplate)
1897 if (!PrevClassTemplate) {
1902 D->getPartialSpecializations(PartialSpecs);
1903 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
1904 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
1905 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
1912TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
1924 = dyn_cast<ClassTemplateDecl>(
Found.front());
1925 if (!InstClassTemplate)
1936 assert(
D->getTemplatedDecl()->isStaticDataMember() &&
1937 "Only static data member templates are allowed.");
1947 VarDecl *Pattern =
D->getTemplatedDecl();
1953 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
1959 if (!VarInst)
return nullptr;
1970 if (!PrevVarTemplate)
1980 if (!PrevVarTemplate) {
1985 D->getPartialSpecializations(PartialSpecs);
1986 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
1987 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
1988 OutOfLineVarPartialSpecs.push_back(
1989 std::make_pair(Inst, PartialSpecs[I]));
1995Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
1997 assert(
D->isStaticDataMember() &&
1998 "Only static data member templates are allowed.");
2004 assert(!
Found.empty() &&
"Instantiation found nothing?");
2007 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
2031 if (
CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(
D->getTemplatedDecl()))
2036 D->getTemplatedDecl(),
2047 assert(InstTemplate &&
2048 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2055 !(isFriend && !
D->getTemplatedDecl()->isThisDeclarationADefinition()))
2066 return InstTemplate;
2075 if (!Prev)
return nullptr;
2076 PrevDecl = cast<CXXRecordDecl>(Prev);
2080 bool IsInjectedClassName =
D->isInjectedClassName();
2084 D->getLambdaDependencyKind(),
D->isGenericLambda(),
2085 D->getLambdaCaptureDefault());
2089 D->getIdentifier(), PrevDecl,
2090 IsInjectedClassName);
2092 if (IsInjectedClassName)
2108 if (!IsInjectedClassName)
2114 Record->setObjectOfFriendDecl();
2117 if (
D->isAnonymousStructOrUnion())
2118 Record->setAnonymousStructOrUnion(
true);
2120 if (
D->isLocalClass())
2141 if (
D->isCompleteDefinition() &&
D->isLocalClass()) {
2150 if (!
D->isCXXClassMember())
2156 LocalInstantiations.perform();
2161 if (IsInjectedClassName)
2162 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2180 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2186 NewFunc->getParamTypes(), NewEPI);
2201 if (FunctionTemplate)
2217 if (FunctionTemplate && !TemplateParams) {
2220 void *InsertPos =
nullptr;
2229 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2231 !(isa<Decl>(Owner) &&
2232 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2236 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(
D)) {
2238 TemplateArgs, DGuide->getExplicitSpecifier());
2239 if (InstantiatedExplicitSpecifier.
isInvalid())
2249 if (TemplateParams && TemplateParams->
size()) {
2251 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2252 if (LastParam && LastParam->isImplicit() &&
2253 LastParam->hasTypeConstraint()) {
2274 Expr *TrailingRequiresClause =
D->getTrailingRequiresClause();
2283 }
else if (isFriend && QualifierLoc) {
2285 SS.
Adopt(QualifierLoc);
2287 if (!DC)
return nullptr;
2300 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(
D)) {
2302 SemaRef.
Context, DC,
D->getInnerLocStart(),
2303 InstantiatedExplicitSpecifier, NameInfo,
T, TInfo,
2305 DGuide->getDeductionCandidateKind(), TrailingRequiresClause,
2306 DGuide->getSourceDeductionGuide(),
2307 DGuide->getSourceDeductionGuideKind());
2311 SemaRef.
Context, DC,
D->getInnerLocStart(), NameInfo,
T, TInfo,
2313 D->isInlineSpecified(),
D->hasWrittenPrototype(),
D->getConstexprKind(),
2314 TrailingRequiresClause);
2315 Function->setFriendConstraintRefersToEnclosingTemplate(
2316 D->FriendConstraintRefersToEnclosingTemplate());
2324 Function->setQualifierInfo(QualifierLoc);
2338 Function->setLexicalDeclContext(LexicalDC);
2341 for (
unsigned P = 0;
P < Params.size(); ++
P)
2346 if (TrailingRequiresClause)
2347 Function->setTrailingRequiresClause(TrailingRequiresClause);
2349 if (TemplateParams) {
2368 Function->setDescribedFunctionTemplate(FunctionTemplate);
2372 if (isFriend &&
D->isThisDeclarationADefinition()) {
2374 D->getDescribedFunctionTemplate());
2376 }
else if (FunctionTemplate &&
2381 Function->setFunctionTemplateSpecialization(FunctionTemplate,
2386 if (isFriend &&
D->isThisDeclarationADefinition()) {
2391 }
else if (!isFriend) {
2402 FT->setObjectOfFriendDecl();
2408 bool IsExplicitSpecialization =
false;
2418 D->getDependentSpecializationInfo()) {
2419 assert(isFriend &&
"dependent specialization info on "
2420 "non-member non-friend function?");
2424 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2425 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2426 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2443 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2447 IsExplicitSpecialization =
true;
2449 D->getTemplateSpecializationArgsAsWritten()) {
2455 ArgsWritten->getRAngleLoc());
2465 IsExplicitSpecialization =
true;
2466 }
else if (TemplateParams || !FunctionTemplate) {
2482 if (isFriend && !QualifierLoc) {
2502 if (
Function->isLocalExternDecl()) {
2504 if (!PVD->hasDefaultArg())
2510 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
2513 { UninstExpr }, UninstExpr->
getType());
2515 PVD->setDefaultArg(ErrorResult.
get());
2521 IsExplicitSpecialization,
2522 Function->isThisDeclarationADefinition());
2528 if (isFriend && TemplateParams && FunctionTemplate->
getPreviousDecl()) {
2532 Function->isThisDeclarationADefinition()
2541 if (isFriend &&
D->isThisDeclarationADefinition() &&
Function->isUsed(
false)) {
2543 Function->getMemberSpecializationInfo()) {
2544 if (MSInfo->getPointOfInstantiation().isInvalid()) {
2546 MSInfo->setPointOfInstantiation(
Loc);
2553 if (
D->isExplicitlyDefaulted()) {
2561 (TemplateParams ? cast<NamedDecl>(FunctionTemplate) :
Function);
2580 if (FunctionTemplate && !TemplateParams) {
2586 void *InsertPos =
nullptr;
2596 if (FunctionTemplate)
2601 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2602 !(isa<Decl>(Owner) &&
2603 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2611 unsigned NumTempParamLists = 0;
2612 if (isFriend && (NumTempParamLists =
D->getNumTemplateParameterLists())) {
2613 TempParamLists.resize(NumTempParamLists);
2614 for (
unsigned I = 0; I != NumTempParamLists; ++I) {
2619 TempParamLists[I] = InstParams;
2625 const bool CouldInstantiate =
2626 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
2627 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
2631 if (CouldInstantiate ||
2635 TemplateArgs, InstantiatedExplicitSpecifier);
2637 if (InstantiatedExplicitSpecifier.isInvalid())
2650 isa<CXXConstructorDecl, CXXDestructorDecl>(
D)) {
2653 D->setTypeSourceInfo(TSI);
2662 if (TemplateParams && TemplateParams->
size()) {
2664 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2665 if (LastParam && LastParam->isImplicit() &&
2666 LastParam->hasTypeConstraint()) {
2691 SS.
Adopt(QualifierLoc);
2701 if (!DC)
return nullptr;
2705 Expr *TrailingRequiresClause =
D->getTrailingRequiresClause();
2720 InstantiatedExplicitSpecifier, Constructor->UsesFPIntrin(),
2721 Constructor->isInlineSpecified(),
false,
2723 TrailingRequiresClause);
2729 Destructor->getConstexprKind(), TrailingRequiresClause);
2738 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
2739 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
2740 Conversion->getEndLoc(), TrailingRequiresClause);
2745 D->UsesFPIntrin(),
D->isInlineSpecified(),
D->getConstexprKind(),
2755 if (TemplateParams) {
2772 TemplateParams, Method);
2779 }
else if (FunctionTemplate) {
2795 if (NumTempParamLists)
2806 for (
unsigned P = 0;
P < Params.size(); ++
P)
2807 Params[
P]->setOwningFunction(Method);
2814 RedeclarationKind::ForExternalRedeclaration);
2816 bool IsExplicitSpecialization =
false;
2821 D->getDependentSpecializationInfo()) {
2824 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2825 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2826 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2842 Method, DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2846 IsExplicitSpecialization =
true;
2848 D->getTemplateSpecializationArgsAsWritten()) {
2852 ArgsWritten->getRAngleLoc());
2863 IsExplicitSpecialization =
true;
2864 }
else if (!FunctionTemplate || TemplateParams || isFriend) {
2891 for (
unsigned P = 0;
P < Params.size(); ++
P) {
2892 if (!Params[
P]->hasDefaultArg())
2898 Expr *UninstExpr = Params[
P]->getUninstantiatedDefaultArg();
2901 { UninstExpr }, UninstExpr->
getType());
2903 Params[
P]->setDefaultArg(ErrorResult.
get());
2909 IsExplicitSpecialization,
2912 if (
D->isPureVirtual())
2922 if (FunctionTemplate)
2928 if (
D->isExplicitlyDefaulted()) {
2932 if (
D->isDeletedAsWritten())
2934 D->getDeletedMessage());
2939 if (IsExplicitSpecialization && !isFriend)
2949 if (
auto *Constructor = dyn_cast<CXXConstructorDecl>(Method)) {
2950 if (Constructor->isDefaultConstructor() ||
2951 Constructor->isCopyOrMoveConstructor())
2959 if (FunctionTemplate) {
2967 }
else if (isFriend) {
2973 Record->makeDeclVisibleInContext(Method);
2984 if (Method->
hasAttr<UsedAttr>()) {
2985 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
2988 A->getMemberSpecializationInfo())
2989 Loc = MSInfo->getPointOfInstantiation();
2990 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
2991 Loc = Spec->getPointOfInstantiation();
3017Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
3019 assert(
D->getTypeForDecl()->isTemplateTypeParmType());
3021 std::optional<unsigned> NumExpanded;
3024 if (
D->isPackExpansion() && !
D->isExpandedParameterPack()) {
3025 assert(TC->getTemplateArgsAsWritten() &&
3026 "type parameter can only be an expansion when explicit arguments "
3032 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
3038 bool RetainExpansion =
false;
3040 cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint())
3043 TC->hasExplicitTemplateArgs() ?
3044 TC->getTemplateArgsAsWritten()->getRAngleLoc() :
3045 TC->getConceptNameInfo().getEndLoc()),
3046 Unexpanded, TemplateArgs, Expand, RetainExpansion, NumExpanded))
3055 D->hasTypeConstraint(), NumExpanded);
3059 if (
auto *TC =
D->getTypeConstraint()) {
3065 EvaluateConstraints))
3069 if (
D->hasDefaultArgument() && !
D->defaultArgumentWasInherited()) {
3083Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3086 TypeLoc TL =
D->getTypeSourceInfo()->getTypeLoc();
3089 bool IsExpandedParameterPack =
false;
3094 if (
D->isExpandedParameterPack()) {
3097 ExpandedParameterPackTypes.reserve(
D->getNumExpansionTypes());
3098 ExpandedParameterPackTypesAsWritten.reserve(
D->getNumExpansionTypes());
3099 for (
unsigned I = 0, N =
D->getNumExpansionTypes(); I != N; ++I) {
3101 SemaRef.
SubstType(
D->getExpansionTypeSourceInfo(I), TemplateArgs,
3111 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
3112 ExpandedParameterPackTypes.push_back(NewT);
3115 IsExpandedParameterPack =
true;
3116 DI =
D->getTypeSourceInfo();
3118 }
else if (
D->isPackExpansion()) {
3130 bool RetainExpansion =
false;
3131 std::optional<unsigned> OrigNumExpansions =
3133 std::optional<unsigned> NumExpansions = OrigNumExpansions;
3135 Pattern.getSourceRange(),
3138 Expand, RetainExpansion,
3143 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3156 ExpandedParameterPackTypesAsWritten.push_back(NewDI);
3157 ExpandedParameterPackTypes.push_back(NewT);
3163 IsExpandedParameterPack =
true;
3164 DI =
D->getTypeSourceInfo();
3186 DI = SemaRef.
SubstType(
D->getTypeSourceInfo(), TemplateArgs,
3200 if (IsExpandedParameterPack)
3204 D->getPosition(),
D->getIdentifier(),
T, DI, ExpandedParameterPackTypes,
3205 ExpandedParameterPackTypesAsWritten);
3213 if (AutoLoc.isConstrained()) {
3215 if (IsExpandedParameterPack)
3218 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
3219 D->getPlaceholderTypeConstraint()))
3220 EllipsisLoc = Constraint->getEllipsisLoc();
3234 if (
D->hasDefaultArgument() && !
D->defaultArgumentWasInherited()) {
3253 for (
const auto &
P : *Params) {
3254 if (
P->isTemplateParameterPack())
3266TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
3273 bool IsExpandedParameterPack =
false;
3275 if (
D->isExpandedParameterPack()) {
3279 ExpandedParams.reserve(
D->getNumExpansionTemplateParameters());
3280 for (
unsigned I = 0, N =
D->getNumExpansionTemplateParameters();
3287 ExpandedParams.push_back(Expansion);
3290 IsExpandedParameterPack =
true;
3291 InstParams = TempParams;
3292 }
else if (
D->isPackExpansion()) {
3303 bool RetainExpansion =
false;
3304 std::optional<unsigned> NumExpansions;
3309 Expand, RetainExpansion,
3314 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3320 ExpandedParams.push_back(Expansion);
3326 IsExpandedParameterPack =
true;
3327 InstParams = TempParams;
3349 if (IsExpandedParameterPack)
3353 D->getPosition(),
D->getIdentifier(),
D->wasDeclaredWithTypename(),
3354 InstParams, ExpandedParams);
3360 D->wasDeclaredWithTypename(), InstParams);
3361 if (
D->hasDefaultArgument() && !
D->defaultArgumentWasInherited()) {
3363 D->getDefaultArgument().getTemplateQualifierLoc();
3367 QualifierLoc,
D->getDefaultArgument().getArgument().getAsTemplate(),
3368 D->getDefaultArgument().getTemplateNameLoc(), TemplateArgs);
3373 D->getDefaultArgument().getTemplateQualifierLoc(),
3374 D->getDefaultArgument().getTemplateNameLoc()));
3392 D->getNamespaceKeyLocation(),
3393 D->getQualifierLoc(),
3394 D->getIdentLocation(),
3395 D->getNominatedNamespace(),
3396 D->getCommonAncestor());
3412 for (
auto *Shadow :
D->shadows()) {
3416 NamedDecl *OldTarget = Shadow->getTargetDecl();
3417 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
3418 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
3419 OldTarget = BaseShadow;
3423 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
3425 SemaRef.
Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
3428 Shadow->getLocation(), OldTarget, TemplateArgs));
3440 Shadow->getLocation(), OldPrev, TemplateArgs));
3443 nullptr, Inst, InstTarget, PrevDecl);
3446 if (isFunctionScope)
3474 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
3480 bool CheckRedeclaration = Owner->
isRecord();
3482 RedeclarationKind::ForVisibleRedeclaration);
3491 SS.
Adopt(QualifierLoc);
3492 if (CheckRedeclaration) {
3493 Prev.setHideTags(
false);
3498 D->hasTypename(), SS,
3562Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
3568template <
typename T>
3569Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
3570 T *
D,
bool InstantiatingPackElement) {
3572 if (
D->isPackExpansion() && !InstantiatingPackElement) {
3580 bool RetainExpansion =
false;
3581 std::optional<unsigned> NumExpansions;
3584 Expand, RetainExpansion, NumExpansions))
3589 assert(!RetainExpansion &&
3590 "should never need to retain an expansion for UsingPackDecl");
3596 return instantiateUnresolvedUsingDecl(
D,
true);
3607 SemaRef.
Diag(
D->getEllipsisLoc(),
3608 diag::err_using_decl_redeclaration_expansion);
3614 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3616 Decl *Slice = instantiateUnresolvedUsingDecl(
D,
true);
3623 Expansions.push_back(cast<NamedDecl>(Slice));
3642 SS.
Adopt(QualifierLoc);
3649 bool InstantiatingSlice =
D->getEllipsisLoc().isValid() &&
3654 bool IsUsingIfExists =
D->template hasAttr<UsingIfExistsAttr>();
3657 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
3659 true, IsUsingIfExists);
3668Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
3670 return instantiateUnresolvedUsingDecl(
D);
3673Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
3675 return instantiateUnresolvedUsingDecl(
D);
3678Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
3680 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
3685 for (
auto *UD :
D->expansions()) {
3688 Expansions.push_back(NewUD);
3699Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
3702 for (
auto *I :
D->varlist()) {
3704 assert(isa<DeclRefExpr>(Var) &&
"threadprivate arg is not a DeclRefExpr");
3705 Vars.push_back(Var);
3719 for (
auto *I :
D->varlist()) {
3721 assert(isa<DeclRefExpr>(Var) &&
"allocate arg is not a DeclRefExpr");
3722 Vars.push_back(Var);
3728 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
3733 NewE.
get(), AC->getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
3734 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
3739 NewE.
get(), AC->getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
3744 Clauses.push_back(IC);
3749 if (Res.
get().isNull())
3751 return Res.
get().getSingleDecl();
3756 "Requires directive cannot be instantiated within a dependent context");
3759Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
3762 const bool RequiresInstantiation =
3763 D->getType()->isDependentType() ||
3764 D->getType()->isInstantiationDependentType() ||
3765 D->getType()->containsUnexpandedParameterPack();
3767 if (RequiresInstantiation) {
3773 SubstReductionType =
D->getType();
3775 if (SubstReductionType.
isNull())
3777 Expr *Combiner =
D->getCombiner();
3779 bool IsCorrect =
true;
3781 std::pair<QualType, SourceLocation> ReductionTypes[] = {
3783 auto *PrevDeclInScope =
D->getPrevDeclInScope();
3784 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
3785 PrevDeclInScope = cast<OMPDeclareReductionDecl>(
3790 nullptr, Owner,
D->getDeclName(), ReductionTypes,
D->
getAccess(),
3792 auto *NewDRD = cast<OMPDeclareReductionDecl>(DRD.get().getSingleDecl());
3794 Expr *SubstCombiner =
nullptr;
3795 Expr *SubstInitializer =
nullptr;
3801 cast<DeclRefExpr>(
D->getCombinerIn())->getDecl(),
3802 cast<DeclRefExpr>(NewDRD->getCombinerIn())->getDecl());
3804 cast<DeclRefExpr>(
D->getCombinerOut())->getDecl(),
3805 cast<DeclRefExpr>(NewDRD->getCombinerOut())->getDecl());
3806 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
3809 SubstCombiner = SemaRef.
SubstExpr(Combiner, TemplateArgs).
get();
3819 cast<DeclRefExpr>(
D->getInitOrig())->getDecl(),
3820 cast<DeclRefExpr>(NewDRD->getInitOrig())->getDecl());
3822 cast<DeclRefExpr>(
D->getInitPriv())->getDecl(),
3823 cast<DeclRefExpr>(NewDRD->getInitPriv())->getDecl());
3828 cast<VarDecl>(cast<DeclRefExpr>(
D->getInitPriv())->getDecl());
3829 IsCorrect = IsCorrect && OldPrivParm->hasInit();
3835 NewDRD, SubstInitializer, OmpPrivParm);
3837 IsCorrect = IsCorrect && SubstCombiner &&
3840 SubstInitializer) ||
3842 !SubstInitializer));
3853 const bool RequiresInstantiation =
3854 D->getType()->isDependentType() ||
3855 D->getType()->isInstantiationDependentType() ||
3856 D->getType()->containsUnexpandedParameterPack();
3859 if (RequiresInstantiation) {
3865 SubstMapperTy =
D->getType();
3867 if (SubstMapperTy.
isNull())
3870 auto *PrevDeclInScope =
D->getPrevDeclInScope();
3871 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
3872 PrevDeclInScope = cast<OMPDeclareMapperDecl>(
3876 bool IsCorrect =
true;
3882 (*
D->clauselist_begin())->getBeginLoc());
3887 cast<DeclRefExpr>(
D->getMapperVarRef())->getDecl(),
3888 cast<DeclRefExpr>(MapperVarRef.
get())->getDecl());
3889 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
3894 auto *OldC = cast<OMPMapClause>(
C);
3896 for (
Expr *OE : OldC->varlist()) {
3902 NewVars.push_back(NE);
3910 SS.
Adopt(NewQualifierLoc);
3916 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
3917 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
3918 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
3920 Clauses.push_back(NewC);
3926 nullptr, Owner,
D->getDeclName(), SubstMapperTy,
D->
getLocation(),
3927 VN,
D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
3928 Decl *NewDMD = DG.
get().getSingleDecl();
3933Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
3935 llvm_unreachable(
"Should not be met in templates");
3945 if (Inst && !
D->getDescribedFunctionTemplate())
3955 llvm_unreachable(
"There are only CXXRecordDecls in C++");
3959TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
3966 "can only instantiate an explicit specialization "
3967 "for a member class template");
3974 if (!InstClassTemplate)
3981 D->getTemplateArgsAsWritten()) {
3982 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
3983 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
3986 TemplateArgs, InstTemplateArgs))
4001 void *InsertPos =
nullptr;
4010 D->getSpecializationKind(),
4030 D->isThisDeclarationADefinition()) {
4033 diag::note_previous_definition);
4066 if (
D->isThisDeclarationADefinition() &&
4080 assert(VarTemplate &&
4081 "A template specialization without specialized template?");
4086 if (!InstVarTemplate)
4091 D->getTemplateArgsAsWritten()) {
4092 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4093 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4096 TemplateArgs, VarTemplateArgsInfo))
4103 InstVarTemplate,
D->
getLocation(), VarTemplateArgsInfo,
4109 void *InsertPos =
nullptr;
4123 VarTemplateArgsInfo,
4135 SemaRef.
SubstType(
D->getTypeSourceInfo(), TemplateArgs,
4136 D->getTypeSpecStartLoc(),
D->getDeclName());
4141 SemaRef.
Diag(
D->
getLocation(), diag::err_variable_instantiates_to_function)
4142 <<
D->isStaticDataMember() << DI->
getType();
4149 VarTemplate, DI->
getType(), DI,
D->getStorageClass(), Converted);
4152 void *InsertPos =
nullptr;
4165 StartingScope,
false, PrevDecl);
4171 llvm_unreachable(
"@defs is not supported in Objective-C++");
4178 "cannot instantiate %0 yet");
4186 llvm_unreachable(
"Concept definitions cannot reside inside a template");
4189Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
4191 llvm_unreachable(
"Concept specializations cannot reside inside a template");
4201 llvm_unreachable(
"Unexpected decl");
4212 SubstD = Instantiator.Visit(D);
4227 SemaRef.
Context.
BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
4238 assert(OldLoc &&
"type of function is not a function type?");
4240 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
4241 NewLoc.
setParam(I, OldLoc.getParam(I));
4251 if (Spaceship->isInvalidDecl())
4263 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
4268 assert(Spaceship->getFriendObjectKind() &&
4269 "defaulted spaceship is neither a member nor a friend");
4279 cast<NamedDecl>(R), Spaceship->getBeginLoc());
4283 return cast_or_null<FunctionDecl>(R);
4297 unsigned N = L->
size();
4301 for (
auto &
P : *L) {
4303 Params.push_back(
D);
4323 bool EvaluateConstraints) {
4370 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
4383 void *InsertPos =
nullptr;
4386 InstParams, InsertPos);
4426 diag::err_partial_spec_redeclared)
4428 SemaRef.
Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
4440 return InstPartialSpec;
4484 InstTemplateArgs, {},
4496 void *InsertPos =
nullptr;
4499 InstParams, InsertPos);
4510 diag::err_variable_instantiates_to_function)
4547 diag::err_var_partial_spec_redeclared)
4550 diag::note_var_prev_partial_spec_here);
4561 LateAttrs, Owner, StartingScope);
4563 return InstPartialSpec;
4570 assert(OldTInfo &&
"substituting function without type source info");
4571 assert(Params.empty() &&
"parameter vector is non-empty at start");
4576 ThisContext = cast<CXXRecordDecl>(Owner);
4577 ThisTypeQuals = Method->getFunctionObjectParameterType().getQualifiers();
4581 OldTInfo, TemplateArgs,
D->getTypeSpecStartLoc(),
D->getDeclName(),
4582 ThisContext, ThisTypeQuals, EvaluateConstraints);
4588 if (NewTInfo != OldTInfo) {
4592 unsigned NewIdx = 0;
4593 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
4594 OldIdx != NumOldParams; ++OldIdx) {
4595 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
4601 std::optional<unsigned> NumArgumentsInExpansion;
4603 NumArgumentsInExpansion =
4606 if (!NumArgumentsInExpansion) {
4610 Params.push_back(NewParam);
4611 Scope->InstantiatedLocal(OldParam, NewParam);
4614 Scope->MakeInstantiatedLocalArgPack(OldParam);
4615 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
4617 Params.push_back(NewParam);
4618 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
4627 cast<FunctionProtoType>(OldProtoLoc.getType());
4628 for (
unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
4638 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
4641 Params.push_back(Parm);
4658 TemplateArgs, ParamTypes, &Params,
4671 for (
auto *
decl : PatternDecl->
decls()) {
4672 if (!isa<VarDecl>(
decl) || isa<ParmVarDecl>(
decl))
4678 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
4679 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
4680 return InstVD && InstVD->isLocalVarDecl() &&
4681 InstVD->getIdentifier() == II;
4687 Scope.InstantiatedLocal(VD, *it);
4688 LSI->
addCapture(cast<VarDecl>(*it),
false,
false,
4694bool Sema::addInstantiatedParametersToScope(
4698 unsigned FParamIdx = 0;
4699 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
4703 assert(FParamIdx < Function->getNumParams());
4721 Scope.InstantiatedLocal(PatternParam, FunctionParam);
4727 Scope.MakeInstantiatedLocalArgPack(PatternParam);
4728 std::optional<unsigned> NumArgumentsInExpansion =
4730 if (NumArgumentsInExpansion) {
4733 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
4746 Scope.InstantiatedLocalPackArg(PatternParam, FunctionParam);
4789 false, std::nullopt,
4798 L->DefaultArgumentInstantiated(Param);
4820 Diag(PointOfInstantiation, diag::err_exception_spec_cycle) <<
Decl;
4832 false, std::nullopt,
4840 if (addInstantiatedParametersToScope(
Decl, Template,
Scope, TemplateArgs)) {
4880 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
4881 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
4882 if (isa<FunctionTemplateDecl>(ActiveInst.Entity)) {
4884 {ActiveInst.Entity->getCanonicalDecl(), ActiveInst.Kind});
4886 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
4887 ActiveInst.Entity = New;
4893 assert(Proto &&
"Function template without prototype?");
4917 assert(NewProto &&
"Template instantiation without function prototype?");
4935 LateAttrs, StartingScope);
4951 if (isa<CXXDestructorDecl>(New) && SemaRef.
getLangOpts().CPlusPlus11)
4967 Lookups.reserve(DFI->getUnqualifiedLookups().size());
4968 bool AnyChanged =
false;
4971 DA.getDecl(), TemplateArgs);
4974 AnyChanged |= (
D != DA.getDecl());
5010 bool DefinitionRequired,
5018 Function->getTemplateSpecializationKindForInstantiation();
5025 !DefinitionRequired)
5030 if (
Function->isDefined(ExistingDefn,
5044 assert(PatternDecl &&
"instantiating a non-template");
5047 Stmt *Pattern =
nullptr;
5049 Pattern = PatternDef->
getBody(PatternDef);
5050 PatternDecl = PatternDef;
5052 PatternDef =
nullptr;
5058 Function->getInstantiatedFromMemberFunction(),
5059 PatternDecl, PatternDef, TSK,
5060 DefinitionRequired)) {
5061 if (DefinitionRequired)
5064 (
Function->isConstexpr() && !Recursive)) {
5068 Function->setInstantiationIsPending(
true);
5070 std::make_pair(
Function, PointOfInstantiation));
5072 if (llvm::isTimeTraceVerbose()) {
5073 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
5075 llvm::raw_string_ostream
OS(Name);
5084 Diag(PointOfInstantiation, diag::warn_func_template_missing)
5088 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
5099 Function->setInstantiationIsPending(
true);
5101 std::make_pair(
Function, PointOfInstantiation));
5105 llvm::TimeTraceScope TimeScope(
"InstantiateFunction", [&]() {
5106 llvm::TimeTraceMetadata M;
5107 llvm::raw_string_ostream
OS(M.Detail);
5110 if (llvm::isTimeTraceVerbose()) {
5137 "missing LateParsedTemplate");
5139 Pattern = PatternDecl->
getBody(PatternDecl);
5146 "unexpected kind of function template definition");
5161 for (
auto *
D =
Function->getMostRecentDecl(); ;
5163 D->setImplicitlyInline();
5173 "instantiating function definition");
5177 Function->setVisibleDespiteOwningModule();
5192 ThisTypeQuals = Method->getMethodQualifiers();
5202 bool MergeWithParentScope =
false;
5204 MergeWithParentScope =
5205 Rec->isLocalClass() && !
Function->isFunctionTemplateSpecialization();
5208 auto RebuildTypeSourceInfoForDefaultSpecialMembers = [&]() {
5214 "Special member needs to be defaulted");
5222 auto *NewRec = dyn_cast<CXXRecordDecl>(
Function->getDeclContext());
5223 const auto *PatternRec =
5225 if (!NewRec || !PatternRec)
5227 if (!PatternRec->isLambda())
5230 struct SpecialMemberTypeInfoRebuilder
5250 getDerived().TransformDecl(TL.
getNameLoc(),
T->getDecl()));
5252 return Base::TransformRecordType(TLB, TL);
5254 QualType Result = getDerived().RebuildRecordType(NewDecl);
5255 if (Result.isNull())
5262 } IR{*
this, PatternRec, NewRec};
5265 assert(NewSI &&
"Type Transform failed?");
5267 Function->setTypeSourceInfo(NewSI);
5271 assert(NewParmSI &&
"Type transformation failed.");
5277 RebuildTypeSourceInfoForDefaultSpecialMembers();
5282 std::optional<ArrayRef<TemplateArgument>> Innermost;
5283 if (
auto *Primary =
Function->getPrimaryTemplate();
5286 Function->getTemplateSpecializationKind() !=
5288 auto It = llvm::find_if(Primary->redecls(),
5290 return cast<FunctionTemplateDecl>(RTD)
5291 ->isCompatibleWithDefinition();
5293 assert(It != Primary->redecls().end() &&
5294 "Should't get here without a definition");
5295 DC = (*It)->getLexicalDeclContext();
5296 Innermost.emplace(
Function->getTemplateSpecializationArgs()->asArray());
5299 Function, DC,
false, Innermost,
false, PatternDecl);
5317 if (addInstantiatedParametersToScope(
Function, PatternDecl,
Scope,
5334 Ctor->isDefaultConstructor()) {
5340 Body =
SubstStmt(Pattern, TemplateArgs);
5352 Listener->FunctionDefinitionInstantiated(
Function);
5362 LocalInstantiations.
perform();
5364 GlobalInstantiations.perform();
5390 bool IsMemberSpec =
false;
5392 if (
auto *PartialSpec =
5393 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar)) {
5394 assert(PartialSpecArgs);
5395 IsMemberSpec = PartialSpec->isMemberSpecialization();
5397 PartialSpec, PartialSpecArgs->
asArray(),
false);
5400 IsMemberSpec =
VarTemplate->isMemberSpecialization();
5412 return cast_or_null<VarTemplateSpecializationDecl>(
5414 VarTemplate, FromVar, TemplateArgsInfo, Converted));
5421 "don't have a definition to instantiate from");
5450 bool InstantiatingVarTemplate,
5454 bool InstantiatingVarTemplatePartialSpec =
5455 isa<VarTemplatePartialSpecializationDecl>(OldVar) &&
5456 isa<VarTemplatePartialSpecializationDecl>(NewVar);
5459 bool InstantiatingSpecFromTemplate =
5460 isa<VarTemplateSpecializationDecl>(NewVar) &&
5462 isa<VarTemplatePartialSpecializationDecl>(OldVar));
5485 if (OldVar->
isUsed(
false))
5507 }
else if (!isa<VarTemplateSpecializationDecl>(NewVar) &&
5510 }
else if (PrevDeclForVarTemplateSpecialization) {
5511 Previous.addDecl(PrevDeclForVarTemplateSpecialization);
5515 if (!InstantiatingVarTemplate) {
5533 !InstantiatingSpecFromTemplate)
5540 dyn_cast<VarTemplateSpecializationDecl>(OldVar)) {
5542 !isa<VarTemplatePartialSpecializationDecl>(OldVTSD))
5543 cast<VarTemplateSpecializationDecl>(NewVar)->setSpecializationKind(
5552 if (InstantiatingVarTemplate || InstantiatingVarTemplatePartialSpec) {
5557 }
else if (InstantiatingSpecFromTemplate ||
5579 L->VariableDefinitionInstantiated(Var);
5606 if (!
Init.isInvalid()) {
5609 if (Var->
hasAttr<DLLImportAttr>() &&
5613 }
else if (InitExpr) {
5649 bool DefinitionRequired,
bool AtEndOfTU) {
5661 assert(PatternDecl &&
"no pattern for templated variable");
5666 dyn_cast<VarTemplateSpecializationDecl>(Var);
5677 (PatternDecl = PatternDecl->
getFirstDecl())->hasInit() &&
5685 "instantiating variable initializer");
5703 PreviousContext.
pop();
5707 LocalInstantiations.
perform();
5709 GlobalInstantiations.
perform();
5713 "not a static data member?");
5722 if (!Def && !DefinitionRequired) {
5725 std::make_pair(Var, PointOfInstantiation));
5730 Diag(PointOfInstantiation, diag::warn_var_template_missing)
5734 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
5745 PatternDecl, Def, TSK,
5746 DefinitionRequired))
5763 struct PassToConsumerRAII {
5768 : Consumer(Consumer), Var(Var) { }
5770 ~PassToConsumerRAII() {
5773 } PassToConsumerRAII(
Consumer, Var);
5780 PointOfInstantiation);
5788 "instantiating variable definition");
5808 }
else if (!VarSpec) {
5837 cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf(
5848 PreviousContext.
pop();
5851 PassToConsumerRAII.Var = Var;
5858 LocalInstantiations.
perform();
5860 GlobalInstantiations.
perform();
5872 for (
const auto *
Init : Tmpl->
inits()) {
5875 if (!
Init->isWritten())
5880 if (
Init->isPackExpansion()) {
5882 TypeLoc BaseTL =
Init->getTypeSourceInfo()->getTypeLoc();
5886 bool ShouldExpand =
false;
5887 bool RetainExpansion =
false;
5888 std::optional<unsigned> NumExpansions;
5892 TemplateArgs, ShouldExpand,
5899 assert(ShouldExpand &&
"Partial instantiation of base initializer?");
5902 for (
unsigned I = 0; I != *NumExpansions; ++I) {
5916 Init->getSourceLocation(),
5925 BaseTInfo, TempInit.
get(),
5933 NewInits.push_back(NewInit.
get());
5948 if (
Init->isDelegatingInitializer() ||
Init->isBaseInitializer()) {
5951 Init->getSourceLocation(),
5959 if (
Init->isBaseInitializer())
5965 }
else if (
Init->isMemberInitializer()) {
5967 Init->getMemberLocation(),
5977 Init->getSourceLocation());
5978 }
else if (
Init->isIndirectMemberInitializer()) {
5981 Init->getMemberLocation(),
5982 Init->getIndirectMember(), TemplateArgs));
5984 if (!IndirectMember) {
5991 Init->getSourceLocation());
5998 NewInits.push_back(NewInit.
get());
6017 Instance = Instance->getCanonicalDecl();
6018 if (Pattern == Instance)
return true;
6019 Instance = Instance->getInstantiatedFromMemberTemplate();
6030 Instance = Instance->getCanonicalDecl();
6031 if (Pattern == Instance)
return true;
6032 Instance = Instance->getInstantiatedFromMemberTemplate();
6042 = cast<ClassTemplatePartialSpecializationDecl>(Pattern->
getCanonicalDecl());
6044 Instance = cast<ClassTemplatePartialSpecializationDecl>(
6045 Instance->getCanonicalDecl());
6046 if (Pattern == Instance)
6048 Instance = Instance->getInstantiatedFromMember();
6059 Instance = Instance->getCanonicalDecl();
6060 if (Pattern == Instance)
return true;
6061 Instance = Instance->getInstantiatedFromMemberClass();
6072 Instance = Instance->getCanonicalDecl();
6073 if (Pattern == Instance)
return true;
6074 Instance = Instance->getInstantiatedFromMemberFunction();
6085 Instance = Instance->getCanonicalDecl();
6086 if (Pattern == Instance)
return true;
6087 Instance = Instance->getInstantiatedFromMemberEnum();
6114 bool OtherIsPackExpansion;
6116 if (
auto *OtherUUD = dyn_cast<T>(
Other)) {
6117 OtherIsPackExpansion = OtherUUD->isPackExpansion();
6119 }
else if (
auto *OtherUPD = dyn_cast<UsingPackDecl>(
Other)) {
6120 OtherIsPackExpansion =
true;
6121 OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
6122 }
else if (
auto *OtherUD = dyn_cast<UsingDecl>(
Other)) {
6123 OtherIsPackExpansion =
false;
6128 return Pattern->isPackExpansion() == OtherIsPackExpansion &&
6134 assert(Instance->isStaticDataMember());
6139 Instance = Instance->getCanonicalDecl();
6140 if (Pattern == Instance)
return true;
6141 Instance = Instance->getInstantiatedFromStaticDataMember();
6150 if (
auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(
D))
6153 if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(
D))
6159 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
Other))
6165 if (
auto *
Enum = dyn_cast<EnumDecl>(
Other))
6168 if (
auto *Var = dyn_cast<VarDecl>(
Other))
6172 if (
auto *Temp = dyn_cast<ClassTemplateDecl>(
Other))
6175 if (
auto *Temp = dyn_cast<FunctionTemplateDecl>(
Other))
6178 if (
auto *PartialSpec =
6179 dyn_cast<ClassTemplatePartialSpecializationDecl>(
Other))
6183 if (
auto *Field = dyn_cast<FieldDecl>(
Other)) {
6184 if (!Field->getDeclName()) {
6187 cast<FieldDecl>(
D));
6191 if (
auto *Using = dyn_cast<UsingDecl>(
Other))
6194 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
Other))
6197 return D->getDeclName() &&
6198 D->getDeclName() == cast<NamedDecl>(
Other)->getDeclName();
6201template<
typename ForwardIterator>
6204 ForwardIterator first,
6205 ForwardIterator last) {
6206 for (; first != last; ++first)
6208 return cast<NamedDecl>(*first);
6215 if (
NamedDecl *
D = dyn_cast<NamedDecl>(DC)) {
6217 return cast_or_null<DeclContext>(ID);
6232 return cast<Decl>(DC)->getTemplateDepth() > Level;
6237 bool FindingInstantiatedContext) {
6259 if (isa<ParmVarDecl>(
D) && !ParentDependsOnArgs &&
6260 !cast<ParmVarDecl>(
D)->getType()->isInstantiationDependentType())
6262 if (isa<ParmVarDecl>(
D) || isa<NonTypeTemplateParmDecl>(
D) ||
6263 isa<TemplateTypeParmDecl>(
D) || isa<TemplateTemplateParmDecl>(
D) ||
6265 isa<OMPDeclareReductionDecl>(ParentDC) ||
6266 isa<OMPDeclareMapperDecl>(ParentDC))) ||
6267 (isa<CXXRecordDecl>(
D) && cast<CXXRecordDecl>(
D)->isLambda() &&
6268 cast<CXXRecordDecl>(
D)->getTemplateDepth() >
6275 if (
auto *BD = dyn_cast<BindingDecl>(FD);
6276 BD && BD->isParameterPack() &&
6278 auto *DRE = cast<DeclRefExpr>(
6280 return cast<NamedDecl>(DRE->getDecl());
6282 return cast<NamedDecl>(FD);
6286 assert(PackIdx != -1 &&
6287 "found declaration pack but not pack expanding");
6289 return cast<NamedDecl>((*cast<DeclArgumentPack *>(*
Found))[PackIdx]);
6296 if (isa<NonTypeTemplateParmDecl>(
D) || isa<TemplateTypeParmDecl>(
D) ||
6297 isa<TemplateTemplateParmDecl>(
D))
6316 bool NeedInstantiate =
false;
6318 NeedInstantiate = RD->isLocalClass();
6319 else if (isa<TypedefNameDecl>(
D) &&
6321 NeedInstantiate =
true;
6323 NeedInstantiate = isa<EnumDecl>(
D);
6324 if (NeedInstantiate) {
6327 return cast<TypeDecl>(Inst);
6332 assert(isa<LabelDecl>(
D));
6335 assert(Inst &&
"Failed to instantiate label??");
6338 return cast<LabelDecl>(Inst);
6342 if (!
Record->isDependentContext())
6351 dyn_cast<ClassTemplateSpecializationDecl>(
Record))
6352 ClassTemplate = Spec->getSpecializedTemplate()->getCanonicalDecl();
6363 if (
CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
6367 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
6387 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD);
6388 if (Guide && Guide->isImplicit()) {
6396 Unpacked = Arg.pack_elements();
6430 if (FindingInstantiatedContext &&
6432 Loc, cast<ClassTemplateSpecializationDecl>(SubstRecord))) {
6433 Diag(
Loc, diag::err_specialization_not_primary_template)
6450 if (!ParentDependsOnArgs)
6464 bool IsBeingInstantiated =
false;
6465 if (
CXXRecordDecl *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
6466 if (!Spec->isDependentContext()) {
6469 assert(Tag &&
"type of non-dependent record is not a RecordType");
6470 if (Tag->isBeingDefined())
6471 IsBeingInstantiated =
true;
6472 if (!Tag->isBeingDefined() &&
6476 ParentDC = Tag->getDecl();
6483 if (
auto Name =
D->getDeclName()) {
6508 if (isa<UsingShadowDecl>(
D)) {
6515 }
else if (IsBeingInstantiated) {
6521 Diag(
Loc, diag::err_member_not_yet_instantiated)
6529 EnumDecl *
Enum = cast<EnumDecl>(ED->getLexicalDeclContext());
6534 Diag(
Loc, diag::err_enumerator_does_not_exist)
6541 llvm_unreachable(
"Unable to find instantiation of declaration!");
6552 std::deque<PendingImplicitInstantiation> delayedPCHInstantiations;
6567 bool DefinitionRequired =
Function->getTemplateSpecializationKind() ==
6573 DefinitionRequired,
true);
6579 DefinitionRequired,
true);
6581 Function->setInstantiationIsPending(
false);
6584 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates &&
6586 delayedPCHInstantiations.push_back(Inst);
6591 VarDecl *Var = cast<VarDecl>(Inst.first);
6594 isa<VarTemplateSpecializationDecl>(Var)) &&
6595 "Not a static data member, nor a variable template"
6596 " specialization?");
6608 llvm_unreachable(
"Cannot instantitiate an undeclared specialization.");
6623 "instantiating variable definition");
6630 DefinitionRequired,
true);
6633 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates)
6639 for (
auto *DD : Pattern->
ddiags()) {
6640 switch (DD->getKind()) {
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Record Record
This file declares semantic analysis functions specific to AMDGPU.
This file declares semantic analysis for CUDA constructs.
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to Swift.
static void instantiateDependentAMDGPUWavesPerEUAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUWavesPerEUAttr &Attr, Decl *New)
static NamedDecl * findInstantiationOf(ASTContext &Ctx, NamedDecl *D, ForwardIterator first, ForwardIterator last)
static void instantiateDependentAMDGPUMaxNumWorkGroupsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUMaxNumWorkGroupsAttr &Attr, Decl *New)
static void instantiateDependentAMDGPUFlatWorkGroupSizeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUFlatWorkGroupSizeAttr &Attr, Decl *New)
static void instantiateDependentDiagnoseIfAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const DiagnoseIfAttr *DIA, const Decl *Tmpl, FunctionDecl *New)
static QualType adjustFunctionTypeForInstantiation(ASTContext &Context, FunctionDecl *D, TypeSourceInfo *TInfo)
Adjust the given function type for an instantiation of the given declaration, to cope with modificati...
static bool isRelevantAttr(Sema &S, const Decl *D, const Attr *A)
Determine whether the attribute A might be relevant to the declaration D.
static bool isDependentContextAtLevel(DeclContext *DC, unsigned Level)
Determine whether the given context is dependent on template parameters at level Level or below.
static void instantiateDependentModeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const ModeAttr &Attr, Decl *New)
static void instantiateDependentCUDALaunchBoundsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const CUDALaunchBoundsAttr &Attr, Decl *New)
static bool isDeclWithinFunction(const Decl *D)
static void instantiateDependentAssumeAlignedAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AssumeAlignedAttr *Aligned, Decl *New)
static bool SubstQualifier(Sema &SemaRef, const DeclT *OldDecl, DeclT *NewDecl, const MultiLevelTemplateArgumentList &TemplateArgs)
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static DeclT * getPreviousDeclForInstantiation(DeclT *D)
Get the previous declaration of a declaration for the purposes of template instantiation.
static Expr * instantiateDependentFunctionAttrCondition(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Expr *OldCond, const Decl *Tmpl, FunctionDecl *New)
static bool isInstantiationOf(ClassTemplateDecl *Pattern, ClassTemplateDecl *Instance)
static void instantiateDependentHLSLParamModifierAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const HLSLParamModifierAttr *Attr, Decl *New)
static void instantiateDependentAllocAlignAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AllocAlignAttr *Align, Decl *New)
static bool isInstantiationOfStaticDataMember(VarDecl *Pattern, VarDecl *Instance)
static void instantiateOMPDeclareSimdDeclAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OMPDeclareSimdDeclAttr &Attr, Decl *New)
Instantiation of 'declare simd' attribute and its arguments.
static void instantiateDependentSYCLKernelAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const SYCLKernelAttr &Attr, Decl *New)
static void instantiateDependentAlignValueAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AlignValueAttr *Aligned, Decl *New)
static void instantiateDependentAlignedAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AlignedAttr *Aligned, Decl *New, bool IsPackExpansion)
static void instantiateOMPDeclareVariantAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OMPDeclareVariantAttr &Attr, Decl *New)
Instantiation of 'declare variant' attribute and its arguments.
static void instantiateDependentEnableIfAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const EnableIfAttr *EIA, const Decl *Tmpl, FunctionDecl *New)
static void instantiateDependentAnnotationAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AnnotateAttr *Attr, Decl *New)
static Sema::RetainOwnershipKind attrToRetainOwnershipKind(const Attr *A)
static bool isInstantiationOfUnresolvedUsingDecl(T *Pattern, Decl *Other, ASTContext &Ctx)
static bool isInvalid(LocType Loc, bool *Invalid)
Defines the SourceManager interface.
Defines the clang::TypeLoc interface and its subclasses.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *D)
HandleCXXStaticMemberVarInstantiation - Tell the consumer that this.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
unsigned getManglingNumber(const NamedDecl *ND, bool ForAuxTarget=false) const
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
QualType getTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args, QualType Canon=QualType()) const
QualType getRecordType(const RecordDecl *Decl) const
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const
getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
void setInstantiatedFromUsingShadowDecl(UsingShadowDecl *Inst, UsingShadowDecl *Pattern)
unsigned getStaticLocalNumber(const VarDecl *VD) const
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
void setInstantiatedFromUsingEnumDecl(UsingEnumDecl *Inst, UsingEnumDecl *Pattern)
Remember that the using enum decl Inst is an instantiation of the using enum decl Pattern of a class ...
void setStaticLocalNumber(const VarDecl *VD, unsigned Number)
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
void setManglingNumber(const NamedDecl *ND, unsigned Number)
void addDeclaratorForUnnamedTagDecl(TagDecl *TD, DeclaratorDecl *DD)
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)
CanQualType UnsignedLongLongTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
QualType getPromotedIntegerType(QualType PromotableType) const
Return the type that PromotableType will promote to: C99 6.3.1.1p2, assuming that PromotableType is a...
const TargetInfo & getTargetInfo() const
void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl)
bool isPromotableIntegerType(QualType T) const
More type predicates useful for type checking/promotion.
void addTypedefNameForUnnamedTagDecl(TagDecl *TD, TypedefNameDecl *TND)
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
SourceRange getRange() const
SourceLocation getLoc() const
Represents a C++ declaration that introduces decls from somewhere else.
A binding in a decomposition declaration.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a C++ constructor within a class.
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), Expr *TrailingRequiresClause=nullptr)
Represents a C++ conversion function within a class.
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, Expr *TrailingRequiresClause=nullptr)
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal, Expr *TrailingRequiresClause=nullptr, const CXXDeductionGuideDecl *SourceDG=nullptr, SourceDeductionGuideKind SK=SourceDeductionGuideKind::None)
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, Expr *TrailingRequiresClause=nullptr)
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, Expr *TrailingRequiresClause=nullptr)
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
Represents a C++ struct/union/class.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr, bool DelayTypeCreation=false)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a class template node.
ClassTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
ClassTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *D)
Find a class template partial specialization which was instantiated from the given member partial spe...
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
void setCommonPtr(Common *C)
QualType getInjectedClassNameSpecialization()
Retrieve the template specialization type of the injected-class-name for this class template.
Common * getCommonPtr() const
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
void setInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *PartialSpec)
static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, QualType CanonInjectedType, ClassTemplatePartialSpecializationDecl *PrevDecl)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, ClassTemplateSpecializationDecl *PrevDecl)
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Declaration of a C++20 concept.
const TypeClass * getTypePtr() const
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
ddiag_range ddiags() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
bool isParameterPack() const
Whether this declaration is a parameter pack.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isInIdentifierNamespace(unsigned NS) const
@ FOK_None
Not a friend object.
bool isReferenced() const
Whether any declaration of this entity was referenced.
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
virtual bool hasBody() const
Returns true if this Decl represents a declaration for a body of code, such as a function or method d...
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
@ IDNS_Ordinary
Ordinary names.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
void setLexicalDeclContext(DeclContext *DC)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
void setTypeSourceInfo(TypeSourceInfo *TI)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
TypeSourceInfo * getTypeSourceInfo() const
void setTemplateParameterListsInfo(ASTContext &Context, ArrayRef< TemplateParameterList * > TPLists)
Represents the type decltype(expr) (C++11).
Expr * getUnderlyingExpr() const
A decomposition declaration.
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
Provides information about a dependent function-template specialization declaration.
Represents a qualified type name for which the type name is dependent.
unsigned getCustomDiagID(Level L, const char(&FormatString)[N])
Return an ID for a diagnostic with the specified format string and level.
bool hasErrorOccurred() const
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
bool isInvalid() const
Determine if the explicit specifier is invalid.
static ExplicitSpecifier Invalid()
const Expr * getExpr() const
void setKind(ExplicitSpecKind Kind)
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
This represents one expression.
static bool isPotentialConstantExprUnevaluated(Expr *E, const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExprUnevaluated - Return true if this expression might be usable in a constant exp...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
bool isConstantInitializer(ASTContext &Ctx, bool ForRef, const Expr **Culprit=nullptr) const
isConstantInitializer - Returns true if this expression can be emitted to IR as a constant,...
Declaration context for names declared as extern "C" in C++.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, SourceLocation FriendL, SourceLocation EllipsisLoc={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
void setUnsupportedFriend(bool Unsupported)
Declaration of a friend template.
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
void setInstantiationIsPending(bool IC)
State that the instantiation of this function is pending.
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
void setDescribedFunctionTemplate(FunctionTemplateDecl *Template)
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
void setInstantiationOfMemberFunction(FunctionDecl *FD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member function FD.
QualType getReturnType() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
void setVirtualAsWritten(bool V)
State that this function is marked as virtual explicitly.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
void setImplicitlyInline(bool I=true)
Flag that this function is implicitly inline.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, Expr *TrailingRequiresClause=nullptr)
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
void setRangeEnd(SourceLocation E)
bool isDefaulted() const
Whether this function is defaulted.
void setIneligibleOrNotSelected(bool II)
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
void setFunctionTemplateSpecialization(FunctionTemplateDecl *Template, TemplateArgumentList *TemplateArgs, void *InsertPos, TemplateSpecializationKind TSK=TSK_ImplicitInstantiation, TemplateArgumentListInfo *TemplateArgsAsWritten=nullptr, SourceLocation PointOfInstantiation=SourceLocation())
Specify that this function declaration is actually a function template specialization.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
DefaultedOrDeletedFunctionInfo * getDefalutedOrDeletedInfo() const
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
QualType getParamType(unsigned i) const
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
ExtProtoInfo getExtProtoInfo() const
FunctionDecl * getExceptionSpecTemplate() const
If this function type has an uninstantiated exception specification, this is the function whose excep...
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
FunctionDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
void setInstantiatedFromMemberTemplate(FunctionTemplateDecl *D)
FunctionTemplateDecl * getPreviousDecl()
Retrieve the previous declaration of this function template, or nullptr if no such declaration exists...
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
ParmVarDecl * getParam(unsigned i) const
void setParam(unsigned i, ParmVarDecl *VD)
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Represents a field injected from an anonymous union/struct into the parent scope.
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, llvm::MutableArrayRef< NamedDecl * > CH)
Description of a constructor that was inherited from a base class.
const TypeClass * getTypePtr() const
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
A stack-allocated class that identifies which local variable declaration instantiations are present i...
void InstantiatedLocal(const Decl *D, Decl *Inst)
LocalInstantiationScope * cloneScopes(LocalInstantiationScope *Outermost)
Clone this scope, and all outer scopes, down to the given outermost scope.
llvm::PointerUnion< Decl *, DeclArgumentPack * > * findInstantiationOf(const Decl *D)
Find the instantiation of the declaration D within the current instantiation scope.
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
Provides information a specialization of a member of a class template, which may be a member function...
Data structure that captures multiple levels of template argument lists for use in template instantia...
const ArgList & getInnermost() const
Retrieve the innermost template argument list.
void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final)
Add a new outmost level to the multi-level template argument list.
unsigned getNumLevels() const
Determine the number of levels in this template argument list.
void setKind(TemplateSubstitutionKind K)
unsigned getNumSubstitutedLevels() const
Determine the number of substituted levels in this template argument list.
void addOuterRetainedLevels(unsigned Num)
unsigned getNumRetainedOuterLevels() const
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool hasLinkage() const
Determine whether this declaration has linkage.
void setDeclName(DeclarationName N)
Set the name of this declaration.
Represents a C++ namespace alias.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Namespace)
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
This represents '#pragma omp allocate ...' directive.
Pseudo declaration for capturing expressions.
This is a basic class for representing single OpenMP clause.
This represents '#pragma omp declare mapper ...' directive.
This represents '#pragma omp declare reduction ...' directive.
This represents '#pragma omp requires...' directive.
This represents '#pragma omp threadprivate ...' directive.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
bool anyScoreOrCondition(llvm::function_ref< bool(Expr *&, bool)> Cond)
Represents a field declaration created by an @defs(...).
Wrapper for void* pointer.
static OpaquePtr make(QualType P)
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a pack expansion of types.
std::optional< unsigned > getNumExpansions() const
Retrieve the number of expansions that this pack expansion will generate, if known.
Represents a parameter to a function.
bool hasUninstantiatedDefaultArg() const
Represents a #pragma detect_mismatch line.
PrettyDeclStackTraceEntry - If a crash occurs in the parser while parsing something related to a decl...
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
The collection of all-type qualifiers we support.
Represents a struct/union/class.
Wrapper for source info for record types.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Declaration of a redeclarable template.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Represents the body of a requires-expression.
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
llvm::MutableArrayRef< Expr * > getExprs()
unsigned getNumExprs() const
Scope - A scope is a transient data structure that is used while parsing the program.
void addAMDGPUFlatWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI, Expr *Min, Expr *Max)
addAMDGPUFlatWorkGroupSizeAttr - Adds an amdgpu_flat_work_group_size attribute to a particular declar...
void addAMDGPUWavesPerEUAttr(Decl *D, const AttributeCommonInfo &CI, Expr *Min, Expr *Max)
addAMDGPUWavePersEUAttr - Adds an amdgpu_waves_per_eu attribute to a particular declaration.
void addAMDGPUMaxNumWorkGroupsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *XExpr, Expr *YExpr, Expr *ZExpr)
addAMDGPUMaxNumWorkGroupsAttr - Adds an amdgpu_max_num_work_groups attribute to a particular declarat...
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
QualType getInoutParameterType(QualType Ty)
bool inferObjCARCLifetime(ValueDecl *decl)
void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI, Sema::RetainOwnershipKind K, bool IsTemplateInstantiation)
DeclGroupPtrTy ActOnOpenMPDeclareReductionDirectiveEnd(Scope *S, DeclGroupPtrTy DeclReductions, bool IsValid)
Called at the end of '#pragma omp declare reduction'.
void ActOnOpenMPDeclareReductionCombinerEnd(Decl *D, Expr *Combiner)
Finish current declare reduction construct initializer.
ExprResult ActOnOpenMPDeclareMapperDirectiveVarDecl(Scope *S, QualType MapperType, SourceLocation StartLoc, DeclarationName VN)
Build the mapper variable of '#pragma omp declare mapper'.
VarDecl * ActOnOpenMPDeclareReductionInitializerStart(Scope *S, Decl *D)
Initialize declare reduction construct initializer.
QualType ActOnOpenMPDeclareReductionType(SourceLocation TyLoc, TypeResult ParsedType)
Check if the specified type is allowed to be used in 'omp declare reduction' construct.
DeclGroupPtrTy ActOnOpenMPAllocateDirective(SourceLocation Loc, ArrayRef< Expr * > VarList, ArrayRef< OMPClause * > Clauses, DeclContext *Owner=nullptr)
Called on well-formed '#pragma omp allocate'.
DeclGroupPtrTy ActOnOpenMPDeclareReductionDirectiveStart(Scope *S, DeclContext *DC, DeclarationName Name, ArrayRef< std::pair< QualType, SourceLocation > > ReductionTypes, AccessSpecifier AS, Decl *PrevDeclInScope=nullptr)
Called on start of '#pragma omp declare reduction'.
OMPClause * ActOnOpenMPAllocatorClause(Expr *Allocator, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'allocator' clause.
void EndOpenMPDSABlock(Stmt *CurDirective)
Called on end of data sharing attribute block.
QualType ActOnOpenMPDeclareMapperType(SourceLocation TyLoc, TypeResult ParsedType)
Check if the specified type is allowed to be used in 'omp declare mapper' construct.
std::optional< std::pair< FunctionDecl *, Expr * > > checkOpenMPDeclareVariantFunction(DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR)
Checks '#pragma omp declare variant' variant function and original functions after parsing of the ass...
void ActOnOpenMPDeclareReductionCombinerStart(Scope *S, Decl *D)
Initialize declare reduction construct initializer.
OMPClause * ActOnOpenMPMapClause(Expr *IteratorModifier, ArrayRef< OpenMPMapModifierKind > MapTypeModifiers, ArrayRef< SourceLocation > MapTypeModifiersLoc, CXXScopeSpec &MapperIdScopeSpec, DeclarationNameInfo &MapperId, OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef< Expr * > VarList, const OMPVarListLocTy &Locs, bool NoDiagnose=false, ArrayRef< Expr * > UnresolvedMappers={})
Called on well-formed 'map' clause.
void StartOpenMPDSABlock(OpenMPDirectiveKind K, const DeclarationNameInfo &DirName, Scope *CurScope, SourceLocation Loc)
Called on start of new data sharing attribute block.
OMPThreadPrivateDecl * CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef< Expr * > VarList)
Builds a new OpenMPThreadPrivateDecl and checks its correctness.
void ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef< Expr * > AdjustArgsNothing, ArrayRef< Expr * > AdjustArgsNeedDevicePtr, ArrayRef< OMPInteropInfo > AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR)
Called on well-formed '#pragma omp declare variant' after parsing of the associated method/function.
void ActOnOpenMPDeclareReductionInitializerEnd(Decl *D, Expr *Initializer, VarDecl *OmpPrivParm)
Finish current declare reduction construct initializer.
DeclGroupPtrTy ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef< Expr * > Uniforms, ArrayRef< Expr * > Aligneds, ArrayRef< Expr * > Alignments, ArrayRef< Expr * > Linears, ArrayRef< unsigned > LinModifiers, ArrayRef< Expr * > Steps, SourceRange SR)
Called on well-formed '#pragma omp declare simd' after parsing of the associated method/function.
OMPClause * ActOnOpenMPAlignClause(Expr *Alignment, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc)
Called on well-formed 'align' clause.
DeclGroupPtrTy ActOnOpenMPDeclareMapperDirective(Scope *S, DeclContext *DC, DeclarationName Name, QualType MapperType, SourceLocation StartLoc, DeclarationName VN, AccessSpecifier AS, Expr *MapperVarRef, ArrayRef< OMPClause * > Clauses, Decl *PrevDeclInScope=nullptr)
Called on start of '#pragma omp declare mapper'.
void AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi)
RAII object used to change the argument pack substitution index within a Sema object.
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
CXXSpecialMemberKind asSpecialMember() const
A helper class for building up ExtParameterInfos.
Records and restores the CurFPFeatures state on entry/exit of compound statements.
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Sema - This implements semantic analysis and AST building for C.
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, const TemplateArgumentListInfo &TemplateArgsInfo, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
bool SubstTypeConstraint(TemplateTypeParmDecl *Inst, const TypeConstraint *TC, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraint)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand, bool &RetainExpansion, std::optional< unsigned > &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Decl * ActOnSkippedFunctionBody(Decl *Decl)
Decl * BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc, bool Failed)
TemplateName SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, TemplateName Name, SourceLocation Loc, const MultiLevelTemplateArgumentList &TemplateArgs)
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, std::optional< unsigned > NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, FunctionDecl *Function)
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
llvm::DenseSet< std::pair< Decl *, unsigned > > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
void deduceOpenCLAddressSpace(ValueDecl *decl)
PragmaStack< FPOptionsOverride > FpPragmaStack
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
void CheckThreadLocalForLargeAlignment(VarDecl *VD)
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
ExpressionEvaluationContextRecord & parentEvaluationContext()
LateParsedTemplateMapT LateParsedTemplateMap
bool SubstExprs(ArrayRef< Expr * > Exprs, bool IsCall, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< Expr * > &Outputs)
Substitute the given template arguments into a list of expressions, expanding pack expansions if requ...
void CheckTemplatePartialSpecialization(ClassTemplatePartialSpecializationDecl *Partial)
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
ParmVarDecl * BuildParmVarDeclForTypedef(DeclContext *DC, SourceLocation Loc, QualType T)
Synthesizes a variable for a parameter arising from a typedef.
bool CheckTemplatePartialSpecializationArgs(SourceLocation Loc, TemplateDecl *PrimaryTemplate, unsigned NumExplicitArgs, ArrayRef< TemplateArgument > Args)
Check the non-type template arguments of a class template partial specialization according to C++ [te...
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void CleanupVarDeclMarking()
ASTContext & getASTContext() const
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
void inferGslPointerAttribute(NamedDecl *ND, CXXRecordDecl *UnderlyingRecord)
Add gsl::Pointer attribute to std::container::iterator.
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
bool CheckFunctionTemplateSpecialization(FunctionDecl *FD, TemplateArgumentListInfo *ExplicitTemplateArgs, LookupResult &Previous, bool QualifiedFriend=false)
Perform semantic analysis for the given function template specialization.
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
NamedReturnInfo getNamedReturnInfo(Expr *&E, SimplerImplicitMoveMode Mode=SimplerImplicitMoveMode::Normal)
Determine whether the given expression might be move-eligible or copy-elidable in either a (co_)retur...
bool CheckEnumUnderlyingType(TypeSourceInfo *TI)
Check that this is a valid underlying type for an enum declaration.
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
const LangOptions & getLangOpts() const
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, ConceptDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, QualType ConstrainedType, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
const LangOptions & LangOpts
void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...
void PerformPendingInstantiations(bool LocalOnly=false)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
VarTemplateSpecializationDecl * CompleteVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiates a variable template specialization by completing it with appropriate type information an...
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
FieldDecl * CheckFieldDecl(DeclarationName Name, QualType T, TypeSourceInfo *TInfo, RecordDecl *Record, SourceLocation Loc, bool Mutable, Expr *BitfieldWidth, InClassInitStyle InitStyle, SourceLocation TSSL, AccessSpecifier AS, NamedDecl *PrevDecl, Declarator *D=nullptr)
Build a new FieldDecl and check its well-formedness.
void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst)
Update instantiation attributes after template was late parsed.
bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange)
Mark the given method pure.
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
const VarDecl * getCopyElisionCandidate(NamedReturnInfo &Info, QualType ReturnType)
Updates given NamedReturnInfo's move-eligible and copy-elidable statuses, considering the function re...
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
std::optional< unsigned > getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
bool SubstParmTypes(SourceLocation Loc, ArrayRef< ParmVarDecl * > Params, const FunctionProtoType::ExtParameterInfo *ExtParamInfos, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< QualType > &ParamTypes, SmallVectorImpl< ParmVarDecl * > *OutParams, ExtParameterInfoBuilder &ParamInfos)
Substitute the given template arguments into the given set of parameters, producing the set of parame...
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
int ArgumentPackSubstitutionIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target, const LookupResult &PreviousDecls, UsingShadowDecl *&PrevShadow)
Determines whether to create a using shadow decl for a particular decl, given the set of decls existi...
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
void CompleteMemberSpecialization(NamedDecl *Member, LookupResult &Previous)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
void MarkDeclarationsReferencedInType(SourceLocation Loc, QualType T)
Mark all of the declarations referenced within a particular AST node as referenced.
bool CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, TemplateSpecializationKind ActOnExplicitInstantiationNewTSK, NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK, SourceLocation PrevPtOfInstantiation, bool &SuppressNew)
Diagnose cases where we have an explicit template specialization before/after an explicit template in...
SourceManager & getSourceManager() const
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
void ActOnEnumBody(SourceLocation EnumLoc, SourceRange BraceRange, Decl *EnumDecl, ArrayRef< Decl * > Elements, Scope *S, const ParsedAttributesView &Attr)
Decl * SubstDecl(Decl *D, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
QualType CheckNonTypeTemplateParameterType(TypeSourceInfo *&TSI, SourceLocation Loc)
Check that the type of a non-type template parameter is well-formed.
QualType CheckTemplateIdType(TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body)
void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, ArrayRef< CXXCtorInitializer * > MemInits, bool AnyErrors)
ActOnMemInitializers - Handle the member initializers for a constructor.
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
RedeclarationKind forRedeclarationInCurContext() const
bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
EnumConstantDecl * CheckEnumConstant(EnumDecl *Enum, EnumConstantDecl *LastEnumConst, SourceLocation IdLoc, IdentifierInfo *Id, Expr *val)
void DiagnoseUnusedNestedTypedefs(const RecordDecl *D)
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
void CheckStaticLocalForDllExport(VarDecl *VD)
Check if VD needs to be dllexport/dllimport due to being in a dllexport/import function.
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
LateTemplateParserCB * LateTemplateParser
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
SourceManager & SourceMgr
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
NamedDecl * BuildUsingPackDecl(NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > Expansions)
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
NamespaceDecl * getStdNamespace() const
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
@ TPC_FriendFunctionTemplate
@ TPC_FriendFunctionTemplateDefinition
void DiagnoseUnusedDecl(const NamedDecl *ND)
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
void ActOnUninitializedDecl(Decl *dcl)
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void BuildVariableInstantiation(VarDecl *NewVar, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs, LateInstantiatedAttrVec *LateAttrs, DeclContext *Owner, LocalInstantiationScope *StartingScope, bool InstantiatingVarTemplate=false, VarTemplateSpecializationDecl *PrevVTSD=nullptr)
BuildVariableInstantiation - Used after a new variable has been created.
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
void CheckAlignasUnderalignment(Decl *D)
bool CheckTemplateArgumentList(TemplateDecl *Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, const DefaultArguments &DefaultArgs, bool PartialTemplateArgs, CheckTemplateArgumentInfo &CTAI, bool UpdateArgsWithConversions=true, bool *ConstraintsNotSatisfied=nullptr)
Check that the given template arguments can be provided to the given template, converting the argumen...
std::pair< ValueDecl *, SourceLocation > PendingImplicitInstantiation
An entity for which implicit template instantiation is required.
DeclContext * FindInstantiatedContext(SourceLocation Loc, DeclContext *DC, const MultiLevelTemplateArgumentList &TemplateArgs)
Finds the instantiation of the given declaration context within the current instantiation.
bool isIncompatibleTypedef(const TypeDecl *Old, TypedefNameDecl *New)
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
void PerformDependentDiagnostics(const DeclContext *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool CheckEnumRedeclaration(SourceLocation EnumLoc, bool IsScoped, QualType EnumUnderlyingTy, bool IsFixed, const EnumDecl *Prev)
Check whether this is a valid redeclaration of a previous enumeration.
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
ASTMutationListener * getASTMutationListener() const
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
TypeSourceInfo * SubstFunctionDeclType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext, Qualifiers ThisTypeQuals, bool EvaluateConstraints=true)
A form of SubstType intended specifically for instantiating the type of a FunctionDecl.
Encodes a location in the source.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
StringRef getFilename(SourceLocation SpellingLoc) const
Return the filename of the file containing a SourceLocation.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
Represents a C++11 static_assert declaration.
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
Represents the declaration of a struct/union/class/enum.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypedefNameDecl * getTypedefNameForAnonDecl() const
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TagKind getTagKind() const
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
Represents a template argument.
@ Pack
The template argument is actually a parameter pack.
@ RewriteSpaceshipAsEqualEqual
void setEvaluateConstraints(bool B)
Decl * VisitDecl(Decl *D)
Decl * VisitVarDecl(VarDecl *D, bool InstantiatingVarTemplate, ArrayRef< BindingDecl * > *Bindings=nullptr)
bool InitMethodInstantiation(CXXMethodDecl *New, CXXMethodDecl *Tmpl)
Initializes common fields of an instantiated method declaration (New) from the corresponding fields o...
bool InitFunctionInstantiation(FunctionDecl *New, FunctionDecl *Tmpl)
Initializes the common fields of an instantiation function declaration (New) from the corresponding f...
VarTemplatePartialSpecializationDecl * InstantiateVarTemplatePartialSpecialization(VarTemplateDecl *VarTemplate, VarTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a variable template partial specialization.
void adjustForRewrite(RewriteKind RK, FunctionDecl *Orig, QualType &T, TypeSourceInfo *&TInfo, DeclarationNameInfo &NameInfo)
TypeSourceInfo * SubstFunctionType(FunctionDecl *D, SmallVectorImpl< ParmVarDecl * > &Params)
Decl * VisitVarTemplateSpecializationDecl(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentListInfo &TemplateArgsInfo, ArrayRef< TemplateArgument > Converted, VarTemplateSpecializationDecl *PrevDecl=nullptr)
void InstantiateEnumDefinition(EnumDecl *Enum, EnumDecl *Pattern)
Decl * VisitFunctionDecl(FunctionDecl *D, TemplateParameterList *TemplateParams, RewriteKind RK=RewriteKind::None)
Normal class members are of more specific types and therefore don't make it here.
Decl * VisitCXXMethodDecl(CXXMethodDecl *D, TemplateParameterList *TemplateParams, RewriteKind RK=RewriteKind::None)
Decl * InstantiateTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
Decl * VisitBaseUsingDecls(BaseUsingDecl *D, BaseUsingDecl *Inst, LookupResult *Lookup)
bool SubstQualifier(const DeclaratorDecl *OldDecl, DeclaratorDecl *NewDecl)
TemplateParameterList * SubstTemplateParams(TemplateParameterList *List)
Instantiates a nested template parameter list in the current instantiation context.
Decl * InstantiateTypedefNameDecl(TypedefNameDecl *D, bool IsTypeAlias)
ClassTemplatePartialSpecializationDecl * InstantiateClassTemplatePartialSpecialization(ClassTemplateDecl *ClassTemplate, ClassTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a class template partial specialization.
bool SubstDefaultedFunction(FunctionDecl *New, FunctionDecl *Tmpl)
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
bool isNull() const
Determine whether this template name is NULL.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SourceRange getSourceRange() const LLVM_READONLY
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
ArrayRef< NamedDecl * > asArray()
SourceLocation getTemplateLoc() const
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, bool Typename, TemplateParameterList *Params)
Declaration of a template type parameter.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, std::optional< unsigned > NumExpanded=std::nullopt)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
void setTypeForDecl(const Type *TD)
const Type * getTypeForDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
SourceLocation getNameLoc() const
void setNameLoc(SourceLocation Loc)
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isRValueReferenceType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsErrors() const
Whether this type is an error type.
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isFunctionType() const
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Represents a dependent using declaration which was marked with typename.
SourceLocation getTypenameLoc() const
Returns the source location of the 'typename' keyword.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Represents a C++ using-enum-declaration.
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
void setObjCForDecl(bool FRD)
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setCXXForRangeDecl(bool FRD)
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
TLSKind getTLSKind() const
void setInitStyle(InitializationStyle Style)
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
void setInitCapture(bool IC)
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
@ CallInit
Call-style initialization (C++98)
bool isObjCForDecl() const
Determine whether this variable is a for-loop declaration for a for-in statement in Objective-C.
void setPreviousDeclInSameBlockScope(bool Same)
bool isInlineSpecified() const
bool isStaticDataMember() const
Determines whether this is a static data member.
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
bool isCXXForRangeDecl() const
Determine whether this variable is the for-range-declaration in a C++0x for-range statement.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
void setInlineSpecified()
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
void setTSCSpec(ThreadStorageClassSpecifier TSC)
void setNRVOVariable(bool NRVO)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
void setConstexpr(bool IC)
void setDescribedVarTemplate(VarTemplateDecl *Template)
bool isDirectInit() const
Whether the initializer is a direct-initializer (list or call).
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Get the template specialization kind of this variable for the purposes of template instantiation.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Declaration of a variable template.
void AddPartialSpecialization(VarTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
VarTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
void AddSpecialization(VarTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
VarTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
VarTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(VarTemplatePartialSpecializationDecl *D)
Find a variable template partial specialization which was instantiated from the given member partial ...
static VarTemplatePartialSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
void setInstantiatedFromMember(VarTemplatePartialSpecializationDecl *PartialSpec)
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate the initializer of the vari...
static VarTemplateSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
llvm::PointerUnion< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the variable template or variable template partial specialization which was specialized by t...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
void setCompleteDefinition()
QualType FunctionType
BlockType - The function type of the block, if one was given.
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
bool NE(InterpState &S, CodePtr OpPC)
Attr * instantiateTemplateAttribute(const Attr *At, ASTContext &C, Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs)
Attr * instantiateTemplateAttributeForDecl(const Attr *At, ASTContext &C, Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs)
The JSON file list parser is used to communicate input to InstallAPI.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
@ Rewrite
We are substituting template parameters for (typically) other template parameters in order to rewrite...
StorageClass
Storage classes.
bool isGenericLambdaCallOperatorOrStaticInvokerSpecialization(const DeclContext *DC)
@ Property
The type of a property.
@ Result
The result type of a method or function.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
@ Other
Other implicit parameter.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_Uninstantiated
not instantiated yet
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ EST_Unevaluated
not evaluated yet, for special member function
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
const DeclarationNameLoc & getInfo() const
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionType::ExtInfo ExtInfo
This structure contains most locations needed for by an OMPVarListClause.
SmallVector< TemplateArgument, 4 > CanonicalConverted
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
SynthesisKind
The kind of template instantiation we are performing.
@ BuildingDeductionGuides
We are building deduction guides for a class.
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
A stack object to be created when performing template instantiation.
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
bool isAlreadyInstantiating() const
Determine whether we are already instantiating this specialization in some surrounding active instant...