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()) {
99 if (!Result.isInvalid())
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;
161 if (Result.isInvalid())
163 E = Result.getAs<
Expr>();
165 if (Aligned->getOffset()) {
166 Result = S.
SubstExpr(Aligned->getOffset(), TemplateArgs);
167 if (Result.isInvalid())
169 OE = Result.getAs<
Expr>();
177 const AlignValueAttr *Aligned,
Decl *
New) {
182 if (!Result.isInvalid())
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;
246 if (Result.isInvalid())
248 if (Result.isUsable()) {
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));
274 if (Result.isInvalid())
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));
330 if (Result.isInvalid())
332 Expr *MaxThreads = Result.getAs<
Expr>();
334 Expr *MinBlocks =
nullptr;
335 if (
Attr.getMinBlocks()) {
337 if (Result.isInvalid())
342 Expr *MaxBlocks =
nullptr;
343 if (
Attr.getMaxBlocks()) {
345 if (Result.isInvalid())
347 MaxBlocks = Result.getAs<
Expr>();
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) {
598 if (Result.isInvalid())
600 Expr *MinExpr = Result.getAs<
Expr>();
603 if (Result.isInvalid())
605 Expr *MaxExpr = Result.getAs<
Expr>();
618 if (Result.isInvalid())
623 if (Result.isInvalid())
628 if (Result.isInvalid())
633 New->addAttr(::new (Context) ReqdWorkGroupSizeAttr(Context,
Attr,
X, Y, Z));
652 if (!
Cond->isTypeDependent())
665 if (Result.isInvalid())
667 Expr *MinExpr = Result.getAs<
Expr>();
669 Expr *MaxExpr =
nullptr;
670 if (
auto Max =
Attr.getMax()) {
672 if (Result.isInvalid())
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 "out or inout parameter type must be a reference and restrict qualified");
802 const MallocSpanAttr *
Attr,
817 for (
const auto *TmplAttr : Tmpl->
attrs()) {
824 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
828 TmplAttr,
Context, *
this, TemplateArgs);
830 New->addAttr(NewAttr);
838 case clang::attr::CFConsumed:
840 case clang::attr::OSConsumed:
842 case clang::attr::NSConsumed:
845 llvm_unreachable(
"Wrong argument supplied");
852 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *Old,
Decl *
New);
858 for (
const auto *TmplAttr : Tmpl->
attrs()) {
863 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
864 if (Aligned && Aligned->isAlignmentDependent()) {
869 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
874 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
879 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
884 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
889 if (
auto *
Constructor = dyn_cast<ConstructorAttr>(TmplAttr)) {
895 if (
auto *
Destructor = dyn_cast<DestructorAttr>(TmplAttr)) {
901 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
907 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
913 if (
const auto *CUDALaunchBounds =
914 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
916 *CUDALaunchBounds,
New);
920 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
925 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
930 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
935 if (
const auto *ReqdWorkGroupSize =
936 dyn_cast<ReqdWorkGroupSizeAttr>(TmplAttr)) {
938 *ReqdWorkGroupSize,
New);
941 if (
const auto *AMDGPUFlatWorkGroupSize =
942 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
944 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize,
New);
947 if (
const auto *AMDGPUFlatWorkGroupSize =
948 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
950 *AMDGPUFlatWorkGroupSize,
New);
953 if (
const auto *AMDGPUMaxNumWorkGroups =
954 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
956 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups,
New);
959 if (
const auto *CUDAClusterDims = dyn_cast<CUDAClusterDimsAttr>(TmplAttr)) {
961 *CUDAClusterDims,
New);
964 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
970 if (
const auto *RoutineAttr = dyn_cast<OpenACCRoutineDeclAttr>(TmplAttr)) {
972 RoutineAttr, Tmpl,
New);
977 if (TmplAttr->getKind() == attr::DLLExport ||
978 TmplAttr->getKind() == attr::DLLImport) {
979 if (
New->hasAttr<DLLExportAttr>() ||
New->hasAttr<DLLImportAttr>()) {
984 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
997 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
998 if (!
New->hasAttr<PointerAttr>())
1003 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
1004 if (!
New->hasAttr<OwnerAttr>())
1009 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
1014 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
1015 if (!
New->hasAttr<CUDAGridConstantAttr>())
1020 if (
auto *A = dyn_cast<MallocSpanAttr>(TmplAttr)) {
1025 if (
auto *A = dyn_cast<CleanupAttr>(TmplAttr)) {
1026 if (!
New->hasAttr<CleanupAttr>()) {
1027 auto *NewAttr = A->clone(
Context);
1028 NewAttr->setArgLoc(A->getArgLoc());
1029 New->addAttr(NewAttr);
1034 assert(!TmplAttr->isPackExpansion());
1035 if (TmplAttr->isLateParsed() && LateAttrs) {
1045 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
1047 ND->isCXXInstanceMember());
1050 *
this, TemplateArgs);
1052 New->addAttr(NewAttr);
1058 for (
const auto *
Attr : Pattern->
attrs()) {
1059 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
1060 if (!Inst->
hasAttr<StrictFPAttr>())
1068 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
1073 DLLExportAttr *
Attr = Ctor->
getAttr<DLLExportAttr>();
1076 for (
unsigned I = 0; I != NumParams; ++I) {
1087template<
typename DeclT>
1089 DeclT *Result = D->getPreviousDecl();
1095 D->getLexicalDeclContext() != Result->getLexicalDeclContext())
1103 llvm_unreachable(
"Translation units cannot be instantiated");
1107 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
1110Decl *TemplateDeclInstantiator::VisitHLSLRootSignatureDecl(
1112 llvm_unreachable(
"HLSL root signature declarations cannot be instantiated");
1117 llvm_unreachable(
"pragma comment cannot be instantiated");
1120Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
1122 llvm_unreachable(
"pragma comment cannot be instantiated");
1127 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
1131 llvm_unreachable(
"GUID declaration cannot be instantiated");
1134Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
1136 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
1139Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
1141 llvm_unreachable(
"template parameter objects cannot be instantiated");
1145TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *D) {
1148 SemaRef.InstantiateAttrs(TemplateArgs, D, Inst, LateAttrs, StartingScope);
1149 Owner->addDecl(Inst);
1154TemplateDeclInstantiator::VisitNamespaceDecl(
NamespaceDecl *D) {
1155 llvm_unreachable(
"Namespaces cannot be instantiated");
1159class OpenACCDeclClauseInstantiator final
1162 const MultiLevelTemplateArgumentList &MLTAL;
1163 ArrayRef<OpenACCClause *> ExistingClauses;
1164 SemaOpenACC::OpenACCParsedClause &ParsedClause;
1165 OpenACCClause *NewClause =
nullptr;
1168 OpenACCDeclClauseInstantiator(Sema &S,
1169 const MultiLevelTemplateArgumentList &MLTAL,
1170 ArrayRef<OpenACCClause *> ExistingClauses,
1171 SemaOpenACC::OpenACCParsedClause &ParsedClause)
1172 : SemaRef(S), MLTAL(MLTAL), ExistingClauses(ExistingClauses),
1173 ParsedClause(ParsedClause) {}
1175 OpenACCClause *CreatedClause() {
return NewClause; }
1176#define VISIT_CLAUSE(CLAUSE_NAME) \
1177 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
1178#include "clang/Basic/OpenACCClauses.def"
1182 for (
Expr *CurVar : VarList) {
1183 ExprResult Res = SemaRef.SubstExpr(CurVar, MLTAL);
1192 InstantiatedVarList.push_back(Res.
get());
1194 return InstantiatedVarList;
1198#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME) \
1199 void OpenACCDeclClauseInstantiator::Visit##CLAUSE_NAME##Clause( \
1200 const OpenACC##CLAUSE_NAME##Clause &) { \
1201 llvm_unreachable("Clause type invalid on declaration construct, or " \
1202 "instantiation not implemented"); \
1231#undef CLAUSE_NOT_ON_DECLS
1233void OpenACCDeclClauseInstantiator::VisitGangClause(
1237 assert(
C.getNumExprs() <= 1 &&
1238 "Only 1 expression allowed on gang clause in routine");
1240 if (
C.getNumExprs() > 0) {
1242 "Only dim allowed on routine");
1244 SemaRef.SubstExpr(
const_cast<Expr *
>(
C.getExpr(0).second), MLTAL);
1246 ER = SemaRef.OpenACC().CheckGangExpr(ExistingClauses,
1247 ParsedClause.getDirectiveKind(),
1248 C.getExpr(0).first, ER.
get());
1251 TransformedIntExprs.push_back(ER.
get());
1256 NewClause = SemaRef.OpenACC().CheckGangClause(
1257 ParsedClause.getDirectiveKind(), ExistingClauses,
1258 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1259 TransformedGangKinds, TransformedIntExprs, ParsedClause.getEndLoc());
1264 ParsedClause.getBeginLoc(),
1265 ParsedClause.getEndLoc());
1267void OpenACCDeclClauseInstantiator::VisitNoHostClause(
1270 ParsedClause.getBeginLoc(),
1271 ParsedClause.getEndLoc());
1274void OpenACCDeclClauseInstantiator::VisitDeviceTypeClause(
1278 SemaRef.getASTContext(),
C.getClauseKind(), ParsedClause.getBeginLoc(),
1279 ParsedClause.getLParenLoc(),
C.getArchitectures(),
1280 ParsedClause.getEndLoc());
1283void OpenACCDeclClauseInstantiator::VisitWorkerClause(
1285 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'worker' clause");
1287 ParsedClause.getBeginLoc(), {},
1288 nullptr, ParsedClause.getEndLoc());
1291void OpenACCDeclClauseInstantiator::VisitVectorClause(
1293 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'vector' clause");
1295 ParsedClause.getBeginLoc(), {},
1296 nullptr, ParsedClause.getEndLoc());
1299void OpenACCDeclClauseInstantiator::VisitCopyClause(
1301 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1302 C.getModifierList());
1303 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1306 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1307 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1308 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1309 ParsedClause.getEndLoc());
1312void OpenACCDeclClauseInstantiator::VisitLinkClause(
1314 ParsedClause.setVarListDetails(
1315 SemaRef.OpenACC().CheckLinkClauseVarList(VisitVarList(
C.getVarList())),
1318 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1323 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1324 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1325 ParsedClause.getEndLoc());
1328void OpenACCDeclClauseInstantiator::VisitDeviceResidentClause(
1330 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1332 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1336 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1337 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1338 ParsedClause.getEndLoc());
1341void OpenACCDeclClauseInstantiator::VisitCopyInClause(
1343 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1344 C.getModifierList());
1346 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1349 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1350 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1351 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1352 ParsedClause.getEndLoc());
1354void OpenACCDeclClauseInstantiator::VisitCopyOutClause(
1356 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1357 C.getModifierList());
1359 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1362 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1363 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1364 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1365 ParsedClause.getEndLoc());
1367void OpenACCDeclClauseInstantiator::VisitCreateClause(
1369 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1370 C.getModifierList());
1372 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1375 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1376 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1377 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1378 ParsedClause.getEndLoc());
1380void OpenACCDeclClauseInstantiator::VisitPresentClause(
1382 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1384 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1388 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1389 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1390 ParsedClause.getEndLoc());
1392void OpenACCDeclClauseInstantiator::VisitDevicePtrClause(
1396 llvm::erase_if(VarList, [&](
Expr *E) {
1401 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1405 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1406 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1407 ParsedClause.getEndLoc());
1410void OpenACCDeclClauseInstantiator::VisitBindClause(
1413 if (
C.isStringArgument())
1415 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1416 ParsedClause.getLParenLoc(),
C.getStringArgument(),
1417 ParsedClause.getEndLoc());
1420 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1421 ParsedClause.getLParenLoc(),
C.getIdentifierArgument(),
1422 ParsedClause.getEndLoc());
1430 for (
const auto *Clause : ClauseList) {
1432 Clause->getBeginLoc());
1433 ParsedClause.setEndLoc(Clause->getEndLoc());
1434 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(Clause))
1435 ParsedClause.setLParenLoc(WithParms->getLParenLoc());
1437 OpenACCDeclClauseInstantiator Instantiator{S, MLTAL, TransformedClauses,
1439 Instantiator.Visit(Clause);
1440 if (Instantiator.CreatedClause())
1441 TransformedClauses.push_back(Instantiator.CreatedClause());
1443 return TransformedClauses;
1450 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *OldDecl,
Decl *NewDecl) {
1451 OpenACCRoutineDeclAttr *A =
1452 OpenACCRoutineDeclAttr::Create(S.
getASTContext(), OldAttr->getLocation());
1454 if (!OldAttr->Clauses.empty()) {
1456 InstantiateOpenACCClauseList(
1458 A->Clauses.assign(TransformedClauses.begin(), TransformedClauses.end());
1469 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1473 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1477 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndDeclDirective(
1489 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1497 FuncRef = SemaRef.OpenACC().ActOnRoutineName(FuncRef.
get());
1502 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1506 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndRoutineDeclDirective(
1518 NamespaceAliasDecl *Inst
1526 Owner->addDecl(Inst);
1536 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1540 TSI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
1551 if (SemaRef.getPreprocessor().NeedsStdLibCxxWorkaroundBefore(2014'04'22)) {
1552 const DecltypeType *DT = TSI->
getType()->
getAs<DecltypeType>();
1555 DT->isReferenceType() &&
1556 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
1557 RD->getIdentifier() && RD->getIdentifier()->isStr(
"common_type") &&
1559 SemaRef.getSourceManager().isInSystemHeader(D->
getBeginLoc()))
1561 TSI = SemaRef.Context.getTrivialTypeSourceInfo(
1579 TagDecl *oldTag = oldTagType->getDecl();
1596 SemaRef.isIncompatibleTypedef(InstPrevTypedef,
Typedef);
1598 Typedef->setPreviousDecl(InstPrevTypedef);
1601 SemaRef.InstantiateAttrs(TemplateArgs, D,
Typedef);
1604 SemaRef.inferGslPointerAttribute(
Typedef);
1653 if (!
Found.empty()) {
1654 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1667 if (PrevAliasTemplate)
1672 if (!PrevAliasTemplate)
1699 SmallVector<BindingDecl*, 16> NewBindings;
1700 BindingDecl *OldBindingPack =
nullptr;
1701 for (
auto *OldBD : D->
bindings()) {
1702 Expr *BindingExpr = OldBD->getBinding();
1703 if (isa_and_present<FunctionParmPackExpr>(BindingExpr)) {
1705 assert(!OldBindingPack &&
"no more than one pack is allowed");
1706 OldBindingPack = OldBD;
1710 ArrayRef<BindingDecl*> NewBindingArray = NewBindings;
1712 auto *NewDD = cast_if_present<DecompositionDecl>(
1715 if (!NewDD || NewDD->isInvalidDecl()) {
1716 for (
auto *NewBD : NewBindings)
1717 NewBD->setInvalidDecl();
1718 }
else if (OldBindingPack) {
1721 BindingDecl *NewBindingPack = *llvm::find_if(
1723 assert(NewBindingPack !=
nullptr &&
"new bindings should also have a pack");
1724 llvm::ArrayRef<BindingDecl *> OldDecls =
1726 llvm::ArrayRef<BindingDecl *> NewDecls =
1728 assert(OldDecls.size() == NewDecls.size());
1729 for (
unsigned I = 0; I < OldDecls.size(); I++)
1730 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldDecls[I],
1742 bool InstantiatingVarTemplate,
1753 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
1786 StartingScope, InstantiatingVarTemplate);
1789 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1790 RT = F->getReturnType();
1795 llvm_unreachable(
"Unknown context type");
1816 SemaRef.CheckStaticLocalForDllExport(Var);
1819 SemaRef.CheckThreadLocalForLargeAlignment(Var);
1821 if (SemaRef.getLangOpts().OpenACC)
1822 SemaRef.OpenACC().ActOnVariableDeclarator(Var);
1831 Owner->addHiddenDecl(AD);
1835Decl *TemplateDeclInstantiator::VisitFieldDecl(
FieldDecl *D) {
1840 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1852 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1863 else if (BitWidth) {
1869 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
1874 BitWidth = InstantiatedBitWidth.
getAs<Expr>();
1877 FieldDecl *
Field = SemaRef.CheckFieldDecl(
1886 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
1888 if (
Field->hasAttrs())
1889 SemaRef.CheckAlignasUnderalignment(Field);
1892 Field->setInvalidDecl();
1894 if (!
Field->getDeclName() ||
Field->isPlaceholderVar(SemaRef.getLangOpts())) {
1896 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
1898 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(
Field->getDeclContext())) {
1899 if (Parent->isAnonymousStructOrUnion() &&
1900 Parent->getRedeclContext()->isFunctionOrMethod())
1901 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
1906 Owner->addDecl(Field);
1916 SemaRef.Diag(D->
getLocation(), diag::err_property_is_variably_modified)
1920 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1932 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1945 SemaRef.InstantiateAttrs(TemplateArgs, D,
Property, LateAttrs,
1958 NamedDecl **NamedChain =
1962 for (
auto *PI : D->
chain()) {
1968 NamedChain[i++] =
Next;
1974 {NamedChain, D->getChainingSize()});
1976 for (
const auto *Attr : D->
attrs())
1977 IndirectField->
addAttr(Attr->clone(SemaRef.Context));
1981 Owner->addDecl(IndirectField);
1982 return IndirectField;
1989 TypeSourceInfo *InstTy;
1998 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
1999 SemaRef.collectUnexpandedParameterPacks(Ty->getTypeLoc(), Unexpanded);
2000 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
2002 bool ShouldExpand =
true;
2003 bool RetainExpansion =
false;
2004 UnsignedOrNone NumExpansions = std::nullopt;
2005 if (SemaRef.CheckParameterPacksForExpansion(
2008 ShouldExpand, RetainExpansion, NumExpansions))
2011 assert(!RetainExpansion &&
2012 "should never retain an expansion for a variadic friend decl");
2015 SmallVector<FriendDecl *> Decls;
2016 for (
unsigned I = 0; I != *NumExpansions; I++) {
2017 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
2018 TypeSourceInfo *TSI = SemaRef.SubstType(
2029 Decls.push_back(FD);
2037 InstTy = SemaRef.SubstType(Ty, TemplateArgs, D->
getLocation(),
2052 assert(ND &&
"friend decl must be a decl or a type!");
2059 if (!NewND)
return nullptr;
2078 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
2083 SemaRef.SubstExpr(D->
getMessage(), TemplateArgs);
2084 if (InstantiatedMessageExpr.
isInvalid())
2087 return SemaRef.BuildStaticAssertDeclaration(
2092Decl *TemplateDeclInstantiator::VisitEnumDecl(
EnumDecl *D) {
2093 EnumDecl *PrevDecl =
nullptr;
2095 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2098 if (!Prev)
return nullptr;
2111 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2112 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
2114 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
2115 Enum->setIntegerType(SemaRef.Context.IntTy);
2125 Enum->setIntegerTypeSourceInfo(NewTI);
2135 QualType UnderlyingType =
Enum->getIntegerType();
2136 Enum->setPromotionType(
2137 SemaRef.Context.isPromotableIntegerType(UnderlyingType)
2138 ? SemaRef.Context.getPromotedIntegerType(UnderlyingType)
2142 &&
"Dependent type without type source info");
2147 SemaRef.InstantiateAttrs(TemplateArgs, D,
Enum);
2152 SemaRef.Context.setManglingNumber(
Enum, SemaRef.Context.getManglingNumber(D));
2155 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2156 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Enum, DD);
2159 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2160 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Enum, TND);
2162 Owner->addDecl(
Enum);
2165 if (Def && Def != D) {
2170 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2171 QualType DefnUnderlying =
2172 SemaRef.SubstType(TI->getType(), TemplateArgs,
2173 UnderlyingLoc, DeclarationName());
2175 DefnUnderlying,
true,
Enum);
2190 if (PrevDecl ==
nullptr) {
2191 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Enum);
2201 Enum->startDefinition();
2212 if (
Expr *UninstValue = EC->getInitExpr()) {
2217 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
2222 if (
Value.isInvalid()) {
2228 = SemaRef.CheckEnumConstant(
Enum, LastEnumConst,
2235 Enum->setInvalidDecl();
2239 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
2242 Enum->addDecl(EnumConst);
2243 Enumerators.push_back(EnumConst);
2244 LastEnumConst = EnumConst;
2247 !
Enum->isScoped()) {
2250 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
2255 SemaRef.ActOnEnumBody(
Enum->getLocation(),
Enum->getBraceRange(),
Enum,
2260 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
2265 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
2273 LocalInstantiationScope Scope(SemaRef);
2286 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2292 CXXRecordDecl *PrevDecl =
nullptr;
2293 ClassTemplateDecl *PrevClassTemplate =
nullptr;
2297 if (!
Found.empty()) {
2298 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
2299 if (PrevClassTemplate)
2308 DeclContext *DC = Owner;
2312 SS.
Adopt(QualifierLoc);
2313 DC = SemaRef.computeDeclContext(SS);
2314 if (!DC)
return nullptr;
2316 DC = SemaRef.FindInstantiatedContext(Pattern->
getLocation(),
2325 SemaRef.forRedeclarationInCurContext());
2326 SemaRef.LookupQualifiedName(R, DC);
2328 if (R.isSingleResult()) {
2329 PrevClassTemplate = R.getAsSingle<ClassTemplateDecl>();
2330 if (PrevClassTemplate)
2334 if (!PrevClassTemplate && QualifierLoc) {
2335 SemaRef.Diag(Pattern->
getLocation(), diag::err_not_tag_in_scope)
2348 SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, LateAttrs,
2351 ClassTemplateDecl *Inst
2357 assert(!Owner->isDependentContext());
2362 if (PrevClassTemplate) {
2364 const ClassTemplateDecl *MostRecentPrevCT =
2366 TemplateParameterList *PrevParams =
2370 if (!SemaRef.TemplateParameterListsAreEqual(
2377 if (SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
2391 if (!PrevClassTemplate)
2408 Owner->addDecl(Inst);
2410 if (!PrevClassTemplate) {
2414 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
2416 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2417 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2418 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
2425TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
2436 ClassTemplateDecl *InstClassTemplate
2437 = dyn_cast<ClassTemplateDecl>(
Found.front());
2438 if (!InstClassTemplate)
2441 if (ClassTemplatePartialSpecializationDecl *
Result
2450 "Only static data member templates are allowed.");
2454 LocalInstantiationScope Scope(SemaRef);
2461 VarTemplateDecl *PrevVarTemplate =
nullptr;
2466 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2472 if (!VarInst)
return nullptr;
2474 DeclContext *DC = Owner;
2483 if (!PrevVarTemplate)
2491 Owner->addDecl(Inst);
2493 if (!PrevVarTemplate) {
2497 SmallVector<VarTemplatePartialSpecializationDecl *, 1> PartialSpecs;
2499 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2500 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2501 OutOfLineVarPartialSpecs.push_back(
2502 std::make_pair(Inst, PartialSpecs[I]));
2508Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
2511 "Only static data member templates are allowed.");
2517 assert(!
Found.empty() &&
"Instantiation found nothing?");
2519 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2520 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
2522 if (VarTemplatePartialSpecializationDecl *
Result =
2535 LocalInstantiationScope Scope(SemaRef);
2536 Sema::ConstraintEvalRAII<TemplateDeclInstantiator> RAII(*
this);
2543 FunctionDecl *Instantiated =
nullptr;
2544 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->
getTemplatedDecl()))
2557 FunctionTemplateDecl *InstTemplate
2560 assert(InstTemplate &&
2561 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2573 Owner->addDecl(InstTemplate);
2576 SemaRef.CheckFriendAccess(InstTemplate);
2579 return InstTemplate;
2583 CXXRecordDecl *PrevDecl =
nullptr;
2585 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2588 if (!Prev)
return nullptr;
2592 CXXRecordDecl *
Record =
nullptr;
2610 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D,
Record, LateAttrs,
2618 if (!IsInjectedClassName)
2624 Record->setObjectOfFriendDecl();
2628 Record->setAnonymousStructOrUnion(
true);
2631 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Record);
2634 SemaRef.Context.setManglingNumber(
Record,
2635 SemaRef.Context.getManglingNumber(D));
2639 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2640 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Record, DD);
2644 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2645 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Record, TND);
2652 Sema::LocalEagerInstantiationScope LocalInstantiations(SemaRef,
2667 LocalInstantiations.perform();
2670 SemaRef.DiagnoseUnusedNestedTypedefs(
Record);
2672 if (IsInjectedClassName)
2673 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2691 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2696 return Context.getFunctionType(NewFunc->getReturnType(),
2697 NewFunc->getParamTypes(), NewEPI);
2721 if (isFriend && Source->wasThisDeclarationADefinition(D)) {
2733 void *InsertPos =
nullptr;
2742 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2743 Owner->isFunctionOrMethod() ||
2745 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2749 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2750 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
2751 TemplateArgs, DGuide->getExplicitSpecifier());
2752 if (InstantiatedExplicitSpecifier.
isInvalid())
2762 if (TemplateParams && TemplateParams->
size()) {
2764 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2765 if (LastParam && LastParam->isImplicit() &&
2766 LastParam->hasTypeConstraint()) {
2781 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2795 SemaRef.adjustContextForLocalExternDecl(DC);
2796 }
else if (isFriend && QualifierLoc) {
2798 SS.
Adopt(QualifierLoc);
2799 DC = SemaRef.computeDeclContext(SS);
2800 if (!DC)
return nullptr;
2807 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
2813 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2816 InstantiatedExplicitSpecifier, NameInfo,
T, TInfo,
2818 DGuide->getDeductionCandidateKind(), TrailingRequiresClause,
2819 DGuide->getSourceDeductionGuide(),
2820 DGuide->getSourceDeductionGuideKind());
2827 TrailingRequiresClause);
2828 Function->setFriendConstraintRefersToEnclosingTemplate(
2837 Function->setQualifierInfo(QualifierLoc);
2848 LexicalDC = SemaRef.CurContext;
2852 Function->setIsTypeAwareOperatorNewOrDelete(
2854 Function->setLexicalDeclContext(LexicalDC);
2857 for (
unsigned P = 0; P < Params.size(); ++P)
2859 Params[P]->setOwningFunction(
Function);
2862 if (TrailingRequiresClause)
2863 Function->setTrailingRequiresClause(TrailingRequiresClause);
2865 if (TemplateParams) {
2893 SemaRef.CodeSynthesisContexts.back().Kind !=
2907 }
else if (!isFriend) {
2911 Function->setInstantiatedFromDecl(D);
2918 FT->setObjectOfFriendDecl();
2924 bool IsExplicitSpecialization =
false;
2931 : SemaRef.forRedeclarationInCurContext());
2935 assert(isFriend &&
"dependent specialization info on "
2936 "non-member non-friend function?");
2940 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2941 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2942 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2943 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
2951 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
2957 if (SemaRef.CheckFunctionTemplateSpecialization(
2959 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2963 IsExplicitSpecialization =
true;
2967 SemaRef.LookupQualifiedName(
Previous, DC);
2971 ArgsWritten->getRAngleLoc());
2972 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
2976 if (SemaRef.CheckFunctionTemplateSpecialization(
Function,
2981 IsExplicitSpecialization =
true;
2998 if (isFriend && !QualifierLoc) {
2999 SemaRef.FilterLookupForScope(
Previous, DC,
nullptr,
3018 if (
Function->isLocalExternDecl()) {
3020 if (!PVD->hasDefaultArg())
3022 if (SemaRef.SubstDefaultArgument(D->
getInnerLocStart(), PVD, TemplateArgs)) {
3026 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
3027 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3029 { UninstExpr }, UninstExpr->
getType());
3031 PVD->setDefaultArg(ErrorResult.
get());
3037 IsExplicitSpecialization,
3038 Function->isThisDeclarationADefinition());
3045 SemaRef.CheckTemplateParameterList(
3048 Function->isThisDeclarationADefinition()
3059 Function->getMemberSpecializationInfo()) {
3060 if (MSInfo->getPointOfInstantiation().isInvalid()) {
3062 MSInfo->setPointOfInstantiation(Loc);
3063 SemaRef.PendingLocalImplicitInstantiations.emplace_back(
Function, Loc);
3101 void *InsertPos =
nullptr;
3116 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
3118 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
3122 SemaRef, D, TemplateArgs,
Scope);
3126 unsigned NumTempParamLists = 0;
3128 TempParamLists.resize(NumTempParamLists);
3129 for (
unsigned I = 0; I != NumTempParamLists; ++I) {
3134 TempParamLists[I] = InstParams;
3140 const bool CouldInstantiate =
3141 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
3142 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
3146 if (CouldInstantiate ||
3147 SemaRef.CodeSynthesisContexts.back().Kind !=
3149 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
3150 TemplateArgs, InstantiatedExplicitSpecifier);
3152 if (InstantiatedExplicitSpecifier.isInvalid())
3167 SemaRef.Context.getTrivialTypeSourceInfo(D->
getType());
3177 if (TemplateParams && TemplateParams->
size()) {
3179 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
3180 if (LastParam && LastParam->isImplicit() &&
3181 LastParam->hasTypeConstraint()) {
3196 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
3206 SS.
Adopt(QualifierLoc);
3207 DC = SemaRef.computeDeclContext(SS);
3209 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
3212 DC = SemaRef.FindInstantiatedContext(D->
getLocation(),
3216 if (!DC)
return nullptr;
3223 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
3234 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3235 InstantiatedExplicitSpecifier,
Constructor->UsesFPIntrin(),
3238 TrailingRequiresClause);
3242 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3244 Destructor->getConstexprKind(), TrailingRequiresClause);
3245 Method->setIneligibleOrNotSelected(
true);
3247 Method->setDeclName(SemaRef.Context.DeclarationNames.getCXXDestructorName(
3249 SemaRef.Context.getCanonicalTagType(
Record)));
3252 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3253 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
3254 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
3255 Conversion->getEndLoc(), TrailingRequiresClause);
3259 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo, SC,
3261 D->
getEndLoc(), TrailingRequiresClause);
3265 Method->setImplicitlyInline();
3268 Method->setQualifierInfo(QualifierLoc);
3270 if (TemplateParams) {
3310 if (NumTempParamLists)
3311 Method->setTemplateParameterListsInfo(
3315 Method->setLexicalDeclContext(Owner);
3316 Method->setObjectOfFriendDecl();
3321 for (
unsigned P = 0; P < Params.size(); ++P)
3322 Params[P]->setOwningFunction(
Method);
3323 Method->setParams(Params);
3326 Method->setInvalidDecl();
3331 bool IsExplicitSpecialization =
false;
3339 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3340 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3341 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3342 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3350 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3356 if (SemaRef.CheckFunctionTemplateSpecialization(
3357 Method, DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3359 Method->setInvalidDecl();
3361 IsExplicitSpecialization =
true;
3364 SemaRef.LookupQualifiedName(
Previous, DC);
3367 ArgsWritten->getRAngleLoc());
3369 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3373 if (SemaRef.CheckFunctionTemplateSpecialization(
Method,
3376 Method->setInvalidDecl();
3378 IsExplicitSpecialization =
true;
3406 for (
unsigned P = 0; P < Params.size(); ++P) {
3407 if (!Params[P]->hasDefaultArg())
3409 if (SemaRef.SubstDefaultArgument(StartLoc, Params[P], TemplateArgs)) {
3413 Expr *UninstExpr = Params[P]->getUninstantiatedDefaultArg();
3414 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3416 { UninstExpr }, UninstExpr->
getType());
3418 Params[P]->setDefaultArg(ErrorResult.
get());
3424 IsExplicitSpecialization,
3425 Method->isThisDeclarationADefinition());
3433 if (isFriend &&
Method->getPreviousDecl())
3434 Method->setAccess(
Method->getPreviousDecl()->getAccess());
3440 SemaRef.CheckOverrideControl(
Method);
3454 if (IsExplicitSpecialization && !isFriend)
3467 Method->setIneligibleOrNotSelected(
true);
3468 }
else if (
Method->isCopyAssignmentOperator() ||
3469 Method->isMoveAssignmentOperator()) {
3470 Method->setIneligibleOrNotSelected(
true);
3482 }
else if (isFriend) {
3486 SemaRef.CheckFriendAccess(
Method);
3499 if (
Method->hasAttr<UsedAttr>()) {
3500 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
3503 A->getMemberSpecializationInfo())
3504 Loc = MSInfo->getPointOfInstantiation();
3505 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
3506 Loc = Spec->getPointOfInstantiation();
3507 SemaRef.MarkFunctionReferenced(Loc,
Method);
3527 return SemaRef.SubstParmVarDecl(D, TemplateArgs, 0,
3532Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
3536 UnsignedOrNone NumExpanded = std::nullopt;
3540 assert(TC->getTemplateArgsAsWritten() &&
3541 "type parameter can only be an expansion when explicit arguments "
3546 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3547 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
3548 SemaRef.collectUnexpandedParameterPacks(ArgLoc, Unexpanded);
3553 bool RetainExpansion =
false;
3554 if (SemaRef.CheckParameterPacksForExpansion(
3557 SourceRange(TC->getConceptNameLoc(),
3558 TC->hasExplicitTemplateArgs()
3559 ? TC->getTemplateArgsAsWritten()->getRAngleLoc()
3560 : TC->getConceptNameInfo().getEndLoc()),
3561 Unexpanded, TemplateArgs,
true,
3562 Expand, RetainExpansion, NumExpanded))
3580 if (SemaRef.SubstTypeConstraint(Inst, TC, TemplateArgs,
3581 EvaluateConstraints))
3586 TemplateArgumentLoc Output;
3594 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
3599Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3603 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
3604 SmallVector<QualType, 4> ExpandedParameterPackTypes;
3605 bool IsExpandedParameterPack =
false;
3606 TypeSourceInfo *TSI;
3616 TypeSourceInfo *NewTSI =
3623 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3627 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3628 ExpandedParameterPackTypes.push_back(NewT);
3631 IsExpandedParameterPack =
true;
3638 PackExpansionTypeLoc Expansion = TL.
castAs<PackExpansionTypeLoc>();
3640 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3641 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3646 bool RetainExpansion =
false;
3647 UnsignedOrNone OrigNumExpansions =
3649 UnsignedOrNone NumExpansions = OrigNumExpansions;
3650 if (SemaRef.CheckParameterPacksForExpansion(
3651 Expansion.
getEllipsisLoc(), Pattern.getSourceRange(), Unexpanded,
3652 TemplateArgs,
true, Expand,
3653 RetainExpansion, NumExpansions))
3657 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3658 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3659 TypeSourceInfo *NewTSI = SemaRef.SubstType(
3665 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3669 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3670 ExpandedParameterPackTypes.push_back(NewT);
3676 IsExpandedParameterPack =
true;
3682 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3683 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
3689 SemaRef.CheckNonTypeTemplateParameterType(NewPattern, D->
getLocation());
3690 TSI = SemaRef.CheckPackExpansion(NewPattern, Expansion.
getEllipsisLoc(),
3705 T = SemaRef.CheckNonTypeTemplateParameterType(TSI, D->
getLocation());
3707 T = SemaRef.Context.IntTy;
3712 NonTypeTemplateParmDecl *Param;
3713 if (IsExpandedParameterPack)
3716 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3718 ExpandedParameterPackTypes, ExpandedParameterPackTypesAsWritten);
3722 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3726 if (AutoLoc.isConstrained()) {
3727 SourceLocation EllipsisLoc;
3728 if (IsExpandedParameterPack)
3731 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
3733 EllipsisLoc = Constraint->getEllipsisLoc();
3737 if (SemaRef.AttachTypeConstraint(AutoLoc, Param,
3748 EnterExpressionEvaluationContext ConstantEvaluated(
3750 TemplateArgumentLoc
Result;
3758 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3766 for (
const auto &P : *Params) {
3767 if (P->isTemplateParameterPack())
3779TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
3783 TemplateParameterList *InstParams;
3784 SmallVector<TemplateParameterList*, 8> ExpandedParams;
3786 bool IsExpandedParameterPack =
false;
3795 LocalInstantiationScope Scope(SemaRef,
true);
3796 TemplateParameterList *Expansion =
3800 ExpandedParams.push_back(Expansion);
3803 IsExpandedParameterPack =
true;
3804 InstParams = TempParams;
3809 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3816 bool RetainExpansion =
false;
3817 UnsignedOrNone NumExpansions = std::nullopt;
3818 if (SemaRef.CheckParameterPacksForExpansion(
3820 TemplateArgs,
true, Expand,
3821 RetainExpansion, NumExpansions))
3825 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3826 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3827 LocalInstantiationScope Scope(SemaRef,
true);
3831 ExpandedParams.push_back(Expansion);
3837 IsExpandedParameterPack =
true;
3840 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3842 LocalInstantiationScope Scope(SemaRef,
true);
3849 LocalInstantiationScope Scope(SemaRef,
true);
3856 TemplateTemplateParmDecl *Param;
3857 if (IsExpandedParameterPack)
3860 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3866 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3879 TemplateArgumentLoc(SemaRef.Context, TemplateArgument(TName),
3888 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3897 UsingDirectiveDecl *Inst
3907 if (!Owner->isFunctionOrMethod())
3908 Owner->addDecl(Inst);
3917 bool isFunctionScope = Owner->isFunctionOrMethod();
3919 for (
auto *Shadow : D->
shadows()) {
3923 NamedDecl *OldTarget = Shadow->getTargetDecl();
3924 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
3925 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
3926 OldTarget = BaseShadow;
3930 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
3932 SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
3934 InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
3935 Shadow->getLocation(), OldTarget, TemplateArgs));
3942 SemaRef.CheckUsingShadowDecl(Inst, InstTarget, *Lookup, PrevDecl))
3946 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
3947 Shadow->getLocation(), OldPrev, TemplateArgs));
3950 nullptr, Inst, InstTarget, PrevDecl);
3951 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
3953 if (isFunctionScope)
3954 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
3960Decl *TemplateDeclInstantiator::VisitUsingDecl(
UsingDecl *D) {
3981 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
3987 bool CheckRedeclaration = Owner->
isRecord();
3998 SS.
Adopt(QualifierLoc);
3999 if (CheckRedeclaration) {
4000 Prev.setHideTags(
false);
4033 EnumDecl *EnumD = cast_or_null<EnumDecl>(SemaRef.FindInstantiatedDecl(
4036 if (SemaRef.RequireCompleteEnumDecl(EnumD, EnumD->
getLocation()))
4039 TypeSourceInfo *TSI = SemaRef.SubstType(D->
getEnumType(), TemplateArgs,
4045 UsingEnumDecl *NewUD =
4049 SemaRef.Context.setInstantiatedFromUsingEnumDecl(NewUD, D);
4051 Owner->addDecl(NewUD);
4069Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
4075template <
typename T>
4076Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
4077 T *D,
bool InstantiatingPackElement) {
4079 if (D->isPackExpansion() && !InstantiatingPackElement) {
4080 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4081 SemaRef.collectUnexpandedParameterPacks(D->getQualifierLoc(), Unexpanded);
4082 SemaRef.collectUnexpandedParameterPacks(D->getNameInfo(), Unexpanded);
4087 bool RetainExpansion =
false;
4088 UnsignedOrNone NumExpansions = std::nullopt;
4089 if (SemaRef.CheckParameterPacksForExpansion(
4090 D->getEllipsisLoc(), D->getSourceRange(), Unexpanded, TemplateArgs,
4091 true, Expand, RetainExpansion,
4097 assert(!RetainExpansion &&
4098 "should never need to retain an expansion for UsingPackDecl");
4103 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
4104 return instantiateUnresolvedUsingDecl(D,
true);
4114 if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {
4115 SemaRef.Diag(D->getEllipsisLoc(),
4116 diag::err_using_decl_redeclaration_expansion);
4121 SmallVector<NamedDecl*, 8> Expansions;
4122 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4123 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
4124 Decl *Slice = instantiateUnresolvedUsingDecl(D,
true);
4134 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4136 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4140 UnresolvedUsingTypenameDecl *TD = dyn_cast<UnresolvedUsingTypenameDecl>(D);
4141 SourceLocation TypenameLoc = TD ? TD->
getTypenameLoc() : SourceLocation();
4143 NestedNameSpecifierLoc QualifierLoc
4144 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
4150 SS.
Adopt(QualifierLoc);
4152 DeclarationNameInfo NameInfo
4153 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
4157 bool InstantiatingSlice =
4158 D->getEllipsisLoc().isValid() && SemaRef.ArgPackSubstIndex;
4159 SourceLocation EllipsisLoc =
4160 InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
4163 NamedDecl *UD = SemaRef.BuildUsingDeclaration(
4164 nullptr, D->getAccess(), D->getUsingLoc(),
4165 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
4166 ParsedAttributesView(),
4167 true, IsUsingIfExists);
4169 SemaRef.InstantiateAttrs(TemplateArgs, D, UD);
4170 SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
4176Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
4178 return instantiateUnresolvedUsingDecl(D);
4181Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
4183 return instantiateUnresolvedUsingDecl(D);
4186Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
4188 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
4192 SmallVector<NamedDecl*, 8> Expansions;
4194 if (NamedDecl *NewUD =
4195 SemaRef.FindInstantiatedDecl(D->
getLocation(), UD, TemplateArgs))
4196 Expansions.push_back(NewUD);
4201 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4203 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4207Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
4209 SmallVector<Expr *, 5> Vars;
4210 for (
auto *I : D->
varlist()) {
4211 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4213 Vars.push_back(Var);
4216 OMPThreadPrivateDecl *TD =
4217 SemaRef.OpenMP().CheckOMPThreadPrivateDecl(D->
getLocation(), Vars);
4227 SmallVector<Expr *, 5> Vars;
4228 for (
auto *I : D->
varlist()) {
4229 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4231 Vars.push_back(Var);
4234 OMPGroupPrivateDecl *TD =
4235 SemaRef.OpenMP().CheckOMPGroupPrivateDecl(D->
getLocation(), Vars);
4244 SmallVector<Expr *, 5> Vars;
4245 for (
auto *I : D->
varlist()) {
4246 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4248 Vars.push_back(Var);
4250 SmallVector<OMPClause *, 4> Clauses;
4253 OMPClause *IC =
nullptr;
4254 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
4255 ExprResult NewE = SemaRef.SubstExpr(AC->getAllocator(), TemplateArgs);
4258 IC = SemaRef.OpenMP().ActOnOpenMPAllocatorClause(
4259 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4260 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
4261 ExprResult NewE = SemaRef.SubstExpr(AC->getAlignment(), TemplateArgs);
4264 IC = SemaRef.OpenMP().ActOnOpenMPAlignClause(
4265 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4270 Clauses.push_back(IC);
4282 "Requires directive cannot be instantiated within a dependent context");
4285Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
4288 const bool RequiresInstantiation =
4292 QualType SubstReductionType;
4293 if (RequiresInstantiation) {
4294 SubstReductionType = SemaRef.OpenMP().ActOnOpenMPDeclareReductionType(
4299 SubstReductionType = D->
getType();
4301 if (SubstReductionType.
isNull())
4305 bool IsCorrect =
true;
4307 std::pair<QualType, SourceLocation> ReductionTypes[] = {
4308 std::make_pair(SubstReductionType, D->
getLocation())};
4310 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4312 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4315 auto DRD = SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveStart(
4319 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDRD);
4320 Expr *SubstCombiner =
nullptr;
4321 Expr *SubstInitializer =
nullptr;
4324 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerStart(
4326 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4329 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4332 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4333 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4335 SubstCombiner = SemaRef.SubstExpr(Combiner, TemplateArgs).get();
4336 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerEnd(NewDRD,
4341 VarDecl *OmpPrivParm =
4342 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerStart(
4344 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4347 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4351 SubstInitializer = SemaRef.SubstExpr(
Init, TemplateArgs).get();
4355 IsCorrect = IsCorrect && OldPrivParm->hasInit();
4357 SemaRef.InstantiateVariableInitializer(OmpPrivParm, OldPrivParm,
4360 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerEnd(
4361 NewDRD, SubstInitializer, OmpPrivParm);
4363 IsCorrect = IsCorrect && SubstCombiner &&
4366 SubstInitializer) ||
4368 !SubstInitializer));
4370 (void)SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveEnd(
4379 const bool RequiresInstantiation =
4383 QualType SubstMapperTy;
4385 if (RequiresInstantiation) {
4386 SubstMapperTy = SemaRef.OpenMP().ActOnOpenMPDeclareMapperType(
4393 if (SubstMapperTy.
isNull())
4397 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4399 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4402 bool IsCorrect =
true;
4403 SmallVector<OMPClause *, 6> Clauses;
4405 DeclarationNameInfo DirName;
4406 SemaRef.OpenMP().StartOpenMPDSABlock(llvm::omp::OMPD_declare_mapper, DirName,
4410 SemaRef.OpenMP().ActOnOpenMPDeclareMapperDirectiveVarDecl(
4412 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4415 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4416 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4421 SmallVector<Expr *, 4> NewVars;
4422 for (Expr *OE : OldC->varlist()) {
4423 Expr *
NE = SemaRef.SubstExpr(OE, TemplateArgs).get();
4428 NewVars.push_back(NE);
4432 NestedNameSpecifierLoc NewQualifierLoc =
4433 SemaRef.SubstNestedNameSpecifierLoc(OldC->getMapperQualifierLoc(),
4436 SS.
Adopt(NewQualifierLoc);
4437 DeclarationNameInfo NewNameInfo =
4438 SemaRef.SubstDeclarationNameInfo(OldC->getMapperIdInfo(), TemplateArgs);
4439 OMPVarListLocTy Locs(OldC->getBeginLoc(), OldC->getLParenLoc(),
4441 OMPClause *NewC = SemaRef.OpenMP().ActOnOpenMPMapClause(
4442 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
4443 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
4444 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
4446 Clauses.push_back(NewC);
4448 SemaRef.OpenMP().EndOpenMPDSABlock(
nullptr);
4453 VN, D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
4455 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDMD);
4459Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
4461 llvm_unreachable(
"Should not be met in templates");
4472 Owner->addDecl(Inst);
4481 llvm_unreachable(
"There are only CXXRecordDecls in C++");
4485TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
4492 "can only instantiate an explicit specialization "
4493 "for a member class template");
4497 ClassTemplateDecl *InstClassTemplate =
4498 cast_or_null<ClassTemplateDecl>(SemaRef.FindInstantiatedDecl(
4500 if (!InstClassTemplate)
4505 TemplateArgumentListInfo InstTemplateArgs;
4506 if (
const ASTTemplateArgumentListInfo *TemplateArgsInfo =
4508 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4509 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4511 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4512 TemplateArgs, InstTemplateArgs))
4518 Sema::CheckTemplateArgumentInfo CTAI;
4519 if (SemaRef.CheckTemplateArgumentList(
4520 InstClassTemplate, D->
getLocation(), InstTemplateArgs,
4527 void *InsertPos =
nullptr;
4528 ClassTemplateSpecializationDecl *PrevDecl =
4535 SemaRef.CheckSpecializationInstantiationRedecl(D->
getLocation(),
4557 SemaRef.Diag(D->
getLocation(), diag::err_redefinition) << PrevDecl;
4559 diag::note_previous_definition);
4564 ClassTemplateSpecializationDecl *InstD =
4586 Owner->addDecl(InstD);
4593 SemaRef.InstantiateClass(D->
getLocation(), InstD, D, TemplateArgs,
4607 "A template specialization without specialized template?");
4610 cast_or_null<VarTemplateDecl>(SemaRef.FindInstantiatedDecl(
4612 if (!InstVarTemplate)
4618 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4619 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4621 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4622 TemplateArgs, VarTemplateArgsInfo))
4628 if (SemaRef.CheckTemplateArgumentList(
4629 InstVarTemplate, D->
getLocation(), VarTemplateArgsInfo,
4635 void *InsertPos =
nullptr;
4642 if (PrevDecl && SemaRef.CheckSpecializationInstantiationRedecl(
4650 VTSD->setTemplateArgsAsWritten(VarTemplateArgsInfo);
4670 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
4680 void *InsertPos =
nullptr;
4681 VarTemplate->findSpecialization(Converted, InsertPos);
4685 if (SemaRef.getLangOpts().OpenCL)
4686 SemaRef.deduceOpenCLAddressSpace(Var);
4692 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
4693 StartingScope,
false, PrevDecl);
4699 llvm_unreachable(
"@defs is not supported in Objective-C++");
4704 unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
4706 "cannot instantiate %0 yet");
4714 llvm_unreachable(
"Concept definitions cannot reside inside a template");
4717Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
4719 llvm_unreachable(
"Concept specializations cannot reside inside a template");
4729 llvm_unreachable(
"Unexpected decl");
4740 SubstD = Instantiator.Visit(D);
4754 T = SemaRef.Context.getFunctionType(
4755 SemaRef.Context.BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
4764 SemaRef.Context.getTrivialTypeSourceInfo(
T, Orig->
getEndLoc());
4766 assert(OldLoc &&
"type of function is not a function type?");
4768 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
4769 NewLoc.
setParam(I, OldLoc.getParam(I));
4774 SemaRef.Context.DeclarationNames.getCXXOperatorName(OO_EqualEqual));
4779 if (Spaceship->isInvalidDecl())
4791 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
4796 assert(Spaceship->getFriendObjectKind() &&
4797 "defaulted spaceship is neither a member nor a friend");
4811 return cast_or_null<FunctionDecl>(R);
4825 unsigned N = L->
size();
4829 for (
auto &P : *L) {
4831 Params.push_back(D);
4851 bool EvaluateConstraints) {
4890 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
4897 if (SemaRef.CheckTemplateArgumentList(
4898 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
4904 if (SemaRef.CheckTemplatePartialSpecializationArgs(
4911 void *InsertPos =
nullptr;
4914 InstParams, InsertPos);
4919 SemaRef.Context, PartialSpec->
getTagKind(), Owner,
4950 diag::err_partial_spec_redeclared)
4952 SemaRef.Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
4953 << SemaRef.Context.getCanonicalTagType(PrevDecl);
4958 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
4964 return InstPartialSpec;
5000 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
5008 InstTemplateArgs, {},
5013 if (SemaRef.CheckTemplatePartialSpecializationArgs(
5020 void *InsertPos =
nullptr;
5023 InstParams, InsertPos);
5034 diag::err_variable_instantiates_to_function)
5071 diag::err_var_partial_spec_redeclared)
5074 diag::note_var_prev_partial_spec_here);
5078 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5082 VarTemplate->AddPartialSpecialization(InstPartialSpec,
nullptr);
5084 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
5085 LateAttrs, Owner, StartingScope);
5087 return InstPartialSpec;
5094 assert(OldTInfo &&
"substituting function without type source info");
5095 assert(Params.empty() &&
"parameter vector is non-empty at start");
5101 ThisTypeQuals =
Method->getFunctionObjectParameterType().getQualifiers();
5106 ThisContext, ThisTypeQuals, EvaluateConstraints);
5112 if (NewTInfo != OldTInfo) {
5116 unsigned NewIdx = 0;
5117 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
5118 OldIdx != NumOldParams; ++OldIdx) {
5119 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
5127 NumArgumentsInExpansion =
5128 SemaRef.getNumArgumentsInExpansion(OldParam->
getType(),
5130 if (!NumArgumentsInExpansion) {
5134 Params.push_back(NewParam);
5135 Scope->InstantiatedLocal(OldParam, NewParam);
5138 Scope->MakeInstantiatedLocalArgPack(OldParam);
5139 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
5141 Params.push_back(NewParam);
5142 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
5152 for (
unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
5156 Params.push_back(SemaRef.BuildParmVarDeclForTypedef(
5162 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
5165 Params.push_back(Parm);
5182 TemplateArgs, ParamTypes, &Params,
5195 for (
auto *
decl : PatternDecl->
decls()) {
5202 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
5203 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
5204 return InstVD && InstVD->isLocalVarDecl() &&
5205 InstVD->getIdentifier() == II;
5211 Scope.InstantiatedLocal(VD, *it);
5218bool Sema::addInstantiatedParametersToScope(
5222 unsigned FParamIdx = 0;
5223 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
5224 const ParmVarDecl *PatternParam = PatternDecl->
getParamDecl(I);
5227 assert(FParamIdx < Function->getNumParams());
5252 UnsignedOrNone NumArgumentsInExpansion =
5254 if (NumArgumentsInExpansion) {
5255 QualType PatternType =
5256 PatternParam->
getType()->
castAs<PackExpansionType>()->getPattern();
5257 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
5261 Sema::ArgPackSubstIndexRAII SubstIndex(*
this, Arg);
5281 assert(Param->hasUninstantiatedDefaultArg());
5313 false, std::nullopt,
5322 L->DefaultArgumentInstantiated(Param);
5335 if (AlreadyInstantiating) {
5338 Diag(PointOfInstantiation, diag::err_exception_spec_cycle) <<
Decl;
5360 false, std::nullopt,
5393 SemaRef.Context.setManglingNumber(
New,
5394 SemaRef.Context.getManglingNumber(Tmpl));
5407 ActiveInstType &ActiveInst = SemaRef.CodeSynthesisContexts.back();
5408 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
5409 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
5411 SemaRef.CurrentSFINAEContext =
nullptr;
5412 atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef, ActiveInst);
5413 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
5414 ActiveInst.Entity =
New;
5420 assert(Proto &&
"Function template without prototype?");
5429 if (SemaRef.getLangOpts().CPlusPlus11 &&
5444 assert(NewProto &&
"Template instantiation without function prototype?");
5449 New->setType(SemaRef.Context.getFunctionType(
5453 SemaRef.SubstExceptionSpec(
New, Proto, TemplateArgs);
5462 LateAttrs, StartingScope);
5483 New->setVirtualAsWritten(
true);
5494 Lookups.reserve(DFI->getUnqualifiedLookups().size());
5495 bool AnyChanged =
false;
5497 NamedDecl *D = SemaRef.FindInstantiatedDecl(
New->getLocation(),
5498 DA.getDecl(), TemplateArgs);
5501 AnyChanged |= (D != DA.getDecl());
5507 New->setDefaultedOrDeletedInfo(
5509 SemaRef.Context, Lookups)
5536 bool DefinitionRequired,
5544 Function->getTemplateSpecializationKindForInstantiation();
5551 !DefinitionRequired)
5556 if (
Function->isDefined(ExistingDefn,
5571 assert(!AlreadyInstantiating &&
"should have been caught by caller");
5576 assert(PatternDecl &&
"instantiating a non-template");
5579 Stmt *Pattern =
nullptr;
5581 Pattern = PatternDef->
getBody(PatternDef);
5582 PatternDecl = PatternDef;
5584 PatternDef =
nullptr;
5588 bool Unreachable =
false;
5593 Function->getInstantiatedFromMemberFunction(), PatternDecl,
5595 DefinitionRequired, &Unreachable)) {
5596 if (DefinitionRequired)
5599 (
Function->isConstexpr() && !Recursive)) {
5603 Function->setInstantiationIsPending(
true);
5606 if (llvm::isTimeTraceVerbose()) {
5607 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
5609 llvm::raw_string_ostream
OS(Name);
5618 Diag(PointOfInstantiation, diag::warn_func_template_missing)
5624 diag::note_unreachable_template_decl);
5628 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
5640 Function->setInstantiationIsPending(
true);
5642 std::make_pair(
Function, PointOfInstantiation));
5646 llvm::TimeTraceScope TimeScope(
"InstantiateFunction", [&]() {
5647 llvm::TimeTraceMetadata M;
5648 llvm::raw_string_ostream
OS(M.Detail);
5651 if (llvm::isTimeTraceVerbose()) {
5654 M.Line =
SourceMgr.getExpansionLineNumber(Loc);
5680 "missing LateParsedTemplate");
5682 Pattern = PatternDecl->
getBody(PatternDecl);
5689 "unexpected kind of function template definition");
5704 for (
auto *D =
Function->getMostRecentDecl(); ;
5706 D->setImplicitlyInline();
5717 "instantiating function definition");
5721 Function->setVisibleDespiteOwningModule();
5747 auto NameLocPointsToPattern = [&] {
5758 return PatternNameLoc;
5768 return PatternNameLoc;
5776 assert(PatternTSI &&
"Pattern is supposed to have an associated TSI");
5784 Function->setDeclarationNameLoc(NameLocPointsToPattern());
5792 ThisContext =
Method->getParent();
5793 ThisTypeQuals =
Method->getMethodQualifiers();
5803 bool MergeWithParentScope =
false;
5805 MergeWithParentScope =
5806 Rec->isLocalClass() && !
Function->isFunctionTemplateSpecialization();
5809 auto RebuildTypeSourceInfoForDefaultSpecialMembers = [&]() {
5815 "Special member needs to be defaulted");
5823 auto *NewRec = dyn_cast<CXXRecordDecl>(
Function->getDeclContext());
5824 const auto *PatternRec =
5826 if (!NewRec || !PatternRec)
5828 if (!PatternRec->isLambda())
5831 struct SpecialMemberTypeInfoRebuilder
5851 getDerived().TransformDecl(TL.
getNameLoc(),
T->getDecl()));
5853 return Base::TransformRecordType(TLB, TL);
5867 } IR{*
this, PatternRec, NewRec};
5870 assert(NewSI &&
"Type Transform failed?");
5872 Function->setTypeSourceInfo(NewSI);
5876 assert(NewParmSI &&
"Type transformation failed.");
5882 RebuildTypeSourceInfoForDefaultSpecialMembers();
5886 std::optional<ArrayRef<TemplateArgument>> Innermost;
5887 if (
auto *Primary =
Function->getPrimaryTemplate();
5890 Function->getTemplateSpecializationKind() !=
5892 auto It = llvm::find_if(Primary->redecls(),
5894 return cast<FunctionTemplateDecl>(RTD)
5895 ->isCompatibleWithDefinition();
5897 assert(It != Primary->redecls().end() &&
5898 "Should't get here without a definition");
5900 ->getTemplatedDecl()
5904 DC = (*It)->getLexicalDeclContext();
5905 Innermost.emplace(
Function->getTemplateSpecializationArgs()->asArray());
5908 Function, DC,
false, Innermost,
false, PatternDecl);
5926 if (addInstantiatedParametersToScope(
Function, PatternDecl,
Scope,
5942 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
5943 Ctor->isDefaultConstructor()) {
5949 Body =
SubstStmt(Pattern, TemplateArgs);
5958 checkReferenceToTULocalFromOtherTU(
Function, PointOfInstantiation);
5963 Listener->FunctionDefinitionInstantiated(
Function);
5973 bool ShouldSkipCG = [&] {
5974 auto *RD = dyn_cast<CXXRecordDecl>(
Function->getParent());
5975 if (!RD || !RD->isLambda())
5979 return Context.isUnevaluated() ||
Context.isImmediateFunctionContext();
5982 if (!ShouldSkipCG) {
5989 LocalInstantiations.
perform();
5991 GlobalInstantiations.perform();
6017 bool IsMemberSpec =
false;
6019 if (
auto *PartialSpec =
6020 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar)) {
6021 assert(PartialSpecArgs);
6022 IsMemberSpec = PartialSpec->isMemberSpecialization();
6024 PartialSpec, PartialSpecArgs->
asArray(),
false);
6027 IsMemberSpec =
VarTemplate->isMemberSpecialization();
6047 "don't have a definition to instantiate from");
6076 bool InstantiatingVarTemplate,
6080 bool InstantiatingVarTemplatePartialSpec =
6085 bool InstantiatingSpecFromTemplate =
6111 if (OldVar->
isUsed(
false))
6136 }
else if (PrevDeclForVarTemplateSpecialization) {
6137 Previous.addDecl(PrevDeclForVarTemplateSpecialization);
6141 if (!InstantiatingVarTemplate) {
6159 !InstantiatingSpecFromTemplate)
6166 dyn_cast<VarTemplateSpecializationDecl>(OldVar)) {
6174 Context.setManglingNumber(NewVar,
Context.getManglingNumber(OldVar));
6175 Context.setStaticLocalNumber(NewVar,
Context.getStaticLocalNumber(OldVar));
6178 if (InstantiatingVarTemplate || InstantiatingVarTemplatePartialSpec) {
6183 }
else if (InstantiatingSpecFromTemplate ||
6205 L->VariableDefinitionInstantiated(Var);
6235 if (!
Init.isInvalid()) {
6238 if (Var->
hasAttr<DLLImportAttr>() &&
6242 }
else if (InitExpr) {
6278 bool DefinitionRequired,
bool AtEndOfTU) {
6290 if (AlreadyInstantiating)
6295 assert(PatternDecl &&
"no pattern for templated variable");
6300 dyn_cast<VarTemplateSpecializationDecl>(Var);
6311 (PatternDecl = PatternDecl->
getFirstDecl())->hasInit() &&
6320 "instantiating variable initializer");
6331 Recursive, AtEndOfTU);
6340 PreviousContext.
pop();
6344 LocalInstantiations.
perform();
6346 GlobalInstantiations.
perform();
6350 "not a static data member?");
6359 if (!Def && !DefinitionRequired) {
6366 Diag(PointOfInstantiation, diag::warn_var_template_missing)
6370 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
6381 PatternDecl, Def, TSK,
6382 DefinitionRequired))
6399 struct PassToConsumerRAII {
6406 ~PassToConsumerRAII() {
6407 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
6409 } PassToConsumerRAII(
Consumer, Var);
6416 PointOfInstantiation);
6425 "instantiating variable definition");
6447 }
else if (!VarSpec) {
6492 PreviousContext.
pop();
6495 PassToConsumerRAII.Var = Var;
6504 LocalInstantiations.
perform();
6506 GlobalInstantiations.
perform();
6518 for (
const auto *
Init : Tmpl->
inits()) {
6521 if (!
Init->isWritten())
6526 if (
Init->isPackExpansion()) {
6528 TypeLoc BaseTL =
Init->getTypeSourceInfo()->getTypeLoc();
6532 bool ShouldExpand =
false;
6533 bool RetainExpansion =
false;
6537 TemplateArgs,
true, ShouldExpand,
6538 RetainExpansion, NumExpansions)) {
6540 New->setInvalidDecl();
6543 assert(ShouldExpand &&
"Partial instantiation of base initializer?");
6546 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6560 Init->getSourceLocation(),
6561 New->getDeclName());
6569 BaseTInfo, TempInit.
get(),
6577 NewInits.push_back(NewInit.
get());
6592 if (
Init->isDelegatingInitializer() ||
Init->isBaseInitializer()) {
6595 Init->getSourceLocation(),
6596 New->getDeclName());
6599 New->setInvalidDecl();
6603 if (
Init->isBaseInitializer())
6605 New->getParent(), EllipsisLoc);
6609 }
else if (
Init->isMemberInitializer()) {
6611 Init->getMemberLocation(),
6616 New->setInvalidDecl();
6621 Init->getSourceLocation());
6622 }
else if (
Init->isIndirectMemberInitializer()) {
6625 Init->getMemberLocation(),
6626 Init->getIndirectMember(), TemplateArgs));
6628 if (!IndirectMember) {
6630 New->setInvalidDecl();
6635 Init->getSourceLocation());
6640 New->setInvalidDecl();
6642 NewInits.push_back(NewInit.
get());
6661 Instance = Instance->getCanonicalDecl();
6662 if (Pattern == Instance)
return true;
6663 Instance = Instance->getInstantiatedFromMemberTemplate();
6674 Instance = Instance->getCanonicalDecl();
6675 if (Pattern == Instance)
return true;
6676 Instance = Instance->getInstantiatedFromMemberTemplate();
6689 Instance->getCanonicalDecl());
6690 if (Pattern == Instance)
6692 Instance = Instance->getInstantiatedFromMember();
6703 Instance = Instance->getCanonicalDecl();
6704 if (Pattern == Instance)
return true;
6705 Instance = Instance->getInstantiatedFromMemberClass();
6716 Instance = Instance->getCanonicalDecl();
6717 if (Pattern == Instance)
return true;
6718 Instance = Instance->getInstantiatedFromMemberFunction();
6729 Instance = Instance->getCanonicalDecl();
6730 if (Pattern == Instance)
return true;
6731 Instance = Instance->getInstantiatedFromMemberEnum();
6758 bool OtherIsPackExpansion;
6760 if (
auto *OtherUUD = dyn_cast<T>(
Other)) {
6761 OtherIsPackExpansion = OtherUUD->isPackExpansion();
6763 }
else if (
auto *OtherUPD = dyn_cast<UsingPackDecl>(
Other)) {
6764 OtherIsPackExpansion =
true;
6765 OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
6766 }
else if (
auto *OtherUD = dyn_cast<UsingDecl>(
Other)) {
6767 OtherIsPackExpansion =
false;
6772 return Pattern->isPackExpansion() == OtherIsPackExpansion &&
6778 assert(Instance->isStaticDataMember());
6783 Instance = Instance->getCanonicalDecl();
6784 if (Pattern == Instance)
return true;
6785 Instance = Instance->getInstantiatedFromStaticDataMember();
6794 if (
auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D))
6797 if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D))
6803 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
Other))
6806 if (
auto *Function = dyn_cast<FunctionDecl>(
Other))
6809 if (
auto *
Enum = dyn_cast<EnumDecl>(
Other))
6812 if (
auto *Var = dyn_cast<VarDecl>(
Other))
6816 if (
auto *Temp = dyn_cast<ClassTemplateDecl>(
Other))
6819 if (
auto *Temp = dyn_cast<FunctionTemplateDecl>(
Other))
6822 if (
auto *PartialSpec =
6823 dyn_cast<ClassTemplatePartialSpecializationDecl>(
Other))
6827 if (
auto *Field = dyn_cast<FieldDecl>(
Other)) {
6828 if (!Field->getDeclName()) {
6835 if (
auto *Using = dyn_cast<UsingDecl>(
Other))
6838 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
Other))
6845template<
typename ForwardIterator>
6848 ForwardIterator first,
6849 ForwardIterator last) {
6850 for (; first != last; ++first)
6859 if (
NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
6861 return cast_or_null<DeclContext>(ID);
6876 return cast<Decl>(DC)->getTemplateDepth() > Level;
6881 bool FindingInstantiatedContext) {
6919 if (
auto *BD = dyn_cast<BindingDecl>(FD);
6927 "found declaration pack but not pack expanding");
6957 bool NeedInstantiate =
false;
6959 NeedInstantiate = RD->isLocalClass();
6962 NeedInstantiate =
true;
6965 if (NeedInstantiate) {
6976 assert(Inst &&
"Failed to instantiate label??");
6983 if (!
Record->isDependentContext())
6992 dyn_cast<ClassTemplateSpecializationDecl>(
Record))
6993 ClassTemplate = Spec->getSpecializedTemplate()->getCanonicalDecl();
7004 if (
CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
7008 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
7028 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD);
7029 if (Guide && Guide->isImplicit()) {
7037 Unpacked = Arg.pack_elements();
7050 if (
T.isNull() ||
T->containsErrors())
7060 assert(
SemaRef.RebuildingImmediateInvocation ||
7073 if (FindingInstantiatedContext &&
7076 Diag(Loc, diag::err_specialization_not_primary_template)
7093 if (!ParentDependsOnArgs)
7107 bool IsBeingInstantiated =
false;
7108 if (
auto *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
7109 if (!Spec->isDependentContext()) {
7110 if (Spec->isEntityBeingDefined())
7111 IsBeingInstantiated =
true;
7113 diag::err_incomplete_type))
7116 ParentDC = Spec->getDefinitionOrSelf();
7155 }
else if (IsBeingInstantiated) {
7161 Diag(Loc, diag::err_member_not_yet_instantiated)
7174 Diag(Loc, diag::err_enumerator_does_not_exist)
7178 <<
Context.getCanonicalTagType(Spec);
7181 llvm_unreachable(
"Unable to find instantiation of declaration!");
7192 std::deque<PendingImplicitInstantiation> DelayedImplicitInstantiations;
7197 bool LocalInstantiation =
false;
7204 LocalInstantiation =
true;
7209 bool DefinitionRequired =
Function->getTemplateSpecializationKind() ==
7214 [
this, Inst, DefinitionRequired, AtEndOfTU](
FunctionDecl *CurFD) {
7216 DefinitionRequired, AtEndOfTU);
7222 DefinitionRequired, AtEndOfTU);
7224 Function->setInstantiationIsPending(
false);
7227 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates &&
7229 DelayedImplicitInstantiations.push_back(Inst);
7230 else if (!AtEndOfTU &&
Function->instantiationIsPending() &&
7231 !LocalInstantiation)
7232 DelayedImplicitInstantiations.push_back(Inst);
7241 "Not a static data member, nor a variable template"
7242 " specialization?");
7254 llvm_unreachable(
"Cannot instantitiate an undeclared specialization.");
7269 "instantiating variable definition");
7276 DefinitionRequired, AtEndOfTU);
7279 if (!DelayedImplicitInstantiations.empty())
7285 for (
auto *DD : Pattern->
ddiags()) {
7286 switch (DD->getKind()) {
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
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.
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.
TemplateParameterList * getTemplateParameterList(unsigned index) const
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...
unsigned getNumTemplateParameterLists() const
void setTypeSourceInfo(TypeSourceInfo *TI)
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...
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(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.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef, const Expr **Culprit=nullptr) const
isConstantInitializer - Returns true if this expression can be emitted to IR as a constant,...
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'.
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.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
bool anyScoreOrCondition(llvm::function_ref< bool(Expr *&, bool)> Cond)
Represents a field declaration created by an @defs(...).
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.
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
void deduceOpenCLAddressSpace(ValueDecl *decl)
PragmaStack< FPOptionsOverride > FpPragmaStack
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
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 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 AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
const LangOptions & LangOpts
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 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
const FunctionProtoType * T
@ 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.