36#include "llvm/Support/TimeProfiler.h"
52template<
typename DeclT>
55 if (!OldDecl->getQualifierLoc())
58 assert((NewDecl->getFriendObjectKind() ||
59 !OldDecl->getLexicalDeclContext()->isDependentContext()) &&
60 "non-friend with qualified name defined in dependent context");
63 const_cast<DeclContext *
>(NewDecl->getFriendObjectKind()
64 ? NewDecl->getLexicalDeclContext()
65 : OldDecl->getLexicalDeclContext()));
74 NewDecl->setQualifierInfo(NewQualifierLoc);
80 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
85 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
89#include "clang/Sema/AttrTemplateInstantiate.inc"
93 const AlignedAttr *Aligned,
Decl *
New,
bool IsPackExpansion) {
94 if (Aligned->isAlignmentExpr()) {
103 S.
SubstType(Aligned->getAlignmentType(), TemplateArgs,
106 Aligned->getLocation(),
107 Result->getTypeLoc().getSourceRange()))
115 const AlignedAttr *Aligned,
Decl *
New) {
116 if (!Aligned->isPackExpansion()) {
122 if (Aligned->isAlignmentExpr())
128 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
131 bool Expand =
true, RetainExpansion =
false;
136 Unexpanded, TemplateArgs,
138 Expand, 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()),
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);
237template <
typename Attr>
241 Expr *tempInstPriority =
nullptr;
249 tempInstPriority =
Result.get();
250 if (std::optional<llvm::APSInt> CE =
254 if (!CE->isIntN(32)) {
256 <<
toString(*CE, 10,
false) << 32 << 1;
262 New->addAttr(Attr::Create(
C, tempInstPriority, *A));
278 if (!
Cond->isTypeDependent()) {
288 S.
Diag(A->
getLocation(), diag::err_attr_cond_never_constant_expr) << A;
289 for (
const auto &P : Diags)
290 S.
Diag(P.first, P.second);
300 S, TemplateArgs, EIA, EIA->getCond(), Tmpl,
New);
304 Cond, EIA->getMessage()));
311 S, TemplateArgs, DIA, DIA->getCond(), Tmpl,
New);
316 DIA->getDefaultSeverity(), DIA->getWarningGroup(),
317 DIA->getArgDependent(),
New));
334 Expr *MinBlocks =
nullptr;
335 if (
Attr.getMinBlocks()) {
342 Expr *MaxBlocks =
nullptr;
343 if (
Attr.getMaxBlocks()) {
366 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
New))
367 New = FTD->getTemplatedDecl();
369 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
374 if (
auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
375 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
378 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
379 Local.InstantiatedLocal(
380 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
384 FD->isCXXInstanceMember());
400 if (
auto *E =
Attr.getSimdlen())
403 if (
Attr.uniforms_size() > 0) {
404 for(
auto *E :
Attr.uniforms()) {
408 Uniforms.push_back(Inst.
get());
412 auto AI =
Attr.alignments_begin();
413 for (
auto *E :
Attr.aligneds()) {
417 Aligneds.push_back(Inst.
get());
421 Alignments.push_back(Inst.
get());
425 auto SI =
Attr.steps_begin();
426 for (
auto *E :
Attr.linears()) {
430 Linears.push_back(Inst.
get());
434 Steps.push_back(Inst.
get());
437 LinModifiers.append(
Attr.modifiers_begin(),
Attr.modifiers_end());
440 Uniforms, Aligneds, Alignments, Linears, LinModifiers, Steps,
449 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
New))
450 New = FTD->getTemplatedDecl();
452 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
454 auto &&SubstExpr = [FD, ThisContext, &S, &TemplateArgs](
Expr *E) {
455 if (
auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
456 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
459 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
460 Local.InstantiatedLocal(
461 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
465 FD->isCXXInstanceMember());
471 auto &&Subst = [&SubstExpr, &S](
Expr *E) {
481 if (
Expr *E =
Attr.getVariantFuncRef()) {
486 VariantFuncRef = Subst(E);
492 TI = *
Attr.getTraitInfos();
495 auto SubstScoreOrConditionExpr = [&S, Subst](
Expr *&E,
bool) {
510 Expr *E = VariantFuncRef.
get();
514 std::optional<std::pair<FunctionDecl *, Expr *>> DeclVarData =
522 E = DeclVarData->second;
523 FD = DeclVarData->first;
525 if (
auto *VariantDRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts())) {
526 if (
auto *VariantFD = dyn_cast<FunctionDecl>(VariantDRE->getDecl())) {
527 if (
auto *VariantFTD = VariantFD->getDescribedFunctionTemplate()) {
528 if (!VariantFTD->isThisDeclarationADefinition())
539 SubstFD->getType(), FD->getType(),
545 New->getLocation(), SubstFD,
true,
547 SubstFD->setInstantiationIsPending(!SubstFD->isDefined());
551 SubstFD->getLocation(),
562 for (
Expr *E :
Attr.adjustArgsNothing()) {
566 NothingExprs.push_back(ER.
get());
568 for (
Expr *E :
Attr.adjustArgsNeedDevicePtr()) {
572 NeedDevicePtrExprs.push_back(ER.
get());
574 for (
Expr *E :
Attr.adjustArgsNeedDeviceAddr()) {
578 NeedDeviceAddrExprs.push_back(ER.
get());
582 AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync);
586 FD, E, TI, NothingExprs, NeedDevicePtrExprs, NeedDeviceAddrExprs,
592 const AMDGPUFlatWorkGroupSizeAttr &
Attr,
Decl *
New) {
633 New->addAttr(::new (Context) ReqdWorkGroupSizeAttr(Context,
Attr,
X, Y, Z));
652 if (!
Cond->isTypeDependent())
669 Expr *MaxExpr =
nullptr;
670 if (
auto Max =
Attr.getMax()) {
682 const AMDGPUMaxNumWorkGroupsAttr &
Attr,
Decl *
New) {
686 Expr *XExpr =
nullptr;
687 Expr *YExpr =
nullptr;
688 Expr *ZExpr =
nullptr;
690 if (
Attr.getMaxNumWorkGroupsX()) {
696 if (
Attr.getMaxNumWorkGroupsY()) {
702 if (
Attr.getMaxNumWorkGroupsZ()) {
718 auto SubstElt = [&S, &TemplateArgs](
Expr *E) {
719 return E ? S.
SubstExpr(E, TemplateArgs).
get() :
nullptr;
722 Expr *XExpr = SubstElt(
Attr.getX());
723 Expr *YExpr = SubstElt(
Attr.getY());
724 Expr *ZExpr = SubstElt(
Attr.getZ());
744 if (
const auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
747 if (!T->isDependentType() && !RD->isDependentContext() &&
750 for (
const auto *ExistingPNA : D->
specific_attrs<PreferredNameAttr>())
752 PNA->getTypedefType()))
757 if (
const auto *BA = dyn_cast<BuiltinAttr>(A)) {
759 switch (BA->getID()) {
760 case Builtin::BIforward:
770 case Builtin::BImove:
771 case Builtin::BImove_if_noexcept:
798 <<
Attr <<
"'groupshared'";
810 "out or inout parameter type must be a reference and restrict qualified");
814 const MallocSpanAttr *
Attr,
829 for (
const auto *TmplAttr : Tmpl->
attrs()) {
836 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
840 TmplAttr,
Context, *
this, TemplateArgs);
843 New->addAttr(NewAttr);
851 case clang::attr::CFConsumed:
853 case clang::attr::OSConsumed:
855 case clang::attr::NSConsumed:
858 llvm_unreachable(
"Wrong argument supplied");
865 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *Old,
Decl *
New);
871 for (
const auto *TmplAttr : Tmpl->
attrs()) {
876 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
877 if (Aligned && Aligned->isAlignmentDependent()) {
882 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
887 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
892 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
897 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
902 if (
auto *
Constructor = dyn_cast<ConstructorAttr>(TmplAttr)) {
908 if (
auto *
Destructor = dyn_cast<DestructorAttr>(TmplAttr)) {
914 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
920 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
926 if (
const auto *CUDALaunchBounds =
927 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
929 *CUDALaunchBounds,
New);
933 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
938 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
943 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
948 if (
const auto *ReqdWorkGroupSize =
949 dyn_cast<ReqdWorkGroupSizeAttr>(TmplAttr)) {
951 *ReqdWorkGroupSize,
New);
954 if (
const auto *AMDGPUFlatWorkGroupSize =
955 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
957 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize,
New);
960 if (
const auto *AMDGPUFlatWorkGroupSize =
961 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
963 *AMDGPUFlatWorkGroupSize,
New);
966 if (
const auto *AMDGPUMaxNumWorkGroups =
967 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
969 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups,
New);
972 if (
const auto *CUDAClusterDims = dyn_cast<CUDAClusterDimsAttr>(TmplAttr)) {
974 *CUDAClusterDims,
New);
977 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
983 if (
const auto *RoutineAttr = dyn_cast<OpenACCRoutineDeclAttr>(TmplAttr)) {
985 RoutineAttr, Tmpl,
New);
990 if (TmplAttr->getKind() == attr::DLLExport ||
991 TmplAttr->getKind() == attr::DLLImport) {
992 if (
New->hasAttr<DLLExportAttr>() ||
New->hasAttr<DLLImportAttr>()) {
997 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
1010 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
1011 if (!
New->hasAttr<PointerAttr>())
1016 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
1017 if (!
New->hasAttr<OwnerAttr>())
1022 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
1027 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
1028 if (!
New->hasAttr<CUDAGridConstantAttr>())
1033 if (
auto *A = dyn_cast<MallocSpanAttr>(TmplAttr)) {
1038 if (
auto *A = dyn_cast<CleanupAttr>(TmplAttr)) {
1039 if (!
New->hasAttr<CleanupAttr>()) {
1040 auto *NewAttr = A->clone(
Context);
1041 NewAttr->setArgLoc(A->getArgLoc());
1042 New->addAttr(NewAttr);
1047 if (
auto *A = dyn_cast<HLSLMatrixLayoutAttr>(TmplAttr)) {
1048 if (!
HLSL().diagnoseInstantiatedMatrixLayoutAttr(
New, A) &&
1049 !
New->hasAttr<HLSLMatrixLayoutAttr>())
1054 assert(!TmplAttr->isPackExpansion());
1055 if (TmplAttr->isLateParsed() && LateAttrs) {
1065 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
1067 ND->isCXXInstanceMember());
1070 *
this, TemplateArgs);
1073 New->addAttr(NewAttr);
1079 for (
const auto *
Attr : Pattern->
attrs()) {
1080 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
1081 if (!Inst->
hasAttr<StrictFPAttr>())
1089 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
1094 DLLExportAttr *
Attr = Ctor->
getAttr<DLLExportAttr>();
1097 for (
unsigned I = 0; I != NumParams; ++I) {
1108template<
typename DeclT>
1110 DeclT *
Result = D->getPreviousDecl();
1116 D->getLexicalDeclContext() !=
Result->getLexicalDeclContext())
1124 llvm_unreachable(
"Translation units cannot be instantiated");
1128 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
1131Decl *TemplateDeclInstantiator::VisitHLSLRootSignatureDecl(
1133 llvm_unreachable(
"HLSL root signature declarations cannot be instantiated");
1138 llvm_unreachable(
"pragma comment cannot be instantiated");
1141Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
1143 llvm_unreachable(
"pragma comment cannot be instantiated");
1148 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
1152 llvm_unreachable(
"GUID declaration cannot be instantiated");
1155Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
1157 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
1160Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
1162 llvm_unreachable(
"template parameter objects cannot be instantiated");
1166TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *D) {
1169 SemaRef.InstantiateAttrs(TemplateArgs, D, Inst, LateAttrs, StartingScope);
1170 Owner->addDecl(Inst);
1175TemplateDeclInstantiator::VisitNamespaceDecl(
NamespaceDecl *D) {
1176 llvm_unreachable(
"Namespaces cannot be instantiated");
1180class OpenACCDeclClauseInstantiator final
1183 const MultiLevelTemplateArgumentList &MLTAL;
1184 ArrayRef<OpenACCClause *> ExistingClauses;
1185 SemaOpenACC::OpenACCParsedClause &ParsedClause;
1186 OpenACCClause *NewClause =
nullptr;
1189 OpenACCDeclClauseInstantiator(Sema &S,
1190 const MultiLevelTemplateArgumentList &MLTAL,
1191 ArrayRef<OpenACCClause *> ExistingClauses,
1192 SemaOpenACC::OpenACCParsedClause &ParsedClause)
1193 : SemaRef(S), MLTAL(MLTAL), ExistingClauses(ExistingClauses),
1194 ParsedClause(ParsedClause) {}
1196 OpenACCClause *CreatedClause() {
return NewClause; }
1197#define VISIT_CLAUSE(CLAUSE_NAME) \
1198 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
1199#include "clang/Basic/OpenACCClauses.def"
1203 for (
Expr *CurVar : VarList) {
1204 ExprResult Res = SemaRef.SubstExpr(CurVar, MLTAL);
1213 InstantiatedVarList.push_back(Res.
get());
1215 return InstantiatedVarList;
1219#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME) \
1220 void OpenACCDeclClauseInstantiator::Visit##CLAUSE_NAME##Clause( \
1221 const OpenACC##CLAUSE_NAME##Clause &) { \
1222 llvm_unreachable("Clause type invalid on declaration construct, or " \
1223 "instantiation not implemented"); \
1252#undef CLAUSE_NOT_ON_DECLS
1254void OpenACCDeclClauseInstantiator::VisitGangClause(
1258 assert(
C.getNumExprs() <= 1 &&
1259 "Only 1 expression allowed on gang clause in routine");
1261 if (
C.getNumExprs() > 0) {
1263 "Only dim allowed on routine");
1265 SemaRef.SubstExpr(
const_cast<Expr *
>(
C.getExpr(0).second), MLTAL);
1267 ER = SemaRef.OpenACC().CheckGangExpr(ExistingClauses,
1268 ParsedClause.getDirectiveKind(),
1269 C.getExpr(0).first, ER.
get());
1272 TransformedIntExprs.push_back(ER.
get());
1277 NewClause = SemaRef.OpenACC().CheckGangClause(
1278 ParsedClause.getDirectiveKind(), ExistingClauses,
1279 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1280 TransformedGangKinds, TransformedIntExprs, ParsedClause.getEndLoc());
1285 ParsedClause.getBeginLoc(),
1286 ParsedClause.getEndLoc());
1288void OpenACCDeclClauseInstantiator::VisitNoHostClause(
1291 ParsedClause.getBeginLoc(),
1292 ParsedClause.getEndLoc());
1295void OpenACCDeclClauseInstantiator::VisitDeviceTypeClause(
1299 SemaRef.getASTContext(),
C.getClauseKind(), ParsedClause.getBeginLoc(),
1300 ParsedClause.getLParenLoc(),
C.getArchitectures(),
1301 ParsedClause.getEndLoc());
1304void OpenACCDeclClauseInstantiator::VisitWorkerClause(
1306 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'worker' clause");
1308 ParsedClause.getBeginLoc(), {},
1309 nullptr, ParsedClause.getEndLoc());
1312void OpenACCDeclClauseInstantiator::VisitVectorClause(
1314 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'vector' clause");
1316 ParsedClause.getBeginLoc(), {},
1317 nullptr, ParsedClause.getEndLoc());
1320void OpenACCDeclClauseInstantiator::VisitCopyClause(
1322 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1323 C.getModifierList());
1324 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1327 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1328 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1329 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1330 ParsedClause.getEndLoc());
1333void OpenACCDeclClauseInstantiator::VisitLinkClause(
1335 ParsedClause.setVarListDetails(
1336 SemaRef.OpenACC().CheckLinkClauseVarList(VisitVarList(
C.getVarList())),
1339 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1344 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1345 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1346 ParsedClause.getEndLoc());
1349void OpenACCDeclClauseInstantiator::VisitDeviceResidentClause(
1351 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1353 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1357 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1358 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1359 ParsedClause.getEndLoc());
1362void OpenACCDeclClauseInstantiator::VisitCopyInClause(
1364 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1365 C.getModifierList());
1367 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1370 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1371 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1372 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1373 ParsedClause.getEndLoc());
1375void OpenACCDeclClauseInstantiator::VisitCopyOutClause(
1377 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1378 C.getModifierList());
1380 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1383 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1384 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1385 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1386 ParsedClause.getEndLoc());
1388void OpenACCDeclClauseInstantiator::VisitCreateClause(
1390 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1391 C.getModifierList());
1393 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1396 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1397 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1398 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1399 ParsedClause.getEndLoc());
1401void OpenACCDeclClauseInstantiator::VisitPresentClause(
1403 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1405 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1409 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1410 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1411 ParsedClause.getEndLoc());
1413void OpenACCDeclClauseInstantiator::VisitDevicePtrClause(
1417 llvm::erase_if(VarList, [&](
Expr *E) {
1422 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1426 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1427 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1428 ParsedClause.getEndLoc());
1431void OpenACCDeclClauseInstantiator::VisitBindClause(
1434 if (
C.isStringArgument())
1436 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1437 ParsedClause.getLParenLoc(),
C.getStringArgument(),
1438 ParsedClause.getEndLoc());
1441 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1442 ParsedClause.getLParenLoc(),
C.getIdentifierArgument(),
1443 ParsedClause.getEndLoc());
1451 for (
const auto *Clause : ClauseList) {
1453 Clause->getBeginLoc());
1454 ParsedClause.setEndLoc(Clause->getEndLoc());
1455 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(Clause))
1456 ParsedClause.setLParenLoc(WithParms->getLParenLoc());
1458 OpenACCDeclClauseInstantiator Instantiator{S, MLTAL, TransformedClauses,
1460 Instantiator.Visit(Clause);
1461 if (Instantiator.CreatedClause())
1462 TransformedClauses.push_back(Instantiator.CreatedClause());
1464 return TransformedClauses;
1471 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *OldDecl,
Decl *NewDecl) {
1472 OpenACCRoutineDeclAttr *A =
1473 OpenACCRoutineDeclAttr::Create(S.
getASTContext(), OldAttr->getLocation());
1475 if (!OldAttr->Clauses.empty()) {
1477 InstantiateOpenACCClauseList(
1479 A->Clauses.assign(TransformedClauses.begin(), TransformedClauses.end());
1490 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1494 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1498 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndDeclDirective(
1510 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1518 FuncRef = SemaRef.OpenACC().ActOnRoutineName(FuncRef.
get());
1523 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1527 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndRoutineDeclDirective(
1539 NamespaceAliasDecl *Inst
1547 Owner->addDecl(Inst);
1557 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1561 TSI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
1572 if (SemaRef.getPreprocessor().NeedsStdLibCxxWorkaroundBefore(2014'04'22)) {
1573 const DecltypeType *DT = TSI->
getType()->
getAs<DecltypeType>();
1576 DT->isReferenceType() &&
1577 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
1578 RD->getIdentifier() && RD->getIdentifier()->isStr(
"common_type") &&
1580 SemaRef.getSourceManager().isInSystemHeader(D->
getBeginLoc()))
1582 TSI = SemaRef.Context.getTrivialTypeSourceInfo(
1600 TagDecl *oldTag = oldTagType->getDecl();
1617 SemaRef.isIncompatibleTypedef(InstPrevTypedef,
Typedef);
1619 Typedef->setPreviousDecl(InstPrevTypedef);
1622 SemaRef.InstantiateAttrs(TemplateArgs, D,
Typedef);
1625 SemaRef.inferGslPointerAttribute(
Typedef);
1674 if (!
Found.empty()) {
1675 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1688 if (PrevAliasTemplate)
1693 if (!PrevAliasTemplate)
1720 SmallVector<BindingDecl*, 16> NewBindings;
1721 BindingDecl *OldBindingPack =
nullptr;
1722 for (
auto *OldBD : D->
bindings()) {
1723 Expr *BindingExpr = OldBD->getBinding();
1724 if (isa_and_present<FunctionParmPackExpr>(BindingExpr)) {
1726 assert(!OldBindingPack &&
"no more than one pack is allowed");
1727 OldBindingPack = OldBD;
1731 ArrayRef<BindingDecl*> NewBindingArray = NewBindings;
1733 auto *NewDD = cast_if_present<DecompositionDecl>(
1736 if (!NewDD || NewDD->isInvalidDecl()) {
1737 for (
auto *NewBD : NewBindings)
1738 NewBD->setInvalidDecl();
1739 }
else if (OldBindingPack) {
1742 BindingDecl *NewBindingPack = *llvm::find_if(
1744 assert(NewBindingPack !=
nullptr &&
"new bindings should also have a pack");
1745 llvm::ArrayRef<BindingDecl *> OldDecls =
1747 llvm::ArrayRef<BindingDecl *> NewDecls =
1749 assert(OldDecls.size() == NewDecls.size());
1750 for (
unsigned I = 0; I < OldDecls.size(); I++)
1751 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldDecls[I],
1763 bool InstantiatingVarTemplate,
1774 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
1807 StartingScope, InstantiatingVarTemplate);
1810 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1811 RT = F->getReturnType();
1816 llvm_unreachable(
"Unknown context type");
1837 SemaRef.CheckStaticLocalForDllExport(Var);
1840 SemaRef.CheckThreadLocalForLargeAlignment(Var);
1842 if (SemaRef.getLangOpts().OpenACC)
1843 SemaRef.OpenACC().ActOnVariableDeclarator(Var);
1852 Owner->addHiddenDecl(AD);
1856Decl *TemplateDeclInstantiator::VisitFieldDecl(
FieldDecl *D) {
1861 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1873 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1884 else if (BitWidth) {
1890 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
1895 BitWidth = InstantiatedBitWidth.
getAs<Expr>();
1898 FieldDecl *
Field = SemaRef.CheckFieldDecl(
1907 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
1909 if (
Field->hasAttrs())
1910 SemaRef.CheckAlignasUnderalignment(Field);
1913 Field->setInvalidDecl();
1915 if (!
Field->getDeclName() ||
Field->isPlaceholderVar(SemaRef.getLangOpts())) {
1917 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
1919 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(
Field->getDeclContext())) {
1920 if (Parent->isAnonymousStructOrUnion() &&
1921 Parent->getRedeclContext()->isFunctionOrMethod())
1922 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
1927 Owner->addDecl(Field);
1937 SemaRef.Diag(D->
getLocation(), diag::err_property_is_variably_modified)
1941 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1953 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1966 SemaRef.InstantiateAttrs(TemplateArgs, D,
Property, LateAttrs,
1979 NamedDecl **NamedChain =
1983 for (
auto *PI : D->
chain()) {
1989 NamedChain[i++] =
Next;
1995 {NamedChain, D->getChainingSize()});
1997 for (
const auto *Attr : D->
attrs())
1998 IndirectField->
addAttr(Attr->clone(SemaRef.Context));
2002 Owner->addDecl(IndirectField);
2003 return IndirectField;
2010 TypeSourceInfo *InstTy;
2019 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2020 SemaRef.collectUnexpandedParameterPacks(Ty->getTypeLoc(), Unexpanded);
2021 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
2023 bool ShouldExpand =
true;
2024 bool RetainExpansion =
false;
2026 if (SemaRef.CheckParameterPacksForExpansion(
2029 ShouldExpand, RetainExpansion, NumExpansions))
2032 assert(!RetainExpansion &&
2033 "should never retain an expansion for a variadic friend decl");
2036 SmallVector<FriendDecl *> Decls;
2037 for (
unsigned I = 0; I != *NumExpansions; I++) {
2038 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
2039 TypeSourceInfo *TSI = SemaRef.SubstType(
2050 Decls.push_back(FD);
2058 InstTy = SemaRef.SubstType(Ty, TemplateArgs, D->
getLocation(),
2073 assert(ND &&
"friend decl must be a decl or a type!");
2080 if (!NewND)
return nullptr;
2099 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
2104 SemaRef.SubstExpr(D->
getMessage(), TemplateArgs);
2105 if (InstantiatedMessageExpr.
isInvalid())
2108 return SemaRef.BuildStaticAssertDeclaration(
2113Decl *TemplateDeclInstantiator::VisitExplicitInstantiationDecl(
2117 llvm_unreachable(
"ExplicitInstantiationDecl should not be instantiated");
2120Decl *TemplateDeclInstantiator::VisitEnumDecl(
EnumDecl *D) {
2121 EnumDecl *PrevDecl =
nullptr;
2123 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2126 if (!Prev)
return nullptr;
2139 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2140 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
2142 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
2143 Enum->setIntegerType(SemaRef.Context.IntTy);
2153 Enum->setIntegerTypeSourceInfo(NewTI);
2163 QualType UnderlyingType =
Enum->getIntegerType();
2164 Enum->setPromotionType(
2165 SemaRef.Context.isPromotableIntegerType(UnderlyingType)
2166 ? SemaRef.Context.getPromotedIntegerType(UnderlyingType)
2170 &&
"Dependent type without type source info");
2175 SemaRef.InstantiateAttrs(TemplateArgs, D,
Enum);
2180 SemaRef.Context.setManglingNumber(
Enum, SemaRef.Context.getManglingNumber(D));
2183 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2184 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Enum, DD);
2187 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2188 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Enum, TND);
2190 Owner->addDecl(
Enum);
2193 if (Def && Def != D) {
2198 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2199 QualType DefnUnderlying =
2200 SemaRef.SubstType(TI->getType(), TemplateArgs,
2201 UnderlyingLoc, DeclarationName());
2203 DefnUnderlying,
true,
Enum);
2218 if (PrevDecl ==
nullptr) {
2219 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Enum);
2229 Enum->startDefinition();
2240 if (
Expr *UninstValue = EC->getInitExpr()) {
2245 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
2250 if (
Value.isInvalid()) {
2256 = SemaRef.CheckEnumConstant(
Enum, LastEnumConst,
2263 Enum->setInvalidDecl();
2267 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
2270 Enum->addDecl(EnumConst);
2271 Enumerators.push_back(EnumConst);
2272 LastEnumConst = EnumConst;
2275 !
Enum->isScoped()) {
2278 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
2283 SemaRef.ActOnEnumBody(
Enum->getLocation(),
Enum->getBraceRange(),
Enum,
2288 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
2293 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
2301 LocalInstantiationScope Scope(SemaRef);
2314 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2320 CXXRecordDecl *PrevDecl =
nullptr;
2321 ClassTemplateDecl *PrevClassTemplate =
nullptr;
2325 if (!
Found.empty()) {
2326 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
2327 if (PrevClassTemplate)
2336 DeclContext *DC = Owner;
2340 SS.
Adopt(QualifierLoc);
2341 DC = SemaRef.computeDeclContext(SS);
2342 if (!DC)
return nullptr;
2344 DC = SemaRef.FindInstantiatedContext(Pattern->
getLocation(),
2353 SemaRef.forRedeclarationInCurContext());
2354 SemaRef.LookupQualifiedName(R, DC);
2356 if (
R.isSingleResult()) {
2357 PrevClassTemplate =
R.getAsSingle<ClassTemplateDecl>();
2358 if (PrevClassTemplate)
2362 if (!PrevClassTemplate && QualifierLoc) {
2363 SemaRef.Diag(Pattern->
getLocation(), diag::err_not_tag_in_scope)
2376 SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, LateAttrs,
2379 ClassTemplateDecl *Inst
2385 assert(!Owner->isDependentContext());
2390 if (PrevClassTemplate) {
2392 const ClassTemplateDecl *MostRecentPrevCT =
2394 TemplateParameterList *PrevParams =
2398 if (!SemaRef.TemplateParameterListsAreEqual(
2405 if (SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
2419 if (!PrevClassTemplate)
2436 Owner->addDecl(Inst);
2438 if (!PrevClassTemplate) {
2442 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
2444 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2445 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2446 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
2453TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
2464 ClassTemplateDecl *InstClassTemplate
2465 = dyn_cast<ClassTemplateDecl>(
Found.front());
2466 if (!InstClassTemplate)
2469 if (ClassTemplatePartialSpecializationDecl *
Result
2478 "Only static data member templates are allowed.");
2482 LocalInstantiationScope Scope(SemaRef);
2489 VarTemplateDecl *PrevVarTemplate =
nullptr;
2494 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2500 if (!VarInst)
return nullptr;
2502 DeclContext *DC = Owner;
2511 if (!PrevVarTemplate)
2519 Owner->addDecl(Inst);
2521 if (!PrevVarTemplate) {
2525 SmallVector<VarTemplatePartialSpecializationDecl *, 1> PartialSpecs;
2527 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2528 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2529 OutOfLineVarPartialSpecs.push_back(
2530 std::make_pair(Inst, PartialSpecs[I]));
2536Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
2539 "Only static data member templates are allowed.");
2545 assert(!
Found.empty() &&
"Instantiation found nothing?");
2547 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2548 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
2550 if (VarTemplatePartialSpecializationDecl *
Result =
2563 LocalInstantiationScope Scope(SemaRef);
2564 Sema::ConstraintEvalRAII<TemplateDeclInstantiator> RAII(*
this);
2571 FunctionDecl *Instantiated =
nullptr;
2572 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->
getTemplatedDecl()))
2585 FunctionTemplateDecl *InstTemplate
2588 assert(InstTemplate &&
2589 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2601 Owner->addDecl(InstTemplate);
2604 SemaRef.CheckFriendAccess(InstTemplate);
2607 return InstTemplate;
2611 CXXRecordDecl *PrevDecl =
nullptr;
2613 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2616 if (!Prev)
return nullptr;
2620 CXXRecordDecl *
Record =
nullptr;
2638 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D,
Record, LateAttrs,
2646 if (!IsInjectedClassName)
2652 Record->setObjectOfFriendDecl();
2656 Record->setAnonymousStructOrUnion(
true);
2659 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Record);
2662 SemaRef.Context.setManglingNumber(
Record,
2663 SemaRef.Context.getManglingNumber(D));
2667 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2668 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Record, DD);
2672 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2673 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Record, TND);
2680 Sema::LocalEagerInstantiationScope LocalInstantiations(SemaRef,
2695 LocalInstantiations.perform();
2698 SemaRef.DiagnoseUnusedNestedTypedefs(
Record);
2700 if (IsInjectedClassName)
2701 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2719 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2724 return Context.getFunctionType(NewFunc->getReturnType(),
2725 NewFunc->getParamTypes(), NewEPI);
2749 if (isFriend && Source->wasThisDeclarationADefinition(D)) {
2761 void *InsertPos =
nullptr;
2770 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2771 Owner->isFunctionOrMethod() ||
2773 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2777 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2778 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
2779 TemplateArgs, DGuide->getExplicitSpecifier());
2780 if (InstantiatedExplicitSpecifier.
isInvalid())
2790 if (TemplateParams && TemplateParams->
size()) {
2792 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2793 if (LastParam && LastParam->isImplicit() &&
2794 LastParam->hasTypeConstraint()) {
2809 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2823 SemaRef.adjustContextForLocalExternDecl(DC);
2824 }
else if (isFriend && QualifierLoc) {
2826 SS.
Adopt(QualifierLoc);
2827 DC = SemaRef.computeDeclContext(SS);
2828 if (!DC)
return nullptr;
2835 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
2841 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2844 InstantiatedExplicitSpecifier, NameInfo, T, TInfo,
2846 DGuide->getDeductionCandidateKind(), TrailingRequiresClause,
2847 DGuide->getSourceDeductionGuide(),
2848 DGuide->getSourceDeductionGuideKind());
2855 TrailingRequiresClause);
2856 Function->setFriendConstraintRefersToEnclosingTemplate(
2865 Function->setQualifierInfo(QualifierLoc);
2876 LexicalDC = SemaRef.CurContext;
2880 Function->setIsTypeAwareOperatorNewOrDelete(
2882 Function->setLexicalDeclContext(LexicalDC);
2885 for (
unsigned P = 0; P < Params.size(); ++P)
2887 Params[P]->setOwningFunction(
Function);
2890 if (TrailingRequiresClause)
2891 Function->setTrailingRequiresClause(TrailingRequiresClause);
2893 if (TemplateParams) {
2921 SemaRef.CodeSynthesisContexts.back().Kind !=
2935 }
else if (!isFriend) {
2939 Function->setInstantiatedFromDecl(D);
2946 FT->setObjectOfFriendDecl();
2952 bool IsExplicitSpecialization =
false;
2959 : SemaRef.forRedeclarationInCurContext());
2963 assert(isFriend &&
"dependent specialization info on "
2964 "non-member non-friend function?");
2968 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2969 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2970 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2971 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
2979 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
2985 if (SemaRef.CheckFunctionTemplateSpecialization(
2987 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2991 IsExplicitSpecialization =
true;
2995 SemaRef.LookupQualifiedName(
Previous, DC);
2999 ArgsWritten->getRAngleLoc());
3000 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3004 if (SemaRef.CheckFunctionTemplateSpecialization(
Function,
3009 IsExplicitSpecialization =
true;
3026 if (isFriend && !QualifierLoc) {
3027 SemaRef.FilterLookupForScope(
Previous, DC,
nullptr,
3046 if (
Function->isLocalExternDecl()) {
3048 if (!PVD->hasDefaultArg())
3050 if (SemaRef.SubstDefaultArgument(D->
getInnerLocStart(), PVD, TemplateArgs)) {
3054 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
3055 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3057 { UninstExpr }, UninstExpr->
getType());
3059 PVD->setDefaultArg(ErrorResult.
get());
3065 IsExplicitSpecialization,
3066 Function->isThisDeclarationADefinition());
3073 SemaRef.CheckTemplateParameterList(
3076 Function->isThisDeclarationADefinition()
3087 Function->getMemberSpecializationInfo()) {
3088 if (MSInfo->getPointOfInstantiation().isInvalid()) {
3090 MSInfo->setPointOfInstantiation(Loc);
3091 SemaRef.PendingLocalImplicitInstantiations.emplace_back(
Function, Loc);
3129 void *InsertPos =
nullptr;
3144 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
3146 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
3150 SemaRef, D, TemplateArgs,
Scope);
3155 if (isFriend && !TPLs.empty()) {
3156 TempParamLists.resize(TPLs.size());
3157 for (
unsigned I = 0; I != TPLs.size(); ++I) {
3161 TempParamLists[I] = InstParams;
3167 const bool CouldInstantiate =
3168 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
3169 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
3173 if (CouldInstantiate ||
3174 SemaRef.CodeSynthesisContexts.back().Kind !=
3176 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
3177 TemplateArgs, InstantiatedExplicitSpecifier);
3179 if (InstantiatedExplicitSpecifier.isInvalid())
3194 SemaRef.Context.getTrivialTypeSourceInfo(D->
getType());
3204 if (TemplateParams && TemplateParams->
size()) {
3206 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
3207 if (LastParam && LastParam->isImplicit() &&
3208 LastParam->hasTypeConstraint()) {
3223 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
3233 SS.
Adopt(QualifierLoc);
3234 DC = SemaRef.computeDeclContext(SS);
3236 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
3239 DC = SemaRef.FindInstantiatedContext(D->
getLocation(),
3243 if (!DC)
return nullptr;
3250 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
3261 SemaRef.Context,
Record, StartLoc, NameInfo, T, TInfo,
3262 InstantiatedExplicitSpecifier,
Constructor->UsesFPIntrin(),
3265 TrailingRequiresClause);
3269 SemaRef.Context,
Record, StartLoc, NameInfo, T, TInfo,
3271 Destructor->getConstexprKind(), TrailingRequiresClause);
3272 Method->setIneligibleOrNotSelected(
true);
3274 Method->setDeclName(SemaRef.Context.DeclarationNames.getCXXDestructorName(
3276 SemaRef.Context.getCanonicalTagType(
Record)));
3279 SemaRef.Context,
Record, StartLoc, NameInfo, T, TInfo,
3280 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
3281 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
3282 Conversion->getEndLoc(), TrailingRequiresClause);
3286 SemaRef.Context,
Record, StartLoc, NameInfo, T, TInfo, SC,
3288 D->
getEndLoc(), TrailingRequiresClause);
3292 Method->setImplicitlyInline();
3295 Method->setQualifierInfo(QualifierLoc);
3297 if (TemplateParams) {
3337 if (!TempParamLists.empty())
3338 Method->setTemplateParameterListsInfo(SemaRef.Context, TempParamLists);
3340 Method->setLexicalDeclContext(Owner);
3341 Method->setObjectOfFriendDecl();
3346 for (
unsigned P = 0; P < Params.size(); ++P)
3347 Params[P]->setOwningFunction(
Method);
3348 Method->setParams(Params);
3351 Method->setInvalidDecl();
3356 bool IsExplicitSpecialization =
false;
3364 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3365 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3366 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3367 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3375 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3381 if (SemaRef.CheckFunctionTemplateSpecialization(
3382 Method, DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3384 Method->setInvalidDecl();
3386 IsExplicitSpecialization =
true;
3389 SemaRef.LookupQualifiedName(
Previous, DC);
3392 ArgsWritten->getRAngleLoc());
3394 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3398 if (SemaRef.CheckFunctionTemplateSpecialization(
Method,
3401 Method->setInvalidDecl();
3403 IsExplicitSpecialization =
true;
3431 for (
unsigned P = 0; P < Params.size(); ++P) {
3432 if (!Params[P]->hasDefaultArg())
3434 if (SemaRef.SubstDefaultArgument(StartLoc, Params[P], TemplateArgs)) {
3438 Expr *UninstExpr = Params[P]->getUninstantiatedDefaultArg();
3439 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3441 { UninstExpr }, UninstExpr->
getType());
3443 Params[P]->setDefaultArg(ErrorResult.
get());
3449 IsExplicitSpecialization,
3450 Method->isThisDeclarationADefinition());
3458 if (isFriend &&
Method->getPreviousDecl())
3459 Method->setAccess(
Method->getPreviousDecl()->getAccess());
3465 SemaRef.CheckOverrideControl(
Method);
3479 if (IsExplicitSpecialization && !isFriend)
3492 Method->setIneligibleOrNotSelected(
true);
3493 }
else if (
Method->isCopyAssignmentOperator() ||
3494 Method->isMoveAssignmentOperator()) {
3495 Method->setIneligibleOrNotSelected(
true);
3507 }
else if (isFriend) {
3511 SemaRef.CheckFriendAccess(
Method);
3524 if (
Method->hasAttr<UsedAttr>()) {
3525 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
3528 A->getMemberSpecializationInfo())
3529 Loc = MSInfo->getPointOfInstantiation();
3530 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
3531 Loc = Spec->getPointOfInstantiation();
3532 SemaRef.MarkFunctionReferenced(Loc,
Method);
3552 return SemaRef.SubstParmVarDecl(D, TemplateArgs, 0,
3557Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
3565 assert(TC->getTemplateArgsAsWritten() &&
3566 "type parameter can only be an expansion when explicit arguments "
3571 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3572 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
3573 SemaRef.collectUnexpandedParameterPacks(ArgLoc, Unexpanded);
3578 bool RetainExpansion =
false;
3579 if (SemaRef.CheckParameterPacksForExpansion(
3582 SourceRange(TC->getConceptNameLoc(),
3583 TC->hasExplicitTemplateArgs()
3584 ? TC->getTemplateArgsAsWritten()->getRAngleLoc()
3585 : TC->getConceptNameInfo().getEndLoc()),
3586 Unexpanded, TemplateArgs,
true,
3587 Expand, RetainExpansion, NumExpanded))
3605 if (SemaRef.SubstTypeConstraint(Inst, TC, TemplateArgs,
3606 EvaluateConstraints))
3611 TemplateArgumentLoc Output;
3619 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
3624Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3628 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
3629 SmallVector<QualType, 4> ExpandedParameterPackTypes;
3630 bool IsExpandedParameterPack =
false;
3631 TypeSourceInfo *TSI;
3641 TypeSourceInfo *NewTSI =
3648 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3652 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3653 ExpandedParameterPackTypes.push_back(NewT);
3656 IsExpandedParameterPack =
true;
3663 PackExpansionTypeLoc Expansion = TL.
castAs<PackExpansionTypeLoc>();
3665 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3666 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3671 bool RetainExpansion =
false;
3675 if (SemaRef.CheckParameterPacksForExpansion(
3676 Expansion.
getEllipsisLoc(), Pattern.getSourceRange(), Unexpanded,
3677 TemplateArgs,
true, Expand,
3678 RetainExpansion, NumExpansions))
3682 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3683 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3684 TypeSourceInfo *NewTSI = SemaRef.SubstType(
3690 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3694 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3695 ExpandedParameterPackTypes.push_back(NewT);
3701 IsExpandedParameterPack =
true;
3707 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3708 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
3714 SemaRef.CheckNonTypeTemplateParameterType(NewPattern, D->
getLocation());
3715 TSI = SemaRef.CheckPackExpansion(NewPattern, Expansion.
getEllipsisLoc(),
3730 T = SemaRef.CheckNonTypeTemplateParameterType(TSI, D->
getLocation());
3732 T = SemaRef.Context.IntTy;
3737 NonTypeTemplateParmDecl *Param;
3738 if (IsExpandedParameterPack)
3741 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3743 ExpandedParameterPackTypes, ExpandedParameterPackTypesAsWritten);
3747 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3751 if (AutoLoc.isConstrained()) {
3752 SourceLocation EllipsisLoc;
3753 if (IsExpandedParameterPack)
3756 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
3758 EllipsisLoc = Constraint->getEllipsisLoc();
3762 if (SemaRef.AttachTypeConstraint(AutoLoc, Param,
3773 EnterExpressionEvaluationContext ConstantEvaluated(
3775 TemplateArgumentLoc
Result;
3783 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3791 for (
const auto &P : *Params) {
3792 if (P->isTemplateParameterPack())
3804TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
3808 TemplateParameterList *InstParams;
3809 SmallVector<TemplateParameterList*, 8> ExpandedParams;
3811 bool IsExpandedParameterPack =
false;
3820 LocalInstantiationScope Scope(SemaRef,
true);
3821 TemplateParameterList *Expansion =
3825 ExpandedParams.push_back(Expansion);
3828 IsExpandedParameterPack =
true;
3829 InstParams = TempParams;
3834 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3841 bool RetainExpansion =
false;
3843 if (SemaRef.CheckParameterPacksForExpansion(
3845 TemplateArgs,
true, Expand,
3846 RetainExpansion, NumExpansions))
3850 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3851 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3852 LocalInstantiationScope Scope(SemaRef,
true);
3856 ExpandedParams.push_back(Expansion);
3862 IsExpandedParameterPack =
true;
3865 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3867 LocalInstantiationScope Scope(SemaRef,
true);
3874 LocalInstantiationScope Scope(SemaRef,
true);
3881 TemplateTemplateParmDecl *Param;
3882 if (IsExpandedParameterPack)
3885 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3891 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3904 TemplateArgumentLoc(SemaRef.Context, TemplateArgument(TName),
3913 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3922 UsingDirectiveDecl *Inst
3932 if (!Owner->isFunctionOrMethod())
3933 Owner->addDecl(Inst);
3942 bool isFunctionScope = Owner->isFunctionOrMethod();
3944 for (
auto *Shadow : D->
shadows()) {
3948 NamedDecl *OldTarget = Shadow->getTargetDecl();
3949 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
3950 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
3951 OldTarget = BaseShadow;
3955 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
3957 SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
3959 InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
3960 Shadow->getLocation(), OldTarget, TemplateArgs));
3967 SemaRef.CheckUsingShadowDecl(Inst, InstTarget, *Lookup, PrevDecl))
3971 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
3972 Shadow->getLocation(), OldPrev, TemplateArgs));
3975 nullptr, Inst, InstTarget, PrevDecl);
3976 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
3978 if (isFunctionScope)
3979 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
3985Decl *TemplateDeclInstantiator::VisitUsingDecl(
UsingDecl *D) {
4006 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
4012 bool CheckRedeclaration = Owner->
isRecord();
4023 SS.
Adopt(QualifierLoc);
4024 if (CheckRedeclaration) {
4025 Prev.setHideTags(
false);
4058 EnumDecl *EnumD = cast_or_null<EnumDecl>(SemaRef.FindInstantiatedDecl(
4061 if (SemaRef.RequireCompleteEnumDecl(EnumD, EnumD->
getLocation()))
4064 TypeSourceInfo *TSI = SemaRef.SubstType(D->
getEnumType(), TemplateArgs,
4070 UsingEnumDecl *NewUD =
4074 SemaRef.Context.setInstantiatedFromUsingEnumDecl(NewUD, D);
4076 Owner->addDecl(NewUD);
4094Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
4100template <
typename T>
4101Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
4102 T *D,
bool InstantiatingPackElement) {
4104 if (D->isPackExpansion() && !InstantiatingPackElement) {
4105 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4106 SemaRef.collectUnexpandedParameterPacks(D->getQualifierLoc(), Unexpanded);
4107 SemaRef.collectUnexpandedParameterPacks(D->getNameInfo(), Unexpanded);
4112 bool RetainExpansion =
false;
4114 if (SemaRef.CheckParameterPacksForExpansion(
4115 D->getEllipsisLoc(), D->getSourceRange(), Unexpanded, TemplateArgs,
4116 true, Expand, RetainExpansion,
4122 assert(!RetainExpansion &&
4123 "should never need to retain an expansion for UsingPackDecl");
4128 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
4129 return instantiateUnresolvedUsingDecl(D,
true);
4139 if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {
4140 SemaRef.Diag(D->getEllipsisLoc(),
4141 diag::err_using_decl_redeclaration_expansion);
4146 SmallVector<NamedDecl*, 8> Expansions;
4147 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4148 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
4149 Decl *Slice = instantiateUnresolvedUsingDecl(D,
true);
4159 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4161 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4165 UnresolvedUsingTypenameDecl *TD = dyn_cast<UnresolvedUsingTypenameDecl>(D);
4166 SourceLocation TypenameLoc = TD ? TD->
getTypenameLoc() : SourceLocation();
4168 NestedNameSpecifierLoc QualifierLoc
4169 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
4175 SS.
Adopt(QualifierLoc);
4177 DeclarationNameInfo NameInfo
4178 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
4182 bool InstantiatingSlice =
4183 D->getEllipsisLoc().isValid() && SemaRef.ArgPackSubstIndex;
4184 SourceLocation EllipsisLoc =
4185 InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
4188 NamedDecl *UD = SemaRef.BuildUsingDeclaration(
4189 nullptr, D->getAccess(), D->getUsingLoc(),
4190 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
4191 ParsedAttributesView(),
4192 true, IsUsingIfExists);
4194 SemaRef.InstantiateAttrs(TemplateArgs, D, UD);
4195 SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
4201Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
4203 return instantiateUnresolvedUsingDecl(D);
4206Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
4208 return instantiateUnresolvedUsingDecl(D);
4211Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
4213 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
4217 SmallVector<NamedDecl*, 8> Expansions;
4219 if (NamedDecl *NewUD =
4220 SemaRef.FindInstantiatedDecl(D->
getLocation(), UD, TemplateArgs))
4221 Expansions.push_back(NewUD);
4226 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4228 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4232Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
4234 SmallVector<Expr *, 5> Vars;
4235 for (
auto *I : D->
varlist()) {
4236 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4238 Vars.push_back(Var);
4241 OMPThreadPrivateDecl *TD =
4242 SemaRef.OpenMP().CheckOMPThreadPrivateDecl(D->
getLocation(), Vars);
4252 SmallVector<Expr *, 5> Vars;
4253 for (
auto *I : D->
varlist()) {
4254 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4256 Vars.push_back(Var);
4259 OMPGroupPrivateDecl *TD =
4260 SemaRef.OpenMP().CheckOMPGroupPrivateDecl(D->
getLocation(), Vars);
4269 SmallVector<Expr *, 5> Vars;
4270 for (
auto *I : D->
varlist()) {
4271 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4273 Vars.push_back(Var);
4275 SmallVector<OMPClause *, 4> Clauses;
4278 OMPClause *IC =
nullptr;
4279 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
4280 ExprResult NewE = SemaRef.SubstExpr(AC->getAllocator(), TemplateArgs);
4283 IC = SemaRef.OpenMP().ActOnOpenMPAllocatorClause(
4284 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4285 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
4286 ExprResult NewE = SemaRef.SubstExpr(AC->getAlignment(), TemplateArgs);
4289 IC = SemaRef.OpenMP().ActOnOpenMPAlignClause(
4290 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4295 Clauses.push_back(IC);
4307 "Requires directive cannot be instantiated within a dependent context");
4310Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
4313 const bool RequiresInstantiation =
4317 QualType SubstReductionType;
4318 if (RequiresInstantiation) {
4319 SubstReductionType = SemaRef.OpenMP().ActOnOpenMPDeclareReductionType(
4324 SubstReductionType = D->
getType();
4326 if (SubstReductionType.
isNull())
4330 bool IsCorrect =
true;
4332 std::pair<QualType, SourceLocation> ReductionTypes[] = {
4333 std::make_pair(SubstReductionType, D->
getLocation())};
4335 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4337 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4340 auto DRD = SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveStart(
4344 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDRD);
4345 Expr *SubstCombiner =
nullptr;
4346 Expr *SubstInitializer =
nullptr;
4349 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerStart(
4351 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4354 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4357 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4358 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4360 SubstCombiner = SemaRef.SubstExpr(Combiner, TemplateArgs).get();
4361 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerEnd(NewDRD,
4366 VarDecl *OmpPrivParm =
4367 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerStart(
4369 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4372 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4376 SubstInitializer = SemaRef.SubstExpr(
Init, TemplateArgs).get();
4380 IsCorrect = IsCorrect && OldPrivParm->hasInit();
4382 SemaRef.InstantiateVariableInitializer(OmpPrivParm, OldPrivParm,
4385 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerEnd(
4386 NewDRD, SubstInitializer, OmpPrivParm);
4388 IsCorrect = IsCorrect && SubstCombiner &&
4391 SubstInitializer) ||
4393 !SubstInitializer));
4395 (void)SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveEnd(
4404 const bool RequiresInstantiation =
4408 QualType SubstMapperTy;
4410 if (RequiresInstantiation) {
4411 SubstMapperTy = SemaRef.OpenMP().ActOnOpenMPDeclareMapperType(
4418 if (SubstMapperTy.
isNull())
4422 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4424 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4427 bool IsCorrect =
true;
4428 SmallVector<OMPClause *, 6> Clauses;
4430 DeclarationNameInfo DirName;
4431 SemaRef.OpenMP().StartOpenMPDSABlock(llvm::omp::OMPD_declare_mapper, DirName,
4435 SemaRef.OpenMP().ActOnOpenMPDeclareMapperDirectiveVarDecl(
4437 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4440 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4441 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4446 SmallVector<Expr *, 4> NewVars;
4447 for (Expr *OE : OldC->varlist()) {
4448 Expr *
NE = SemaRef.SubstExpr(OE, TemplateArgs).get();
4453 NewVars.push_back(NE);
4457 NestedNameSpecifierLoc NewQualifierLoc =
4458 SemaRef.SubstNestedNameSpecifierLoc(OldC->getMapperQualifierLoc(),
4461 SS.
Adopt(NewQualifierLoc);
4462 DeclarationNameInfo NewNameInfo =
4463 SemaRef.SubstDeclarationNameInfo(OldC->getMapperIdInfo(), TemplateArgs);
4464 OMPVarListLocTy Locs(OldC->getBeginLoc(), OldC->getLParenLoc(),
4466 OMPClause *NewC = SemaRef.OpenMP().ActOnOpenMPMapClause(
4467 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
4468 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
4469 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
4471 Clauses.push_back(NewC);
4473 SemaRef.OpenMP().EndOpenMPDSABlock(
nullptr);
4478 VN, D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
4480 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDMD);
4484Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
4486 llvm_unreachable(
"Should not be met in templates");
4497 Owner->addDecl(Inst);
4506 llvm_unreachable(
"There are only CXXRecordDecls in C++");
4510TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
4517 "can only instantiate an explicit specialization "
4518 "for a member class template");
4522 ClassTemplateDecl *InstClassTemplate =
4523 cast_or_null<ClassTemplateDecl>(SemaRef.FindInstantiatedDecl(
4525 if (!InstClassTemplate)
4530 TemplateArgumentListInfo InstTemplateArgs;
4531 if (
const ASTTemplateArgumentListInfo *TemplateArgsInfo =
4533 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4534 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4536 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4537 TemplateArgs, InstTemplateArgs))
4543 Sema::CheckTemplateArgumentInfo CTAI;
4544 if (SemaRef.CheckTemplateArgumentList(
4545 InstClassTemplate, D->
getLocation(), InstTemplateArgs,
4552 void *InsertPos =
nullptr;
4553 ClassTemplateSpecializationDecl *PrevDecl =
4560 SemaRef.CheckSpecializationInstantiationRedecl(D->
getLocation(),
4582 SemaRef.Diag(D->
getLocation(), diag::err_redefinition) << PrevDecl;
4584 diag::note_previous_definition);
4589 ClassTemplateSpecializationDecl *InstD =
4611 Owner->addDecl(InstD);
4618 SemaRef.InstantiateClass(D->
getLocation(), InstD, D, TemplateArgs,
4632 "A template specialization without specialized template?");
4635 cast_or_null<VarTemplateDecl>(SemaRef.FindInstantiatedDecl(
4637 if (!InstVarTemplate)
4643 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4644 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4646 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4647 TemplateArgs, VarTemplateArgsInfo))
4653 if (SemaRef.CheckTemplateArgumentList(
4654 InstVarTemplate, D->
getLocation(), VarTemplateArgsInfo,
4660 void *InsertPos =
nullptr;
4667 if (PrevDecl && SemaRef.CheckSpecializationInstantiationRedecl(
4675 VTSD->setTemplateArgsAsWritten(VarTemplateArgsInfo);
4695 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
4705 void *InsertPos =
nullptr;
4706 VarTemplate->findSpecialization(Converted, InsertPos);
4710 if (SemaRef.getLangOpts().OpenCL)
4711 SemaRef.deduceOpenCLAddressSpace(Var);
4717 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
4718 StartingScope,
false, PrevDecl);
4724 llvm_unreachable(
"@defs is not supported in Objective-C++");
4729 unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
4731 "cannot instantiate %0 yet");
4739 llvm_unreachable(
"Concept definitions cannot reside inside a template");
4742Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
4744 llvm_unreachable(
"Concept specializations cannot reside inside a template");
4754 llvm_unreachable(
"Unexpected decl");
4765 SubstD = Instantiator.Visit(D);
4779 T = SemaRef.Context.getFunctionType(
4780 SemaRef.Context.BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
4789 SemaRef.Context.getTrivialTypeSourceInfo(T, Orig->
getEndLoc());
4791 assert(OldLoc &&
"type of function is not a function type?");
4793 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
4794 NewLoc.
setParam(I, OldLoc.getParam(I));
4799 SemaRef.Context.DeclarationNames.getCXXOperatorName(OO_EqualEqual));
4804 if (Spaceship->isInvalidDecl())
4816 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
4821 assert(Spaceship->getFriendObjectKind() &&
4822 "defaulted spaceship is neither a member nor a friend");
4836 return cast_or_null<FunctionDecl>(R);
4850 unsigned N = L->
size();
4854 for (
auto &P : *L) {
4856 Params.push_back(D);
4876 bool EvaluateConstraints) {
4915 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
4922 if (SemaRef.CheckTemplateArgumentList(
4923 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
4929 if (SemaRef.CheckTemplatePartialSpecializationArgs(
4936 void *InsertPos =
nullptr;
4939 InstParams, InsertPos);
4944 SemaRef.Context, PartialSpec->
getTagKind(), Owner,
4975 diag::err_partial_spec_redeclared)
4977 SemaRef.Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
4978 << SemaRef.Context.getCanonicalTagType(PrevDecl);
4983 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
4989 return InstPartialSpec;
5025 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
5033 InstTemplateArgs, {},
5038 if (SemaRef.CheckTemplatePartialSpecializationArgs(
5045 void *InsertPos =
nullptr;
5048 InstParams, InsertPos);
5059 diag::err_variable_instantiates_to_function)
5096 diag::err_var_partial_spec_redeclared)
5099 diag::note_var_prev_partial_spec_here);
5103 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5107 VarTemplate->AddPartialSpecialization(InstPartialSpec,
nullptr);
5109 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
5110 LateAttrs, Owner, StartingScope);
5112 return InstPartialSpec;
5119 assert(OldTInfo &&
"substituting function without type source info");
5120 assert(Params.empty() &&
"parameter vector is non-empty at start");
5126 ThisTypeQuals =
Method->getFunctionObjectParameterType().getQualifiers();
5131 ThisContext, ThisTypeQuals, EvaluateConstraints);
5137 if (NewTInfo != OldTInfo) {
5141 unsigned NewIdx = 0;
5142 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
5143 OldIdx != NumOldParams; ++OldIdx) {
5144 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
5152 NumArgumentsInExpansion =
5153 SemaRef.getNumArgumentsInExpansion(OldParam->
getType(),
5155 if (!NumArgumentsInExpansion) {
5159 Params.push_back(NewParam);
5160 Scope->InstantiatedLocal(OldParam, NewParam);
5163 Scope->MakeInstantiatedLocalArgPack(OldParam);
5164 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
5166 Params.push_back(NewParam);
5167 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
5177 for (
unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
5181 Params.push_back(SemaRef.BuildParmVarDeclForTypedef(
5187 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
5190 Params.push_back(Parm);
5207 TemplateArgs, ParamTypes, &Params,
5220 for (
auto *
decl : PatternDecl->
decls()) {
5227 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
5228 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
5229 return InstVD && InstVD->isLocalVarDecl() &&
5230 InstVD->getIdentifier() == II;
5236 Scope.InstantiatedLocal(VD, *it);
5243bool Sema::addInstantiatedParametersToScope(
5247 unsigned FParamIdx = 0;
5248 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
5249 const ParmVarDecl *PatternParam = PatternDecl->
getParamDecl(I);
5252 assert(FParamIdx < Function->getNumParams());
5279 if (NumArgumentsInExpansion) {
5280 QualType PatternType =
5281 PatternParam->
getType()->
castAs<PackExpansionType>()->getPattern();
5282 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
5286 Sema::ArgPackSubstIndexRAII SubstIndex(*
this, Arg);
5306 assert(Param->hasUninstantiatedDefaultArg());
5338 false, std::nullopt,
5347 L->DefaultArgumentInstantiated(Param);
5360 if (AlreadyInstantiating) {
5363 Diag(PointOfInstantiation, diag::err_exception_spec_cycle) <<
Decl;
5385 false, std::nullopt,
5418 SemaRef.Context.setManglingNumber(
New,
5419 SemaRef.Context.getManglingNumber(Tmpl));
5432 ActiveInstType &ActiveInst = SemaRef.CodeSynthesisContexts.back();
5433 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
5434 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
5436 SemaRef.CurrentSFINAEContext =
nullptr;
5437 atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef, ActiveInst);
5438 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
5439 ActiveInst.Entity =
New;
5445 assert(Proto &&
"Function template without prototype?");
5454 if (SemaRef.getLangOpts().CPlusPlus11 &&
5469 assert(NewProto &&
"Template instantiation without function prototype?");
5474 New->setType(SemaRef.Context.getFunctionType(
5478 SemaRef.SubstExceptionSpec(
New, Proto, TemplateArgs);
5487 LateAttrs, StartingScope);
5489 SemaRef.inferLifetimeBoundAttribute(
New);
5510 New->setVirtualAsWritten(
true);
5521 Lookups.reserve(DFI->getUnqualifiedLookups().size());
5522 bool AnyChanged =
false;
5524 NamedDecl *D = SemaRef.FindInstantiatedDecl(
New->getLocation(),
5525 DA.getDecl(), TemplateArgs);
5528 AnyChanged |= (D != DA.getDecl());
5534 New->setDefaultedOrDeletedInfo(
5536 SemaRef.Context, Lookups)
5563 bool DefinitionRequired,
5571 Function->getTemplateSpecializationKindForInstantiation();
5578 !DefinitionRequired)
5583 if (
Function->isDefined(ExistingDefn,
5598 assert(!AlreadyInstantiating &&
"should have been caught by caller");
5603 assert(PatternDecl &&
"instantiating a non-template");
5606 Stmt *Pattern =
nullptr;
5608 Pattern = PatternDef->
getBody(PatternDef);
5609 PatternDecl = PatternDef;
5611 PatternDef =
nullptr;
5615 bool Unreachable =
false;
5620 Function->getInstantiatedFromMemberFunction(), PatternDecl,
5622 DefinitionRequired, &Unreachable)) {
5623 if (DefinitionRequired)
5626 (
Function->isConstexpr() && !Recursive)) {
5630 Function->setInstantiationIsPending(
true);
5633 if (llvm::isTimeTraceVerbose()) {
5634 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
5636 llvm::raw_string_ostream
OS(Name);
5645 Diag(PointOfInstantiation, diag::warn_func_template_missing)
5651 diag::note_unreachable_template_decl);
5655 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
5667 Function->setInstantiationIsPending(
true);
5669 std::make_pair(
Function, PointOfInstantiation));
5673 llvm::TimeTraceScope TimeScope(
"InstantiateFunction", [&]() {
5674 llvm::TimeTraceMetadata M;
5675 llvm::raw_string_ostream
OS(M.Detail);
5678 if (llvm::isTimeTraceVerbose()) {
5681 M.Line =
SourceMgr.getExpansionLineNumber(Loc);
5707 "missing LateParsedTemplate");
5709 Pattern = PatternDecl->
getBody(PatternDecl);
5716 "unexpected kind of function template definition");
5731 for (
auto *D =
Function->getMostRecentDecl(); ;
5733 D->setImplicitlyInline();
5744 "instantiating function definition");
5748 Function->setVisibleDespiteOwningModule();
5774 auto NameLocPointsToPattern = [&] {
5785 return PatternNameLoc;
5795 return PatternNameLoc;
5803 assert(PatternTSI &&
"Pattern is supposed to have an associated TSI");
5811 Function->setDeclarationNameLoc(NameLocPointsToPattern());
5819 ThisContext =
Method->getParent();
5820 ThisTypeQuals =
Method->getMethodQualifiers();
5830 bool MergeWithParentScope =
false;
5832 MergeWithParentScope =
5833 Rec->isLocalClass() && !
Function->isFunctionTemplateSpecialization();
5836 auto RebuildTypeSourceInfoForDefaultSpecialMembers = [&]() {
5842 "Special member needs to be defaulted");
5850 auto *NewRec = dyn_cast<CXXRecordDecl>(
Function->getDeclContext());
5851 const auto *PatternRec =
5853 if (!NewRec || !PatternRec)
5855 if (!PatternRec->isLambda())
5858 struct SpecialMemberTypeInfoRebuilder
5878 getDerived().TransformDecl(TL.
getNameLoc(), T->getDecl()));
5880 return Base::TransformRecordType(TLB, TL);
5894 } IR{*
this, PatternRec, NewRec};
5897 assert(NewSI &&
"Type Transform failed?");
5899 Function->setTypeSourceInfo(NewSI);
5903 assert(NewParmSI &&
"Type transformation failed.");
5909 RebuildTypeSourceInfoForDefaultSpecialMembers();
5913 std::optional<ArrayRef<TemplateArgument>> Innermost;
5914 if (
auto *Primary =
Function->getPrimaryTemplate();
5917 Function->getTemplateSpecializationKind() !=
5919 auto It = llvm::find_if(Primary->redecls(),
5921 return cast<FunctionTemplateDecl>(RTD)
5922 ->isCompatibleWithDefinition();
5924 assert(It != Primary->redecls().end() &&
5925 "Should't get here without a definition");
5927 ->getTemplatedDecl()
5931 DC = (*It)->getLexicalDeclContext();
5932 Innermost.emplace(
Function->getTemplateSpecializationArgs()->asArray());
5935 Function, DC,
false, Innermost,
false, PatternDecl);
5953 if (addInstantiatedParametersToScope(
Function, PatternDecl,
Scope,
5969 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
5970 Ctor->isDefaultConstructor()) {
5976 Body =
SubstStmt(Pattern, TemplateArgs);
5987 checkReferenceToTULocalFromOtherTU(
Function, PointOfInstantiation);
5993 Listener->FunctionDefinitionInstantiated(
Function);
6003 bool ShouldSkipCG = [&] {
6004 auto *RD = dyn_cast<CXXRecordDecl>(
Function->getParent());
6005 if (!RD || !RD->isLambda())
6009 return Context.isUnevaluated() ||
Context.isImmediateFunctionContext();
6012 if (!ShouldSkipCG) {
6019 LocalInstantiations.
perform();
6021 GlobalInstantiations.perform();
6046 bool IsMemberSpec =
false;
6048 if (
auto *PartialSpec =
6049 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar)) {
6050 assert(PartialSpecArgs);
6051 IsMemberSpec = PartialSpec->isMemberSpecialization();
6053 PartialSpec, PartialSpecArgs->
asArray(),
false);
6056 IsMemberSpec =
VarTemplate->isMemberSpecialization();
6076 "don't have a definition to instantiate from");
6105 bool InstantiatingVarTemplate,
6109 bool InstantiatingVarTemplatePartialSpec =
6114 bool InstantiatingSpecFromTemplate =
6140 if (OldVar->
isUsed(
false))
6165 }
else if (PrevDeclForVarTemplateSpecialization) {
6166 Previous.addDecl(PrevDeclForVarTemplateSpecialization);
6170 if (!InstantiatingVarTemplate) {
6188 !InstantiatingSpecFromTemplate)
6195 dyn_cast<VarTemplateSpecializationDecl>(OldVar)) {
6203 Context.setManglingNumber(NewVar,
Context.getManglingNumber(OldVar));
6204 Context.setStaticLocalNumber(NewVar,
Context.getStaticLocalNumber(OldVar));
6207 if (InstantiatingVarTemplate || InstantiatingVarTemplatePartialSpec) {
6212 }
else if (InstantiatingSpecFromTemplate ||
6234 L->VariableDefinitionInstantiated(Var);
6264 if (!
Init.isInvalid()) {
6267 if (Var->
hasAttr<DLLImportAttr>() &&
6270 }
else if (InitExpr) {
6306 bool DefinitionRequired,
bool AtEndOfTU) {
6318 if (AlreadyInstantiating)
6323 assert(PatternDecl &&
"no pattern for templated variable");
6328 dyn_cast<VarTemplateSpecializationDecl>(Var);
6339 (PatternDecl = PatternDecl->
getFirstDecl())->hasInit() &&
6348 "instantiating variable initializer");
6359 Recursive, AtEndOfTU);
6368 PreviousContext.
pop();
6372 LocalInstantiations.
perform();
6374 GlobalInstantiations.
perform();
6378 "not a static data member?");
6387 if (!Def && !DefinitionRequired) {
6394 Diag(PointOfInstantiation, diag::warn_var_template_missing)
6398 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
6409 PatternDecl, Def, TSK,
6410 DefinitionRequired))
6427 struct PassToConsumerRAII {
6434 ~PassToConsumerRAII() {
6435 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
6437 } PassToConsumerRAII(
Consumer, Var);
6444 PointOfInstantiation);
6453 "instantiating variable definition");
6475 }
else if (!VarSpec) {
6520 PreviousContext.
pop();
6523 PassToConsumerRAII.Var = Var;
6532 LocalInstantiations.
perform();
6534 GlobalInstantiations.
perform();
6546 for (
const auto *
Init : Tmpl->
inits()) {
6549 if (!
Init->isWritten())
6554 if (
Init->isPackExpansion()) {
6556 TypeLoc BaseTL =
Init->getTypeSourceInfo()->getTypeLoc();
6560 bool ShouldExpand =
false;
6561 bool RetainExpansion =
false;
6565 TemplateArgs,
true, ShouldExpand,
6566 RetainExpansion, NumExpansions)) {
6568 New->setInvalidDecl();
6571 assert(ShouldExpand &&
"Partial instantiation of base initializer?");
6574 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6588 Init->getSourceLocation(),
6589 New->getDeclName());
6597 BaseTInfo, TempInit.
get(),
6605 NewInits.push_back(NewInit.
get());
6620 if (
Init->isDelegatingInitializer() ||
Init->isBaseInitializer()) {
6623 Init->getSourceLocation(),
6624 New->getDeclName());
6627 New->setInvalidDecl();
6631 if (
Init->isBaseInitializer())
6633 New->getParent(), EllipsisLoc);
6637 }
else if (
Init->isMemberInitializer()) {
6639 Init->getMemberLocation(),
6644 New->setInvalidDecl();
6649 Init->getSourceLocation());
6650 }
else if (
Init->isIndirectMemberInitializer()) {
6653 Init->getMemberLocation(),
6654 Init->getIndirectMember(), TemplateArgs));
6656 if (!IndirectMember) {
6658 New->setInvalidDecl();
6663 Init->getSourceLocation());
6668 New->setInvalidDecl();
6670 NewInits.push_back(NewInit.
get());
6689 Instance = Instance->getCanonicalDecl();
6690 if (Pattern == Instance)
return true;
6691 Instance = Instance->getInstantiatedFromMemberTemplate();
6702 Instance = Instance->getCanonicalDecl();
6703 if (Pattern == Instance)
return true;
6704 Instance = Instance->getInstantiatedFromMemberTemplate();
6717 Instance->getCanonicalDecl());
6718 if (Pattern == Instance)
6720 Instance = Instance->getInstantiatedFromMember();
6731 Instance = Instance->getCanonicalDecl();
6732 if (Pattern == Instance)
return true;
6733 Instance = Instance->getInstantiatedFromMemberClass();
6744 Instance = Instance->getCanonicalDecl();
6745 if (Pattern == Instance)
return true;
6746 Instance = Instance->getInstantiatedFromMemberFunction();
6757 Instance = Instance->getCanonicalDecl();
6758 if (Pattern == Instance)
return true;
6759 Instance = Instance->getInstantiatedFromMemberEnum();
6786 bool OtherIsPackExpansion;
6788 if (
auto *OtherUUD = dyn_cast<T>(
Other)) {
6789 OtherIsPackExpansion = OtherUUD->isPackExpansion();
6791 }
else if (
auto *OtherUPD = dyn_cast<UsingPackDecl>(
Other)) {
6792 OtherIsPackExpansion =
true;
6793 OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
6794 }
else if (
auto *OtherUD = dyn_cast<UsingDecl>(
Other)) {
6795 OtherIsPackExpansion =
false;
6800 return Pattern->isPackExpansion() == OtherIsPackExpansion &&
6806 assert(Instance->isStaticDataMember());
6811 Instance = Instance->getCanonicalDecl();
6812 if (Pattern == Instance)
return true;
6813 Instance = Instance->getInstantiatedFromStaticDataMember();
6822 if (
auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D))
6825 if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D))
6831 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
Other))
6834 if (
auto *Function = dyn_cast<FunctionDecl>(
Other))
6837 if (
auto *
Enum = dyn_cast<EnumDecl>(
Other))
6840 if (
auto *Var = dyn_cast<VarDecl>(
Other))
6844 if (
auto *Temp = dyn_cast<ClassTemplateDecl>(
Other))
6847 if (
auto *Temp = dyn_cast<FunctionTemplateDecl>(
Other))
6850 if (
auto *PartialSpec =
6851 dyn_cast<ClassTemplatePartialSpecializationDecl>(
Other))
6855 if (
auto *Field = dyn_cast<FieldDecl>(
Other)) {
6856 if (!Field->getDeclName()) {
6863 if (
auto *Using = dyn_cast<UsingDecl>(
Other))
6866 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
Other))
6873template<
typename ForwardIterator>
6876 ForwardIterator first,
6877 ForwardIterator last) {
6878 for (; first != last; ++first)
6887 if (
NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
6889 return cast_or_null<DeclContext>(ID);
6904 return cast<Decl>(DC)->getTemplateDepth() > Level;
6909 bool FindingInstantiatedContext) {
6947 if (
auto *BD = dyn_cast<BindingDecl>(FD);
6955 "found declaration pack but not pack expanding");
6985 bool NeedInstantiate =
false;
6987 NeedInstantiate = RD->isLocalClass();
6990 NeedInstantiate =
true;
6993 if (NeedInstantiate) {
7004 assert(Inst &&
"Failed to instantiate label??");
7011 if (!
Record->isDependentContext())
7020 dyn_cast<ClassTemplateSpecializationDecl>(
Record))
7021 ClassTemplate = Spec->getSpecializedTemplate()->getCanonicalDecl();
7032 if (
CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
7036 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
7056 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD);
7057 if (Guide && Guide->isImplicit()) {
7065 Unpacked = Arg.pack_elements();
7078 if (T.isNull() || T->containsErrors())
7088 assert(
SemaRef.RebuildingImmediateInvocation ||
7101 if (FindingInstantiatedContext &&
7104 Diag(Loc, diag::err_specialization_not_primary_template)
7121 if (!ParentDependsOnArgs)
7135 bool IsBeingInstantiated =
false;
7136 if (
auto *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
7137 if (!Spec->isDependentContext()) {
7138 if (Spec->isEntityBeingDefined())
7139 IsBeingInstantiated =
true;
7141 diag::err_incomplete_type))
7144 ParentDC = Spec->getDefinitionOrSelf();
7183 }
else if (IsBeingInstantiated) {
7189 Diag(Loc, diag::err_member_not_yet_instantiated)
7202 Diag(Loc, diag::err_enumerator_does_not_exist)
7206 <<
Context.getCanonicalTagType(Spec);
7209 llvm_unreachable(
"Unable to find instantiation of declaration!");
7220 std::deque<PendingImplicitInstantiation> DelayedImplicitInstantiations;
7225 bool LocalInstantiation =
false;
7232 LocalInstantiation =
true;
7237 bool DefinitionRequired =
Function->getTemplateSpecializationKind() ==
7242 [
this, Inst, DefinitionRequired, AtEndOfTU](
FunctionDecl *CurFD) {
7244 DefinitionRequired, AtEndOfTU);
7250 DefinitionRequired, AtEndOfTU);
7252 Function->setInstantiationIsPending(
false);
7255 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates &&
7257 DelayedImplicitInstantiations.push_back(Inst);
7258 else if (!AtEndOfTU &&
Function->instantiationIsPending() &&
7259 !LocalInstantiation)
7260 DelayedImplicitInstantiations.push_back(Inst);
7269 "Not a static data member, nor a variable template"
7270 " specialization?");
7282 llvm_unreachable(
"Cannot instantitiate an undeclared specialization.");
7297 "instantiating variable definition");
7304 DefinitionRequired, AtEndOfTU);
7307 if (!DelayedImplicitInstantiations.empty())
7313 for (
auto *DD : Pattern->
ddiags()) {
7314 switch (DD->getKind()) {
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
llvm::MachO::Record Record
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
This file declares semantic analysis for CUDA constructs.
static const NamedDecl * getDefinition(const Decl *D)
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 instantiateDependentCUDAClusterDimsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const CUDAClusterDimsAttr &Attr, Decl *New)
static void sharedInstantiateConstructorDestructorAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Decl *New, ASTContext &C)
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 void instantiateDependentReqdWorkGroupSizeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const ReqdWorkGroupSizeAttr &Attr, Decl *New)
#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME)
static void instantiateDependentMallocSpanAttr(Sema &S, const MallocSpanAttr *Attr, Decl *New)
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 void instantiateDependentHLSLParamModifierAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const HLSLParamModifierAttr *Attr, const Decl *Old, Decl *New)
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 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 void instantiateDependentOpenACCRoutineDeclAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OpenACCRoutineDeclAttr *OldAttr, const Decl *Old, Decl *New)
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.
bool anyScoreOrCondition(llvm::function_ref< bool(Expr *&, bool)> Cond)
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
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
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
CanQualType UnsignedLongLongTy
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
CanQualType getCanonicalTagType(const TagDecl *TD) const
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)
SourceLocation getColonLoc() const
The location of the colon following the access specifier.
SourceLocation getAccessSpecifierLoc() const
The location of the access specifier.
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.
shadow_range shadows() const
A binding in a decomposition declaration.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
ArrayRef< BindingDecl * > getBindingPackDecls() const
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(), const AssociatedConstraint &TrailingRequiresClause={})
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, const AssociatedConstraint &TrailingRequiresClause={})
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, const AssociatedConstraint &TrailingRequiresClause={}, 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, const AssociatedConstraint &TrailingRequiresClause={})
Represents a static or instance method of a struct/union/class.
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, const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
unsigned getLambdaDependencyKind() const
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
bool isLambda() const
Determine whether this class describes a lambda function object.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
TypeSourceInfo * getLambdaTypeInfo() const
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
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.
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class 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 the given declaration.
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)
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, CanQualType CanonInjectedTST, 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.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, bool StrictPackMatch, ClassTemplateSpecializationDecl *PrevDecl)
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)
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
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)
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.
DeclContextLookupResult lookup_result
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
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).
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.
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)
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
The name of a declaration.
@ CXXConversionFunctionName
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
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
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.
RAII object that enters a new function expression evaluation context.
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.
bool isScopedUsingClassTag() 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,...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getDefinition() const
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Represents an explicit instantiation of a template entity in source code.
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
static ExplicitSpecifier getFromDecl(const 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 isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Declaration context for names declared as extern "C" in C++.
Abstract interface for external sources of AST nodes.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
bool isUnsupportedFriend() const
Determines if this friend kind is unsupported.
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, SourceLocation FriendL, SourceLocation EllipsisLoc={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
SourceLocation getFriendLoc() const
Retrieves the location of the 'friend' keyword.
void setUnsupportedFriend(bool Unsupported)
SourceRange getSourceRange() const override LLVM_READONLY
Retrieves the source range for the friend declaration.
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
bool isPackExpansion() const
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.
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, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ConstexprSpecKind getConstexprKind() const
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
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 ...
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
bool isDeleted() const
Whether this function has been deleted.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
bool FriendConstraintRefersToEnclosingTemplate() const
bool isDeletedAsWritten() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
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 the given declaration.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
void setInstantiatedFromMemberTemplate(FunctionTemplateDecl *D)
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.
unsigned getChainingSize() const
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
ArrayRef< NamedDecl * > chain() const
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'.
An lvalue reference type, per C++11 [dcl.ref].
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...
SmallVector< ValueDecl *, 4 > DeclArgumentPack
A set of declarations.
void InstantiatedLocal(const Decl *D, Decl *Inst)
void InstantiatedLocalPackArg(const Decl *D, VarDecl *Inst)
void MakeInstantiatedLocalArgPack(const Decl *D)
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)
IdentifierInfo * getGetterId() const
IdentifierInfo * getSetterId() const
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.
void setKind(TemplateSubstitutionKind K)
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.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represents a C++ namespace alias.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
SourceLocation getAliasLoc() const
Returns the location of the alias name, i.e.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
TypeSourceInfo * getExpansionTypeSourceInfo(unsigned I) const
Retrieve a particular expansion type source info within an expanded parameter pack.
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
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)
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Expr * getPlaceholderTypeConstraint() const
Return the constraint introduced by the placeholder type of this non-type template parameter (if any)...
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.
clauselist_range clauselists()
Pseudo declaration for capturing expressions.
This represents 'pragma omp declare mapper ...' directive.
OMPDeclareMapperDecl * getPrevDeclInScope()
Get reference to previous declare mapper construct in the same scope with the same name.
clauselist_iterator clauselist_begin()
clauselist_range clauselists()
DeclarationName getVarName()
Get the name of the variable declared in the mapper.
Expr * getMapperVarRef()
Get the variable declared in the mapper.
This represents 'pragma omp declare reduction ...' directive.
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Expr * getInitPriv()
Get Priv variable of the initializer.
Expr * getCombinerOut()
Get Out variable of the combiner.
Expr * getCombinerIn()
Get In variable of the combiner.
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
OMPDeclareReductionDecl * getPrevDeclInScope()
Get reference to previous declare reduction construct in the same scope with the same name.
Expr * getInitOrig()
Get Orig variable of the initializer.
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
This represents 'pragma omp groupprivate ...' directive.
This represents 'pragma omp requires...' directive.
This represents 'pragma omp threadprivate ...' directive.
Represents a field declaration created by an @defs(...).
static OpaquePtr make(QualType P)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
OpenACCDirectiveKind getDirectiveKind() const
ArrayRef< const OpenACCClause * > clauses() const
SourceLocation getDirectiveLoc() const
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
A 'device_type' or 'dtype' clause, takes a list of either an 'asterisk' or an identifier.
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
SourceLocation getRParenLoc() const
const Expr * getFunctionReference() const
SourceLocation getLParenLoc() const
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a parameter to a function.
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 isRestrictQualified() const
Determine whether this type is restrict-qualified.
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...
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
The collection of all-type qualifiers we support.
Represents a struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Wrapper for source info for record types.
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.
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)
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)
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)
A type to represent all the data for an OpenACC Clause that has been parsed, but not yet created/sema...
OpenACCDirectiveKind getDirectiveKind() const
OpenACCClauseKind getClauseKind() const
void ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef< Expr * > AdjustArgsNothing, ArrayRef< Expr * > AdjustArgsNeedDevicePtr, ArrayRef< Expr * > AdjustArgsNeedDeviceAddr, ArrayRef< OMPInteropInfo > AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR)
Called on well-formed '#pragma omp declare variant' after parsing of the associated method/function.
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...
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.
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)
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.
@ 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)
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
void deduceOpenCLAddressSpace(VarDecl *decl)
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.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
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.
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
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)
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
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...
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions, bool Diagnose=true)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
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.
SmallVector< LateInstantiatedAttribute, 1 > LateInstantiatedAttrVec
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
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...
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
const LangOptions & getLangOpts() const
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
const LangOptions & LangOpts
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...
void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst)
Update instantiation attributes after template was late parsed.
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.
const VarDecl * getCopyElisionCandidate(NamedReturnInfo &Info, QualType ReturnType)
Updates given NamedReturnInfo's move-eligible and copy-elidable statuses, considering the function re...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
UnsignedOrNone getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
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...
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
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 PerformPendingInstantiations(bool LocalOnly=false, bool AtEndOfTU=true)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
Decl * SubstDecl(Decl *D, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs)
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.
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
RedeclarationKind forRedeclarationInCurContext() const
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)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
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 checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A)
Recheck instantiated thread-safety attributes that could not be validated on the dependent pattern de...
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ 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),...
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.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
SourceManager & SourceMgr
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
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 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.
bool CheckSpanLikeType(const AttributeCommonInfo &CI, const QualType &Ty)
Check that the type is a plain record with one field being a pointer type and the other field being a...
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.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
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.
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)
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
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)
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
Represents a C++11 static_assert declaration.
SourceLocation getRParenLoc() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
Represents the declaration of a struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
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
SourceLocation getNameLoc() const
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
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.
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKWLoc() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
@ Pack
The template argument is actually a parameter pack.
@ RewriteSpaceshipAsEqualEqual
void setEvaluateConstraints(bool B)
Decl * VisitDecl(Decl *D)
VarTemplateSpecializationDecl * VisitVarTemplateSpecializationDecl(VarTemplateDecl *VarTemplate, VarDecl *FromVar, ArrayRef< TemplateArgument > Converted, VarTemplateSpecializationDecl *PrevDecl=nullptr)
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)
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.
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.
bool wasDeclaredWithTypename() const
Whether this template template parameter was declared with the 'typename' keyword.
TemplateParameterList * getExpansionTemplateParameters(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
TemplateNameKind templateParameterKind() const
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getIndex() const
Retrieve the index of the template parameter.
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
UnsignedOrNone getNumExpansionParameters() const
Whether this parameter is a template type parameter pack that has a known list of different type-cons...
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool isParameterPack() const
Returns whether this is a parameter pack.
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, UnsignedOrNone NumExpanded=std::nullopt)
unsigned getDepth() const
Retrieve the depth of the template parameter.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
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.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
const Type * getTypeForDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
void pushTrivial(ASTContext &Context, QualType T, SourceLocation Loc)
Pushes 'T' with all locations pointing to 'Loc'.
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...
SourceLocation getBeginLoc() const
Get the begin source location.
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.
The base class of the type hierarchy.
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 containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isTemplateTypeParmType() const
bool isAtomicType() const
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.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
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.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
DeclContext * getCommonAncestor()
Returns the common ancestor context of this using-directive and its nominated namespace.
SourceLocation getNamespaceKeyLocation() const
Returns the location of the namespace keyword.
SourceLocation getIdentLocation() const
Returns the location of this using declaration's identifier.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
Represents a C++ using-enum-declaration.
SourceLocation getEnumLoc() const
The source location of the 'enum' keyword.
EnumDecl * getEnumDecl() const
TypeSourceInfo * getEnumType() const
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
SourceLocation getUsingLoc() const
The source location of the 'using' keyword.
Represents a pack of using declarations that a single using-declarator pack-expanded into.
ArrayRef< NamedDecl * > expansions() const
Get the set of using declarations that this 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)
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
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...
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
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 ...
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
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.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
llvm::FoldingSetVector< VarTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
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()
Decl * Visit(PTR(Decl) D)
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)
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
bool NE(InterpState &S, CodePtr OpPC)
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
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.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
bool isa(CodeGen::Address addr)
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...
QualType getFunctionOrMethodResultType(const Decl *D)
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
StorageClass
Storage classes.
bool isGenericLambdaCallOperatorOrStaticInvokerSpecialization(const DeclContext *DC)
@ Property
The type of a property.
@ Result
The result type of a method or function.
ActionResult< CXXCtorInitializer * > MemInitResult
OptionalUnsigned< unsigned > UnsignedOrNone
@ Template
We are parsing a template declaration.
@ FunctionTemplate
The name was classified as a function template name.
@ VarTemplate
The name was classified as a variable template name.
@ 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.
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,...
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
ActionResult< Expr * > ExprResult
@ 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
ActionResult< Stmt * > StmtResult
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 ('<').
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
TypeSourceInfo * getNamedTypeInfo() const
getNamedTypeInfo - Returns the source type info associated to the name.
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
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
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.
VarDecl * DeclForInitializer
Declaration for initializer if one is currently being parsed.
A stack object to be created when performing template instantiation.
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.