35#include "llvm/Support/SaveAndRestore.h"
36#include "llvm/Support/TimeProfiler.h"
52template<
typename DeclT>
55 if (!OldDecl->getQualifierLoc())
58 assert((NewDecl->getFriendObjectKind() ||
59 !OldDecl->getLexicalDeclContext()->isDependentContext()) &&
60 "non-friend with qualified name defined in dependent context");
63 const_cast<DeclContext *
>(NewDecl->getFriendObjectKind()
64 ? NewDecl->getLexicalDeclContext()
65 : OldDecl->getLexicalDeclContext()));
74 NewDecl->setQualifierInfo(NewQualifierLoc);
80 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
85 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
89#include "clang/Sema/AttrTemplateInstantiate.inc"
93 const AlignedAttr *Aligned,
Decl *
New,
bool IsPackExpansion) {
94 if (Aligned->isAlignmentExpr()) {
103 S.
SubstType(Aligned->getAlignmentType(), TemplateArgs,
106 Aligned->getLocation(),
107 Result->getTypeLoc().getSourceRange()))
115 const AlignedAttr *Aligned,
Decl *
New) {
116 if (!Aligned->isPackExpansion()) {
122 if (Aligned->isAlignmentExpr())
128 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
131 bool Expand =
true, RetainExpansion =
false;
136 Unexpanded, TemplateArgs,
138 Expand, RetainExpansion, NumExpansions))
145 for (
unsigned I = 0; I != *NumExpansions; ++I) {
154 const AssumeAlignedAttr *Aligned,
Decl *
New) {
159 Expr *E, *OE =
nullptr;
165 if (Aligned->getOffset()) {
177 const AlignValueAttr *Aligned,
Decl *
New) {
188 const AllocAlignAttr *Align,
Decl *
New) {
191 llvm::APInt(64, Align->getParamIndex().getSourceIndex()),
204 bool HasDelayedArgs =
Attr->delayedArgs_size();
213 false, TemplateArgs, Args))
216 StringRef Str =
Attr->getAnnotation();
217 if (HasDelayedArgs) {
218 if (Args.size() < 1) {
228 ActualArgs.insert(ActualArgs.begin(), Args.begin() + 1, Args.end());
229 std::swap(Args, ActualArgs);
237template <
typename Attr>
241 Expr *tempInstPriority =
nullptr;
249 tempInstPriority =
Result.get();
250 if (std::optional<llvm::APSInt> CE =
254 if (!CE->isIntN(32)) {
256 <<
toString(*CE, 10,
false) << 32 << 1;
262 New->addAttr(Attr::Create(
C, tempInstPriority, *A));
278 if (!
Cond->isTypeDependent()) {
288 S.
Diag(A->
getLocation(), diag::err_attr_cond_never_constant_expr) << A;
289 for (
const auto &P : Diags)
290 S.
Diag(P.first, P.second);
300 S, TemplateArgs, EIA, EIA->getCond(), Tmpl,
New);
304 Cond, EIA->getMessage()));
311 S, TemplateArgs, DIA, DIA->getCond(), Tmpl,
New);
316 DIA->getDefaultSeverity(), DIA->getWarningGroup(),
317 DIA->getArgDependent(),
New));
334 Expr *MinBlocks =
nullptr;
335 if (
Attr.getMinBlocks()) {
342 Expr *MaxBlocks =
nullptr;
343 if (
Attr.getMaxBlocks()) {
366 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
New))
367 New = FTD->getTemplatedDecl();
369 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
374 if (
auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
375 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
378 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
379 Local.InstantiatedLocal(
380 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
384 FD->isCXXInstanceMember());
400 if (
auto *E =
Attr.getSimdlen())
403 if (
Attr.uniforms_size() > 0) {
404 for(
auto *E :
Attr.uniforms()) {
408 Uniforms.push_back(Inst.
get());
412 auto AI =
Attr.alignments_begin();
413 for (
auto *E :
Attr.aligneds()) {
417 Aligneds.push_back(Inst.
get());
421 Alignments.push_back(Inst.
get());
425 auto SI =
Attr.steps_begin();
426 for (
auto *E :
Attr.linears()) {
430 Linears.push_back(Inst.
get());
434 Steps.push_back(Inst.
get());
437 LinModifiers.append(
Attr.modifiers_begin(),
Attr.modifiers_end());
440 Uniforms, Aligneds, Alignments, Linears, LinModifiers, Steps,
449 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
New))
450 New = FTD->getTemplatedDecl();
452 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
454 auto &&SubstExpr = [FD, ThisContext, &S, &TemplateArgs](
Expr *E) {
455 if (
auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
456 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
459 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
460 Local.InstantiatedLocal(
461 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
465 FD->isCXXInstanceMember());
471 auto &&Subst = [&SubstExpr, &S](
Expr *E) {
481 if (
Expr *E =
Attr.getVariantFuncRef()) {
486 VariantFuncRef = Subst(E);
492 TI = *
Attr.getTraitInfos();
495 auto SubstScoreOrConditionExpr = [&S, Subst](
Expr *&E,
bool) {
510 Expr *E = VariantFuncRef.
get();
514 std::optional<std::pair<FunctionDecl *, Expr *>> DeclVarData =
522 E = DeclVarData->second;
523 FD = DeclVarData->first;
525 if (
auto *VariantDRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts())) {
526 if (
auto *VariantFD = dyn_cast<FunctionDecl>(VariantDRE->getDecl())) {
527 if (
auto *VariantFTD = VariantFD->getDescribedFunctionTemplate()) {
528 if (!VariantFTD->isThisDeclarationADefinition())
539 SubstFD->getType(), FD->getType(),
545 New->getLocation(), SubstFD,
true,
547 SubstFD->setInstantiationIsPending(!SubstFD->isDefined());
551 SubstFD->getLocation(),
562 for (
Expr *E :
Attr.adjustArgsNothing()) {
566 NothingExprs.push_back(ER.
get());
568 for (
Expr *E :
Attr.adjustArgsNeedDevicePtr()) {
572 NeedDevicePtrExprs.push_back(ER.
get());
574 for (
Expr *E :
Attr.adjustArgsNeedDeviceAddr()) {
578 NeedDeviceAddrExprs.push_back(ER.
get());
584 Expr *SubstFr =
nullptr;
595 SubstAttrs.push_back(ER.
get());
597 Info.
Prefs.emplace_back(SubstFr, std::move(SubstAttrs));
599 AppendArgs.push_back(Info);
603 FD, E, TI, NothingExprs, NeedDevicePtrExprs, NeedDeviceAddrExprs,
609 const AMDGPUFlatWorkGroupSizeAttr &
Attr,
Decl *
New) {
650 New->addAttr(::new (Context) ReqdWorkGroupSizeAttr(Context,
Attr,
X, Y, Z));
669 if (!
Cond->isTypeDependent())
686 Expr *MaxExpr =
nullptr;
687 if (
auto Max =
Attr.getMax()) {
699 const AMDGPUMaxNumWorkGroupsAttr &
Attr,
Decl *
New) {
703 Expr *XExpr =
nullptr;
704 Expr *YExpr =
nullptr;
705 Expr *ZExpr =
nullptr;
707 if (
Attr.getMaxNumWorkGroupsX()) {
713 if (
Attr.getMaxNumWorkGroupsY()) {
719 if (
Attr.getMaxNumWorkGroupsZ()) {
735 auto SubstElt = [&S, &TemplateArgs](
Expr *E) {
736 return E ? S.
SubstExpr(E, TemplateArgs).
get() :
nullptr;
739 Expr *XExpr = SubstElt(
Attr.getX());
740 Expr *YExpr = SubstElt(
Attr.getY());
741 Expr *ZExpr = SubstElt(
Attr.getZ());
761 if (
const auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
764 if (!
T->isDependentType() && !RD->isDependentContext() &&
767 for (
const auto *ExistingPNA : D->
specific_attrs<PreferredNameAttr>())
769 PNA->getTypedefType()))
774 if (
const auto *BA = dyn_cast<BuiltinAttr>(A)) {
776 switch (BA->getID()) {
777 case Builtin::BIforward:
787 case Builtin::BImove:
788 case Builtin::BImove_if_noexcept:
815 <<
Attr <<
"'groupshared'";
827 "out or inout parameter type must be a reference and restrict qualified");
831 const MallocSpanAttr *
Attr,
846 for (
const auto *TmplAttr : Tmpl->
attrs()) {
853 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
857 TmplAttr,
Context, *
this, TemplateArgs);
860 New->addAttr(NewAttr);
868 case clang::attr::CFConsumed:
870 case clang::attr::OSConsumed:
872 case clang::attr::NSConsumed:
875 llvm_unreachable(
"Wrong argument supplied");
882 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *Old,
Decl *
New);
888 for (
const auto *TmplAttr : Tmpl->
attrs()) {
893 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
894 if (Aligned && Aligned->isAlignmentDependent()) {
899 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
904 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
909 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
914 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
919 if (
auto *
Constructor = dyn_cast<ConstructorAttr>(TmplAttr)) {
925 if (
auto *
Destructor = dyn_cast<DestructorAttr>(TmplAttr)) {
931 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
937 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
943 if (
const auto *CUDALaunchBounds =
944 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
946 *CUDALaunchBounds,
New);
950 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
955 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
960 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
965 if (
const auto *ReqdWorkGroupSize =
966 dyn_cast<ReqdWorkGroupSizeAttr>(TmplAttr)) {
968 *ReqdWorkGroupSize,
New);
971 if (
const auto *AMDGPUFlatWorkGroupSize =
972 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
974 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize,
New);
977 if (
const auto *AMDGPUFlatWorkGroupSize =
978 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
980 *AMDGPUFlatWorkGroupSize,
New);
983 if (
const auto *AMDGPUMaxNumWorkGroups =
984 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
986 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups,
New);
989 if (
const auto *CUDAClusterDims = dyn_cast<CUDAClusterDimsAttr>(TmplAttr)) {
991 *CUDAClusterDims,
New);
994 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
1000 if (
const auto *RoutineAttr = dyn_cast<OpenACCRoutineDeclAttr>(TmplAttr)) {
1002 RoutineAttr, Tmpl,
New);
1007 if (TmplAttr->getKind() == attr::DLLExport ||
1008 TmplAttr->getKind() == attr::DLLImport) {
1009 if (
New->hasAttr<DLLExportAttr>() ||
New->hasAttr<DLLImportAttr>()) {
1014 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
1027 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
1028 if (!
New->hasAttr<PointerAttr>())
1033 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
1034 if (!
New->hasAttr<OwnerAttr>())
1039 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
1044 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
1045 if (!
New->hasAttr<CUDAGridConstantAttr>())
1050 if (
auto *A = dyn_cast<MallocSpanAttr>(TmplAttr)) {
1055 if (
auto *A = dyn_cast<CleanupAttr>(TmplAttr)) {
1056 if (!
New->hasAttr<CleanupAttr>()) {
1057 auto *NewAttr = A->clone(
Context);
1058 NewAttr->setArgLoc(A->getArgLoc());
1059 New->addAttr(NewAttr);
1064 assert(!TmplAttr->isPackExpansion());
1065 if (TmplAttr->isLateParsed() && LateAttrs) {
1075 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
1077 ND->isCXXInstanceMember());
1080 *
this, TemplateArgs);
1083 New->addAttr(NewAttr);
1089 for (
const auto *
Attr : Pattern->
attrs()) {
1090 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
1091 if (!Inst->
hasAttr<StrictFPAttr>())
1102template<
typename DeclT>
1104 DeclT *
Result = D->getPreviousDecl();
1110 D->getLexicalDeclContext() !=
Result->getLexicalDeclContext())
1118 llvm_unreachable(
"Translation units cannot be instantiated");
1122 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
1125Decl *TemplateDeclInstantiator::VisitHLSLRootSignatureDecl(
1127 llvm_unreachable(
"HLSL root signature declarations cannot be instantiated");
1132 llvm_unreachable(
"pragma comment cannot be instantiated");
1135Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
1137 llvm_unreachable(
"pragma comment cannot be instantiated");
1142 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
1146 llvm_unreachable(
"GUID declaration cannot be instantiated");
1149Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
1151 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
1154Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
1156 llvm_unreachable(
"template parameter objects cannot be instantiated");
1160TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *D) {
1163 SemaRef.InstantiateAttrs(TemplateArgs, D, Inst, LateAttrs, StartingScope);
1164 Owner->addDecl(Inst);
1169TemplateDeclInstantiator::VisitNamespaceDecl(
NamespaceDecl *D) {
1170 llvm_unreachable(
"Namespaces cannot be instantiated");
1174class OpenACCDeclClauseInstantiator final
1177 const MultiLevelTemplateArgumentList &MLTAL;
1178 ArrayRef<OpenACCClause *> ExistingClauses;
1179 SemaOpenACC::OpenACCParsedClause &ParsedClause;
1180 OpenACCClause *NewClause =
nullptr;
1183 OpenACCDeclClauseInstantiator(Sema &S,
1184 const MultiLevelTemplateArgumentList &MLTAL,
1185 ArrayRef<OpenACCClause *> ExistingClauses,
1186 SemaOpenACC::OpenACCParsedClause &ParsedClause)
1187 : SemaRef(S), MLTAL(MLTAL), ExistingClauses(ExistingClauses),
1188 ParsedClause(ParsedClause) {}
1190 OpenACCClause *CreatedClause() {
return NewClause; }
1191#define VISIT_CLAUSE(CLAUSE_NAME) \
1192 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
1193#include "clang/Basic/OpenACCClauses.def"
1197 for (
Expr *CurVar : VarList) {
1198 ExprResult Res = SemaRef.SubstExpr(CurVar, MLTAL);
1207 InstantiatedVarList.push_back(Res.
get());
1209 return InstantiatedVarList;
1213#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME) \
1214 void OpenACCDeclClauseInstantiator::Visit##CLAUSE_NAME##Clause( \
1215 const OpenACC##CLAUSE_NAME##Clause &) { \
1216 llvm_unreachable("Clause type invalid on declaration construct, or " \
1217 "instantiation not implemented"); \
1246#undef CLAUSE_NOT_ON_DECLS
1248void OpenACCDeclClauseInstantiator::VisitGangClause(
1252 assert(
C.getNumExprs() <= 1 &&
1253 "Only 1 expression allowed on gang clause in routine");
1255 if (
C.getNumExprs() > 0) {
1257 "Only dim allowed on routine");
1259 SemaRef.SubstExpr(
const_cast<Expr *
>(
C.getExpr(0).second), MLTAL);
1261 ER = SemaRef.OpenACC().CheckGangExpr(ExistingClauses,
1262 ParsedClause.getDirectiveKind(),
1263 C.getExpr(0).first, ER.
get());
1266 TransformedIntExprs.push_back(ER.
get());
1271 NewClause = SemaRef.OpenACC().CheckGangClause(
1272 ParsedClause.getDirectiveKind(), ExistingClauses,
1273 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1274 TransformedGangKinds, TransformedIntExprs, ParsedClause.getEndLoc());
1279 ParsedClause.getBeginLoc(),
1280 ParsedClause.getEndLoc());
1282void OpenACCDeclClauseInstantiator::VisitNoHostClause(
1285 ParsedClause.getBeginLoc(),
1286 ParsedClause.getEndLoc());
1289void OpenACCDeclClauseInstantiator::VisitDeviceTypeClause(
1293 SemaRef.getASTContext(),
C.getClauseKind(), ParsedClause.getBeginLoc(),
1294 ParsedClause.getLParenLoc(),
C.getArchitectures(),
1295 ParsedClause.getEndLoc());
1298void OpenACCDeclClauseInstantiator::VisitWorkerClause(
1300 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'worker' clause");
1302 ParsedClause.getBeginLoc(), {},
1303 nullptr, ParsedClause.getEndLoc());
1306void OpenACCDeclClauseInstantiator::VisitVectorClause(
1308 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'vector' clause");
1310 ParsedClause.getBeginLoc(), {},
1311 nullptr, ParsedClause.getEndLoc());
1314void OpenACCDeclClauseInstantiator::VisitCopyClause(
1316 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1317 C.getModifierList());
1318 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1321 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1322 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1323 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1324 ParsedClause.getEndLoc());
1327void OpenACCDeclClauseInstantiator::VisitLinkClause(
1329 ParsedClause.setVarListDetails(
1330 SemaRef.OpenACC().CheckLinkClauseVarList(VisitVarList(
C.getVarList())),
1333 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1338 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1339 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1340 ParsedClause.getEndLoc());
1343void OpenACCDeclClauseInstantiator::VisitDeviceResidentClause(
1345 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1347 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1351 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1352 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1353 ParsedClause.getEndLoc());
1356void OpenACCDeclClauseInstantiator::VisitCopyInClause(
1358 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1359 C.getModifierList());
1361 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1364 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1365 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1366 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1367 ParsedClause.getEndLoc());
1369void OpenACCDeclClauseInstantiator::VisitCopyOutClause(
1371 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1372 C.getModifierList());
1374 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1377 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1378 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1379 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1380 ParsedClause.getEndLoc());
1382void OpenACCDeclClauseInstantiator::VisitCreateClause(
1384 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1385 C.getModifierList());
1387 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1390 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1391 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1392 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1393 ParsedClause.getEndLoc());
1395void OpenACCDeclClauseInstantiator::VisitPresentClause(
1397 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1399 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1403 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1404 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1405 ParsedClause.getEndLoc());
1407void OpenACCDeclClauseInstantiator::VisitDevicePtrClause(
1411 llvm::erase_if(VarList, [&](
Expr *E) {
1416 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1420 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1421 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1422 ParsedClause.getEndLoc());
1425void OpenACCDeclClauseInstantiator::VisitBindClause(
1428 if (
C.isStringArgument())
1430 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1431 ParsedClause.getLParenLoc(),
C.getStringArgument(),
1432 ParsedClause.getEndLoc());
1435 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1436 ParsedClause.getLParenLoc(),
C.getIdentifierArgument(),
1437 ParsedClause.getEndLoc());
1445 for (
const auto *Clause : ClauseList) {
1447 Clause->getBeginLoc());
1448 ParsedClause.setEndLoc(Clause->getEndLoc());
1449 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(Clause))
1450 ParsedClause.setLParenLoc(WithParms->getLParenLoc());
1452 OpenACCDeclClauseInstantiator Instantiator{S, MLTAL, TransformedClauses,
1454 Instantiator.Visit(Clause);
1455 if (Instantiator.CreatedClause())
1456 TransformedClauses.push_back(Instantiator.CreatedClause());
1458 return TransformedClauses;
1465 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *OldDecl,
Decl *NewDecl) {
1466 OpenACCRoutineDeclAttr *A =
1467 OpenACCRoutineDeclAttr::Create(S.
getASTContext(), OldAttr->getLocation());
1469 if (!OldAttr->Clauses.empty()) {
1471 InstantiateOpenACCClauseList(
1473 A->Clauses.assign(TransformedClauses.begin(), TransformedClauses.end());
1484 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1488 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1492 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndDeclDirective(
1504 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1512 FuncRef = SemaRef.OpenACC().ActOnRoutineName(FuncRef.
get());
1517 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1521 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndRoutineDeclDirective(
1533 NamespaceAliasDecl *Inst
1541 Owner->addDecl(Inst);
1551 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1555 TSI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
1566 if (SemaRef.getPreprocessor().NeedsStdLibCxxWorkaroundBefore(2014'04'22)) {
1567 const DecltypeType *DT = TSI->
getType()->
getAs<DecltypeType>();
1570 DT->isReferenceType() &&
1571 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
1572 RD->getIdentifier() && RD->getIdentifier()->isStr(
"common_type") &&
1574 SemaRef.getSourceManager().isInSystemHeader(D->
getBeginLoc()))
1576 TSI = SemaRef.Context.getTrivialTypeSourceInfo(
1594 TagDecl *oldTag = oldTagType->getDecl();
1611 SemaRef.isIncompatibleTypedef(InstPrevTypedef,
Typedef);
1613 Typedef->setPreviousDecl(InstPrevTypedef);
1616 SemaRef.InstantiateAttrs(TemplateArgs, D,
Typedef);
1619 SemaRef.inferGslPointerAttribute(
Typedef);
1668 if (!
Found.empty()) {
1669 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1682 if (PrevAliasTemplate)
1687 if (!PrevAliasTemplate)
1714 SmallVector<BindingDecl*, 16> NewBindings;
1715 BindingDecl *OldBindingPack =
nullptr;
1716 for (
auto *OldBD : D->
bindings()) {
1717 Expr *BindingExpr = OldBD->getBinding();
1718 if (isa_and_present<FunctionParmPackExpr>(BindingExpr)) {
1720 assert(!OldBindingPack &&
"no more than one pack is allowed");
1721 OldBindingPack = OldBD;
1725 ArrayRef<BindingDecl*> NewBindingArray = NewBindings;
1727 auto *NewDD = cast_if_present<DecompositionDecl>(
1730 if (!NewDD || NewDD->isInvalidDecl()) {
1731 for (
auto *NewBD : NewBindings)
1732 NewBD->setInvalidDecl();
1733 }
else if (OldBindingPack) {
1736 BindingDecl *NewBindingPack = *llvm::find_if(
1738 assert(NewBindingPack !=
nullptr &&
"new bindings should also have a pack");
1739 llvm::ArrayRef<BindingDecl *> OldDecls =
1741 llvm::ArrayRef<BindingDecl *> NewDecls =
1743 assert(OldDecls.size() == NewDecls.size());
1744 for (
unsigned I = 0; I < OldDecls.size(); I++)
1745 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldDecls[I],
1757 bool InstantiatingVarTemplate,
1766 if (!InstantiatingVarTemplate)
1772 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
1774 if (!InstantiatingVarTemplate)
1779 DeclContext *DC = Owner;
1781 SemaRef.adjustContextForLocalExternDecl(DC);
1795 if (SemaRef.getLangOpts().ObjCAutoRefCount &&
1796 SemaRef.ObjC().inferObjCARCLifetime(Var))
1799 if (SemaRef.getLangOpts().OpenCL)
1800 SemaRef.deduceOpenCLAddressSpace(Var);
1806 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
1807 StartingScope, InstantiatingVarTemplate);
1810 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1811 RT = F->getReturnType();
1816 llvm_unreachable(
"Unknown context type");
1829 Sema::NamedReturnInfo Info = SemaRef.getNamedReturnInfo(Var);
1830 bool NRVO = SemaRef.getCopyElisionCandidate(Info, RT) !=
nullptr;
1837 SemaRef.CheckStaticLocalForDllExport(Var);
1840 SemaRef.CheckThreadLocalForLargeAlignment(Var);
1842 if (SemaRef.getLangOpts().OpenACC)
1843 SemaRef.OpenACC().ActOnVariableDeclarator(Var);
1855 Owner->addHiddenDecl(AD);
1859Decl *TemplateDeclInstantiator::VisitFieldDecl(
FieldDecl *D) {
1864 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1876 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1887 else if (BitWidth) {
1893 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
1898 BitWidth = InstantiatedBitWidth.
getAs<Expr>();
1901 FieldDecl *
Field = SemaRef.CheckFieldDecl(
1910 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
1912 if (
Field->hasAttrs())
1913 SemaRef.CheckAlignasUnderalignment(Field);
1916 Field->setInvalidDecl();
1918 if (!
Field->getDeclName() ||
Field->isPlaceholderVar(SemaRef.getLangOpts())) {
1920 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
1922 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(
Field->getDeclContext())) {
1923 if (Parent->isAnonymousStructOrUnion() &&
1924 Parent->getRedeclContext()->isFunctionOrMethod())
1925 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
1930 Owner->addDecl(Field);
1940 SemaRef.Diag(D->
getLocation(), diag::err_property_is_variably_modified)
1944 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1956 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1969 SemaRef.InstantiateAttrs(TemplateArgs, D,
Property, LateAttrs,
1982 NamedDecl **NamedChain =
1986 for (
auto *PI : D->
chain()) {
1992 NamedChain[i++] =
Next;
1998 {NamedChain, D->getChainingSize()});
2000 for (
const auto *Attr : D->
attrs())
2001 IndirectField->
addAttr(Attr->clone(SemaRef.Context));
2005 Owner->addDecl(IndirectField);
2006 return IndirectField;
2013 TypeSourceInfo *InstTy;
2022 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
2023 SemaRef.collectUnexpandedParameterPacks(Ty->getTypeLoc(), Unexpanded);
2024 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
2026 bool ShouldExpand =
true;
2027 bool RetainExpansion =
false;
2029 if (SemaRef.CheckParameterPacksForExpansion(
2032 ShouldExpand, RetainExpansion, NumExpansions))
2035 assert(!RetainExpansion &&
2036 "should never retain an expansion for a variadic friend decl");
2039 SmallVector<FriendDecl *> Decls;
2040 for (
unsigned I = 0; I != *NumExpansions; I++) {
2041 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
2042 TypeSourceInfo *TSI = SemaRef.SubstType(
2053 Decls.push_back(FD);
2061 InstTy = SemaRef.SubstType(Ty, TemplateArgs, D->
getLocation(),
2076 assert(ND &&
"friend decl must be a decl or a type!");
2083 if (!NewND)
return nullptr;
2102 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
2107 SemaRef.SubstExpr(D->
getMessage(), TemplateArgs);
2108 if (InstantiatedMessageExpr.
isInvalid())
2111 return SemaRef.BuildStaticAssertDeclaration(
2116Decl *TemplateDeclInstantiator::VisitExplicitInstantiationDecl(
2120 llvm_unreachable(
"ExplicitInstantiationDecl should not be instantiated");
2123Decl *TemplateDeclInstantiator::VisitCXXExpansionStmtDecl(
2126 CXXExpansionStmtDecl *NewESD = SemaRef.BuildCXXExpansionStmtDecl(
2128 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldESD, NewESD);
2133 StmtResult NewInst = SemaRef.SubstStmt(OldInst, TemplateArgs);
2134 if (NewInst.isInvalid())
2145 Sema::ContextRAII Context(SemaRef, NewESD,
false);
2149 if (Expansion.isInvalid())
2158Decl *TemplateDeclInstantiator::VisitEnumDecl(
EnumDecl *D) {
2159 EnumDecl *PrevDecl =
nullptr;
2161 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2164 if (!Prev)
return nullptr;
2177 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2178 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
2180 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
2181 Enum->setIntegerType(SemaRef.Context.IntTy);
2191 Enum->setIntegerTypeSourceInfo(NewTI);
2201 QualType UnderlyingType =
Enum->getIntegerType();
2202 Enum->setPromotionType(
2203 SemaRef.Context.isPromotableIntegerType(UnderlyingType)
2204 ? SemaRef.Context.getPromotedIntegerType(UnderlyingType)
2208 &&
"Dependent type without type source info");
2213 SemaRef.InstantiateAttrs(TemplateArgs, D,
Enum);
2218 SemaRef.Context.setManglingNumber(
Enum, SemaRef.Context.getManglingNumber(D));
2221 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2222 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Enum, DD);
2225 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2226 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Enum, TND);
2228 Owner->addDecl(
Enum);
2231 if (Def && Def != D) {
2236 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2237 QualType DefnUnderlying =
2238 SemaRef.SubstType(TI->getType(), TemplateArgs,
2239 UnderlyingLoc, DeclarationName());
2241 DefnUnderlying,
true,
Enum);
2256 if (PrevDecl ==
nullptr) {
2257 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Enum);
2267 Enum->startDefinition();
2278 if (
Expr *UninstValue = EC->getInitExpr()) {
2283 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
2288 if (
Value.isInvalid()) {
2294 = SemaRef.CheckEnumConstant(
Enum, LastEnumConst,
2301 Enum->setInvalidDecl();
2305 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
2308 Enum->addDecl(EnumConst);
2309 Enumerators.push_back(EnumConst);
2310 LastEnumConst = EnumConst;
2313 !
Enum->isScoped()) {
2316 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
2321 SemaRef.ActOnEnumBody(
Enum->getLocation(),
Enum->getBraceRange(),
Enum,
2326 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
2331 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
2339 LocalInstantiationScope Scope(SemaRef);
2352 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2358 CXXRecordDecl *PrevDecl =
nullptr;
2359 ClassTemplateDecl *PrevClassTemplate =
nullptr;
2363 if (!
Found.empty()) {
2364 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
2365 if (PrevClassTemplate)
2374 DeclContext *DC = Owner;
2378 SS.
Adopt(QualifierLoc);
2379 DC = SemaRef.computeDeclContext(SS);
2380 if (!DC)
return nullptr;
2382 DC = SemaRef.FindInstantiatedContext(Pattern->
getLocation(),
2391 SemaRef.forRedeclarationInCurContext());
2392 SemaRef.LookupQualifiedName(R, DC);
2394 if (
R.isSingleResult()) {
2395 PrevClassTemplate =
R.getAsSingle<ClassTemplateDecl>();
2396 if (PrevClassTemplate)
2400 if (!PrevClassTemplate && QualifierLoc) {
2401 SemaRef.Diag(Pattern->
getLocation(), diag::err_not_tag_in_scope)
2414 SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, LateAttrs,
2417 ClassTemplateDecl *Inst
2423 assert(!Owner->isDependentContext());
2428 if (PrevClassTemplate) {
2430 const ClassTemplateDecl *MostRecentPrevCT =
2432 TemplateParameterList *PrevParams =
2436 if (!SemaRef.TemplateParameterListsAreEqual(
2443 if (SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
2457 if (!PrevClassTemplate)
2474 Owner->addDecl(Inst);
2476 if (!PrevClassTemplate) {
2480 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
2482 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2483 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2484 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
2491TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
2502 ClassTemplateDecl *InstClassTemplate
2503 = dyn_cast<ClassTemplateDecl>(
Found.front());
2504 if (!InstClassTemplate)
2507 if (ClassTemplatePartialSpecializationDecl *
Result
2516 "Only static data member templates are allowed.");
2520 LocalInstantiationScope Scope(SemaRef);
2527 VarTemplateDecl *PrevVarTemplate =
nullptr;
2532 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2538 if (!VarInst)
return nullptr;
2540 DeclContext *DC = Owner;
2549 if (!PrevVarTemplate)
2557 Owner->addDecl(Inst);
2558 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D, Inst, LateAttrs,
2561 if (!PrevVarTemplate) {
2565 SmallVector<VarTemplatePartialSpecializationDecl *, 1> PartialSpecs;
2567 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2568 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2569 OutOfLineVarPartialSpecs.push_back(
2570 std::make_pair(Inst, PartialSpecs[I]));
2576Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
2579 "Only static data member templates are allowed.");
2585 assert(!
Found.empty() &&
"Instantiation found nothing?");
2587 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2588 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
2590 if (VarTemplatePartialSpecializationDecl *
Result =
2603 LocalInstantiationScope Scope(SemaRef);
2604 llvm::SaveAndRestore RAII(EvaluateConstraints,
false);
2611 FunctionDecl *Instantiated =
nullptr;
2612 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->
getTemplatedDecl()))
2625 FunctionTemplateDecl *InstTemplate
2628 assert(InstTemplate &&
2629 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2641 Owner->addDecl(InstTemplate);
2644 SemaRef.CheckFriendAccess(InstTemplate);
2647 return InstTemplate;
2651 CXXRecordDecl *PrevDecl =
nullptr;
2653 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2656 if (!Prev)
return nullptr;
2660 CXXRecordDecl *
Record =
nullptr;
2678 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D,
Record, LateAttrs,
2686 if (!IsInjectedClassName)
2692 Record->setObjectOfFriendDecl();
2696 Record->setAnonymousStructOrUnion(
true);
2699 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Record);
2702 SemaRef.Context.setManglingNumber(
Record,
2703 SemaRef.Context.getManglingNumber(D));
2707 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2708 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Record, DD);
2712 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2713 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Record, TND);
2720 Sema::LocalEagerInstantiationScope LocalInstantiations(SemaRef,
2735 LocalInstantiations.perform();
2738 SemaRef.DiagnoseUnusedNestedTypedefs(
Record);
2740 if (IsInjectedClassName)
2741 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2759 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2764 return Context.getFunctionType(NewFunc->getReturnType(),
2765 NewFunc->getParamTypes(), NewEPI);
2789 if (isFriend && Source->wasThisDeclarationADefinition(D)) {
2801 void *InsertPos =
nullptr;
2810 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2811 Owner->isFunctionOrMethod() ||
2813 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2817 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2818 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
2819 TemplateArgs, DGuide->getExplicitSpecifier());
2820 if (InstantiatedExplicitSpecifier.
isInvalid())
2830 if (TemplateParams && TemplateParams->
size()) {
2832 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2833 if (LastParam && LastParam->isImplicit() &&
2834 LastParam->hasTypeConstraint()) {
2849 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2863 SemaRef.adjustContextForLocalExternDecl(DC);
2864 }
else if (isFriend && QualifierLoc) {
2866 SS.
Adopt(QualifierLoc);
2867 DC = SemaRef.computeDeclContext(SS);
2868 if (!DC)
return nullptr;
2875 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
2881 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2884 InstantiatedExplicitSpecifier, NameInfo,
T, TInfo,
2886 DGuide->getDeductionCandidateKind(), TrailingRequiresClause,
2887 DGuide->getSourceDeductionGuide(),
2888 DGuide->getSourceDeductionGuideKind());
2895 TrailingRequiresClause);
2896 Function->setFriendConstraintRefersToEnclosingTemplate(
2905 Function->setQualifierInfo(QualifierLoc);
2916 LexicalDC = SemaRef.CurContext;
2920 Function->setIsTypeAwareOperatorNewOrDelete(
2922 Function->setLexicalDeclContext(LexicalDC);
2925 for (
unsigned P = 0; P < Params.size(); ++P)
2927 Params[P]->setOwningFunction(
Function);
2930 if (TrailingRequiresClause)
2931 Function->setTrailingRequiresClause(TrailingRequiresClause);
2933 if (TemplateParams) {
2961 SemaRef.CodeSynthesisContexts.back().Kind !=
2975 }
else if (!isFriend) {
2979 Function->setInstantiatedFromDecl(D);
2986 FT->setObjectOfFriendDecl();
2992 bool IsExplicitSpecialization =
false;
2999 : SemaRef.forRedeclarationInCurContext());
3003 assert(isFriend &&
"dependent specialization info on "
3004 "non-member non-friend function?");
3008 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3009 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3010 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3011 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3019 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3025 if (SemaRef.CheckFunctionTemplateSpecialization(
3027 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3031 IsExplicitSpecialization =
true;
3035 SemaRef.LookupQualifiedName(
Previous, DC);
3039 ArgsWritten->getRAngleLoc());
3040 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3044 if (SemaRef.CheckFunctionTemplateSpecialization(
Function,
3049 IsExplicitSpecialization =
true;
3066 if (isFriend && !QualifierLoc) {
3067 SemaRef.FilterLookupForScope(
Previous, DC,
nullptr,
3086 if (
Function->isLocalExternDecl()) {
3088 if (!PVD->hasDefaultArg())
3090 if (SemaRef.SubstDefaultArgument(D->
getInnerLocStart(), PVD, TemplateArgs)) {
3094 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
3095 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3097 { UninstExpr }, UninstExpr->
getType());
3099 PVD->setDefaultArg(ErrorResult.
get());
3105 IsExplicitSpecialization,
3106 Function->isThisDeclarationADefinition());
3113 SemaRef.CheckTemplateParameterList(
3116 Function->isThisDeclarationADefinition()
3127 Function->getMemberSpecializationInfo()) {
3128 if (MSInfo->getPointOfInstantiation().isInvalid()) {
3130 MSInfo->setPointOfInstantiation(Loc);
3131 SemaRef.PendingLocalImplicitInstantiations.emplace_back(
Function, Loc);
3169 void *InsertPos =
nullptr;
3184 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
3186 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
3190 SemaRef, D, TemplateArgs,
Scope);
3195 if (isFriend && !TPLs.empty()) {
3196 TempParamLists.resize(TPLs.size());
3197 for (
unsigned I = 0; I != TPLs.size(); ++I) {
3201 TempParamLists[I] = InstParams;
3207 const bool CouldInstantiate =
3208 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
3209 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
3213 if (CouldInstantiate ||
3214 SemaRef.CodeSynthesisContexts.back().Kind !=
3216 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
3217 TemplateArgs, InstantiatedExplicitSpecifier);
3219 if (InstantiatedExplicitSpecifier.isInvalid())
3234 SemaRef.Context.getTrivialTypeSourceInfo(D->
getType());
3244 if (TemplateParams && TemplateParams->
size()) {
3246 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
3247 if (LastParam && LastParam->isImplicit() &&
3248 LastParam->hasTypeConstraint()) {
3263 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
3273 SS.
Adopt(QualifierLoc);
3274 DC = SemaRef.computeDeclContext(SS);
3276 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
3279 DC = SemaRef.FindInstantiatedContext(D->
getLocation(),
3283 if (!DC)
return nullptr;
3290 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
3306 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3307 InstantiatedExplicitSpecifier,
Constructor->UsesFPIntrin(),
3310 TrailingRequiresClause);
3314 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3316 Destructor->getConstexprKind(), TrailingRequiresClause);
3317 Method->setIneligibleOrNotSelected(
true);
3319 Method->setDeclName(SemaRef.Context.DeclarationNames.getCXXDestructorName(
3321 SemaRef.Context.getCanonicalTagType(
Record)));
3324 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3325 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
3326 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
3327 Conversion->getEndLoc(), TrailingRequiresClause);
3331 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo, SC,
3333 D->
getEndLoc(), TrailingRequiresClause);
3337 Method->setImplicitlyInline();
3340 Method->setQualifierInfo(QualifierLoc);
3342 if (TemplateParams) {
3382 if (!TempParamLists.empty())
3383 Method->setTemplateParameterListsInfo(SemaRef.Context, TempParamLists);
3385 Method->setLexicalDeclContext(Owner);
3386 Method->setObjectOfFriendDecl();
3391 for (
unsigned P = 0; P < Params.size(); ++P)
3392 Params[P]->setOwningFunction(
Method);
3393 Method->setParams(Params);
3396 Method->setInvalidDecl();
3401 bool IsExplicitSpecialization =
false;
3409 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3410 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3411 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3412 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3420 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3426 if (SemaRef.CheckFunctionTemplateSpecialization(
3427 Method, DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3429 Method->setInvalidDecl();
3431 IsExplicitSpecialization =
true;
3434 SemaRef.LookupQualifiedName(
Previous, DC);
3437 ArgsWritten->getRAngleLoc());
3439 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3443 if (SemaRef.CheckFunctionTemplateSpecialization(
Method,
3446 Method->setInvalidDecl();
3448 IsExplicitSpecialization =
true;
3476 for (
unsigned P = 0; P < Params.size(); ++P) {
3477 if (!Params[P]->hasDefaultArg())
3479 if (SemaRef.SubstDefaultArgument(StartLoc, Params[P], TemplateArgs)) {
3483 Expr *UninstExpr = Params[P]->getUninstantiatedDefaultArg();
3484 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3486 { UninstExpr }, UninstExpr->
getType());
3488 Params[P]->setDefaultArg(ErrorResult.
get());
3494 IsExplicitSpecialization,
3495 Method->isThisDeclarationADefinition());
3503 if (isFriend &&
Method->getPreviousDecl())
3504 Method->setAccess(
Method->getPreviousDecl()->getAccess());
3510 SemaRef.CheckOverrideControl(
Method);
3524 if (IsExplicitSpecialization && !isFriend)
3537 Method->setIneligibleOrNotSelected(
true);
3538 }
else if (
Method->isCopyAssignmentOperator() ||
3539 Method->isMoveAssignmentOperator()) {
3540 Method->setIneligibleOrNotSelected(
true);
3552 }
else if (isFriend) {
3556 SemaRef.CheckFriendAccess(
Method);
3569 if (
Method->hasAttr<UsedAttr>()) {
3570 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
3573 A->getMemberSpecializationInfo())
3574 Loc = MSInfo->getPointOfInstantiation();
3575 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
3576 Loc = Spec->getPointOfInstantiation();
3577 SemaRef.MarkFunctionReferenced(Loc,
Method);
3597 return SemaRef.SubstParmVarDecl(D, TemplateArgs, 0,
3602Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
3610 assert(TC->getTemplateArgsAsWritten() &&
3611 "type parameter can only be an expansion when explicit arguments "
3616 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3617 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
3618 SemaRef.collectUnexpandedParameterPacks(ArgLoc, Unexpanded);
3623 bool RetainExpansion =
false;
3624 if (SemaRef.CheckParameterPacksForExpansion(
3627 SourceRange(TC->getConceptNameLoc(),
3628 TC->hasExplicitTemplateArgs()
3629 ? TC->getTemplateArgsAsWritten()->getRAngleLoc()
3630 : TC->getConceptNameInfo().getEndLoc()),
3631 Unexpanded, TemplateArgs,
true,
3632 Expand, RetainExpansion, NumExpanded))
3639 D->
getDepth() - (TemplateArgs.retainInnerDepths()
3641 : TemplateArgs.getNumSubstitutedLevels()),
3652 if (SemaRef.SubstTypeConstraint(Inst, TC, TemplateArgs,
3653 EvaluateConstraints))
3658 TemplateArgumentLoc Output;
3666 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
3671Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3675 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
3676 SmallVector<QualType, 4> ExpandedParameterPackTypes;
3677 bool IsExpandedParameterPack =
false;
3678 TypeSourceInfo *TSI;
3688 TypeSourceInfo *NewTSI =
3695 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3699 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3700 ExpandedParameterPackTypes.push_back(NewT);
3703 IsExpandedParameterPack =
true;
3710 PackExpansionTypeLoc Expansion = TL.
castAs<PackExpansionTypeLoc>();
3712 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3713 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3718 bool RetainExpansion =
false;
3722 if (SemaRef.CheckParameterPacksForExpansion(
3723 Expansion.
getEllipsisLoc(), Pattern.getSourceRange(), Unexpanded,
3724 TemplateArgs,
true, Expand,
3725 RetainExpansion, NumExpansions))
3729 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3730 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3731 TypeSourceInfo *NewTSI = SemaRef.SubstType(
3737 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3741 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3742 ExpandedParameterPackTypes.push_back(NewT);
3748 IsExpandedParameterPack =
true;
3754 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3755 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
3761 SemaRef.CheckNonTypeTemplateParameterType(NewPattern, D->
getLocation());
3762 TSI = SemaRef.CheckPackExpansion(NewPattern, Expansion.
getEllipsisLoc(),
3777 T = SemaRef.CheckNonTypeTemplateParameterType(TSI, D->
getLocation());
3779 T = SemaRef.Context.IntTy;
3784 NonTypeTemplateParmDecl *Param;
3785 if (IsExpandedParameterPack)
3788 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3790 ExpandedParameterPackTypes, ExpandedParameterPackTypesAsWritten);
3794 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3798 if (AutoLoc.isConstrained()) {
3799 SourceLocation EllipsisLoc;
3800 if (IsExpandedParameterPack)
3803 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
3805 EllipsisLoc = Constraint->getEllipsisLoc();
3809 if (SemaRef.AttachTypeConstraint(AutoLoc, Param,
3820 EnterExpressionEvaluationContext ConstantEvaluated(
3822 TemplateArgumentLoc
Result;
3830 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3838 for (
const auto &P : *Params) {
3839 if (P->isTemplateParameterPack())
3851TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
3855 TemplateParameterList *InstParams;
3856 SmallVector<TemplateParameterList*, 8> ExpandedParams;
3858 bool IsExpandedParameterPack =
false;
3867 LocalInstantiationScope Scope(SemaRef,
true);
3868 TemplateParameterList *Expansion =
3872 ExpandedParams.push_back(Expansion);
3875 IsExpandedParameterPack =
true;
3876 InstParams = TempParams;
3881 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3888 bool RetainExpansion =
false;
3890 if (SemaRef.CheckParameterPacksForExpansion(
3892 TemplateArgs,
true, Expand,
3893 RetainExpansion, NumExpansions))
3897 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3898 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3899 LocalInstantiationScope Scope(SemaRef,
true);
3903 ExpandedParams.push_back(Expansion);
3909 IsExpandedParameterPack =
true;
3912 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3914 LocalInstantiationScope Scope(SemaRef,
true);
3921 LocalInstantiationScope Scope(SemaRef,
true);
3928 TemplateTemplateParmDecl *Param;
3929 if (IsExpandedParameterPack)
3932 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3938 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3951 TemplateArgumentLoc(SemaRef.Context, TemplateArgument(TName),
3960 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3969 UsingDirectiveDecl *Inst
3979 if (!Owner->isFunctionOrMethod())
3980 Owner->addDecl(Inst);
3989 bool isFunctionScope = Owner->isFunctionOrMethod();
3991 for (
auto *Shadow : D->
shadows()) {
3995 NamedDecl *OldTarget = Shadow->getTargetDecl();
3996 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
3997 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
3998 OldTarget = BaseShadow;
4002 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
4004 SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
4006 InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
4007 Shadow->getLocation(), OldTarget, TemplateArgs));
4014 SemaRef.CheckUsingShadowDecl(Inst, InstTarget, *Lookup, PrevDecl))
4018 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
4019 Shadow->getLocation(), OldPrev, TemplateArgs));
4022 nullptr, Inst, InstTarget, PrevDecl);
4023 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
4025 if (isFunctionScope)
4026 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
4032Decl *TemplateDeclInstantiator::VisitUsingDecl(
UsingDecl *D) {
4053 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
4059 bool CheckRedeclaration = Owner->
isRecord();
4070 SS.
Adopt(QualifierLoc);
4071 if (CheckRedeclaration) {
4072 Prev.setHideTags(
false);
4105 EnumDecl *EnumD = cast_or_null<EnumDecl>(SemaRef.FindInstantiatedDecl(
4108 if (SemaRef.RequireCompleteEnumDecl(EnumD, EnumD->
getLocation()))
4111 TypeSourceInfo *TSI = SemaRef.SubstType(D->
getEnumType(), TemplateArgs,
4117 UsingEnumDecl *NewUD =
4121 SemaRef.Context.setInstantiatedFromUsingEnumDecl(NewUD, D);
4123 Owner->addDecl(NewUD);
4141Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
4147template <
typename T>
4148Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
4149 T *D,
bool InstantiatingPackElement) {
4151 if (D->isPackExpansion() && !InstantiatingPackElement) {
4152 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4153 SemaRef.collectUnexpandedParameterPacks(D->getQualifierLoc(), Unexpanded);
4154 SemaRef.collectUnexpandedParameterPacks(D->getNameInfo(), Unexpanded);
4159 bool RetainExpansion =
false;
4161 if (SemaRef.CheckParameterPacksForExpansion(
4162 D->getEllipsisLoc(), D->getSourceRange(), Unexpanded, TemplateArgs,
4163 true, Expand, RetainExpansion,
4169 assert(!RetainExpansion &&
4170 "should never need to retain an expansion for UsingPackDecl");
4175 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
4176 return instantiateUnresolvedUsingDecl(D,
true);
4186 if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {
4187 SemaRef.Diag(D->getEllipsisLoc(),
4188 diag::err_using_decl_redeclaration_expansion);
4193 SmallVector<NamedDecl*, 8> Expansions;
4194 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4195 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
4196 Decl *Slice = instantiateUnresolvedUsingDecl(D,
true);
4206 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4208 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4212 UnresolvedUsingTypenameDecl *TD = dyn_cast<UnresolvedUsingTypenameDecl>(D);
4213 SourceLocation TypenameLoc = TD ? TD->
getTypenameLoc() : SourceLocation();
4215 NestedNameSpecifierLoc QualifierLoc
4216 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
4222 SS.
Adopt(QualifierLoc);
4224 DeclarationNameInfo NameInfo
4225 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
4229 bool InstantiatingSlice =
4230 D->getEllipsisLoc().isValid() && SemaRef.ArgPackSubstIndex;
4231 SourceLocation EllipsisLoc =
4232 InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
4235 NamedDecl *UD = SemaRef.BuildUsingDeclaration(
4236 nullptr, D->getAccess(), D->getUsingLoc(),
4237 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
4238 ParsedAttributesView(),
4239 true, IsUsingIfExists);
4241 SemaRef.InstantiateAttrs(TemplateArgs, D, UD);
4242 SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
4248Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
4250 return instantiateUnresolvedUsingDecl(D);
4253Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
4255 return instantiateUnresolvedUsingDecl(D);
4258Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
4260 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
4264 SmallVector<NamedDecl*, 8> Expansions;
4266 if (NamedDecl *NewUD =
4267 SemaRef.FindInstantiatedDecl(D->
getLocation(), UD, TemplateArgs))
4268 Expansions.push_back(NewUD);
4273 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4275 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4279Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
4281 SmallVector<Expr *, 5> Vars;
4282 for (
auto *I : D->
varlist()) {
4283 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4285 Vars.push_back(Var);
4288 OMPThreadPrivateDecl *TD =
4289 SemaRef.OpenMP().CheckOMPThreadPrivateDecl(D->
getLocation(), Vars);
4299 SmallVector<Expr *, 5> Vars;
4300 for (
auto *I : D->
varlist()) {
4301 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4303 Vars.push_back(Var);
4306 OMPGroupPrivateDecl *TD =
4307 SemaRef.OpenMP().CheckOMPGroupPrivateDecl(D->
getLocation(), Vars);
4316 SmallVector<Expr *, 5> Vars;
4317 for (
auto *I : D->
varlist()) {
4318 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4320 Vars.push_back(Var);
4322 SmallVector<OMPClause *, 4> Clauses;
4325 OMPClause *IC =
nullptr;
4326 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
4327 ExprResult NewE = SemaRef.SubstExpr(AC->getAllocator(), TemplateArgs);
4330 IC = SemaRef.OpenMP().ActOnOpenMPAllocatorClause(
4331 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4332 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
4333 ExprResult NewE = SemaRef.SubstExpr(AC->getAlignment(), TemplateArgs);
4336 IC = SemaRef.OpenMP().ActOnOpenMPAlignClause(
4337 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4342 Clauses.push_back(IC);
4354 "Requires directive cannot be instantiated within a dependent context");
4357Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
4360 const bool RequiresInstantiation =
4364 QualType SubstReductionType;
4365 if (RequiresInstantiation) {
4366 SubstReductionType = SemaRef.OpenMP().ActOnOpenMPDeclareReductionType(
4371 SubstReductionType = D->
getType();
4373 if (SubstReductionType.
isNull())
4377 bool IsCorrect =
true;
4379 std::pair<QualType, SourceLocation> ReductionTypes[] = {
4380 std::make_pair(SubstReductionType, D->
getLocation())};
4382 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4384 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4387 auto DRD = SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveStart(
4391 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDRD);
4392 Expr *SubstCombiner =
nullptr;
4393 Expr *SubstInitializer =
nullptr;
4396 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerStart(
4398 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4401 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4404 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4405 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4407 SubstCombiner = SemaRef.SubstExpr(Combiner, TemplateArgs).get();
4408 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerEnd(NewDRD,
4413 VarDecl *OmpPrivParm =
4414 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerStart(
4416 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4419 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4423 SubstInitializer = SemaRef.SubstExpr(
Init, TemplateArgs).get();
4427 IsCorrect = IsCorrect && OldPrivParm->hasInit();
4429 SemaRef.InstantiateVariableInitializer(OmpPrivParm, OldPrivParm,
4432 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerEnd(
4433 NewDRD, SubstInitializer, OmpPrivParm);
4435 IsCorrect = IsCorrect && SubstCombiner &&
4438 SubstInitializer) ||
4440 !SubstInitializer));
4442 (void)SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveEnd(
4451 const bool RequiresInstantiation =
4455 QualType SubstMapperTy;
4457 if (RequiresInstantiation) {
4458 SubstMapperTy = SemaRef.OpenMP().ActOnOpenMPDeclareMapperType(
4465 if (SubstMapperTy.
isNull())
4469 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4471 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4474 bool IsCorrect =
true;
4475 SmallVector<OMPClause *, 6> Clauses;
4477 DeclarationNameInfo DirName;
4478 SemaRef.OpenMP().StartOpenMPDSABlock(llvm::omp::OMPD_declare_mapper, DirName,
4482 SemaRef.OpenMP().ActOnOpenMPDeclareMapperDirectiveVarDecl(
4484 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4487 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4488 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4493 SmallVector<Expr *, 4> NewVars;
4494 for (Expr *OE : OldC->varlist()) {
4495 Expr *
NE = SemaRef.SubstExpr(OE, TemplateArgs).get();
4500 NewVars.push_back(NE);
4504 NestedNameSpecifierLoc NewQualifierLoc =
4505 SemaRef.SubstNestedNameSpecifierLoc(OldC->getMapperQualifierLoc(),
4508 SS.
Adopt(NewQualifierLoc);
4509 DeclarationNameInfo NewNameInfo =
4510 SemaRef.SubstDeclarationNameInfo(OldC->getMapperIdInfo(), TemplateArgs);
4511 OMPVarListLocTy Locs(OldC->getBeginLoc(), OldC->getLParenLoc(),
4513 OMPClause *NewC = SemaRef.OpenMP().ActOnOpenMPMapClause(
4514 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
4515 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
4516 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
4518 Clauses.push_back(NewC);
4520 SemaRef.OpenMP().EndOpenMPDSABlock(
nullptr);
4525 VN, D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
4527 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDMD);
4531Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
4533 llvm_unreachable(
"Should not be met in templates");
4544 Owner->addDecl(Inst);
4553 llvm_unreachable(
"There are only CXXRecordDecls in C++");
4557TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
4564 "can only instantiate an explicit specialization "
4565 "for a member class template");
4569 ClassTemplateDecl *InstClassTemplate =
4570 cast_or_null<ClassTemplateDecl>(SemaRef.FindInstantiatedDecl(
4572 if (!InstClassTemplate)
4577 TemplateArgumentListInfo InstTemplateArgs;
4578 if (
const ASTTemplateArgumentListInfo *TemplateArgsInfo =
4580 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4581 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4583 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4584 TemplateArgs, InstTemplateArgs))
4590 Sema::CheckTemplateArgumentInfo CTAI;
4591 if (SemaRef.CheckTemplateArgumentList(
4592 InstClassTemplate, D->
getLocation(), InstTemplateArgs,
4599 void *InsertPos =
nullptr;
4600 ClassTemplateSpecializationDecl *PrevDecl =
4607 SemaRef.CheckSpecializationInstantiationRedecl(D->
getLocation(),
4629 SemaRef.Diag(D->
getLocation(), diag::err_redefinition) << PrevDecl;
4631 diag::note_previous_definition);
4636 ClassTemplateSpecializationDecl *InstD =
4658 Owner->addDecl(InstD);
4665 SemaRef.InstantiateClass(D->
getLocation(), InstD, D, TemplateArgs,
4679 "A template specialization without specialized template?");
4682 cast_or_null<VarTemplateDecl>(SemaRef.FindInstantiatedDecl(
4684 if (!InstVarTemplate)
4690 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4691 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4693 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4694 TemplateArgs, VarTemplateArgsInfo))
4700 if (SemaRef.CheckTemplateArgumentList(
4701 InstVarTemplate, D->
getLocation(), VarTemplateArgsInfo,
4707 void *InsertPos =
nullptr;
4714 if (PrevDecl && SemaRef.CheckSpecializationInstantiationRedecl(
4722 VTSD->setTemplateArgsAsWritten(VarTemplateArgsInfo);
4742 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
4752 void *InsertPos =
nullptr;
4753 VarTemplate->findSpecialization(Converted, InsertPos);
4757 if (SemaRef.getLangOpts().OpenCL)
4758 SemaRef.deduceOpenCLAddressSpace(Var);
4764 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
4765 StartingScope,
false, PrevDecl);
4771 llvm_unreachable(
"@defs is not supported in Objective-C++");
4776 unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
4778 "cannot instantiate %0 yet");
4786 llvm_unreachable(
"Concept definitions cannot reside inside a template");
4789Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
4791 llvm_unreachable(
"Concept specializations cannot reside inside a template");
4801 llvm_unreachable(
"Unexpected decl");
4812 SubstD = Instantiator.Visit(D);
4826 T = SemaRef.Context.getFunctionType(
4827 SemaRef.Context.BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
4836 SemaRef.Context.getTrivialTypeSourceInfo(
T, Orig->
getEndLoc());
4838 assert(OldLoc &&
"type of function is not a function type?");
4840 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
4841 NewLoc.
setParam(I, OldLoc.getParam(I));
4846 SemaRef.Context.DeclarationNames.getCXXOperatorName(OO_EqualEqual));
4851 if (Spaceship->isInvalidDecl())
4863 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
4868 assert(Spaceship->getFriendObjectKind() &&
4869 "defaulted spaceship is neither a member nor a friend");
4883 return cast_or_null<FunctionDecl>(R);
4897 unsigned N = L->
size();
4901 for (
auto &P : *L) {
4903 Params.push_back(D);
4912 if (InstRequiresClause && EvaluateConstraints) {
4914 SemaRef.SubstConstraintExpr(InstRequiresClause, TemplateArgs);
4917 InstRequiresClause = E.
get();
4930 bool EvaluateConstraints) {
4969 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
4976 if (SemaRef.CheckTemplateArgumentList(
4977 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
4983 if (SemaRef.CheckTemplatePartialSpecializationArgs(
4990 void *InsertPos =
nullptr;
4993 InstParams, InsertPos);
4998 SemaRef.Context, PartialSpec->
getTagKind(), Owner,
5029 diag::err_partial_spec_redeclared)
5031 SemaRef.Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
5032 << SemaRef.Context.getCanonicalTagType(PrevDecl);
5037 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5043 return InstPartialSpec;
5079 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
5087 InstTemplateArgs, {},
5092 if (SemaRef.CheckTemplatePartialSpecializationArgs(
5099 void *InsertPos =
nullptr;
5102 InstParams, InsertPos);
5113 diag::err_variable_instantiates_to_function)
5150 diag::err_var_partial_spec_redeclared)
5153 diag::note_var_prev_partial_spec_here);
5157 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5161 VarTemplate->AddPartialSpecialization(InstPartialSpec,
nullptr);
5163 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
5164 LateAttrs, Owner, StartingScope);
5166 return InstPartialSpec;
5173 assert(OldTInfo &&
"substituting function without type source info");
5174 assert(Params.empty() &&
"parameter vector is non-empty at start");
5180 ThisTypeQuals =
Method->getFunctionObjectParameterType().getQualifiers();
5185 ThisContext, ThisTypeQuals, EvaluateConstraints);
5191 if (NewTInfo != OldTInfo) {
5195 unsigned NewIdx = 0;
5196 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
5197 OldIdx != NumOldParams; ++OldIdx) {
5198 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
5206 NumArgumentsInExpansion =
5207 SemaRef.getNumArgumentsInExpansion(OldParam->
getType(),
5209 if (!NumArgumentsInExpansion) {
5213 Params.push_back(NewParam);
5214 Scope->InstantiatedLocal(OldParam, NewParam);
5217 Scope->MakeInstantiatedLocalArgPack(OldParam);
5218 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
5220 Params.push_back(NewParam);
5221 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
5231 for (
unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
5235 Params.push_back(SemaRef.BuildParmVarDeclForTypedef(
5241 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
5244 Params.push_back(Parm);
5261 TemplateArgs, ParamTypes, &Params,
5274 for (
auto *
decl : PatternDecl->
decls()) {
5281 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
5282 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
5283 return InstVD && InstVD->isLocalVarDecl() &&
5284 InstVD->getIdentifier() == II;
5290 Scope.InstantiatedLocal(VD, *it);
5297bool Sema::addInstantiatedParametersToScope(
5301 unsigned FParamIdx = 0;
5302 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
5303 const ParmVarDecl *PatternParam = PatternDecl->
getParamDecl(I);
5306 assert(FParamIdx < Function->getNumParams());
5333 if (NumArgumentsInExpansion) {
5334 QualType PatternType =
5335 PatternParam->
getType()->
castAs<PackExpansionType>()->getPattern();
5336 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
5340 Sema::ArgPackSubstIndexRAII SubstIndex(*
this, Arg);
5360 assert(Param->hasUninstantiatedDefaultArg());
5392 false, std::nullopt,
5401 L->DefaultArgumentInstantiated(Param);
5414 if (AlreadyInstantiating) {
5417 Diag(PointOfInstantiation, diag::err_exception_spec_cycle) <<
Decl;
5439 false, std::nullopt,
5472 SemaRef.Context.setManglingNumber(
New,
5473 SemaRef.Context.getManglingNumber(Tmpl));
5486 ActiveInstType &ActiveInst = SemaRef.CodeSynthesisContexts.back();
5487 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
5488 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
5490 SemaRef.CurrentSFINAEContext =
nullptr;
5491 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
5492 ActiveInst.Entity =
New;
5497 assert(Proto &&
"Function template without prototype?");
5506 if (SemaRef.getLangOpts().CPlusPlus11 &&
5521 assert(NewProto &&
"Template instantiation without function prototype?");
5526 New->setType(SemaRef.Context.getFunctionType(
5530 SemaRef.SubstExceptionSpec(
New, Proto, TemplateArgs);
5539 LateAttrs, StartingScope);
5541 SemaRef.inferLifetimeBoundAttribute(
New);
5562 New->setVirtualAsWritten(
true);
5573 Lookups.reserve(DFI->getUnqualifiedLookups().size());
5574 bool AnyChanged =
false;
5576 NamedDecl *D = SemaRef.FindInstantiatedDecl(
New->getLocation(),
5577 DA.getDecl(), TemplateArgs);
5580 AnyChanged |= (D != DA.getDecl());
5584 New->setDefaultedOrDeletedInfo(
5586 SemaRef.Context, Lookups, DFI->getFPFeatures(),
5587 DFI->getDeletedMessage())
5614 bool DefinitionRequired,
5622 Function->getTemplateSpecializationKindForInstantiation();
5629 !DefinitionRequired)
5634 if (
Function->isDefined(ExistingDefn,
5649 assert(!AlreadyInstantiating &&
"should have been caught by caller");
5654 assert(PatternDecl &&
"instantiating a non-template");
5657 Stmt *Pattern =
nullptr;
5659 Pattern = PatternDef->
getBody(PatternDef);
5660 PatternDecl = PatternDef;
5662 PatternDef =
nullptr;
5666 bool Unreachable =
false;
5671 Function->getInstantiatedFromMemberFunction(), PatternDecl,
5673 DefinitionRequired, &Unreachable)) {
5674 if (DefinitionRequired)
5677 (
Function->isConstexpr() && !Recursive)) {
5681 Function->setInstantiationIsPending(
true);
5684 if (llvm::isTimeTraceVerbose()) {
5685 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
5687 llvm::raw_string_ostream
OS(Name);
5696 Diag(PointOfInstantiation, diag::warn_func_template_missing)
5702 diag::note_unreachable_template_decl);
5706 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
5718 Function->setInstantiationIsPending(
true);
5720 std::make_pair(
Function, PointOfInstantiation));
5724 llvm::TimeTraceScope TimeScope(
"InstantiateFunction", [&]() {
5725 llvm::TimeTraceMetadata M;
5726 llvm::raw_string_ostream
OS(M.Detail);
5729 if (llvm::isTimeTraceVerbose()) {
5732 M.Line =
SourceMgr.getExpansionLineNumber(Loc);
5758 "missing LateParsedTemplate");
5760 Pattern = PatternDecl->
getBody(PatternDecl);
5767 "unexpected kind of function template definition");
5782 for (
auto *D =
Function->getMostRecentDecl(); ;
5784 D->setImplicitlyInline();
5795 "instantiating function definition");
5799 Function->setVisibleDespiteOwningModule();
5825 auto NameLocPointsToPattern = [&] {
5836 return PatternNameLoc;
5846 return PatternNameLoc;
5854 assert(PatternTSI &&
"Pattern is supposed to have an associated TSI");
5862 Function->setDeclarationNameLoc(NameLocPointsToPattern());
5870 ThisContext =
Method->getParent();
5871 ThisTypeQuals =
Method->getMethodQualifiers();
5881 bool MergeWithParentScope =
false;
5883 MergeWithParentScope =
5884 Rec->isLocalClass() && !
Function->isFunctionTemplateSpecialization();
5887 auto RebuildTypeSourceInfoForDefaultSpecialMembers = [&]() {
5893 "Special member needs to be defaulted");
5901 auto *NewRec = dyn_cast<CXXRecordDecl>(
Function->getDeclContext());
5902 const auto *PatternRec =
5904 if (!NewRec || !PatternRec)
5906 if (!PatternRec->isLambda())
5909 struct SpecialMemberTypeInfoRebuilder
5929 getDerived().TransformDecl(TL.
getNameLoc(),
T->getDecl()));
5931 return Base::TransformRecordType(TLB, TL);
5945 } IR{*
this, PatternRec, NewRec};
5948 assert(NewSI &&
"Type Transform failed?");
5950 Function->setTypeSourceInfo(NewSI);
5954 assert(NewParmSI &&
"Type transformation failed.");
5960 RebuildTypeSourceInfoForDefaultSpecialMembers();
5964 std::optional<ArrayRef<TemplateArgument>> Innermost;
5965 if (
auto *Primary =
Function->getPrimaryTemplate();
5968 Function->getTemplateSpecializationKind() !=
5970 auto It = llvm::find_if(Primary->redecls(),
5972 return cast<FunctionTemplateDecl>(RTD)
5973 ->isCompatibleWithDefinition();
5975 assert(It != Primary->redecls().end() &&
5976 "Should't get here without a definition");
5978 ->getTemplatedDecl()
5982 DC = (*It)->getLexicalDeclContext();
5983 Innermost.emplace(
Function->getTemplateSpecializationArgs()->asArray());
5986 Function, DC,
false, Innermost,
false, PatternDecl);
6004 if (addInstantiatedParametersToScope(
Function, PatternDecl,
Scope,
6020 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
6021 Ctor->isDefaultConstructor()) {
6022 if (DLLExportAttr *
Attr = Ctor->getAttr<DLLExportAttr>())
6028 Body =
SubstStmt(Pattern, TemplateArgs);
6039 checkReferenceToTULocalFromOtherTU(
Function, PointOfInstantiation);
6045 Listener->FunctionDefinitionInstantiated(
Function);
6055 bool ShouldSkipCG = [&] {
6056 auto *RD = dyn_cast<CXXRecordDecl>(
Function->getParent());
6057 if (!RD || !RD->isLambda())
6061 return Context.isUnevaluated() ||
Context.isImmediateFunctionContext();
6064 if (!ShouldSkipCG) {
6071 LocalInstantiations.
perform();
6073 GlobalInstantiations.perform();
6098 bool IsMemberSpec =
false;
6100 if (
auto *PartialSpec =
6101 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar)) {
6102 assert(PartialSpecArgs);
6103 IsMemberSpec = PartialSpec->isMemberSpecialization();
6105 PartialSpec, PartialSpecArgs->
asArray(),
false);
6108 IsMemberSpec =
VarTemplate->isMemberSpecialization();
6128 "don't have a definition to instantiate from");
6157 bool InstantiatingVarTemplate,
6161 bool InstantiatingVarTemplatePartialSpec =
6166 bool InstantiatingSpecFromTemplate =
6192 if (OldVar->
isUsed(
false))
6217 }
else if (PrevDeclForVarTemplateSpecialization) {
6218 Previous.addDecl(PrevDeclForVarTemplateSpecialization);
6222 if (!InstantiatingVarTemplate) {
6240 !InstantiatingSpecFromTemplate)
6247 dyn_cast<VarTemplateSpecializationDecl>(OldVar)) {
6255 Context.setManglingNumber(NewVar,
Context.getManglingNumber(OldVar));
6256 Context.setStaticLocalNumber(NewVar,
Context.getStaticLocalNumber(OldVar));
6259 if (InstantiatingVarTemplate || InstantiatingVarTemplatePartialSpec) {
6264 }
else if (InstantiatingSpecFromTemplate ||
6286 L->VariableDefinitionInstantiated(Var);
6316 if (!
Init.isInvalid()) {
6319 if (Var->
hasAttr<DLLImportAttr>() &&
6322 }
else if (InitExpr) {
6358 bool DefinitionRequired,
bool AtEndOfTU) {
6370 if (AlreadyInstantiating)
6375 assert(PatternDecl &&
"no pattern for templated variable");
6380 dyn_cast<VarTemplateSpecializationDecl>(Var);
6391 (PatternDecl = PatternDecl->
getFirstDecl())->hasInit() &&
6400 "instantiating variable initializer");
6411 Recursive, AtEndOfTU);
6420 PreviousContext.
pop();
6424 LocalInstantiations.
perform();
6426 GlobalInstantiations.
perform();
6430 "not a static data member?");
6439 if (!Def && !DefinitionRequired) {
6446 Diag(PointOfInstantiation, diag::warn_var_template_missing)
6450 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
6461 PatternDecl, Def, TSK,
6462 DefinitionRequired))
6479 struct PassToConsumerRAII {
6486 ~PassToConsumerRAII() {
6487 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
6489 } PassToConsumerRAII(
Consumer, Var);
6496 PointOfInstantiation);
6505 "instantiating variable definition");
6527 }
else if (!VarSpec) {
6572 PreviousContext.
pop();
6575 PassToConsumerRAII.Var = Var;
6584 LocalInstantiations.
perform();
6586 GlobalInstantiations.
perform();
6598 for (
const auto *
Init : Tmpl->
inits()) {
6601 if (!
Init->isWritten())
6606 if (
Init->isPackExpansion()) {
6608 TypeLoc BaseTL =
Init->getTypeSourceInfo()->getTypeLoc();
6612 bool ShouldExpand =
false;
6613 bool RetainExpansion =
false;
6617 TemplateArgs,
true, ShouldExpand,
6618 RetainExpansion, NumExpansions)) {
6620 New->setInvalidDecl();
6623 assert(ShouldExpand &&
"Partial instantiation of base initializer?");
6626 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6640 Init->getSourceLocation(),
6641 New->getDeclName());
6649 BaseTInfo, TempInit.
get(),
6657 NewInits.push_back(NewInit.
get());
6672 if (
Init->isDelegatingInitializer() ||
Init->isBaseInitializer()) {
6675 Init->getSourceLocation(),
6676 New->getDeclName());
6679 New->setInvalidDecl();
6683 if (
Init->isBaseInitializer())
6685 New->getParent(), EllipsisLoc);
6689 }
else if (
Init->isMemberInitializer()) {
6691 Init->getMemberLocation(),
6696 New->setInvalidDecl();
6701 Init->getSourceLocation());
6702 }
else if (
Init->isIndirectMemberInitializer()) {
6705 Init->getMemberLocation(),
6706 Init->getIndirectMember(), TemplateArgs));
6708 if (!IndirectMember) {
6710 New->setInvalidDecl();
6715 Init->getSourceLocation());
6720 New->setInvalidDecl();
6722 NewInits.push_back(NewInit.
get());
6741 Instance = Instance->getCanonicalDecl();
6742 if (Pattern == Instance)
return true;
6743 Instance = Instance->getInstantiatedFromMemberTemplate();
6754 Instance = Instance->getCanonicalDecl();
6755 if (Pattern == Instance)
return true;
6756 Instance = Instance->getInstantiatedFromMemberTemplate();
6769 Instance->getCanonicalDecl());
6770 if (Pattern == Instance)
6772 Instance = Instance->getInstantiatedFromMember();
6783 Instance = Instance->getCanonicalDecl();
6784 if (Pattern == Instance)
return true;
6785 Instance = Instance->getInstantiatedFromMemberClass();
6796 Instance = Instance->getCanonicalDecl();
6797 if (Pattern == Instance)
return true;
6798 Instance = Instance->getInstantiatedFromMemberFunction();
6809 Instance = Instance->getCanonicalDecl();
6810 if (Pattern == Instance)
return true;
6811 Instance = Instance->getInstantiatedFromMemberEnum();
6838 bool OtherIsPackExpansion;
6840 if (
auto *OtherUUD = dyn_cast<T>(
Other)) {
6841 OtherIsPackExpansion = OtherUUD->isPackExpansion();
6843 }
else if (
auto *OtherUPD = dyn_cast<UsingPackDecl>(
Other)) {
6844 OtherIsPackExpansion =
true;
6845 OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
6846 }
else if (
auto *OtherUD = dyn_cast<UsingDecl>(
Other)) {
6847 OtherIsPackExpansion =
false;
6852 return Pattern->isPackExpansion() == OtherIsPackExpansion &&
6858 assert(Instance->isStaticDataMember());
6863 Instance = Instance->getCanonicalDecl();
6864 if (Pattern == Instance)
return true;
6865 Instance = Instance->getInstantiatedFromStaticDataMember();
6874 if (
auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D))
6877 if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D))
6883 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
Other))
6886 if (
auto *Function = dyn_cast<FunctionDecl>(
Other))
6889 if (
auto *
Enum = dyn_cast<EnumDecl>(
Other))
6892 if (
auto *Var = dyn_cast<VarDecl>(
Other))
6896 if (
auto *Temp = dyn_cast<ClassTemplateDecl>(
Other))
6899 if (
auto *Temp = dyn_cast<FunctionTemplateDecl>(
Other))
6902 if (
auto *PartialSpec =
6903 dyn_cast<ClassTemplatePartialSpecializationDecl>(
Other))
6907 if (
auto *Field = dyn_cast<FieldDecl>(
Other)) {
6908 if (!Field->getDeclName()) {
6915 if (
auto *Using = dyn_cast<UsingDecl>(
Other))
6918 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
Other))
6925template<
typename ForwardIterator>
6928 ForwardIterator first,
6929 ForwardIterator last) {
6930 for (; first != last; ++first)
6939 if (
NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
6941 return cast_or_null<DeclContext>(ID);
6956 return cast<Decl>(DC)->getTemplateDepth() > Level;
6961 bool FindingInstantiatedContext) {
6999 if (
auto *BD = dyn_cast<BindingDecl>(FD);
7007 "found declaration pack but not pack expanding");
7037 bool NeedInstantiate =
false;
7039 NeedInstantiate = RD->isLocalClass();
7042 NeedInstantiate =
true;
7045 if (NeedInstantiate) {
7056 assert(Inst &&
"Failed to instantiate label??");
7063 if (!
Record->isDependentContext())
7072 dyn_cast<ClassTemplateSpecializationDecl>(
Record))
7073 ClassTemplate = Spec->getSpecializedTemplate()->getCanonicalDecl();
7084 if (
CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
7088 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
7108 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD);
7109 if (Guide && Guide->isImplicit()) {
7117 Unpacked = Arg.pack_elements();
7130 if (
T.isNull() ||
T->containsErrors())
7140 assert(
SemaRef.RebuildingImmediateInvocation ||
7153 if (FindingInstantiatedContext &&
7156 Diag(Loc, diag::err_specialization_not_primary_template)
7179 if (!ParentDependsOnArgs)
7193 bool IsBeingInstantiated =
false;
7194 if (
auto *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
7195 if (!Spec->isDependentContext()) {
7196 if (Spec->isEntityBeingDefined())
7197 IsBeingInstantiated =
true;
7199 diag::err_incomplete_type))
7202 ParentDC = Spec->getDefinitionOrSelf();
7241 }
else if (IsBeingInstantiated) {
7247 Diag(Loc, diag::err_member_not_yet_instantiated)
7260 Diag(Loc, diag::err_enumerator_does_not_exist)
7264 <<
Context.getCanonicalTagType(Spec);
7267 llvm_unreachable(
"Unable to find instantiation of declaration!");
7278 std::deque<PendingImplicitInstantiation> DelayedImplicitInstantiations;
7283 bool LocalInstantiation =
false;
7290 LocalInstantiation =
true;
7295 bool DefinitionRequired =
Function->getTemplateSpecializationKind() ==
7300 [
this, Inst, DefinitionRequired, AtEndOfTU](
FunctionDecl *CurFD) {
7302 DefinitionRequired, AtEndOfTU);
7308 DefinitionRequired, AtEndOfTU);
7310 Function->setInstantiationIsPending(
false);
7313 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates &&
7315 DelayedImplicitInstantiations.push_back(Inst);
7316 else if (!AtEndOfTU &&
Function->instantiationIsPending() &&
7317 !LocalInstantiation)
7318 DelayedImplicitInstantiations.push_back(Inst);
7327 "Not a static data member, nor a variable template"
7328 " specialization?");
7340 llvm_unreachable(
"Cannot instantitiate an undeclared specialization.");
7355 "instantiating variable definition");
7362 DefinitionRequired, AtEndOfTU);
7365 if (!DelayedImplicitInstantiations.empty())
7371 for (
auto *DD : Pattern->
ddiags()) {
7372 switch (DD->getKind()) {
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Result
Implement __builtin_bit_cast and related operations.
llvm::MachO::Record Record
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
This file declares semantic analysis for CUDA constructs.
static const NamedDecl * getDefinition(const Decl *D)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to Swift.
static void instantiateDependentAMDGPUWavesPerEUAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUWavesPerEUAttr &Attr, Decl *New)
static NamedDecl * findInstantiationOf(ASTContext &Ctx, NamedDecl *D, ForwardIterator first, ForwardIterator last)
static void instantiateDependentAMDGPUMaxNumWorkGroupsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUMaxNumWorkGroupsAttr &Attr, Decl *New)
static void instantiateDependentAMDGPUFlatWorkGroupSizeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUFlatWorkGroupSizeAttr &Attr, Decl *New)
static void instantiateDependentCUDAClusterDimsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const CUDAClusterDimsAttr &Attr, Decl *New)
static void sharedInstantiateConstructorDestructorAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Decl *New, ASTContext &C)
static void instantiateDependentDiagnoseIfAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const DiagnoseIfAttr *DIA, const Decl *Tmpl, FunctionDecl *New)
static QualType adjustFunctionTypeForInstantiation(ASTContext &Context, FunctionDecl *D, TypeSourceInfo *TInfo)
Adjust the given function type for an instantiation of the given declaration, to cope with modificati...
static bool isRelevantAttr(Sema &S, const Decl *D, const Attr *A)
Determine whether the attribute A might be relevant to the declaration D.
static void instantiateDependentReqdWorkGroupSizeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const ReqdWorkGroupSizeAttr &Attr, Decl *New)
#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME)
static void instantiateDependentMallocSpanAttr(Sema &S, const MallocSpanAttr *Attr, Decl *New)
static bool isDependentContextAtLevel(DeclContext *DC, unsigned Level)
Determine whether the given context is dependent on template parameters at level Level or below.
static void instantiateDependentModeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const ModeAttr &Attr, Decl *New)
static void instantiateDependentCUDALaunchBoundsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const CUDALaunchBoundsAttr &Attr, Decl *New)
static bool isDeclWithinFunction(const Decl *D)
static void instantiateDependentAssumeAlignedAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AssumeAlignedAttr *Aligned, Decl *New)
static bool SubstQualifier(Sema &SemaRef, const DeclT *OldDecl, DeclT *NewDecl, const MultiLevelTemplateArgumentList &TemplateArgs)
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static void instantiateDependentHLSLParamModifierAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const HLSLParamModifierAttr *Attr, const Decl *Old, Decl *New)
static DeclT * getPreviousDeclForInstantiation(DeclT *D)
Get the previous declaration of a declaration for the purposes of template instantiation.
static Expr * instantiateDependentFunctionAttrCondition(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Expr *OldCond, const Decl *Tmpl, FunctionDecl *New)
static bool isInstantiationOf(ClassTemplateDecl *Pattern, ClassTemplateDecl *Instance)
static void instantiateDependentAllocAlignAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AllocAlignAttr *Align, Decl *New)
static bool isInstantiationOfStaticDataMember(VarDecl *Pattern, VarDecl *Instance)
static void instantiateOMPDeclareSimdDeclAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OMPDeclareSimdDeclAttr &Attr, Decl *New)
Instantiation of 'declare simd' attribute and its arguments.
static void instantiateDependentSYCLKernelAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const SYCLKernelAttr &Attr, Decl *New)
static void instantiateDependentAlignValueAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AlignValueAttr *Aligned, Decl *New)
static void instantiateDependentAlignedAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AlignedAttr *Aligned, Decl *New, bool IsPackExpansion)
static void instantiateOMPDeclareVariantAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OMPDeclareVariantAttr &Attr, Decl *New)
Instantiation of 'declare variant' attribute and its arguments.
static void instantiateDependentEnableIfAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const EnableIfAttr *EIA, const Decl *Tmpl, FunctionDecl *New)
static void instantiateDependentAnnotationAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AnnotateAttr *Attr, Decl *New)
static Sema::RetainOwnershipKind attrToRetainOwnershipKind(const Attr *A)
static void instantiateDependentOpenACCRoutineDeclAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OpenACCRoutineDeclAttr *OldAttr, const Decl *Old, Decl *New)
static bool isInstantiationOfUnresolvedUsingDecl(T *Pattern, Decl *Other, ASTContext &Ctx)
static bool isInvalid(LocType Loc, bool *Invalid)
Defines the SourceManager interface.
Defines the clang::TypeLoc interface and its subclasses.
bool anyScoreOrCondition(llvm::function_ref< bool(Expr *&, bool)> Cond)
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
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.
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 C++26 expansion statement declaration.
CXXExpansionStmtPattern * getExpansionPattern()
CXXExpansionStmtInstantiation * getInstantiations()
void setInstantiations(CXXExpansionStmtInstantiation *S)
NonTypeTemplateParmDecl * getIndexTemplateParm()
void setExpansionPattern(CXXExpansionStmtPattern *S)
Represents a static or instance method of a struct/union/class.
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
unsigned getLambdaDependencyKind() const
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
bool isLambda() const
Determine whether this class describes a lambda function object.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
TypeSourceInfo * getLambdaTypeInfo() const
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a class template node.
ClassTemplateDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
ClassTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *D)
Find a class template partial specialization which was instantiated from the given member partial spe...
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
void setCommonPtr(Common *C)
Common * getCommonPtr() const
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
void setInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *PartialSpec)
static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, CanQualType CanonInjectedTST, ClassTemplatePartialSpecializationDecl *PrevDecl)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, bool StrictPackMatch, ClassTemplateSpecializationDecl *PrevDecl)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Declaration of a C++20 concept.
const TypeClass * getTypePtr() const
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
ddiag_range ddiags() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
decl_iterator decls_begin() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isInIdentifierNamespace(unsigned NS) const
@ FOK_None
Not a friend object.
bool isReferenced() const
Whether any declaration of this entity was referenced.
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
@ IDNS_Ordinary
Ordinary names.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
void setLexicalDeclContext(DeclContext *DC)
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
The name of a declaration.
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
void setTypeSourceInfo(TypeSourceInfo *TI)
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, SourceLocation RSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
Provides information about a dependent function-template specialization declaration.
RAII object that enters a new function expression evaluation context.
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getDefinition() const
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Represents an explicit instantiation of a template entity in source code.
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
bool isInvalid() const
Determine if the explicit specifier is invalid.
static ExplicitSpecifier Invalid()
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(const FunctionDecl *Function)
This represents one expression.
static bool isPotentialConstantExprUnevaluated(Expr *E, const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExprUnevaluated - Return true if this expression might be usable in a constant exp...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef=false, const Expr **Culprit=nullptr) const
Returns true if this expression can be emitted to IR as a constant, and thus can be used as a constan...
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Declaration context for names declared as extern "C" in C++.
Abstract interface for external sources of AST nodes.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
bool isUnsupportedFriend() const
Determines if this friend kind is unsupported.
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, SourceLocation FriendL, SourceLocation EllipsisLoc={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
SourceLocation getFriendLoc() const
Retrieves the location of the 'friend' keyword.
void setUnsupportedFriend(bool Unsupported)
SourceRange getSourceRange() const override LLVM_READONLY
Retrieves the source range for the friend declaration.
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
bool isPackExpansion() const
Declaration of a friend template.
CXXSpecialMemberKind asSpecialMember() const
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, FPOptionsOverride FPFeatures, 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.
DefaultedFunctionKind getDefaultedFunctionKind() const
Determine the kind of defaulting that would be done for a given function.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
QualType getParamType(unsigned i) const
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
ExtProtoInfo getExtProtoInfo() const
FunctionDecl * getExceptionSpecTemplate() const
If this function type has an uninstantiated exception specification, this is the function whose excep...
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
void setInstantiatedFromMemberTemplate(FunctionTemplateDecl *D)
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
ParmVarDecl * getParam(unsigned i) const
void setParam(unsigned i, ParmVarDecl *VD)
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Represents a field injected from an anonymous union/struct into the parent scope.
unsigned getChainingSize() const
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
ArrayRef< NamedDecl * > chain() const
Description of a constructor that was inherited from a base class.
const TypeClass * getTypePtr() const
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
An lvalue reference type, per C++11 [dcl.ref].
Represents the declaration of a label.
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
A stack-allocated class that identifies which local variable declaration instantiations are present i...
SmallVector< ValueDecl *, 4 > DeclArgumentPack
A set of declarations.
void InstantiatedLocal(const Decl *D, Decl *Inst)
void InstantiatedLocalPackArg(const Decl *D, VarDecl *Inst)
void MakeInstantiatedLocalArgPack(const Decl *D)
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
IdentifierInfo * getGetterId() const
IdentifierInfo * getSetterId() const
Provides information a specialization of a member of a class template, which may be a member function...
Data structure that captures multiple levels of template argument lists for use in template instantia...
const ArgList & getInnermost() const
Retrieve the innermost template argument list.
void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final)
Add a new outmost level to the multi-level template argument list.
void setKind(TemplateSubstitutionKind K)
void addOuterRetainedLevels(unsigned Num)
unsigned getNumRetainedOuterLevels() const
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool hasLinkage() const
Determine whether this declaration has linkage.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represents a C++ namespace alias.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
SourceLocation getAliasLoc() const
Returns the location of the alias name, i.e.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, int D, int P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
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...
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Expr * getPlaceholderTypeConstraint() const
Return the constraint introduced by the placeholder type of this non-type template parameter (if any)...
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
This represents 'pragma omp allocate ...' directive.
clauselist_range clauselists()
Pseudo declaration for capturing expressions.
This represents 'pragma omp declare mapper ...' directive.
OMPDeclareMapperDecl * getPrevDeclInScope()
Get reference to previous declare mapper construct in the same scope with the same name.
clauselist_iterator clauselist_begin()
clauselist_range clauselists()
DeclarationName getVarName()
Get the name of the variable declared in the mapper.
Expr * getMapperVarRef()
Get the variable declared in the mapper.
This represents 'pragma omp declare reduction ...' directive.
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Expr * getInitPriv()
Get Priv variable of the initializer.
Expr * getCombinerOut()
Get Out variable of the combiner.
Expr * getCombinerIn()
Get In variable of the combiner.
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
OMPDeclareReductionDecl * getPrevDeclInScope()
Get reference to previous declare reduction construct in the same scope with the same name.
Expr * getInitOrig()
Get Orig variable of the initializer.
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
This represents 'pragma omp groupprivate ...' directive.
This represents 'pragma omp requires...' directive.
This represents 'pragma omp threadprivate ...' directive.
Represents a field declaration created by an @defs(...).
static OpaquePtr make(QualType P)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
OpenACCDirectiveKind getDirectiveKind() const
ArrayRef< const OpenACCClause * > clauses() const
SourceLocation getDirectiveLoc() const
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
A 'device_type' or 'dtype' clause, takes a list of either an 'asterisk' or an identifier.
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
SourceLocation getRParenLoc() const
const Expr * getFunctionReference() const
SourceLocation getLParenLoc() const
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a parameter to a function.
Represents a #pragma detect_mismatch line.
PrettyDeclStackTraceEntry - If a crash occurs in the parser while parsing something related to a decl...
A (possibly-)qualified type.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
The collection of all-type qualifiers we support.
Represents a struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Wrapper for source info for record types.
Declaration of a redeclarable template.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Represents the body of a requires-expression.
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
Scope - A scope is a transient data structure that is used while parsing the program.
void addAMDGPUFlatWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI, Expr *Min, Expr *Max)
addAMDGPUFlatWorkGroupSizeAttr - Adds an amdgpu_flat_work_group_size attribute to a particular declar...
void addAMDGPUWavesPerEUAttr(Decl *D, const AttributeCommonInfo &CI, Expr *Min, Expr *Max)
addAMDGPUWavePersEUAttr - Adds an amdgpu_waves_per_eu attribute to a particular declaration.
void addAMDGPUMaxNumWorkGroupsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *XExpr, Expr *YExpr, Expr *ZExpr)
addAMDGPUMaxNumWorkGroupsAttr - Adds an amdgpu_max_num_work_groups attribute to a particular declarat...
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
QualType getInoutParameterType(QualType Ty)
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...
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.
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...
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Decl * ActOnSkippedFunctionBody(Decl *Decl)
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
void deduceOpenCLAddressSpace(VarDecl *decl)
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, FunctionDecl *Function)
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
PragmaStack< FPOptionsOverride > FpPragmaStack
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
ExpressionEvaluationContextRecord & parentEvaluationContext()
LateParsedTemplateMapT LateParsedTemplateMap
bool SubstExprs(ArrayRef< Expr * > Exprs, bool IsCall, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< Expr * > &Outputs)
Substitute the given template arguments into a list of expressions, expanding pack expansions if requ...
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions, bool Diagnose=true)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, const IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
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)
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
const LangOptions & getLangOpts() const
void inferLifetimeBoundAttribute(FunctionDecl *FD)
Add [[clang:lifetimebound]] attr for std:: functions and methods.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
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.
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)
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
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...
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
RedeclarationKind forRedeclarationInCurContext() const
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
sema::AnalysisBasedWarnings AnalysisWarnings
Worker object for performing CFG-based warnings.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
bool checkInstantiatedThreadSafetyAttrs(const Decl *D, const Attr *A)
Recheck instantiated thread-safety attributes that could not be validated on the dependent pattern de...
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
LateTemplateParserCB * LateTemplateParser
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
SourceManager & SourceMgr
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
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.
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.
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.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, int D, int P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
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.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, int D, int P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
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.
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)
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)
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
@ 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)
@ Default
Set to the current date and time.
@ Property
The type of a property.
@ Result
The result type of a method or function.
ActionResult< CXXCtorInitializer * > MemInitResult
OptionalUnsigned< unsigned > UnsignedOrNone
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
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
llvm::SmallVector< OMPInteropPref, 4 > Prefs
One entry of a prefer_type list.
llvm::SmallVector< Expr *, 2 > Attrs
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.