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));
268 Expr *Cond =
nullptr;
282 Cond = Converted.
get();
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(),
560 auto SubstAdjustArgsExpr = [&](
Expr *&E) {
573 if (SubstAdjustArgsExpr(NewItem.
E) ||
574 SubstAdjustArgsExpr(NewItem.
Lower.
E) ||
575 SubstAdjustArgsExpr(NewItem.
Upper.
E))
577 Items.push_back(NewItem);
581 Desc->AdjustOp, Desc->NeedDevicePtrModifier, Items,
583 AdjustArgs.push_back(D);
589 Expr *SubstFr =
nullptr;
600 SubstAttrs.push_back(ER.
get());
602 Info.
Prefs.emplace_back(SubstFr, std::move(SubstAttrs));
604 AppendArgs.push_back(Info);
614 const AMDGPUFlatWorkGroupSizeAttr &
Attr,
Decl *
New) {
655 New->addAttr(::new (Context) ReqdWorkGroupSizeAttr(Context,
Attr,
X, Y, Z));
663 Expr *Cond =
nullptr;
671 Cond = SubstResult.
get();
691 Expr *MaxExpr =
nullptr;
692 if (
auto Max =
Attr.getMax()) {
704 const AMDGPUMaxNumWorkGroupsAttr &
Attr,
Decl *
New) {
708 Expr *XExpr =
nullptr;
709 Expr *YExpr =
nullptr;
710 Expr *ZExpr =
nullptr;
712 if (
Attr.getMaxNumWorkGroupsX()) {
718 if (
Attr.getMaxNumWorkGroupsY()) {
724 if (
Attr.getMaxNumWorkGroupsZ()) {
740 auto SubstElt = [&S, &TemplateArgs](
Expr *E) {
741 return E ? S.
SubstExpr(E, TemplateArgs).
get() :
nullptr;
744 Expr *XExpr = SubstElt(
Attr.getX());
745 Expr *YExpr = SubstElt(
Attr.getY());
746 Expr *ZExpr = SubstElt(
Attr.getZ());
766 if (
const auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
769 if (!
T->isDependentType() && !RD->isDependentContext() &&
772 for (
const auto *ExistingPNA : D->
specific_attrs<PreferredNameAttr>())
774 PNA->getTypedefType()))
779 if (
const auto *BA = dyn_cast<BuiltinAttr>(A)) {
781 switch (BA->getID()) {
782 case Builtin::BIforward:
792 case Builtin::BImove:
793 case Builtin::BImove_if_noexcept:
820 <<
Attr <<
"'groupshared'";
832 "out or inout parameter type must be a reference and restrict qualified");
836 const MallocSpanAttr *
Attr,
851 for (
const auto *TmplAttr : Tmpl->
attrs()) {
858 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
862 TmplAttr,
Context, *
this, TemplateArgs);
865 New->addAttr(NewAttr);
873 case clang::attr::CFConsumed:
875 case clang::attr::OSConsumed:
877 case clang::attr::NSConsumed:
880 llvm_unreachable(
"Wrong argument supplied");
892 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
894 ND->isCXXInstanceMember());
899 New->addAttr(NewAttr);
905 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *Old,
Decl *
New);
911 for (
const auto *TmplAttr : Tmpl->
attrs()) {
916 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
917 if (Aligned && Aligned->isAlignmentDependent()) {
922 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
927 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
932 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
937 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
942 if (
auto *
Constructor = dyn_cast<ConstructorAttr>(TmplAttr)) {
948 if (
auto *
Destructor = dyn_cast<DestructorAttr>(TmplAttr)) {
954 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
960 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
966 if (
const auto *CUDALaunchBounds =
967 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
969 *CUDALaunchBounds,
New);
973 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
978 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
983 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
988 if (
const auto *ReqdWorkGroupSize =
989 dyn_cast<ReqdWorkGroupSizeAttr>(TmplAttr)) {
991 *ReqdWorkGroupSize,
New);
995 if (
const auto *AMDGPUFlatWorkGroupSize =
996 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
998 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize,
New);
1002 if (
const auto *AMDGPUFlatWorkGroupSize =
1003 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
1005 *AMDGPUFlatWorkGroupSize,
New);
1009 if (
const auto *AMDGPUMaxNumWorkGroups =
1010 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
1012 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups,
New);
1016 if (
const auto *CUDAClusterDims = dyn_cast<CUDAClusterDimsAttr>(TmplAttr)) {
1018 *CUDAClusterDims,
New);
1022 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
1028 if (
const auto *RoutineAttr = dyn_cast<OpenACCRoutineDeclAttr>(TmplAttr)) {
1030 RoutineAttr, Tmpl,
New);
1035 if (TmplAttr->getKind() == attr::DLLExport ||
1036 TmplAttr->getKind() == attr::DLLImport) {
1037 if (
New->hasAttr<DLLExportAttr>() ||
New->hasAttr<DLLImportAttr>()) {
1042 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
1055 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
1056 if (!
New->hasAttr<PointerAttr>())
1061 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
1062 if (!
New->hasAttr<OwnerAttr>())
1067 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
1072 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
1073 if (!
New->hasAttr<CUDAGridConstantAttr>())
1078 if (
auto *A = dyn_cast<MallocSpanAttr>(TmplAttr)) {
1083 if (
auto *A = dyn_cast<CleanupAttr>(TmplAttr)) {
1084 if (!
New->hasAttr<CleanupAttr>()) {
1085 auto *NewAttr = A->clone(
Context);
1086 NewAttr->setArgLoc(A->getArgLoc());
1087 New->addAttr(NewAttr);
1092 assert(!TmplAttr->isPackExpansion());
1093 if (TmplAttr->isLateParsed() && LateAttrs) {
1114 "late attributes instantiated outside the scope they were deferred in");
1121 "deferred scope did not extend the outermost scope");
1127 for (
const auto *
Attr : Pattern->
attrs()) {
1128 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
1129 if (!Inst->
hasAttr<StrictFPAttr>())
1140template<
typename DeclT>
1142 DeclT *
Result = D->getPreviousDecl();
1148 D->getLexicalDeclContext() !=
Result->getLexicalDeclContext())
1156 llvm_unreachable(
"Translation units cannot be instantiated");
1160 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
1163Decl *TemplateDeclInstantiator::VisitHLSLRootSignatureDecl(
1165 llvm_unreachable(
"HLSL root signature declarations cannot be instantiated");
1170 llvm_unreachable(
"pragma comment cannot be instantiated");
1173Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
1175 llvm_unreachable(
"pragma comment cannot be instantiated");
1180 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
1184 llvm_unreachable(
"GUID declaration cannot be instantiated");
1187Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
1189 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
1192Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
1194 llvm_unreachable(
"template parameter objects cannot be instantiated");
1198TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *D) {
1201 SemaRef.InstantiateAttrs(TemplateArgs, D, Inst, LateAttrs, StartingScope);
1202 Owner->addDecl(Inst);
1207TemplateDeclInstantiator::VisitNamespaceDecl(
NamespaceDecl *D) {
1208 llvm_unreachable(
"Namespaces cannot be instantiated");
1212class OpenACCDeclClauseInstantiator final
1215 const MultiLevelTemplateArgumentList &MLTAL;
1216 ArrayRef<OpenACCClause *> ExistingClauses;
1217 SemaOpenACC::OpenACCParsedClause &ParsedClause;
1218 OpenACCClause *NewClause =
nullptr;
1221 OpenACCDeclClauseInstantiator(Sema &S,
1222 const MultiLevelTemplateArgumentList &MLTAL,
1223 ArrayRef<OpenACCClause *> ExistingClauses,
1224 SemaOpenACC::OpenACCParsedClause &ParsedClause)
1225 : SemaRef(S), MLTAL(MLTAL), ExistingClauses(ExistingClauses),
1226 ParsedClause(ParsedClause) {}
1228 OpenACCClause *CreatedClause() {
return NewClause; }
1229#define VISIT_CLAUSE(CLAUSE_NAME) \
1230 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
1231#include "clang/Basic/OpenACCClauses.def"
1235 for (
Expr *CurVar : VarList) {
1236 ExprResult Res = SemaRef.SubstExpr(CurVar, MLTAL);
1245 InstantiatedVarList.push_back(Res.
get());
1247 return InstantiatedVarList;
1251#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME) \
1252 void OpenACCDeclClauseInstantiator::Visit##CLAUSE_NAME##Clause( \
1253 const OpenACC##CLAUSE_NAME##Clause &) { \
1254 llvm_unreachable("Clause type invalid on declaration construct, or " \
1255 "instantiation not implemented"); \
1284#undef CLAUSE_NOT_ON_DECLS
1286void OpenACCDeclClauseInstantiator::VisitGangClause(
1290 assert(
C.getNumExprs() <= 1 &&
1291 "Only 1 expression allowed on gang clause in routine");
1293 if (
C.getNumExprs() > 0) {
1295 "Only dim allowed on routine");
1297 SemaRef.SubstExpr(
const_cast<Expr *
>(
C.getExpr(0).second), MLTAL);
1299 ER = SemaRef.OpenACC().CheckGangExpr(ExistingClauses,
1300 ParsedClause.getDirectiveKind(),
1301 C.getExpr(0).first, ER.
get());
1304 TransformedIntExprs.push_back(ER.
get());
1309 NewClause = SemaRef.OpenACC().CheckGangClause(
1310 ParsedClause.getDirectiveKind(), ExistingClauses,
1311 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1312 TransformedGangKinds, TransformedIntExprs, ParsedClause.getEndLoc());
1317 ParsedClause.getBeginLoc(),
1318 ParsedClause.getEndLoc());
1320void OpenACCDeclClauseInstantiator::VisitNoHostClause(
1323 ParsedClause.getBeginLoc(),
1324 ParsedClause.getEndLoc());
1327void OpenACCDeclClauseInstantiator::VisitDeviceTypeClause(
1331 SemaRef.getASTContext(),
C.getClauseKind(), ParsedClause.getBeginLoc(),
1332 ParsedClause.getLParenLoc(),
C.getArchitectures(),
1333 ParsedClause.getEndLoc());
1336void OpenACCDeclClauseInstantiator::VisitWorkerClause(
1338 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'worker' clause");
1340 ParsedClause.getBeginLoc(), {},
1341 nullptr, ParsedClause.getEndLoc());
1344void OpenACCDeclClauseInstantiator::VisitVectorClause(
1346 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'vector' clause");
1348 ParsedClause.getBeginLoc(), {},
1349 nullptr, ParsedClause.getEndLoc());
1352void OpenACCDeclClauseInstantiator::VisitCopyClause(
1354 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1355 C.getModifierList());
1356 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1359 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1360 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1361 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1362 ParsedClause.getEndLoc());
1365void OpenACCDeclClauseInstantiator::VisitLinkClause(
1367 ParsedClause.setVarListDetails(
1368 SemaRef.OpenACC().CheckLinkClauseVarList(VisitVarList(
C.getVarList())),
1371 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1376 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1377 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1378 ParsedClause.getEndLoc());
1381void OpenACCDeclClauseInstantiator::VisitDeviceResidentClause(
1383 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1385 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1389 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1390 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1391 ParsedClause.getEndLoc());
1394void OpenACCDeclClauseInstantiator::VisitCopyInClause(
1396 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1397 C.getModifierList());
1399 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1402 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1403 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1404 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1405 ParsedClause.getEndLoc());
1407void OpenACCDeclClauseInstantiator::VisitCopyOutClause(
1409 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1410 C.getModifierList());
1412 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1415 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1416 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1417 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1418 ParsedClause.getEndLoc());
1420void OpenACCDeclClauseInstantiator::VisitCreateClause(
1422 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1423 C.getModifierList());
1425 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1428 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1429 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1430 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1431 ParsedClause.getEndLoc());
1433void OpenACCDeclClauseInstantiator::VisitPresentClause(
1435 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1437 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1441 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1442 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1443 ParsedClause.getEndLoc());
1445void OpenACCDeclClauseInstantiator::VisitDevicePtrClause(
1449 llvm::erase_if(VarList, [&](
Expr *E) {
1454 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1458 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1459 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1460 ParsedClause.getEndLoc());
1463void OpenACCDeclClauseInstantiator::VisitBindClause(
1466 if (
C.isStringArgument())
1468 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1469 ParsedClause.getLParenLoc(),
C.getStringArgument(),
1470 ParsedClause.getEndLoc());
1473 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1474 ParsedClause.getLParenLoc(),
C.getIdentifierArgument(),
1475 ParsedClause.getEndLoc());
1483 for (
const auto *Clause : ClauseList) {
1485 Clause->getBeginLoc());
1486 ParsedClause.setEndLoc(Clause->getEndLoc());
1487 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(Clause))
1488 ParsedClause.setLParenLoc(WithParms->getLParenLoc());
1490 OpenACCDeclClauseInstantiator Instantiator{S, MLTAL, TransformedClauses,
1492 Instantiator.Visit(Clause);
1493 if (Instantiator.CreatedClause())
1494 TransformedClauses.push_back(Instantiator.CreatedClause());
1496 return TransformedClauses;
1503 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *OldDecl,
Decl *NewDecl) {
1504 OpenACCRoutineDeclAttr *A =
1505 OpenACCRoutineDeclAttr::Create(S.
getASTContext(), OldAttr->getLocation());
1507 if (!OldAttr->Clauses.empty()) {
1509 InstantiateOpenACCClauseList(
1511 A->Clauses.assign(TransformedClauses.begin(), TransformedClauses.end());
1522 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1526 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1530 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndDeclDirective(
1542 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1550 FuncRef = SemaRef.OpenACC().ActOnRoutineName(FuncRef.
get());
1555 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1559 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndRoutineDeclDirective(
1571 NamespaceAliasDecl *Inst
1579 Owner->addDecl(Inst);
1589 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1593 TSI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
1604 if (SemaRef.getPreprocessor().NeedsStdLibCxxWorkaroundBefore(2014'04'22)) {
1605 const DecltypeType *DT = TSI->
getType()->
getAs<DecltypeType>();
1608 DT->isReferenceType() &&
1609 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
1610 RD->getIdentifier() && RD->getIdentifier()->isStr(
"common_type") &&
1612 SemaRef.getSourceManager().isInSystemHeader(D->
getBeginLoc()))
1614 TSI = SemaRef.Context.getTrivialTypeSourceInfo(
1632 TagDecl *oldTag = oldTagType->getDecl();
1649 SemaRef.isIncompatibleTypedef(InstPrevTypedef,
Typedef);
1651 Typedef->setPreviousDecl(InstPrevTypedef);
1654 SemaRef.InstantiateAttrs(TemplateArgs, D,
Typedef);
1657 SemaRef.inferGslPointerAttribute(
Typedef);
1706 if (!
Found.empty()) {
1707 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1720 if (PrevAliasTemplate)
1725 if (!PrevAliasTemplate)
1752 SmallVector<BindingDecl*, 16> NewBindings;
1753 BindingDecl *OldBindingPack =
nullptr;
1754 for (
auto *OldBD : D->
bindings()) {
1755 Expr *BindingExpr = OldBD->getBinding();
1756 if (isa_and_present<FunctionParmPackExpr>(BindingExpr)) {
1758 assert(!OldBindingPack &&
"no more than one pack is allowed");
1759 OldBindingPack = OldBD;
1763 ArrayRef<BindingDecl*> NewBindingArray = NewBindings;
1765 auto *NewDD = cast_if_present<DecompositionDecl>(
1768 if (!NewDD || NewDD->isInvalidDecl()) {
1769 for (
auto *NewBD : NewBindings)
1770 NewBD->setInvalidDecl();
1771 }
else if (OldBindingPack) {
1774 BindingDecl *NewBindingPack = *llvm::find_if(
1776 assert(NewBindingPack !=
nullptr &&
"new bindings should also have a pack");
1777 llvm::ArrayRef<BindingDecl *> OldDecls =
1779 llvm::ArrayRef<BindingDecl *> NewDecls =
1781 assert(OldDecls.size() == NewDecls.size());
1782 for (
unsigned I = 0; I < OldDecls.size(); I++)
1783 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldDecls[I],
1795 bool InstantiatingVarTemplate,
1804 if (!InstantiatingVarTemplate)
1810 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
1812 if (!InstantiatingVarTemplate)
1817 DeclContext *DC = Owner;
1819 SemaRef.adjustContextForLocalExternDecl(DC);
1833 if (SemaRef.getLangOpts().ObjCAutoRefCount &&
1834 SemaRef.ObjC().inferObjCARCLifetime(Var))
1837 if (SemaRef.getLangOpts().OpenCL)
1838 SemaRef.deduceOpenCLAddressSpace(Var);
1844 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
1845 StartingScope, InstantiatingVarTemplate);
1848 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1849 RT = F->getReturnType();
1854 llvm_unreachable(
"Unknown context type");
1867 Sema::NamedReturnInfo Info = SemaRef.getNamedReturnInfo(Var);
1868 bool NRVO = SemaRef.getCopyElisionCandidate(Info, RT) !=
nullptr;
1875 SemaRef.CheckStaticLocalForDllExport(Var);
1878 SemaRef.CheckThreadLocalForLargeAlignment(Var);
1880 if (SemaRef.getLangOpts().OpenACC)
1881 SemaRef.OpenACC().ActOnVariableDeclarator(Var);
1893 Owner->addHiddenDecl(AD);
1897Decl *TemplateDeclInstantiator::VisitFieldDecl(
FieldDecl *D) {
1902 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1914 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1925 else if (BitWidth) {
1931 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
1936 BitWidth = InstantiatedBitWidth.
getAs<Expr>();
1939 FieldDecl *
Field = SemaRef.CheckFieldDecl(
1948 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
1950 if (
Field->hasAttrs())
1951 SemaRef.CheckAlignasUnderalignment(Field);
1954 Field->setInvalidDecl();
1956 if (!
Field->getDeclName() ||
Field->isPlaceholderVar(SemaRef.getLangOpts())) {
1958 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
1960 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(
Field->getDeclContext())) {
1961 if (Parent->isAnonymousStructOrUnion() &&
1962 Parent->getRedeclContext()->isFunctionOrMethod())
1963 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
1968 Owner->addDecl(Field);
1978 SemaRef.Diag(D->
getLocation(), diag::err_property_is_variably_modified)
1982 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1994 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
2007 SemaRef.InstantiateAttrs(TemplateArgs, D,
Property, LateAttrs,
2020 NamedDecl **NamedChain =
2024 for (
auto *PI : D->
chain()) {
2030 NamedChain[i++] =
Next;
2036 {NamedChain, D->getChainingSize()});
2038 for (
const auto *Attr : D->
attrs())
2039 IndirectField->
addAttr(Attr->clone(SemaRef.Context));
2043 Owner->addDecl(IndirectField);
2044 return IndirectField;
2047static std::optional<TemplateName>
2050 bool HasTemplateKeyword,
bool RequireClassTemplate) {
2055 SS.
Adopt(QualifierLoc);
2061 return std::nullopt;
2066 return std::nullopt;
2071 if (RequireClassTemplate && !IsDependentContext) {
2072 SemaRef.
Diag(NameLoc, diag::err_no_member_template)
2074 return std::nullopt;
2079 if (
Result.isAmbiguous())
2080 return std::nullopt;
2084 if (RequireClassTemplate && !IsDependentContext) {
2085 SemaRef.
Diag(NameLoc, diag::err_redefinition_different_kind) << Name;
2087 Result.getRepresentativeDecl()->getUnderlyingDecl()->getLocation(),
2088 diag::note_previous_definition);
2089 return std::nullopt;
2094 auto *FoundUsingShadow =
2095 dyn_cast<UsingShadowDecl>(
Result.getRepresentativeDecl());
2110 if (!TSTL || !QualifierLoc ||
2111 !QualifierLoc.getNestedNameSpecifier().isDependent())
2112 return SubstType(TSI, TemplateArgs, Loc, Entity);
2115 auto *FriendCTD = dyn_cast_or_null<ClassTemplateDecl>(
2116 FriendTST->getTemplateName().getAsTemplateDecl());
2118 return SubstType(TSI, TemplateArgs, Loc, Entity);
2130 if (InstTemplate->isNull())
2131 return SubstType(TSI, TemplateArgs, Loc, Entity);
2134 for (
unsigned I = 0, N = TSTL.
getNumArgs(); I != N; ++I)
2135 FriendArgLocs.push_back(TSTL.
getArgLoc(I));
2162static std::optional<SubstitutedFriend>
2172 if (!InstQualifierLoc ||
2175 return std::nullopt;
2181 assert(DNTL &&
"friend class template must have a dependent name type");
2184 SemaRef, InstQualifierLoc, DNTL.getTypePtr()->getIdentifier(),
2185 DNTL.getNameLoc(),
false,
2188 return std::nullopt;
2189 if (!InstTemplate->isNull())
2193 assert(DTN &&
"unresolved friend template must have a dependent name");
2196 DTN->hasTemplateKeyword()});
2202 return std::nullopt;
2208 assert(TSI &&
"friend pack expansion must name a type");
2210 const auto *FTD = dyn_cast<FriendTemplateDecl>(D);
2213 TPLs = FTD->getTemplateParameterLists();
2216 SemaRef.collectUnexpandedParameterPacks(TSI->
getTypeLoc(), Unexpanded);
2217 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
2219 bool ShouldExpand =
true;
2220 bool RetainExpansion =
false;
2222 if (SemaRef.CheckParameterPacksForExpansion(
2224 true, ShouldExpand, RetainExpansion,
2228 assert(!RetainExpansion &&
2229 "should never retain an expansion for a friend declaration");
2234 for (
unsigned I = 0; I != *NumExpansions; I++) {
2241 std::optional<SubstitutedFriend> InstFriend;
2244 SemaRef, TSI, FTD->getFriendTemplateName(), TemplateArgs,
2249 if (!InstFriend || InstFriend->empty())
2259 {}, InstFriend->Template);
2261 assert(InstTPLs.empty() &&
"unexpected template parameter lists");
2262 assert(InstFriend->Template.isNull() &&
2263 "non-template friend resolved to a class template");
2293 assert(ND &&
"friend decl must be a decl or a type!");
2300 if (!NewND)
return nullptr;
2318 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
2323 SemaRef.SubstExpr(D->
getMessage(), TemplateArgs);
2324 if (InstantiatedMessageExpr.
isInvalid())
2327 return SemaRef.BuildStaticAssertDeclaration(
2332Decl *TemplateDeclInstantiator::VisitExplicitInstantiationDecl(
2336 llvm_unreachable(
"ExplicitInstantiationDecl should not be instantiated");
2339Decl *TemplateDeclInstantiator::VisitCXXExpansionStmtDecl(
2342 CXXExpansionStmtDecl *NewESD = SemaRef.BuildCXXExpansionStmtDecl(
2344 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldESD, NewESD);
2349 StmtResult NewInst = SemaRef.SubstStmt(OldInst, TemplateArgs);
2350 if (NewInst.isInvalid())
2361 Sema::ContextRAII Context(SemaRef, NewESD,
false);
2365 if (Expansion.isInvalid())
2374Decl *TemplateDeclInstantiator::VisitEnumDecl(
EnumDecl *D) {
2375 EnumDecl *PrevDecl =
nullptr;
2377 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2380 if (!Prev)
return nullptr;
2393 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2394 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
2396 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
2397 Enum->setIntegerType(SemaRef.Context.IntTy);
2407 Enum->setIntegerTypeSourceInfo(NewTI);
2417 QualType UnderlyingType =
Enum->getIntegerType();
2418 Enum->setPromotionType(
2419 SemaRef.Context.isPromotableIntegerType(UnderlyingType)
2420 ? SemaRef.Context.getPromotedIntegerType(UnderlyingType)
2424 &&
"Dependent type without type source info");
2429 SemaRef.InstantiateAttrs(TemplateArgs, D,
Enum);
2434 SemaRef.Context.setManglingNumber(
Enum, SemaRef.Context.getManglingNumber(D));
2437 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2438 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Enum, DD);
2441 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2442 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Enum, TND);
2444 Owner->addDecl(
Enum);
2447 if (Def && Def != D) {
2452 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2453 QualType DefnUnderlying =
2454 SemaRef.SubstType(TI->getType(), TemplateArgs,
2455 UnderlyingLoc, DeclarationName());
2457 DefnUnderlying,
true,
Enum);
2472 if (PrevDecl ==
nullptr) {
2473 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Enum);
2483 Enum->startDefinition();
2494 if (
Expr *UninstValue = EC->getInitExpr()) {
2499 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
2504 if (
Value.isInvalid()) {
2510 = SemaRef.CheckEnumConstant(
Enum, LastEnumConst,
2517 Enum->setInvalidDecl();
2521 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
2524 Enum->addDecl(EnumConst);
2525 Enumerators.push_back(EnumConst);
2526 LastEnumConst = EnumConst;
2529 !
Enum->isScoped()) {
2532 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
2537 SemaRef.ActOnEnumBody(
Enum->getLocation(),
Enum->getBraceRange(),
Enum,
2542 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
2547 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
2555 LocalInstantiationScope Scope(SemaRef);
2568 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2574 CXXRecordDecl *PrevDecl =
nullptr;
2575 ClassTemplateDecl *PrevClassTemplate =
nullptr;
2579 if (!
Found.empty()) {
2580 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
2581 if (PrevClassTemplate)
2590 DeclContext *DC = Owner;
2594 SS.
Adopt(QualifierLoc);
2595 DC = SemaRef.computeDeclContext(SS);
2596 if (!DC)
return nullptr;
2598 DC = SemaRef.FindInstantiatedContext(Pattern->
getLocation(),
2607 SemaRef.forRedeclarationInCurContext());
2608 SemaRef.LookupQualifiedName(R, DC);
2610 if (
R.isSingleResult()) {
2611 PrevClassTemplate =
R.getAsSingle<ClassTemplateDecl>();
2612 if (PrevClassTemplate)
2616 if (!PrevClassTemplate && QualifierLoc) {
2617 SemaRef.Diag(Pattern->
getLocation(), diag::err_not_tag_in_scope)
2630 SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, LateAttrs,
2633 ClassTemplateDecl *Inst
2639 assert(!Owner->isDependentContext());
2644 if (PrevClassTemplate) {
2646 const ClassTemplateDecl *MostRecentPrevCT =
2648 TemplateParameterList *PrevParams =
2652 if (!SemaRef.TemplateParameterListsAreEqual(
2659 if (SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
2673 if (!PrevClassTemplate)
2690 Owner->addDecl(Inst);
2692 if (!PrevClassTemplate) {
2696 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
2698 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2699 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2700 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
2707TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
2718 ClassTemplateDecl *InstClassTemplate
2719 = dyn_cast<ClassTemplateDecl>(
Found.front());
2720 if (!InstClassTemplate)
2723 if (ClassTemplatePartialSpecializationDecl *
Result
2732 "Only static data member templates are allowed.");
2736 LocalInstantiationScope Scope(SemaRef);
2743 VarTemplateDecl *PrevVarTemplate =
nullptr;
2748 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2754 if (!VarInst)
return nullptr;
2756 DeclContext *DC = Owner;
2765 if (!PrevVarTemplate)
2773 Owner->addDecl(Inst);
2774 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D, Inst, LateAttrs,
2777 if (!PrevVarTemplate) {
2781 SmallVector<VarTemplatePartialSpecializationDecl *, 1> PartialSpecs;
2783 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2784 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2785 OutOfLineVarPartialSpecs.push_back(
2786 std::make_pair(Inst, PartialSpecs[I]));
2792Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
2795 "Only static data member templates are allowed.");
2801 assert(!
Found.empty() &&
"Instantiation found nothing?");
2803 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2804 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
2806 if (VarTemplatePartialSpecializationDecl *
Result =
2819 LocalInstantiationScope Scope(SemaRef);
2820 llvm::SaveAndRestore RAII(EvaluateConstraints,
false);
2827 FunctionDecl *Instantiated =
nullptr;
2828 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->
getTemplatedDecl()))
2841 FunctionTemplateDecl *InstTemplate
2844 assert(InstTemplate &&
2845 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2857 Owner->addDecl(InstTemplate);
2861 SemaRef.CheckFriendAccess(InstTemplate);
2864 return InstTemplate;
2868 CXXRecordDecl *PrevDecl =
nullptr;
2870 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2873 if (!Prev)
return nullptr;
2877 CXXRecordDecl *
Record =
nullptr;
2895 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D,
Record, LateAttrs,
2903 if (!IsInjectedClassName)
2909 Record->setObjectOfFriendDecl();
2913 Record->setAnonymousStructOrUnion(
true);
2916 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Record);
2919 SemaRef.Context.setManglingNumber(
Record,
2920 SemaRef.Context.getManglingNumber(D));
2924 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2925 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Record, DD);
2929 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2930 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Record, TND);
2937 Sema::LocalEagerInstantiationScope LocalInstantiations(SemaRef,
2952 LocalInstantiations.perform();
2955 SemaRef.DiagnoseUnusedNestedTypedefs(
Record);
2957 if (IsInjectedClassName)
2958 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2976 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2981 return Context.getFunctionType(NewFunc->getReturnType(),
2982 NewFunc->getParamTypes(), NewEPI);
3006 if (isFriend && Source->wasThisDeclarationADefinition(D)) {
3018 llvm::FoldingSetInsertToken InsertToken;
3027 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
3028 Owner->isFunctionOrMethod() ||
3030 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
3034 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
3035 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
3036 TemplateArgs, DGuide->getExplicitSpecifier());
3037 if (InstantiatedExplicitSpecifier.
isInvalid())
3047 if (TemplateParams && TemplateParams->
size()) {
3049 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
3050 if (LastParam && LastParam->isImplicit() &&
3051 LastParam->hasTypeConstraint()) {
3066 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
3074 SemaRef.CheckDependentFriend(D->
getLocation(), QualifierLoc,
3086 SemaRef.adjustContextForLocalExternDecl(DC);
3087 }
else if (isFriend && QualifierLoc) {
3089 SS.
Adopt(QualifierLoc);
3090 DC = SemaRef.computeDeclContext(SS);
3091 if (!DC)
return nullptr;
3098 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
3104 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
3107 InstantiatedExplicitSpecifier, NameInfo,
T, TInfo,
3109 DGuide->getDeductionCandidateKind(), TrailingRequiresClause,
3110 DGuide->getSourceDeductionGuide(),
3111 DGuide->getSourceDeductionGuideKind());
3118 TrailingRequiresClause);
3119 Function->setFriendConstraintRefersToEnclosingTemplate(
3128 Function->setQualifierInfo(QualifierLoc);
3139 LexicalDC = SemaRef.CurContext;
3143 Function->setIsTypeAwareOperatorNewOrDelete(
3145 Function->setLexicalDeclContext(LexicalDC);
3148 for (
unsigned P = 0; P < Params.size(); ++P)
3150 Params[P]->setOwningFunction(
Function);
3153 if (TrailingRequiresClause)
3154 Function->setTrailingRequiresClause(TrailingRequiresClause);
3156 if (TemplateParams) {
3184 SemaRef.CodeSynthesisContexts.back().Kind !=
3188 Function->setFunctionTemplateSpecialization(
3197 }
else if (!isFriend) {
3201 Function->setInstantiatedFromDecl(D);
3207 FT->setObjectOfFriendDecl();
3213 bool IsExplicitSpecialization =
false;
3220 : SemaRef.forRedeclarationInCurContext());
3224 assert(isFriend &&
"dependent specialization info on "
3225 "non-member non-friend function?");
3229 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3230 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3231 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3232 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3240 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3246 if (SemaRef.CheckFunctionTemplateSpecialization(
3248 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3252 IsExplicitSpecialization =
true;
3256 SemaRef.LookupQualifiedName(
Previous, DC);
3260 ArgsWritten->getRAngleLoc());
3261 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3265 if (SemaRef.CheckFunctionTemplateSpecialization(
Function,
3270 IsExplicitSpecialization =
true;
3287 if (isFriend && !QualifierLoc) {
3288 SemaRef.FilterLookupForScope(
Previous, DC,
nullptr,
3307 if (
Function->isLocalExternDecl()) {
3309 if (!PVD->hasDefaultArg())
3311 if (SemaRef.SubstDefaultArgument(D->
getInnerLocStart(), PVD, TemplateArgs)) {
3315 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
3316 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3318 { UninstExpr }, UninstExpr->
getType());
3320 PVD->setDefaultArg(ErrorResult.
get());
3326 IsExplicitSpecialization,
3327 Function->isThisDeclarationADefinition());
3334 SemaRef.CheckTemplateParameterList(
3337 Function->isThisDeclarationADefinition()
3348 Function->getMemberSpecializationInfo()) {
3349 if (MSInfo->getPointOfInstantiation().isInvalid()) {
3351 MSInfo->setPointOfInstantiation(Loc);
3352 SemaRef.PendingLocalImplicitInstantiations.emplace_back(
Function, Loc);
3390 llvm::FoldingSetInsertToken InsertToken;
3405 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
3407 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
3411 SemaRef, D, TemplateArgs,
Scope);
3416 if (isFriend && !TPLs.empty()) {
3417 TempParamLists.resize(TPLs.size());
3418 for (
unsigned I = 0; I != TPLs.size(); ++I) {
3422 TempParamLists[I] = InstParams;
3428 const bool CouldInstantiate =
3429 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
3430 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
3434 if (CouldInstantiate ||
3435 SemaRef.CodeSynthesisContexts.back().Kind !=
3437 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
3438 TemplateArgs, InstantiatedExplicitSpecifier);
3440 if (InstantiatedExplicitSpecifier.isInvalid())
3455 SemaRef.Context.getTrivialTypeSourceInfo(D->
getType());
3465 if (TemplateParams && TemplateParams->
size()) {
3467 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
3468 if (LastParam && LastParam->isImplicit() &&
3469 LastParam->hasTypeConstraint()) {
3484 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
3492 SemaRef.CheckDependentFriend(D->
getLocation(), QualifierLoc,
3500 SS.
Adopt(QualifierLoc);
3501 DC = SemaRef.computeDeclContext(SS);
3503 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
3505 }
else if (!QualifierLoc) {
3506 DC = SemaRef.FindInstantiatedContext(D->
getLocation(),
3510 if (!DC)
return nullptr;
3517 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
3533 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3534 InstantiatedExplicitSpecifier,
Constructor->UsesFPIntrin(),
3537 TrailingRequiresClause);
3541 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3543 Destructor->getConstexprKind(), TrailingRequiresClause);
3544 Method->setIneligibleOrNotSelected(
true);
3546 Method->setDeclName(SemaRef.Context.DeclarationNames.getCXXDestructorName(
3548 SemaRef.Context.getCanonicalTagType(
Record)));
3551 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3552 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
3553 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
3554 Conversion->getEndLoc(), TrailingRequiresClause);
3558 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo, SC,
3560 D->
getEndLoc(), TrailingRequiresClause);
3564 Method->setImplicitlyInline();
3567 Method->setQualifierInfo(QualifierLoc);
3569 if (TemplateParams) {
3596 Method->setFunctionTemplateSpecialization(
3600 }
else if (!isFriend) {
3609 if (!TempParamLists.empty())
3610 Method->setTemplateParameterListsInfo(SemaRef.Context, TempParamLists);
3612 Method->setLexicalDeclContext(Owner);
3613 Method->setObjectOfFriendDecl();
3618 for (
unsigned P = 0; P < Params.size(); ++P)
3619 Params[P]->setOwningFunction(
Method);
3620 Method->setParams(Params);
3623 Method->setInvalidDecl();
3628 bool IsExplicitSpecialization =
false;
3636 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3637 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3638 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3639 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3647 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3654 if (SemaRef.CheckDependentFunctionTemplateSpecialization(
3656 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3658 Method->setInvalidDecl();
3661 SemaRef.LookupQualifiedName(
Previous, DC);
3662 if (SemaRef.CheckFunctionTemplateSpecialization(
3664 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3666 Method->setInvalidDecl();
3667 IsExplicitSpecialization =
true;
3671 SemaRef.LookupQualifiedName(
Previous, DC);
3674 ArgsWritten->getRAngleLoc());
3676 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3680 if (SemaRef.CheckFunctionTemplateSpecialization(
Method,
3683 Method->setInvalidDecl();
3685 IsExplicitSpecialization =
true;
3713 for (
unsigned P = 0; P < Params.size(); ++P) {
3714 if (!Params[P]->hasDefaultArg())
3716 if (SemaRef.SubstDefaultArgument(StartLoc, Params[P], TemplateArgs)) {
3720 Expr *UninstExpr = Params[P]->getUninstantiatedDefaultArg();
3721 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3723 { UninstExpr }, UninstExpr->
getType());
3725 Params[P]->setDefaultArg(ErrorResult.
get());
3731 IsExplicitSpecialization,
3732 Method->isThisDeclarationADefinition());
3740 if (isFriend &&
Method->getPreviousDecl())
3741 Method->setAccess(
Method->getPreviousDecl()->getAccess());
3747 SemaRef.CheckOverrideControl(
Method);
3761 if (IsExplicitSpecialization && !isFriend)
3774 Method->setIneligibleOrNotSelected(
true);
3775 }
else if (
Method->isCopyAssignmentOperator() ||
3776 Method->isMoveAssignmentOperator()) {
3777 Method->setIneligibleOrNotSelected(
true);
3789 }
else if (isFriend) {
3793 SemaRef.CheckFriendAccess(
Method);
3806 if (
Method->hasAttr<UsedAttr>()) {
3807 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
3810 A->getMemberSpecializationInfo())
3811 Loc = MSInfo->getPointOfInstantiation();
3812 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
3813 Loc = Spec->getPointOfInstantiation();
3814 SemaRef.MarkFunctionReferenced(Loc,
Method);
3834 return SemaRef.SubstParmVarDecl(D, TemplateArgs, 0,
3839Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
3847 assert(TC->getTemplateArgsAsWritten() &&
3848 "type parameter can only be an expansion when explicit arguments "
3853 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3854 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
3855 SemaRef.collectUnexpandedParameterPacks(ArgLoc, Unexpanded);
3860 bool RetainExpansion =
false;
3861 if (SemaRef.CheckParameterPacksForExpansion(
3864 SourceRange(TC->getConceptNameLoc(),
3865 TC->hasExplicitTemplateArgs()
3866 ? TC->getTemplateArgsAsWritten()->getRAngleLoc()
3867 : TC->getConceptNameInfo().getEndLoc()),
3868 Unexpanded, TemplateArgs,
true,
3869 Expand, RetainExpansion, NumExpanded))
3876 D->
getDepth() - (TemplateArgs.retainInnerDepths()
3878 : TemplateArgs.getNumSubstitutedLevels()),
3889 if (SemaRef.SubstTypeConstraint(Inst, TC, TemplateArgs,
3890 EvaluateConstraints))
3895 TemplateArgumentLoc Output;
3903 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
3908Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3912 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
3913 SmallVector<QualType, 4> ExpandedParameterPackTypes;
3914 bool IsExpandedParameterPack =
false;
3915 TypeSourceInfo *TSI;
3925 TypeSourceInfo *NewTSI =
3932 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3936 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3937 ExpandedParameterPackTypes.push_back(NewT);
3940 IsExpandedParameterPack =
true;
3947 PackExpansionTypeLoc Expansion = TL.
castAs<PackExpansionTypeLoc>();
3949 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3950 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3955 bool RetainExpansion =
false;
3959 if (SemaRef.CheckParameterPacksForExpansion(
3960 Expansion.
getEllipsisLoc(), Pattern.getSourceRange(), Unexpanded,
3961 TemplateArgs,
true, Expand,
3962 RetainExpansion, NumExpansions))
3966 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3967 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3968 TypeSourceInfo *NewTSI = SemaRef.SubstType(
3974 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3978 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3979 ExpandedParameterPackTypes.push_back(NewT);
3985 IsExpandedParameterPack =
true;
3991 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3992 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
3998 SemaRef.CheckNonTypeTemplateParameterType(NewPattern, D->
getLocation());
3999 TSI = SemaRef.CheckPackExpansion(NewPattern, Expansion.
getEllipsisLoc(),
4014 T = SemaRef.CheckNonTypeTemplateParameterType(TSI, D->
getLocation());
4016 T = SemaRef.Context.IntTy;
4021 NonTypeTemplateParmDecl *Param;
4022 if (IsExpandedParameterPack)
4025 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
4027 ExpandedParameterPackTypes, ExpandedParameterPackTypesAsWritten);
4031 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
4035 if (AutoLoc.isConstrained()) {
4036 SourceLocation EllipsisLoc;
4037 if (IsExpandedParameterPack)
4040 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
4042 EllipsisLoc = Constraint->getEllipsisLoc();
4046 if (SemaRef.AttachTypeConstraint(AutoLoc, Param,
4057 EnterExpressionEvaluationContext ConstantEvaluated(
4059 TemplateArgumentLoc
Result;
4067 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
4075 for (
const auto &P : *Params) {
4076 if (P->isTemplateParameterPack())
4088TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
4092 TemplateParameterList *InstParams;
4093 SmallVector<TemplateParameterList*, 8> ExpandedParams;
4095 bool IsExpandedParameterPack =
false;
4104 LocalInstantiationScope Scope(SemaRef,
true);
4105 TemplateParameterList *Expansion =
4109 ExpandedParams.push_back(Expansion);
4112 IsExpandedParameterPack =
true;
4113 InstParams = TempParams;
4118 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4125 bool RetainExpansion =
false;
4127 if (SemaRef.CheckParameterPacksForExpansion(
4129 TemplateArgs,
true, Expand,
4130 RetainExpansion, NumExpansions))
4134 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4135 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
4136 LocalInstantiationScope Scope(SemaRef,
true);
4140 ExpandedParams.push_back(Expansion);
4146 IsExpandedParameterPack =
true;
4149 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
4151 LocalInstantiationScope Scope(SemaRef,
true);
4158 LocalInstantiationScope Scope(SemaRef,
true);
4165 TemplateTemplateParmDecl *Param;
4166 if (IsExpandedParameterPack)
4169 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
4175 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
4188 TemplateArgumentLoc(SemaRef.Context, TemplateArgument(TName),
4197 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
4206 UsingDirectiveDecl *Inst
4216 if (!Owner->isFunctionOrMethod())
4217 Owner->addDecl(Inst);
4226 bool isFunctionScope = Owner->isFunctionOrMethod();
4228 for (
auto *Shadow : D->
shadows()) {
4232 NamedDecl *OldTarget = Shadow->getTargetDecl();
4233 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
4234 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
4235 OldTarget = BaseShadow;
4239 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
4241 SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
4243 InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
4244 Shadow->getLocation(), OldTarget, TemplateArgs));
4251 SemaRef.CheckUsingShadowDecl(Inst, InstTarget, *Lookup, PrevDecl))
4255 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
4256 Shadow->getLocation(), OldPrev, TemplateArgs));
4259 nullptr, Inst, InstTarget, PrevDecl);
4260 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
4262 if (isFunctionScope)
4263 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
4269Decl *TemplateDeclInstantiator::VisitUsingDecl(
UsingDecl *D) {
4290 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
4296 bool CheckRedeclaration = Owner->
isRecord();
4307 SS.
Adopt(QualifierLoc);
4308 if (CheckRedeclaration) {
4309 Prev.setHideTags(
false);
4342 EnumDecl *EnumD = cast_or_null<EnumDecl>(SemaRef.FindInstantiatedDecl(
4345 if (SemaRef.RequireCompleteEnumDecl(EnumD, EnumD->
getLocation()))
4348 TypeSourceInfo *TSI = SemaRef.SubstType(D->
getEnumType(), TemplateArgs,
4354 UsingEnumDecl *NewUD =
4358 SemaRef.Context.setInstantiatedFromUsingEnumDecl(NewUD, D);
4360 Owner->addDecl(NewUD);
4378Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
4384template <
typename T>
4385Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
4386 T *D,
bool InstantiatingPackElement) {
4388 if (D->isPackExpansion() && !InstantiatingPackElement) {
4389 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4390 SemaRef.collectUnexpandedParameterPacks(D->getQualifierLoc(), Unexpanded);
4391 SemaRef.collectUnexpandedParameterPacks(D->getNameInfo(), Unexpanded);
4396 bool RetainExpansion =
false;
4398 if (SemaRef.CheckParameterPacksForExpansion(
4399 D->getEllipsisLoc(), D->getSourceRange(), Unexpanded, TemplateArgs,
4400 true, Expand, RetainExpansion,
4406 assert(!RetainExpansion &&
4407 "should never need to retain an expansion for UsingPackDecl");
4412 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
4413 return instantiateUnresolvedUsingDecl(D,
true);
4423 if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {
4424 SemaRef.Diag(D->getEllipsisLoc(),
4425 diag::err_using_decl_redeclaration_expansion);
4430 SmallVector<NamedDecl*, 8> Expansions;
4431 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4432 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
4433 Decl *Slice = instantiateUnresolvedUsingDecl(D,
true);
4443 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4445 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4449 UnresolvedUsingTypenameDecl *TD = dyn_cast<UnresolvedUsingTypenameDecl>(D);
4450 SourceLocation TypenameLoc = TD ? TD->
getTypenameLoc() : SourceLocation();
4452 NestedNameSpecifierLoc QualifierLoc
4453 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
4459 SS.
Adopt(QualifierLoc);
4461 DeclarationNameInfo NameInfo
4462 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
4466 bool InstantiatingSlice =
4467 D->getEllipsisLoc().isValid() && SemaRef.ArgPackSubstIndex;
4468 SourceLocation EllipsisLoc =
4469 InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
4472 NamedDecl *UD = SemaRef.BuildUsingDeclaration(
4473 nullptr, D->getAccess(), D->getUsingLoc(),
4474 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
4475 ParsedAttributesView(),
4476 true, IsUsingIfExists);
4478 SemaRef.InstantiateAttrs(TemplateArgs, D, UD);
4479 SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
4485Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
4487 return instantiateUnresolvedUsingDecl(D);
4490Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
4492 return instantiateUnresolvedUsingDecl(D);
4495Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
4497 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
4501 SmallVector<NamedDecl*, 8> Expansions;
4503 if (NamedDecl *NewUD =
4504 SemaRef.FindInstantiatedDecl(D->
getLocation(), UD, TemplateArgs))
4505 Expansions.push_back(NewUD);
4510 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4512 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4516Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
4518 SmallVector<Expr *, 5> Vars;
4519 for (
auto *I : D->
varlist()) {
4520 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4522 Vars.push_back(Var);
4525 OMPThreadPrivateDecl *TD =
4526 SemaRef.OpenMP().CheckOMPThreadPrivateDecl(D->
getLocation(), Vars);
4536 SmallVector<Expr *, 5> Vars;
4537 for (
auto *I : D->
varlist()) {
4538 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4540 Vars.push_back(Var);
4543 OMPGroupPrivateDecl *TD =
4544 SemaRef.OpenMP().CheckOMPGroupPrivateDecl(D->
getLocation(), Vars);
4553 SmallVector<Expr *, 5> Vars;
4554 for (
auto *I : D->
varlist()) {
4555 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4557 Vars.push_back(Var);
4559 SmallVector<OMPClause *, 4> Clauses;
4562 OMPClause *IC =
nullptr;
4563 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
4564 ExprResult NewE = SemaRef.SubstExpr(AC->getAllocator(), TemplateArgs);
4567 IC = SemaRef.OpenMP().ActOnOpenMPAllocatorClause(
4568 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4569 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
4570 ExprResult NewE = SemaRef.SubstExpr(AC->getAlignment(), TemplateArgs);
4573 IC = SemaRef.OpenMP().ActOnOpenMPAlignClause(
4574 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4579 Clauses.push_back(IC);
4591 "Requires directive cannot be instantiated within a dependent context");
4594Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
4597 const bool RequiresInstantiation =
4601 QualType SubstReductionType;
4602 if (RequiresInstantiation) {
4607 SubstReductionType = SemaRef.OpenMP().ActOnOpenMPDeclareReductionType(
4610 SubstReductionType = D->
getType();
4612 if (SubstReductionType.
isNull())
4616 bool IsCorrect =
true;
4618 std::pair<QualType, SourceLocation> ReductionTypes[] = {
4619 std::make_pair(SubstReductionType, D->
getLocation())};
4621 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4623 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4626 auto DRD = SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveStart(
4630 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDRD);
4631 Expr *SubstCombiner =
nullptr;
4632 Expr *SubstInitializer =
nullptr;
4635 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerStart(
4637 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4640 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4643 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4644 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4646 SubstCombiner = SemaRef.SubstExpr(Combiner, TemplateArgs).get();
4647 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerEnd(NewDRD,
4652 VarDecl *OmpPrivParm =
4653 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerStart(
4655 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4658 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4662 SubstInitializer = SemaRef.SubstExpr(
Init, TemplateArgs).get();
4666 IsCorrect = IsCorrect && OldPrivParm->hasInit();
4668 SemaRef.InstantiateVariableInitializer(OmpPrivParm, OldPrivParm,
4671 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerEnd(
4672 NewDRD, SubstInitializer, OmpPrivParm);
4674 IsCorrect = IsCorrect && SubstCombiner &&
4677 SubstInitializer) ||
4679 !SubstInitializer));
4681 (void)SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveEnd(
4690 const bool RequiresInstantiation =
4694 QualType SubstMapperTy;
4696 if (RequiresInstantiation) {
4701 SubstMapperTy = SemaRef.OpenMP().ActOnOpenMPDeclareMapperType(
4706 if (SubstMapperTy.
isNull())
4710 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4712 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4715 bool IsCorrect =
true;
4716 SmallVector<OMPClause *, 6> Clauses;
4718 DeclarationNameInfo DirName;
4719 SemaRef.OpenMP().StartOpenMPDSABlock(llvm::omp::OMPD_declare_mapper, DirName,
4723 SemaRef.OpenMP().ActOnOpenMPDeclareMapperDirectiveVarDecl(
4725 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4728 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4729 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4734 SmallVector<Expr *, 4> NewVars;
4735 for (Expr *OE : OldC->varlist()) {
4736 Expr *
NE = SemaRef.SubstExpr(OE, TemplateArgs).get();
4741 NewVars.push_back(NE);
4745 NestedNameSpecifierLoc NewQualifierLoc =
4746 SemaRef.SubstNestedNameSpecifierLoc(OldC->getMapperQualifierLoc(),
4749 SS.
Adopt(NewQualifierLoc);
4750 DeclarationNameInfo NewNameInfo =
4751 SemaRef.SubstDeclarationNameInfo(OldC->getMapperIdInfo(), TemplateArgs);
4752 OMPVarListLocTy Locs(OldC->getBeginLoc(), OldC->getLParenLoc(),
4754 OMPClause *NewC = SemaRef.OpenMP().ActOnOpenMPMapClause(
4755 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
4756 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
4757 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
4759 Clauses.push_back(NewC);
4761 SemaRef.OpenMP().EndOpenMPDSABlock(
nullptr);
4766 VN, D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
4768 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDMD);
4772Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
4774 llvm_unreachable(
"Should not be met in templates");
4785 Owner->addDecl(Inst);
4794 llvm_unreachable(
"There are only CXXRecordDecls in C++");
4798TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
4805 "can only instantiate an explicit specialization "
4806 "for a member class template");
4810 ClassTemplateDecl *InstClassTemplate =
4811 cast_or_null<ClassTemplateDecl>(SemaRef.FindInstantiatedDecl(
4813 if (!InstClassTemplate)
4818 TemplateArgumentListInfo InstTemplateArgs;
4819 if (
const ASTTemplateArgumentListInfo *TemplateArgsInfo =
4821 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4822 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4824 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4825 TemplateArgs, InstTemplateArgs))
4831 Sema::CheckTemplateArgumentInfo CTAI;
4832 if (SemaRef.CheckTemplateArgumentList(
4833 InstClassTemplate, D->
getLocation(), InstTemplateArgs,
4840 llvm::FoldingSetInsertToken InsertToken;
4841 ClassTemplateSpecializationDecl *PrevDecl =
4849 SemaRef.CheckSpecializationInstantiationRedecl(D->
getLocation(),
4871 SemaRef.Diag(D->
getLocation(), diag::err_redefinition) << PrevDecl;
4873 diag::note_previous_definition);
4878 ClassTemplateSpecializationDecl *InstD =
4900 Owner->addDecl(InstD);
4907 SemaRef.InstantiateClass(D->
getLocation(), InstD, D, TemplateArgs,
4921 "A template specialization without specialized template?");
4924 cast_or_null<VarTemplateDecl>(SemaRef.FindInstantiatedDecl(
4926 if (!InstVarTemplate)
4932 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4933 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4935 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4936 TemplateArgs, VarTemplateArgsInfo))
4942 if (SemaRef.CheckTemplateArgumentList(
4943 InstVarTemplate, D->
getLocation(), VarTemplateArgsInfo,
4949 llvm::FoldingSetInsertToken InsertToken;
4956 if (PrevDecl && SemaRef.CheckSpecializationInstantiationRedecl(
4964 VTSD->setTemplateArgsAsWritten(VarTemplateArgsInfo);
4984 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
4994 llvm::FoldingSetInsertToken InsertToken;
4995 VarTemplate->findSpecialization(Converted, InsertToken);
4999 if (SemaRef.getLangOpts().OpenCL)
5000 SemaRef.deduceOpenCLAddressSpace(Var);
5006 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
5007 StartingScope,
false, PrevDecl);
5013 llvm_unreachable(
"@defs is not supported in Objective-C++");
5023 LocalInstantiationScope Scope(SemaRef,
true);
5024 SmallVector<TemplateParameterList *, 1> InstTPLs;
5034 if (!Substituted || Substituted->empty())
5036 ToFriend = Substituted->TypeInfo;
5037 ToTemplate = Substituted->
Template;
5039 if (
auto *InstTemplate =
5045 if (
auto *InstFriendDecl =
5047 ToFriend = InstFriendDecl;
5054 InstTPLs, {}, ToTemplate);
5057 Owner->addDecl(InstFriend);
5062 llvm_unreachable(
"Concept definitions cannot reside inside a template");
5065Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
5067 llvm_unreachable(
"Concept specializations cannot reside inside a template");
5077 llvm_unreachable(
"Unexpected decl");
5088 SubstD = Instantiator.Visit(D);
5102 T = SemaRef.Context.getFunctionType(
5103 SemaRef.Context.BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
5112 SemaRef.Context.getTrivialTypeSourceInfo(
T, Orig->
getEndLoc());
5114 assert(OldLoc &&
"type of function is not a function type?");
5116 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
5117 NewLoc.
setParam(I, OldLoc.getParam(I));
5122 SemaRef.Context.DeclarationNames.getCXXOperatorName(OO_EqualEqual));
5127 if (Spaceship->isInvalidDecl())
5139 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
5144 assert(Spaceship->getFriendObjectKind() &&
5145 "defaulted spaceship is neither a member nor a friend");
5159 return cast_or_null<FunctionDecl>(R);
5173 unsigned N = L->
size();
5177 for (
auto &P : *L) {
5179 Params.push_back(D);
5188 if (InstRequiresClause && EvaluateConstraints) {
5190 SemaRef.SubstConstraintExpr(InstRequiresClause, TemplateArgs);
5193 InstRequiresClause = E.
get();
5212 if (
Expr *RequiresClause = L->getRequiresClause()) {
5214 SemaRef.SubstConstraintExprWithoutSatisfaction(RequiresClause,
5216 if (!InstRequiresClause.
isUsable())
5225 InstTPLs.push_back(InstParams);
5233 bool EvaluateConstraints) {
5272 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
5279 if (SemaRef.CheckTemplateArgumentList(
5280 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
5286 if (SemaRef.CheckTemplatePartialSpecializationArgs(
5293 llvm::FoldingSetInsertToken InsertToken;
5296 InstParams, InsertToken);
5301 SemaRef.Context, PartialSpec->
getTagKind(), Owner,
5332 diag::err_partial_spec_redeclared)
5334 SemaRef.Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
5335 << SemaRef.Context.getCanonicalTagType(PrevDecl);
5340 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5346 return InstPartialSpec;
5382 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
5390 InstTemplateArgs, {},
5395 if (SemaRef.CheckTemplatePartialSpecializationArgs(
5402 llvm::FoldingSetInsertToken InsertToken;
5405 InstParams, InsertToken);
5416 diag::err_variable_instantiates_to_function)
5453 diag::err_var_partial_spec_redeclared)
5456 diag::note_var_prev_partial_spec_here);
5460 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5464 VarTemplate->AddPartialSpecialization(InstPartialSpec, {});
5466 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
5467 LateAttrs, Owner, StartingScope);
5469 return InstPartialSpec;
5475 assert(OldTInfo &&
"substituting function without type source info");
5476 assert(Params.empty() &&
"parameter vector is non-empty at start");
5482 ThisTypeQuals =
Method->getFunctionObjectParameterType().getQualifiers();
5487 ThisContext, ThisTypeQuals, EvaluateConstraints);
5493 if (NewTInfo != OldTInfo) {
5497 unsigned NewIdx = 0;
5498 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
5499 OldIdx != NumOldParams; ++OldIdx) {
5500 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
5508 NumArgumentsInExpansion =
5509 SemaRef.getNumArgumentsInExpansion(OldParam->
getType(),
5511 if (!NumArgumentsInExpansion) {
5515 Params.push_back(NewParam);
5516 Scope->InstantiatedLocal(OldParam, NewParam);
5519 Scope->MakeInstantiatedLocalArgPack(OldParam);
5520 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
5522 Params.push_back(NewParam);
5523 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
5535 if (SemaRef.SubstParmTypes(D->
getLocation(), OldProtoLoc.getParams(),
5536 nullptr, TemplateArgs, ParamTypes, &Params,
5538 EvaluateConstraints))
5547 assert(Params.size() == ParamTypes.size());
5548 for (
unsigned i = 0, i_end = Params.size(); i != i_end; ++i)
5550 Params[i] = SemaRef.BuildParmVarDeclForTypedef(D, D->
getLocation(),
5567 TemplateArgs, ParamTypes, &Params, ExtParamInfos,
5568 nullptr, EvaluateConstraints))
5580 for (
auto *
decl : PatternDecl->
decls()) {
5587 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
5588 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
5589 return InstVD && InstVD->isLocalVarDecl() &&
5590 InstVD->getIdentifier() == II;
5596 Scope.InstantiatedLocal(VD, *it);
5603bool Sema::addInstantiatedParametersToScope(
5607 unsigned FParamIdx = 0;
5608 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
5609 const ParmVarDecl *PatternParam = PatternDecl->
getParamDecl(I);
5612 assert(FParamIdx < Function->getNumParams());
5639 if (NumArgumentsInExpansion) {
5640 QualType PatternType =
5641 PatternParam->
getType()->
castAs<PackExpansionType>()->getPattern();
5642 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
5646 Sema::ArgPackSubstIndexRAII SubstIndex(*
this, Arg);
5666 assert(Param->hasUninstantiatedDefaultArg());
5698 false, std::nullopt,
5707 L->DefaultArgumentInstantiated(Param);
5720 if (AlreadyInstantiating) {
5723 Diag(PointOfInstantiation, diag::err_exception_spec_cycle) <<
Decl;
5745 false, std::nullopt,
5778 SemaRef.Context.setManglingNumber(
New,
5779 SemaRef.Context.getManglingNumber(Tmpl));
5792 ActiveInstType &ActiveInst = SemaRef.CodeSynthesisContexts.back();
5793 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
5794 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
5796 SemaRef.CurrentSFINAEContext =
nullptr;
5797 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
5798 ActiveInst.Entity =
New;
5803 assert(Proto &&
"Function template without prototype?");
5812 if (SemaRef.getLangOpts().CPlusPlus11 &&
5827 assert(NewProto &&
"Template instantiation without function prototype?");
5832 New->setType(SemaRef.Context.getFunctionType(
5836 SemaRef.SubstExceptionSpec(
New, Proto, TemplateArgs);
5845 LateAttrs, StartingScope);
5847 SemaRef.inferLifetimeBoundAttribute(
New);
5868 New->setVirtualAsWritten(
true);
5879 Lookups.reserve(DFI->getUnqualifiedLookups().size());
5880 bool AnyChanged =
false;
5882 NamedDecl *D = SemaRef.FindInstantiatedDecl(
New->getLocation(),
5883 DA.getDecl(), TemplateArgs);
5886 AnyChanged |= (D != DA.getDecl());
5890 New->setDefaultedOrDeletedInfo(
5892 SemaRef.Context, Lookups, DFI->getFPFeatures(),
5893 DFI->getDeletedMessage())
5920 bool DefinitionRequired,
5928 Function->getTemplateSpecializationKindForInstantiation();
5935 !DefinitionRequired)
5940 if (
Function->isDefined(ExistingDefn,
5955 assert(!AlreadyInstantiating &&
"should have been caught by caller");
5960 assert(PatternDecl &&
"instantiating a non-template");
5963 Stmt *Pattern =
nullptr;
5965 Pattern = PatternDef->
getBody(PatternDef);
5966 PatternDecl = PatternDef;
5968 PatternDef =
nullptr;
5972 bool Unreachable =
false;
5977 Function->getInstantiatedFromMemberFunction(), PatternDecl,
5979 DefinitionRequired, &Unreachable)) {
5980 if (DefinitionRequired)
5983 (
Function->isConstexpr() && !Recursive)) {
5987 Function->setInstantiationIsPending(
true);
5990 if (llvm::isTimeTraceVerbose()) {
5991 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
5993 llvm::raw_string_ostream
OS(Name);
6002 Diag(PointOfInstantiation, diag::warn_func_template_missing)
6008 diag::note_unreachable_template_decl);
6012 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
6024 Function->setInstantiationIsPending(
true);
6026 std::make_pair(
Function, PointOfInstantiation));
6030 llvm::TimeTraceScope TimeScope(
"InstantiateFunction", [&]() {
6031 llvm::TimeTraceMetadata M;
6032 llvm::raw_string_ostream
OS(M.Detail);
6035 if (llvm::isTimeTraceVerbose()) {
6038 M.Line =
SourceMgr.getExpansionLineNumber(Loc);
6064 "missing LateParsedTemplate");
6066 Pattern = PatternDecl->
getBody(PatternDecl);
6073 "unexpected kind of function template definition");
6088 for (
auto *D =
Function->getMostRecentDecl(); ;
6090 D->setImplicitlyInline();
6101 "instantiating function definition");
6105 Function->setVisibleDespiteOwningModule();
6131 auto NameLocPointsToPattern = [&] {
6142 return PatternNameLoc;
6152 return PatternNameLoc;
6160 assert(PatternTSI &&
"Pattern is supposed to have an associated TSI");
6168 Function->setDeclarationNameLoc(NameLocPointsToPattern());
6176 ThisContext =
Method->getParent();
6177 ThisTypeQuals =
Method->getMethodQualifiers();
6187 bool MergeWithParentScope =
false;
6189 MergeWithParentScope =
6190 Rec->isLocalClass() && !
Function->isFunctionTemplateSpecialization();
6193 auto RebuildTypeSourceInfoForDefaultSpecialMembers = [&]() {
6199 "Special member needs to be defaulted");
6207 auto *NewRec = dyn_cast<CXXRecordDecl>(
Function->getDeclContext());
6208 const auto *PatternRec =
6210 if (!NewRec || !PatternRec)
6212 if (!PatternRec->isLambda())
6215 struct SpecialMemberTypeInfoRebuilder
6235 getDerived().TransformDecl(TL.
getNameLoc(),
T->getDecl()));
6237 return Base::TransformRecordType(TLB, TL);
6251 } IR{*
this, PatternRec, NewRec};
6254 assert(NewSI &&
"Type Transform failed?");
6256 Function->setTypeSourceInfo(NewSI);
6260 assert(NewParmSI &&
"Type transformation failed.");
6266 RebuildTypeSourceInfoForDefaultSpecialMembers();
6270 std::optional<ArrayRef<TemplateArgument>> Innermost;
6271 if (
auto *Primary =
Function->getPrimaryTemplate();
6274 Function->getTemplateSpecializationKind() !=
6276 auto It = llvm::find_if(Primary->redecls(),
6278 return cast<FunctionTemplateDecl>(RTD)
6279 ->isCompatibleWithDefinition();
6281 assert(It != Primary->redecls().end() &&
6282 "Should't get here without a definition");
6284 ->getTemplatedDecl()
6288 DC = (*It)->getLexicalDeclContext();
6289 Innermost.emplace(
Function->getTemplateSpecializationArgs()->asArray());
6292 Function, DC,
false, Innermost,
false, PatternDecl);
6310 if (addInstantiatedParametersToScope(
Function, PatternDecl,
Scope,
6326 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
6327 Ctor->isDefaultConstructor()) {
6328 if (DLLExportAttr *
Attr = Ctor->getAttr<DLLExportAttr>())
6334 Body =
SubstStmt(Pattern, TemplateArgs);
6345 checkReferenceToTULocalFromOtherTU(
Function, PointOfInstantiation);
6351 Listener->FunctionDefinitionInstantiated(
Function);
6361 bool ShouldSkipCG = [&] {
6362 auto *RD = dyn_cast<CXXRecordDecl>(
Function->getParent());
6363 if (!RD || !RD->isLambda())
6367 return Context.isUnevaluated() ||
Context.isImmediateFunctionContext();
6370 if (!ShouldSkipCG) {
6377 LocalInstantiations.
perform();
6379 GlobalInstantiations.perform();
6408 bool IsMemberSpec =
false;
6410 if (
auto *PartialSpec =
6411 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar)) {
6412 assert(PartialSpecArgs);
6413 IsMemberSpec = PartialSpec->isMemberSpecialization();
6415 PartialSpec, PartialSpecArgs->
asArray(),
false);
6418 IsMemberSpec =
VarTemplate->isMemberSpecialization();
6438 "don't have a definition to instantiate from");
6467 bool InstantiatingVarTemplate,
6471 bool InstantiatingVarTemplatePartialSpec =
6476 bool InstantiatingSpecFromTemplate =
6502 if (OldVar->
isUsed(
false))
6527 }
else if (PrevDeclForVarTemplateSpecialization) {
6528 Previous.addDecl(PrevDeclForVarTemplateSpecialization);
6532 if (!InstantiatingVarTemplate) {
6550 !InstantiatingSpecFromTemplate)
6557 dyn_cast<VarTemplateSpecializationDecl>(OldVar)) {
6565 Context.setManglingNumber(NewVar,
Context.getManglingNumber(OldVar));
6566 Context.setStaticLocalNumber(NewVar,
Context.getStaticLocalNumber(OldVar));
6569 if (InstantiatingVarTemplate || InstantiatingVarTemplatePartialSpec) {
6574 }
else if (InstantiatingSpecFromTemplate ||
6596 L->VariableDefinitionInstantiated(Var);
6626 if (!
Init.isInvalid()) {
6629 if (Var->
hasAttr<DLLImportAttr>() &&
6632 }
else if (InitExpr) {
6668 bool DefinitionRequired,
bool AtEndOfTU) {
6680 if (AlreadyInstantiating)
6685 assert(PatternDecl &&
"no pattern for templated variable");
6690 dyn_cast<VarTemplateSpecializationDecl>(Var);
6701 (PatternDecl = PatternDecl->
getFirstDecl())->hasInit() &&
6710 "instantiating variable initializer");
6721 Recursive, AtEndOfTU);
6730 PreviousContext.
pop();
6734 LocalInstantiations.
perform();
6736 GlobalInstantiations.
perform();
6740 "not a static data member?");
6749 if (!Def && !DefinitionRequired) {
6756 Diag(PointOfInstantiation, diag::warn_var_template_missing)
6760 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
6771 PatternDecl, Def, TSK,
6772 DefinitionRequired))
6789 struct PassToConsumerRAII {
6796 ~PassToConsumerRAII() {
6797 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
6799 } PassToConsumerRAII(
Consumer, Var);
6806 PointOfInstantiation);
6815 "instantiating variable definition");
6837 }
else if (!VarSpec) {
6870 dyn_cast<VarTemplatePartialSpecializationDecl *>(PatternPtr))
6882 PreviousContext.
pop();
6885 PassToConsumerRAII.Var = Var;
6894 LocalInstantiations.
perform();
6896 GlobalInstantiations.
perform();
6908 for (
const auto *
Init : Tmpl->
inits()) {
6911 if (!
Init->isWritten())
6916 if (
Init->isPackExpansion()) {
6918 TypeLoc BaseTL =
Init->getTypeSourceInfo()->getTypeLoc();
6922 bool ShouldExpand =
false;
6923 bool RetainExpansion =
false;
6927 TemplateArgs,
true, ShouldExpand,
6928 RetainExpansion, NumExpansions)) {
6930 New->setInvalidDecl();
6933 assert(ShouldExpand &&
"Partial instantiation of base initializer?");
6936 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6950 Init->getSourceLocation(),
6951 New->getDeclName());
6959 BaseTInfo, TempInit.
get(),
6967 NewInits.push_back(NewInit.
get());
6982 if (
Init->isDelegatingInitializer() ||
Init->isBaseInitializer()) {
6985 Init->getSourceLocation(),
6986 New->getDeclName());
6989 New->setInvalidDecl();
6993 if (
Init->isBaseInitializer())
6995 New->getParent(), EllipsisLoc);
6999 }
else if (
Init->isMemberInitializer()) {
7001 Init->getMemberLocation(),
7006 New->setInvalidDecl();
7011 Init->getSourceLocation());
7012 }
else if (
Init->isIndirectMemberInitializer()) {
7015 Init->getMemberLocation(),
7016 Init->getIndirectMember(), TemplateArgs));
7018 if (!IndirectMember) {
7020 New->setInvalidDecl();
7025 Init->getSourceLocation());
7030 New->setInvalidDecl();
7032 NewInits.push_back(NewInit.
get());
7051 Instance = Instance->getCanonicalDecl();
7052 if (Pattern == Instance)
return true;
7053 Instance = Instance->getInstantiatedFromMemberTemplate();
7064 Instance = Instance->getCanonicalDecl();
7065 if (Pattern == Instance)
return true;
7066 Instance = Instance->getInstantiatedFromMemberTemplate();
7079 Instance->getCanonicalDecl());
7080 if (Pattern == Instance)
7082 Instance = Instance->getInstantiatedFromMember();
7093 Instance = Instance->getCanonicalDecl();
7094 if (Pattern == Instance)
return true;
7095 Instance = Instance->getInstantiatedFromMemberClass();
7106 Instance = Instance->getCanonicalDecl();
7107 if (Pattern == Instance)
return true;
7108 Instance = Instance->getInstantiatedFromMemberFunction();
7119 Instance = Instance->getCanonicalDecl();
7120 if (Pattern == Instance)
return true;
7121 Instance = Instance->getInstantiatedFromMemberEnum();
7148 bool OtherIsPackExpansion;
7150 if (
auto *OtherUUD = dyn_cast<T>(
Other)) {
7151 OtherIsPackExpansion = OtherUUD->isPackExpansion();
7153 }
else if (
auto *OtherUPD = dyn_cast<UsingPackDecl>(
Other)) {
7154 OtherIsPackExpansion =
true;
7155 OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
7156 }
else if (
auto *OtherUD = dyn_cast<UsingDecl>(
Other)) {
7157 OtherIsPackExpansion =
false;
7162 return Pattern->isPackExpansion() == OtherIsPackExpansion &&
7168 assert(Instance->isStaticDataMember());
7173 Instance = Instance->getCanonicalDecl();
7174 if (Pattern == Instance)
return true;
7175 Instance = Instance->getInstantiatedFromStaticDataMember();
7184 if (
auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D))
7187 if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D))
7193 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
Other))
7196 if (
auto *Function = dyn_cast<FunctionDecl>(
Other))
7199 if (
auto *
Enum = dyn_cast<EnumDecl>(
Other))
7202 if (
auto *Var = dyn_cast<VarDecl>(
Other))
7206 if (
auto *Temp = dyn_cast<ClassTemplateDecl>(
Other))
7209 if (
auto *Temp = dyn_cast<FunctionTemplateDecl>(
Other))
7212 if (
auto *PartialSpec =
7213 dyn_cast<ClassTemplatePartialSpecializationDecl>(
Other))
7217 if (
auto *Field = dyn_cast<FieldDecl>(
Other)) {
7218 if (!Field->getDeclName()) {
7225 if (
auto *Using = dyn_cast<UsingDecl>(
Other))
7228 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
Other))
7235template<
typename ForwardIterator>
7238 ForwardIterator first,
7239 ForwardIterator last) {
7240 for (; first != last; ++first)
7249 if (
NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
7251 return cast_or_null<DeclContext>(ID);
7266 return cast<Decl>(DC)->getTemplateDepth() > Level;
7271 bool FindingInstantiatedContext) {
7308 if (
Decl *FD = dyn_cast<Decl *>(*
Found)) {
7309 if (
auto *BD = dyn_cast<BindingDecl>(FD);
7317 "found declaration pack but not pack expanding");
7347 bool NeedInstantiate =
false;
7349 NeedInstantiate = RD->isLocalClass();
7352 NeedInstantiate =
true;
7355 if (NeedInstantiate) {
7366 assert(Inst &&
"Failed to instantiate label??");
7373 if (!
Record->isDependentContext())
7382 dyn_cast<ClassTemplateSpecializationDecl>(
Record))
7383 ClassTemplate = Spec->getSpecializedTemplate()->getCanonicalDecl();
7394 if (
CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
7398 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
7418 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD);
7419 if (Guide && Guide->isImplicit()) {
7427 Unpacked = Arg.pack_elements();
7440 if (
T.isNull() ||
T->containsErrors())
7450 assert(
SemaRef.RebuildingImmediateInvocation ||
7463 if (FindingInstantiatedContext &&
7466 Diag(Loc, diag::err_specialization_not_primary_template)
7489 if (!ParentDependsOnArgs)
7503 bool IsBeingInstantiated =
false;
7504 if (
auto *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
7505 if (!Spec->isDependentContext()) {
7506 if (Spec->isEntityBeingDefined())
7507 IsBeingInstantiated =
true;
7509 diag::err_incomplete_type))
7512 ParentDC = Spec->getDefinitionOrSelf();
7551 }
else if (IsBeingInstantiated) {
7557 Diag(Loc, diag::err_member_not_yet_instantiated)
7570 Diag(Loc, diag::err_enumerator_does_not_exist)
7574 <<
Context.getCanonicalTagType(Spec);
7577 llvm_unreachable(
"Unable to find instantiation of declaration!");
7588 std::deque<PendingImplicitInstantiation> DelayedImplicitInstantiations;
7593 bool LocalInstantiation =
false;
7600 LocalInstantiation =
true;
7605 bool DefinitionRequired =
Function->getTemplateSpecializationKind() ==
7610 [
this, Inst, DefinitionRequired, AtEndOfTU](
FunctionDecl *CurFD) {
7612 DefinitionRequired, AtEndOfTU);
7618 DefinitionRequired, AtEndOfTU);
7620 Function->setInstantiationIsPending(
false);
7623 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates &&
7625 DelayedImplicitInstantiations.push_back(Inst);
7626 else if (!AtEndOfTU &&
Function->instantiationIsPending() &&
7627 !LocalInstantiation)
7628 DelayedImplicitInstantiations.push_back(Inst);
7637 "Not a static data member, nor a variable template"
7638 " specialization?");
7650 llvm_unreachable(
"Cannot instantitiate an undeclared specialization.");
7665 "instantiating variable definition");
7672 DefinitionRequired, AtEndOfTU);
7675 if (!DelayedImplicitInstantiations.empty())
7681 for (
auto *DD : Pattern->
ddiags()) {
7682 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 std::optional< SubstitutedFriend > SubstFriendTemplateType(Sema &SemaRef, TypeSourceInfo *TSI, TemplateName FriendTemplate, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity)
static bool isRelevantAttr(Sema &S, const Decl *D, const Attr *A)
Determine whether the attribute A might be relevant to the declaration D.
static std::optional< TemplateName > LookupFriendTemplateName(Sema &SemaRef, NestedNameSpecifierLoc QualifierLoc, DeclarationName Name, SourceLocation NameLoc, bool HasTemplateKeyword, bool RequireClassTemplate)
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 void instantiateAttrOnDecl(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *TmplAttr, Decl *New)
Instantiate TmplAttr for New in the current instantiation scope and attach it, if it is still valid t...
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
TemplateName getDependentTemplateName(const DependentTemplateStorage &Name) const
Retrieve the template name that represents a dependent template name such as MetaFun::template operat...
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,...
TemplateName getQualifiedTemplateName(NestedNameSpecifier Qualifier, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
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.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, llvm::FoldingSetInsertToken &InsertToken)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
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.
static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a class template node.
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, llvm::FoldingSetInsertToken &InsertToken)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
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, llvm::FoldingSetInsertToken InsertToken)
Insert the specified specialization knowing that it is not already in.
void setCommonPtr(Common *C)
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, llvm::FoldingSetInsertToken InsertToken)
Insert the specified partial specialization knowing that it is not already in.
Common * getCommonPtr() const
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
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
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
@ 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...
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
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 isTypeDependent() const
Determines whether the type 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, bool AllowRelaxedEval=false) 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,...
llvm::PointerUnion< NamedDecl *, TypeSourceInfo * > FriendUnion
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getFriendLoc() const
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
virtual 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
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend, SourceLocation FriendL, SourceLocation EllipsisLoc={})
Declaration of a friend template.
static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, FriendUnion Friend, SourceLocation FriendLoc, ArrayRef< TemplateParameterList * > FriendTPLists, SourceLocation EllipsisLoc={}, TemplateName Template={})
NamedDecl * getFriendDecl() const override
If this friend declaration doesn't name a type, return the inner declaration.
TemplateName getFriendTemplateName() const
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
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.
param_type_iterator param_type_begin() const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
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.
static void deleteScopes(LocalInstantiationScope *Scope, LocalInstantiationScope *Outermost)
deletes the given scope, and all outer scopes, down to the given outermost scope.
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.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
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.
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
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...
Describes the source-level contents of one OpenMP 'adjust_args' clause.
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
OMPAdjustArgsDescriptor * ActOnOpenMPAdjustArgsClause(OpenMPAdjustArgsOpKind AdjustOp, OpenMPNeedDevicePtrModifier NeedDevicePtrModifier, ArrayRef< OMPAdjustArgsItem > Items, SourceLocation Loc)
Called on well-formed 'adjust_args' clause of a '#pragma omp declare variant' directive.
std::optional< std::pair< FunctionDecl *, Expr * > > checkOpenMPDeclareVariantFunction(DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR)
Checks '#pragma omp declare variant' variant function and original functions after parsing of the ass...
void ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef< OMPAdjustArgsDescriptor * > AdjustArgs, ArrayRef< OMPInteropInfo > AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR)
Called on well-formed '#pragma omp declare variant' after parsing of the associated method/function.
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)
TypeSourceInfo * SubstFriendType(TypeSourceInfo *TSI, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity)
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.
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
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...
void InstantiateLateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, LateInstantiatedAttrVec &LateAttrs, LocalInstantiationScope *OuterMostScope)
Instantiate the attributes that InstantiateAttrs deferred to LateAttrs, and attach them to their decl...
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.
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
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)
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
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 CheckDependentFriend(SourceLocation Loc, NestedNameSpecifierLoc NNSLoc, ArrayRef< TemplateParameterList * > TPLs, bool IsInstantiation)
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.
bool isValid() const
Return true if this is a valid SourceLocation object.
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
bool SubstTemplateParameterLists(ArrayRef< TemplateParameterList * > TPLs, SmallVectorImpl< TemplateParameterList * > &InstTPLs)
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.
bool InstantiateFriendPackExpansion(FriendDecl *D)
Decl * InstantiateTypedefNameDecl(TypedefNameDecl *D, bool IsTypeAlias)
ClassTemplatePartialSpecializationDecl * InstantiateClassTemplatePartialSpecialization(ClassTemplateDecl *ClassTemplate, ClassTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a class template partial specialization.
bool SubstDefaultedFunction(FunctionDecl *New, FunctionDecl *Tmpl)
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
bool isNull() const
Determine whether this template name is NULL.
@ Template
A single template declaration.
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
unsigned getNumArgs() const
SourceLocation getLAngleLoc() const
TemplateArgumentLoc getArgLoc(unsigned i) const
SourceLocation getRAngleLoc() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKeywordLoc() const
NestedNameSpecifierLoc getQualifierLoc() const
SourceLocation getElaboratedKeywordLoc() 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...
NestedNameSpecifierLoc getPrefix() const
If this type represents a qualified-id, this returns it's nested name specifier.
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.
VarTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, llvm::FoldingSetInsertToken &InsertToken)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
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.
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
TypeSourceInfo * TypeInfo
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
Expr * E
The bound expression, or the logical offset for a NumArgs bound.
One item in an OpenMP 'adjust_args' parameter list.
Expr * E
A named parameter or positional expression for a Single item.
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.
An attribute whose instantiation is deferred, together with the instantiation scope to instantiate it...