36#include "llvm/Support/TimeProfiler.h"
52template<
typename DeclT>
55 if (!OldDecl->getQualifierLoc())
58 assert((NewDecl->getFriendObjectKind() ||
59 !OldDecl->getLexicalDeclContext()->isDependentContext()) &&
60 "non-friend with qualified name defined in dependent context");
63 const_cast<DeclContext *
>(NewDecl->getFriendObjectKind()
64 ? NewDecl->getLexicalDeclContext()
65 : OldDecl->getLexicalDeclContext()));
74 NewDecl->setQualifierInfo(NewQualifierLoc);
80 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
85 return ::SubstQualifier(SemaRef, OldDecl, NewDecl, TemplateArgs);
89#include "clang/Sema/AttrTemplateInstantiate.inc"
93 const AlignedAttr *Aligned,
Decl *
New,
bool IsPackExpansion) {
94 if (Aligned->isAlignmentExpr()) {
99 if (!Result.isInvalid())
103 S.
SubstType(Aligned->getAlignmentType(), TemplateArgs,
106 Aligned->getLocation(),
107 Result->getTypeLoc().getSourceRange()))
115 const AlignedAttr *Aligned,
Decl *
New) {
116 if (!Aligned->isPackExpansion()) {
122 if (Aligned->isAlignmentExpr())
128 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
131 bool Expand =
true, RetainExpansion =
false;
136 Unexpanded, TemplateArgs,
138 Expand, RetainExpansion, NumExpansions))
145 for (
unsigned I = 0; I != *NumExpansions; ++I) {
154 const AssumeAlignedAttr *Aligned,
Decl *
New) {
159 Expr *E, *OE =
nullptr;
161 if (Result.isInvalid())
163 E = Result.getAs<
Expr>();
165 if (Aligned->getOffset()) {
166 Result = S.
SubstExpr(Aligned->getOffset(), TemplateArgs);
167 if (Result.isInvalid())
169 OE = Result.getAs<
Expr>();
177 const AlignValueAttr *Aligned,
Decl *
New) {
182 if (!Result.isInvalid())
188 const AllocAlignAttr *Align,
Decl *
New) {
191 llvm::APInt(64, Align->getParamIndex().getSourceIndex()),
204 bool HasDelayedArgs =
Attr->delayedArgs_size();
213 false, TemplateArgs, Args))
216 StringRef Str =
Attr->getAnnotation();
217 if (HasDelayedArgs) {
218 if (Args.size() < 1) {
228 ActualArgs.insert(ActualArgs.begin(), Args.begin() + 1, Args.end());
229 std::swap(Args, ActualArgs);
237template <
typename Attr>
241 Expr *tempInstPriority =
nullptr;
246 if (Result.isInvalid())
248 tempInstPriority = Result.get();
249 if (std::optional<llvm::APSInt> CE =
253 if (!CE->isIntN(32)) {
255 <<
toString(*CE, 10,
false) << 32 << 1;
260 New->addAttr(Attr::Create(
C, tempInstPriority, *A));
272 if (Result.isInvalid())
276 if (!
Cond->isTypeDependent()) {
286 S.
Diag(A->
getLocation(), diag::err_attr_cond_never_constant_expr) << A;
287 for (
const auto &P : Diags)
288 S.
Diag(P.first, P.second);
298 S, TemplateArgs, EIA, EIA->getCond(), Tmpl,
New);
302 Cond, EIA->getMessage()));
309 S, TemplateArgs, DIA, DIA->getCond(), Tmpl,
New);
314 DIA->getDefaultSeverity(), DIA->getWarningGroup(),
315 DIA->getArgDependent(),
New));
328 if (Result.isInvalid())
330 Expr *MaxThreads = Result.getAs<
Expr>();
332 Expr *MinBlocks =
nullptr;
333 if (
Attr.getMinBlocks()) {
335 if (Result.isInvalid())
340 Expr *MaxBlocks =
nullptr;
341 if (
Attr.getMaxBlocks()) {
343 if (Result.isInvalid())
345 MaxBlocks = Result.getAs<
Expr>();
364 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
New))
365 New = FTD->getTemplatedDecl();
367 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
372 if (
auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
373 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
376 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
377 Local.InstantiatedLocal(
378 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
382 FD->isCXXInstanceMember());
398 if (
auto *E =
Attr.getSimdlen())
401 if (
Attr.uniforms_size() > 0) {
402 for(
auto *E :
Attr.uniforms()) {
406 Uniforms.push_back(Inst.
get());
410 auto AI =
Attr.alignments_begin();
411 for (
auto *E :
Attr.aligneds()) {
415 Aligneds.push_back(Inst.
get());
419 Alignments.push_back(Inst.
get());
423 auto SI =
Attr.steps_begin();
424 for (
auto *E :
Attr.linears()) {
428 Linears.push_back(Inst.
get());
432 Steps.push_back(Inst.
get());
435 LinModifiers.append(
Attr.modifiers_begin(),
Attr.modifiers_end());
438 Uniforms, Aligneds, Alignments, Linears, LinModifiers, Steps,
447 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(
New))
448 New = FTD->getTemplatedDecl();
450 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(FD->getDeclContext());
452 auto &&SubstExpr = [FD, ThisContext, &S, &TemplateArgs](
Expr *E) {
453 if (
auto *DRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts()))
454 if (
auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
457 if (FD->getNumParams() > PVD->getFunctionScopeIndex())
458 Local.InstantiatedLocal(
459 PVD, FD->getParamDecl(PVD->getFunctionScopeIndex()));
463 FD->isCXXInstanceMember());
469 auto &&Subst = [&SubstExpr, &S](
Expr *E) {
479 if (
Expr *E =
Attr.getVariantFuncRef()) {
484 VariantFuncRef = Subst(E);
490 TI = *
Attr.getTraitInfos();
493 auto SubstScoreOrConditionExpr = [&S, Subst](
Expr *&E,
bool) {
508 Expr *E = VariantFuncRef.
get();
512 std::optional<std::pair<FunctionDecl *, Expr *>> DeclVarData =
520 E = DeclVarData->second;
521 FD = DeclVarData->first;
523 if (
auto *VariantDRE = dyn_cast<DeclRefExpr>(E->IgnoreParenImpCasts())) {
524 if (
auto *VariantFD = dyn_cast<FunctionDecl>(VariantDRE->getDecl())) {
525 if (
auto *VariantFTD = VariantFD->getDescribedFunctionTemplate()) {
526 if (!VariantFTD->isThisDeclarationADefinition())
537 SubstFD->getType(), FD->getType(),
543 New->getLocation(), SubstFD,
true,
545 SubstFD->setInstantiationIsPending(!SubstFD->isDefined());
549 SubstFD->getLocation(),
560 for (
Expr *E :
Attr.adjustArgsNothing()) {
564 NothingExprs.push_back(ER.
get());
566 for (
Expr *E :
Attr.adjustArgsNeedDevicePtr()) {
570 NeedDevicePtrExprs.push_back(ER.
get());
572 for (
Expr *E :
Attr.adjustArgsNeedDeviceAddr()) {
576 NeedDeviceAddrExprs.push_back(ER.
get());
580 AppendArgs.emplace_back(II.IsTarget, II.IsTargetSync);
584 FD, E, TI, NothingExprs, NeedDevicePtrExprs, NeedDeviceAddrExprs,
590 const AMDGPUFlatWorkGroupSizeAttr &
Attr,
Decl *
New) {
596 if (Result.isInvalid())
598 Expr *MinExpr = Result.getAs<
Expr>();
601 if (Result.isInvalid())
603 Expr *MaxExpr = Result.getAs<
Expr>();
616 if (Result.isInvalid())
621 if (Result.isInvalid())
626 if (Result.isInvalid())
631 New->addAttr(::new (Context) ReqdWorkGroupSizeAttr(Context,
Attr,
X, Y, Z));
650 if (!
Cond->isTypeDependent())
663 if (Result.isInvalid())
665 Expr *MinExpr = Result.getAs<
Expr>();
667 Expr *MaxExpr =
nullptr;
668 if (
auto Max =
Attr.getMax()) {
670 if (Result.isInvalid())
680 const AMDGPUMaxNumWorkGroupsAttr &
Attr,
Decl *
New) {
684 Expr *XExpr =
nullptr;
685 Expr *YExpr =
nullptr;
686 Expr *ZExpr =
nullptr;
688 if (
Attr.getMaxNumWorkGroupsX()) {
694 if (
Attr.getMaxNumWorkGroupsY()) {
700 if (
Attr.getMaxNumWorkGroupsZ()) {
716 auto SubstElt = [&S, &TemplateArgs](
Expr *E) {
717 return E ? S.
SubstExpr(E, TemplateArgs).
get() :
nullptr;
720 Expr *XExpr = SubstElt(
Attr.getX());
721 Expr *YExpr = SubstElt(
Attr.getY());
722 Expr *ZExpr = SubstElt(
Attr.getZ());
742 if (
const auto *PNA = dyn_cast<PreferredNameAttr>(A)) {
745 if (!
T->isDependentType() && !RD->isDependentContext() &&
748 for (
const auto *ExistingPNA : D->
specific_attrs<PreferredNameAttr>())
750 PNA->getTypedefType()))
755 if (
const auto *BA = dyn_cast<BuiltinAttr>(A)) {
757 switch (BA->getID()) {
758 case Builtin::BIforward:
768 case Builtin::BImove:
769 case Builtin::BImove_if_noexcept:
796 "out or inout parameter type must be a reference and restrict qualified");
807 for (
const auto *TmplAttr : Tmpl->
attrs()) {
814 *
this, dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext()),
818 TmplAttr,
Context, *
this, TemplateArgs);
820 New->addAttr(NewAttr);
828 case clang::attr::CFConsumed:
830 case clang::attr::OSConsumed:
832 case clang::attr::NSConsumed:
835 llvm_unreachable(
"Wrong argument supplied");
842 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *Old,
Decl *
New);
848 for (
const auto *TmplAttr : Tmpl->
attrs()) {
853 const AlignedAttr *Aligned = dyn_cast<AlignedAttr>(TmplAttr);
854 if (Aligned && Aligned->isAlignmentDependent()) {
859 if (
const auto *AssumeAligned = dyn_cast<AssumeAlignedAttr>(TmplAttr)) {
864 if (
const auto *AlignValue = dyn_cast<AlignValueAttr>(TmplAttr)) {
869 if (
const auto *AllocAlign = dyn_cast<AllocAlignAttr>(TmplAttr)) {
874 if (
const auto *Annotate = dyn_cast<AnnotateAttr>(TmplAttr)) {
879 if (
auto *
Constructor = dyn_cast<ConstructorAttr>(TmplAttr)) {
885 if (
auto *
Destructor = dyn_cast<DestructorAttr>(TmplAttr)) {
891 if (
const auto *EnableIf = dyn_cast<EnableIfAttr>(TmplAttr)) {
897 if (
const auto *DiagnoseIf = dyn_cast<DiagnoseIfAttr>(TmplAttr)) {
903 if (
const auto *CUDALaunchBounds =
904 dyn_cast<CUDALaunchBoundsAttr>(TmplAttr)) {
906 *CUDALaunchBounds,
New);
910 if (
const auto *Mode = dyn_cast<ModeAttr>(TmplAttr)) {
915 if (
const auto *OMPAttr = dyn_cast<OMPDeclareSimdDeclAttr>(TmplAttr)) {
920 if (
const auto *OMPAttr = dyn_cast<OMPDeclareVariantAttr>(TmplAttr)) {
925 if (
const auto *ReqdWorkGroupSize =
926 dyn_cast<ReqdWorkGroupSizeAttr>(TmplAttr)) {
928 *ReqdWorkGroupSize,
New);
931 if (
const auto *AMDGPUFlatWorkGroupSize =
932 dyn_cast<AMDGPUFlatWorkGroupSizeAttr>(TmplAttr)) {
934 *
this, TemplateArgs, *AMDGPUFlatWorkGroupSize,
New);
937 if (
const auto *AMDGPUFlatWorkGroupSize =
938 dyn_cast<AMDGPUWavesPerEUAttr>(TmplAttr)) {
940 *AMDGPUFlatWorkGroupSize,
New);
943 if (
const auto *AMDGPUMaxNumWorkGroups =
944 dyn_cast<AMDGPUMaxNumWorkGroupsAttr>(TmplAttr)) {
946 *
this, TemplateArgs, *AMDGPUMaxNumWorkGroups,
New);
949 if (
const auto *CUDAClusterDims = dyn_cast<CUDAClusterDimsAttr>(TmplAttr)) {
951 *CUDAClusterDims,
New);
954 if (
const auto *ParamAttr = dyn_cast<HLSLParamModifierAttr>(TmplAttr)) {
960 if (
const auto *RoutineAttr = dyn_cast<OpenACCRoutineDeclAttr>(TmplAttr)) {
962 RoutineAttr, Tmpl,
New);
967 if (TmplAttr->getKind() == attr::DLLExport ||
968 TmplAttr->getKind() == attr::DLLImport) {
969 if (
New->hasAttr<DLLExportAttr>() ||
New->hasAttr<DLLImportAttr>()) {
974 if (
const auto *ABIAttr = dyn_cast<ParameterABIAttr>(TmplAttr)) {
987 if (
auto *A = dyn_cast<PointerAttr>(TmplAttr)) {
988 if (!
New->hasAttr<PointerAttr>())
993 if (
auto *A = dyn_cast<OwnerAttr>(TmplAttr)) {
994 if (!
New->hasAttr<OwnerAttr>())
999 if (
auto *A = dyn_cast<SYCLKernelAttr>(TmplAttr)) {
1004 if (
auto *A = dyn_cast<CUDAGridConstantAttr>(TmplAttr)) {
1005 if (!
New->hasAttr<CUDAGridConstantAttr>())
1010 assert(!TmplAttr->isPackExpansion());
1011 if (TmplAttr->isLateParsed() && LateAttrs) {
1021 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
1023 ND->isCXXInstanceMember());
1026 *
this, TemplateArgs);
1028 New->addAttr(NewAttr);
1034 for (
const auto *
Attr : Pattern->
attrs()) {
1035 if (
auto *A = dyn_cast<StrictFPAttr>(
Attr)) {
1036 if (!Inst->
hasAttr<StrictFPAttr>())
1044 assert(
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
1049 DLLExportAttr *
Attr = Ctor->
getAttr<DLLExportAttr>();
1052 for (
unsigned I = 0; I != NumParams; ++I) {
1063template<
typename DeclT>
1065 DeclT *Result = D->getPreviousDecl();
1071 D->getLexicalDeclContext() != Result->getLexicalDeclContext())
1079 llvm_unreachable(
"Translation units cannot be instantiated");
1083 llvm_unreachable(
"HLSL buffer declarations cannot be instantiated");
1086Decl *TemplateDeclInstantiator::VisitHLSLRootSignatureDecl(
1088 llvm_unreachable(
"HLSL root signature declarations cannot be instantiated");
1093 llvm_unreachable(
"pragma comment cannot be instantiated");
1096Decl *TemplateDeclInstantiator::VisitPragmaDetectMismatchDecl(
1098 llvm_unreachable(
"pragma comment cannot be instantiated");
1103 llvm_unreachable(
"extern \"C\" context cannot be instantiated");
1107 llvm_unreachable(
"GUID declaration cannot be instantiated");
1110Decl *TemplateDeclInstantiator::VisitUnnamedGlobalConstantDecl(
1112 llvm_unreachable(
"UnnamedGlobalConstantDecl cannot be instantiated");
1115Decl *TemplateDeclInstantiator::VisitTemplateParamObjectDecl(
1117 llvm_unreachable(
"template parameter objects cannot be instantiated");
1121TemplateDeclInstantiator::VisitLabelDecl(
LabelDecl *D) {
1124 SemaRef.InstantiateAttrs(TemplateArgs, D, Inst, LateAttrs, StartingScope);
1125 Owner->addDecl(Inst);
1130TemplateDeclInstantiator::VisitNamespaceDecl(
NamespaceDecl *D) {
1131 llvm_unreachable(
"Namespaces cannot be instantiated");
1135class OpenACCDeclClauseInstantiator final
1138 const MultiLevelTemplateArgumentList &MLTAL;
1139 ArrayRef<OpenACCClause *> ExistingClauses;
1140 SemaOpenACC::OpenACCParsedClause &ParsedClause;
1141 OpenACCClause *NewClause =
nullptr;
1144 OpenACCDeclClauseInstantiator(Sema &S,
1145 const MultiLevelTemplateArgumentList &MLTAL,
1146 ArrayRef<OpenACCClause *> ExistingClauses,
1147 SemaOpenACC::OpenACCParsedClause &ParsedClause)
1148 : SemaRef(S), MLTAL(MLTAL), ExistingClauses(ExistingClauses),
1149 ParsedClause(ParsedClause) {}
1151 OpenACCClause *CreatedClause() {
return NewClause; }
1152#define VISIT_CLAUSE(CLAUSE_NAME) \
1153 void Visit##CLAUSE_NAME##Clause(const OpenACC##CLAUSE_NAME##Clause &Clause);
1154#include "clang/Basic/OpenACCClauses.def"
1158 for (
Expr *CurVar : VarList) {
1159 ExprResult Res = SemaRef.SubstExpr(CurVar, MLTAL);
1168 InstantiatedVarList.push_back(Res.
get());
1170 return InstantiatedVarList;
1174#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME) \
1175 void OpenACCDeclClauseInstantiator::Visit##CLAUSE_NAME##Clause( \
1176 const OpenACC##CLAUSE_NAME##Clause &) { \
1177 llvm_unreachable("Clause type invalid on declaration construct, or " \
1178 "instantiation not implemented"); \
1207#undef CLAUSE_NOT_ON_DECLS
1209void OpenACCDeclClauseInstantiator::VisitGangClause(
1213 assert(
C.getNumExprs() <= 1 &&
1214 "Only 1 expression allowed on gang clause in routine");
1216 if (
C.getNumExprs() > 0) {
1218 "Only dim allowed on routine");
1220 SemaRef.SubstExpr(
const_cast<Expr *
>(
C.getExpr(0).second), MLTAL);
1222 ER = SemaRef.OpenACC().CheckGangExpr(ExistingClauses,
1223 ParsedClause.getDirectiveKind(),
1224 C.getExpr(0).first, ER.
get());
1227 TransformedIntExprs.push_back(ER.
get());
1232 NewClause = SemaRef.OpenACC().CheckGangClause(
1233 ParsedClause.getDirectiveKind(), ExistingClauses,
1234 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1235 TransformedGangKinds, TransformedIntExprs, ParsedClause.getEndLoc());
1240 ParsedClause.getBeginLoc(),
1241 ParsedClause.getEndLoc());
1243void OpenACCDeclClauseInstantiator::VisitNoHostClause(
1246 ParsedClause.getBeginLoc(),
1247 ParsedClause.getEndLoc());
1250void OpenACCDeclClauseInstantiator::VisitDeviceTypeClause(
1254 SemaRef.getASTContext(),
C.getClauseKind(), ParsedClause.getBeginLoc(),
1255 ParsedClause.getLParenLoc(),
C.getArchitectures(),
1256 ParsedClause.getEndLoc());
1259void OpenACCDeclClauseInstantiator::VisitWorkerClause(
1261 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'worker' clause");
1263 ParsedClause.getBeginLoc(), {},
1264 nullptr, ParsedClause.getEndLoc());
1267void OpenACCDeclClauseInstantiator::VisitVectorClause(
1269 assert(!
C.hasIntExpr() &&
"Int Expr not allowed on routine 'vector' clause");
1271 ParsedClause.getBeginLoc(), {},
1272 nullptr, ParsedClause.getEndLoc());
1275void OpenACCDeclClauseInstantiator::VisitCopyClause(
1277 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1278 C.getModifierList());
1279 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1282 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1283 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1284 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1285 ParsedClause.getEndLoc());
1288void OpenACCDeclClauseInstantiator::VisitLinkClause(
1290 ParsedClause.setVarListDetails(
1291 SemaRef.OpenACC().CheckLinkClauseVarList(VisitVarList(
C.getVarList())),
1294 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1299 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1300 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1301 ParsedClause.getEndLoc());
1304void OpenACCDeclClauseInstantiator::VisitDeviceResidentClause(
1306 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1308 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1312 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1313 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1314 ParsedClause.getEndLoc());
1317void OpenACCDeclClauseInstantiator::VisitCopyInClause(
1319 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1320 C.getModifierList());
1322 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1325 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1326 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1327 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1328 ParsedClause.getEndLoc());
1330void OpenACCDeclClauseInstantiator::VisitCopyOutClause(
1332 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1333 C.getModifierList());
1335 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1338 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1339 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1340 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1341 ParsedClause.getEndLoc());
1343void OpenACCDeclClauseInstantiator::VisitCreateClause(
1345 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1346 C.getModifierList());
1348 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
C.getModifierList()))
1351 SemaRef.getASTContext(), ParsedClause.getClauseKind(),
1352 ParsedClause.getBeginLoc(), ParsedClause.getLParenLoc(),
1353 ParsedClause.getModifierList(), ParsedClause.getVarList(),
1354 ParsedClause.getEndLoc());
1356void OpenACCDeclClauseInstantiator::VisitPresentClause(
1358 ParsedClause.setVarListDetails(VisitVarList(
C.getVarList()),
1360 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1364 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1365 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1366 ParsedClause.getEndLoc());
1368void OpenACCDeclClauseInstantiator::VisitDevicePtrClause(
1372 llvm::erase_if(VarList, [&](
Expr *E) {
1377 if (SemaRef.OpenACC().CheckDeclareClause(ParsedClause,
1381 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1382 ParsedClause.getLParenLoc(), ParsedClause.getVarList(),
1383 ParsedClause.getEndLoc());
1386void OpenACCDeclClauseInstantiator::VisitBindClause(
1389 if (
C.isStringArgument())
1391 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1392 ParsedClause.getLParenLoc(),
C.getStringArgument(),
1393 ParsedClause.getEndLoc());
1396 SemaRef.getASTContext(), ParsedClause.getBeginLoc(),
1397 ParsedClause.getLParenLoc(),
C.getIdentifierArgument(),
1398 ParsedClause.getEndLoc());
1406 for (
const auto *Clause : ClauseList) {
1408 Clause->getBeginLoc());
1409 ParsedClause.setEndLoc(Clause->getEndLoc());
1410 if (
const auto *WithParms = dyn_cast<OpenACCClauseWithParams>(Clause))
1411 ParsedClause.setLParenLoc(WithParms->getLParenLoc());
1413 OpenACCDeclClauseInstantiator Instantiator{S, MLTAL, TransformedClauses,
1415 Instantiator.Visit(Clause);
1416 if (Instantiator.CreatedClause())
1417 TransformedClauses.push_back(Instantiator.CreatedClause());
1419 return TransformedClauses;
1426 const OpenACCRoutineDeclAttr *OldAttr,
const Decl *OldDecl,
Decl *NewDecl) {
1427 OpenACCRoutineDeclAttr *A =
1428 OpenACCRoutineDeclAttr::Create(S.
getASTContext(), OldAttr->getLocation());
1430 if (!OldAttr->Clauses.empty()) {
1432 InstantiateOpenACCClauseList(
1434 A->Clauses.assign(TransformedClauses.begin(), TransformedClauses.end());
1445 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1449 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1453 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndDeclDirective(
1465 llvm::SmallVector<OpenACCClause *> TransformedClauses =
1473 FuncRef = SemaRef.OpenACC().ActOnRoutineName(FuncRef.
get());
1478 if (SemaRef.OpenACC().ActOnStartDeclDirective(
1482 DeclGroupRef Res = SemaRef.OpenACC().ActOnEndRoutineDeclDirective(
1494 NamespaceAliasDecl *Inst
1502 Owner->addDecl(Inst);
1512 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1516 TSI = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.Context.IntTy);
1527 if (SemaRef.getPreprocessor().NeedsStdLibCxxWorkaroundBefore(2014'04'22)) {
1528 const DecltypeType *DT = TSI->
getType()->
getAs<DecltypeType>();
1531 DT->isReferenceType() &&
1532 RD->getEnclosingNamespaceContext() == SemaRef.getStdNamespace() &&
1533 RD->getIdentifier() && RD->getIdentifier()->isStr(
"common_type") &&
1535 SemaRef.getSourceManager().isInSystemHeader(D->
getBeginLoc()))
1537 TSI = SemaRef.Context.getTrivialTypeSourceInfo(
1555 TagDecl *oldTag = oldTagType->getDecl();
1572 SemaRef.isIncompatibleTypedef(InstPrevTypedef,
Typedef);
1574 Typedef->setPreviousDecl(InstPrevTypedef);
1577 SemaRef.InstantiateAttrs(TemplateArgs, D,
Typedef);
1580 SemaRef.inferGslPointerAttribute(
Typedef);
1629 if (!
Found.empty()) {
1630 PrevAliasTemplate = dyn_cast<TypeAliasTemplateDecl>(
Found.front());
1643 if (PrevAliasTemplate)
1648 if (!PrevAliasTemplate)
1675 SmallVector<BindingDecl*, 16> NewBindings;
1676 BindingDecl *OldBindingPack =
nullptr;
1677 for (
auto *OldBD : D->
bindings()) {
1678 Expr *BindingExpr = OldBD->getBinding();
1679 if (isa_and_present<FunctionParmPackExpr>(BindingExpr)) {
1681 assert(!OldBindingPack &&
"no more than one pack is allowed");
1682 OldBindingPack = OldBD;
1686 ArrayRef<BindingDecl*> NewBindingArray = NewBindings;
1688 auto *NewDD = cast_if_present<DecompositionDecl>(
1691 if (!NewDD || NewDD->isInvalidDecl()) {
1692 for (
auto *NewBD : NewBindings)
1693 NewBD->setInvalidDecl();
1694 }
else if (OldBindingPack) {
1697 BindingDecl *NewBindingPack = *llvm::find_if(
1699 assert(NewBindingPack !=
nullptr &&
"new bindings should also have a pack");
1700 llvm::ArrayRef<BindingDecl *> OldDecls =
1702 llvm::ArrayRef<BindingDecl *> NewDecls =
1704 assert(OldDecls.size() == NewDecls.size());
1705 for (
unsigned I = 0; I < OldDecls.size(); I++)
1706 SemaRef.CurrentInstantiationScope->InstantiatedLocal(OldDecls[I],
1718 bool InstantiatingVarTemplate,
1729 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
1762 StartingScope, InstantiatingVarTemplate);
1765 if (
auto *F = dyn_cast<FunctionDecl>(DC))
1766 RT = F->getReturnType();
1771 llvm_unreachable(
"Unknown context type");
1792 SemaRef.CheckStaticLocalForDllExport(Var);
1795 SemaRef.CheckThreadLocalForLargeAlignment(Var);
1797 if (SemaRef.getLangOpts().OpenACC)
1798 SemaRef.OpenACC().ActOnVariableDeclarator(Var);
1807 Owner->addHiddenDecl(AD);
1811Decl *TemplateDeclInstantiator::VisitFieldDecl(
FieldDecl *D) {
1816 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1828 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1839 else if (BitWidth) {
1845 = SemaRef.SubstExpr(BitWidth, TemplateArgs);
1850 BitWidth = InstantiatedBitWidth.
getAs<Expr>();
1853 FieldDecl *
Field = SemaRef.CheckFieldDecl(
1862 SemaRef.InstantiateAttrs(TemplateArgs, D, Field, LateAttrs, StartingScope);
1864 if (
Field->hasAttrs())
1865 SemaRef.CheckAlignasUnderalignment(Field);
1868 Field->setInvalidDecl();
1870 if (!
Field->getDeclName() ||
Field->isPlaceholderVar(SemaRef.getLangOpts())) {
1872 SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D);
1874 if (CXXRecordDecl *Parent= dyn_cast<CXXRecordDecl>(
Field->getDeclContext())) {
1875 if (Parent->isAnonymousStructOrUnion() &&
1876 Parent->getRedeclContext()->isFunctionOrMethod())
1877 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Field);
1882 Owner->addDecl(Field);
1892 SemaRef.Diag(D->
getLocation(), diag::err_property_is_variably_modified)
1896 TSI = SemaRef.SubstType(TSI, TemplateArgs, D->
getLocation(),
1908 SemaRef.Diag(D->
getLocation(), diag::err_field_instantiates_to_function)
1921 SemaRef.InstantiateAttrs(TemplateArgs, D,
Property, LateAttrs,
1934 NamedDecl **NamedChain =
1938 for (
auto *PI : D->
chain()) {
1944 NamedChain[i++] =
Next;
1950 {NamedChain, D->getChainingSize()});
1952 for (
const auto *Attr : D->
attrs())
1953 IndirectField->
addAttr(Attr->clone(SemaRef.Context));
1957 Owner->addDecl(IndirectField);
1958 return IndirectField;
1965 TypeSourceInfo *InstTy;
1974 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
1975 SemaRef.collectUnexpandedParameterPacks(Ty->getTypeLoc(), Unexpanded);
1976 assert(!Unexpanded.empty() &&
"Pack expansion without packs");
1978 bool ShouldExpand =
true;
1979 bool RetainExpansion =
false;
1980 UnsignedOrNone NumExpansions = std::nullopt;
1981 if (SemaRef.CheckParameterPacksForExpansion(
1984 ShouldExpand, RetainExpansion, NumExpansions))
1987 assert(!RetainExpansion &&
1988 "should never retain an expansion for a variadic friend decl");
1991 SmallVector<FriendDecl *> Decls;
1992 for (
unsigned I = 0; I != *NumExpansions; I++) {
1993 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
1994 TypeSourceInfo *TSI = SemaRef.SubstType(
2005 Decls.push_back(FD);
2013 InstTy = SemaRef.SubstType(Ty, TemplateArgs, D->
getLocation(),
2028 assert(ND &&
"friend decl must be a decl or a type!");
2035 if (!NewND)
return nullptr;
2054 = SemaRef.SubstExpr(AssertExpr, TemplateArgs);
2059 SemaRef.SubstExpr(D->
getMessage(), TemplateArgs);
2060 if (InstantiatedMessageExpr.
isInvalid())
2063 return SemaRef.BuildStaticAssertDeclaration(
2068Decl *TemplateDeclInstantiator::VisitEnumDecl(
EnumDecl *D) {
2069 EnumDecl *PrevDecl =
nullptr;
2071 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2074 if (!Prev)
return nullptr;
2087 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2088 TypeSourceInfo *NewTI = SemaRef.SubstType(TI, TemplateArgs, UnderlyingLoc,
2090 if (!NewTI || SemaRef.CheckEnumUnderlyingType(NewTI))
2091 Enum->setIntegerType(SemaRef.Context.IntTy);
2101 Enum->setIntegerTypeSourceInfo(NewTI);
2111 QualType UnderlyingType =
Enum->getIntegerType();
2112 Enum->setPromotionType(
2113 SemaRef.Context.isPromotableIntegerType(UnderlyingType)
2114 ? SemaRef.Context.getPromotedIntegerType(UnderlyingType)
2118 &&
"Dependent type without type source info");
2123 SemaRef.InstantiateAttrs(TemplateArgs, D,
Enum);
2128 SemaRef.Context.setManglingNumber(
Enum, SemaRef.Context.getManglingNumber(D));
2131 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2132 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Enum, DD);
2135 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2136 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Enum, TND);
2138 Owner->addDecl(
Enum);
2141 if (Def && Def != D) {
2146 SourceLocation UnderlyingLoc = TI->getTypeLoc().getBeginLoc();
2147 QualType DefnUnderlying =
2148 SemaRef.SubstType(TI->getType(), TemplateArgs,
2149 UnderlyingLoc, DeclarationName());
2151 DefnUnderlying,
true,
Enum);
2166 if (PrevDecl ==
nullptr) {
2167 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Enum);
2177 Enum->startDefinition();
2188 if (
Expr *UninstValue = EC->getInitExpr()) {
2193 Value = SemaRef.SubstExpr(UninstValue, TemplateArgs);
2198 if (
Value.isInvalid()) {
2204 = SemaRef.CheckEnumConstant(
Enum, LastEnumConst,
2211 Enum->setInvalidDecl();
2215 SemaRef.InstantiateAttrs(TemplateArgs, EC, EnumConst);
2218 Enum->addDecl(EnumConst);
2219 Enumerators.push_back(EnumConst);
2220 LastEnumConst = EnumConst;
2223 !
Enum->isScoped()) {
2226 SemaRef.CurrentInstantiationScope->InstantiatedLocal(EC, EnumConst);
2231 SemaRef.ActOnEnumBody(
Enum->getLocation(),
Enum->getBraceRange(),
Enum,
2236 llvm_unreachable(
"EnumConstantDecls can only occur within EnumDecls.");
2241 llvm_unreachable(
"BuiltinTemplateDecls cannot be instantiated.");
2249 LocalInstantiationScope Scope(SemaRef);
2262 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2268 CXXRecordDecl *PrevDecl =
nullptr;
2269 ClassTemplateDecl *PrevClassTemplate =
nullptr;
2273 if (!
Found.empty()) {
2274 PrevClassTemplate = dyn_cast<ClassTemplateDecl>(
Found.front());
2275 if (PrevClassTemplate)
2284 DeclContext *DC = Owner;
2288 SS.
Adopt(QualifierLoc);
2289 DC = SemaRef.computeDeclContext(SS);
2290 if (!DC)
return nullptr;
2292 DC = SemaRef.FindInstantiatedContext(Pattern->
getLocation(),
2301 SemaRef.forRedeclarationInCurContext());
2302 SemaRef.LookupQualifiedName(R, DC);
2304 if (R.isSingleResult()) {
2305 PrevClassTemplate = R.getAsSingle<ClassTemplateDecl>();
2306 if (PrevClassTemplate)
2310 if (!PrevClassTemplate && QualifierLoc) {
2311 SemaRef.Diag(Pattern->
getLocation(), diag::err_not_tag_in_scope)
2324 SemaRef.InstantiateAttrsForDecl(TemplateArgs, Pattern, RecordInst, LateAttrs,
2327 ClassTemplateDecl *Inst
2333 assert(!Owner->isDependentContext());
2338 if (PrevClassTemplate) {
2340 const ClassTemplateDecl *MostRecentPrevCT =
2342 TemplateParameterList *PrevParams =
2346 if (!SemaRef.TemplateParameterListsAreEqual(
2353 if (SemaRef.CheckTemplateParameterList(InstParams, PrevParams,
2367 if (!PrevClassTemplate)
2384 Owner->addDecl(Inst);
2386 if (!PrevClassTemplate) {
2390 SmallVector<ClassTemplatePartialSpecializationDecl *, 4> PartialSpecs;
2392 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2393 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2394 OutOfLinePartialSpecs.push_back(std::make_pair(Inst, PartialSpecs[I]));
2401TemplateDeclInstantiator::VisitClassTemplatePartialSpecializationDecl(
2412 ClassTemplateDecl *InstClassTemplate
2413 = dyn_cast<ClassTemplateDecl>(
Found.front());
2414 if (!InstClassTemplate)
2417 if (ClassTemplatePartialSpecializationDecl *
Result
2426 "Only static data member templates are allowed.");
2430 LocalInstantiationScope Scope(SemaRef);
2437 VarTemplateDecl *PrevVarTemplate =
nullptr;
2442 PrevVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2448 if (!VarInst)
return nullptr;
2450 DeclContext *DC = Owner;
2459 if (!PrevVarTemplate)
2467 Owner->addDecl(Inst);
2469 if (!PrevVarTemplate) {
2473 SmallVector<VarTemplatePartialSpecializationDecl *, 1> PartialSpecs;
2475 for (
unsigned I = 0, N = PartialSpecs.size(); I != N; ++I)
2476 if (PartialSpecs[I]->getFirstDecl()->isOutOfLine())
2477 OutOfLineVarPartialSpecs.push_back(
2478 std::make_pair(Inst, PartialSpecs[I]));
2484Decl *TemplateDeclInstantiator::VisitVarTemplatePartialSpecializationDecl(
2487 "Only static data member templates are allowed.");
2493 assert(!
Found.empty() &&
"Instantiation found nothing?");
2495 VarTemplateDecl *InstVarTemplate = dyn_cast<VarTemplateDecl>(
Found.front());
2496 assert(InstVarTemplate &&
"Instantiation did not find a variable template?");
2498 if (VarTemplatePartialSpecializationDecl *
Result =
2511 LocalInstantiationScope Scope(SemaRef);
2512 Sema::ConstraintEvalRAII<TemplateDeclInstantiator> RAII(*
this);
2519 FunctionDecl *Instantiated =
nullptr;
2520 if (CXXMethodDecl *DMethod = dyn_cast<CXXMethodDecl>(D->
getTemplatedDecl()))
2533 FunctionTemplateDecl *InstTemplate
2536 assert(InstTemplate &&
2537 "VisitFunctionDecl/CXXMethodDecl didn't create a template!");
2549 Owner->addDecl(InstTemplate);
2552 SemaRef.CheckFriendAccess(InstTemplate);
2555 return InstTemplate;
2559 CXXRecordDecl *PrevDecl =
nullptr;
2561 NamedDecl *Prev = SemaRef.FindInstantiatedDecl(D->
getLocation(),
2564 if (!Prev)
return nullptr;
2568 CXXRecordDecl *
Record =
nullptr;
2586 SemaRef.InstantiateAttrsForDecl(TemplateArgs, D,
Record, LateAttrs,
2594 if (!IsInjectedClassName)
2600 Record->setObjectOfFriendDecl();
2604 Record->setAnonymousStructOrUnion(
true);
2607 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D,
Record);
2610 SemaRef.Context.setManglingNumber(
Record,
2611 SemaRef.Context.getManglingNumber(D));
2615 if (DeclaratorDecl *DD = SemaRef.Context.getDeclaratorForUnnamedTagDecl(D))
2616 SemaRef.Context.addDeclaratorForUnnamedTagDecl(
Record, DD);
2620 if (TypedefNameDecl *TND = SemaRef.Context.getTypedefNameForUnnamedTagDecl(D))
2621 SemaRef.Context.addTypedefNameForUnnamedTagDecl(
Record, TND);
2628 Sema::LocalEagerInstantiationScope LocalInstantiations(SemaRef,
2643 LocalInstantiations.perform();
2646 SemaRef.DiagnoseUnusedNestedTypedefs(
Record);
2648 if (IsInjectedClassName)
2649 assert(
Record->isInjectedClassName() &&
"Broken injected-class-name");
2667 if (OrigFunc->
getExtInfo() == NewFunc->getExtInfo())
2672 return Context.getFunctionType(NewFunc->getReturnType(),
2673 NewFunc->getParamTypes(), NewEPI);
2697 if (isFriend && Source->wasThisDeclarationADefinition(D)) {
2709 void *InsertPos =
nullptr;
2718 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
2719 Owner->isFunctionOrMethod() ||
2721 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
2725 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2726 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
2727 TemplateArgs, DGuide->getExplicitSpecifier());
2728 if (InstantiatedExplicitSpecifier.
isInvalid())
2738 if (TemplateParams && TemplateParams->
size()) {
2740 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
2741 if (LastParam && LastParam->isImplicit() &&
2742 LastParam->hasTypeConstraint()) {
2757 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
2771 SemaRef.adjustContextForLocalExternDecl(DC);
2772 }
else if (isFriend && QualifierLoc) {
2774 SS.
Adopt(QualifierLoc);
2775 DC = SemaRef.computeDeclContext(SS);
2776 if (!DC)
return nullptr;
2783 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
2789 if (
auto *DGuide = dyn_cast<CXXDeductionGuideDecl>(D)) {
2792 InstantiatedExplicitSpecifier, NameInfo,
T, TInfo,
2794 DGuide->getDeductionCandidateKind(), TrailingRequiresClause,
2795 DGuide->getSourceDeductionGuide(),
2796 DGuide->getSourceDeductionGuideKind());
2803 TrailingRequiresClause);
2804 Function->setFriendConstraintRefersToEnclosingTemplate(
2813 Function->setQualifierInfo(QualifierLoc);
2824 LexicalDC = SemaRef.CurContext;
2828 Function->setIsTypeAwareOperatorNewOrDelete(
2830 Function->setLexicalDeclContext(LexicalDC);
2833 for (
unsigned P = 0; P < Params.size(); ++P)
2835 Params[P]->setOwningFunction(
Function);
2838 if (TrailingRequiresClause)
2839 Function->setTrailingRequiresClause(TrailingRequiresClause);
2841 if (TemplateParams) {
2869 SemaRef.CodeSynthesisContexts.back().Kind !=
2883 }
else if (!isFriend) {
2887 Function->setInstantiatedFromDecl(D);
2894 FT->setObjectOfFriendDecl();
2900 bool IsExplicitSpecialization =
false;
2907 : SemaRef.forRedeclarationInCurContext());
2911 assert(isFriend &&
"dependent specialization info on "
2912 "non-member non-friend function?");
2916 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
2917 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
2918 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
2919 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
2927 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
2933 if (SemaRef.CheckFunctionTemplateSpecialization(
2935 DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
2939 IsExplicitSpecialization =
true;
2943 SemaRef.LookupQualifiedName(
Previous, DC);
2947 ArgsWritten->getRAngleLoc());
2948 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
2952 if (SemaRef.CheckFunctionTemplateSpecialization(
Function,
2957 IsExplicitSpecialization =
true;
2974 if (isFriend && !QualifierLoc) {
2975 SemaRef.FilterLookupForScope(
Previous, DC,
nullptr,
2994 if (
Function->isLocalExternDecl()) {
2996 if (!PVD->hasDefaultArg())
2998 if (SemaRef.SubstDefaultArgument(D->
getInnerLocStart(), PVD, TemplateArgs)) {
3002 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
3003 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3005 { UninstExpr }, UninstExpr->
getType());
3007 PVD->setDefaultArg(ErrorResult.
get());
3013 IsExplicitSpecialization,
3014 Function->isThisDeclarationADefinition());
3021 SemaRef.CheckTemplateParameterList(
3024 Function->isThisDeclarationADefinition()
3035 Function->getMemberSpecializationInfo()) {
3036 if (MSInfo->getPointOfInstantiation().isInvalid()) {
3038 MSInfo->setPointOfInstantiation(Loc);
3039 SemaRef.PendingLocalImplicitInstantiations.emplace_back(
Function, Loc);
3077 void *InsertPos =
nullptr;
3092 bool MergeWithParentScope = (TemplateParams !=
nullptr) ||
3094 cast<Decl>(Owner)->isDefinedOutsideFunctionOrMethod());
3098 SemaRef, D, TemplateArgs,
Scope);
3102 unsigned NumTempParamLists = 0;
3104 TempParamLists.resize(NumTempParamLists);
3105 for (
unsigned I = 0; I != NumTempParamLists; ++I) {
3110 TempParamLists[I] = InstParams;
3116 const bool CouldInstantiate =
3117 InstantiatedExplicitSpecifier.getExpr() ==
nullptr ||
3118 !InstantiatedExplicitSpecifier.getExpr()->isValueDependent();
3122 if (CouldInstantiate ||
3123 SemaRef.CodeSynthesisContexts.back().Kind !=
3125 InstantiatedExplicitSpecifier = SemaRef.instantiateExplicitSpecifier(
3126 TemplateArgs, InstantiatedExplicitSpecifier);
3128 if (InstantiatedExplicitSpecifier.isInvalid())
3143 SemaRef.Context.getTrivialTypeSourceInfo(D->
getType());
3153 if (TemplateParams && TemplateParams->
size()) {
3155 dyn_cast<TemplateTypeParmDecl>(TemplateParams->
asArray().back());
3156 if (LastParam && LastParam->isImplicit() &&
3157 LastParam->hasTypeConstraint()) {
3172 QualifierLoc = SemaRef.SubstNestedNameSpecifierLoc(QualifierLoc,
3182 SS.
Adopt(QualifierLoc);
3183 DC = SemaRef.computeDeclContext(SS);
3185 if (DC && SemaRef.RequireCompleteDeclContext(SS, DC))
3188 DC = SemaRef.FindInstantiatedContext(D->
getLocation(),
3192 if (!DC)
return nullptr;
3199 = SemaRef.SubstDeclarationNameInfo(D->
getNameInfo(), TemplateArgs);
3210 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3211 InstantiatedExplicitSpecifier,
Constructor->UsesFPIntrin(),
3214 TrailingRequiresClause);
3218 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3220 Destructor->getConstexprKind(), TrailingRequiresClause);
3221 Method->setIneligibleOrNotSelected(
true);
3223 Method->setDeclName(SemaRef.Context.DeclarationNames.getCXXDestructorName(
3225 SemaRef.Context.getCanonicalTagType(
Record)));
3228 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo,
3229 Conversion->UsesFPIntrin(), Conversion->isInlineSpecified(),
3230 InstantiatedExplicitSpecifier, Conversion->getConstexprKind(),
3231 Conversion->getEndLoc(), TrailingRequiresClause);
3235 SemaRef.Context,
Record, StartLoc, NameInfo,
T, TInfo, SC,
3237 D->
getEndLoc(), TrailingRequiresClause);
3241 Method->setImplicitlyInline();
3244 Method->setQualifierInfo(QualifierLoc);
3246 if (TemplateParams) {
3286 if (NumTempParamLists)
3287 Method->setTemplateParameterListsInfo(
3291 Method->setLexicalDeclContext(Owner);
3292 Method->setObjectOfFriendDecl();
3297 for (
unsigned P = 0; P < Params.size(); ++P)
3298 Params[P]->setOwningFunction(
Method);
3299 Method->setParams(Params);
3302 Method->setInvalidDecl();
3307 bool IsExplicitSpecialization =
false;
3315 if (
const auto *ArgsWritten = DFTSI->TemplateArgumentsAsWritten) {
3316 ExplicitArgs.
setLAngleLoc(ArgsWritten->getLAngleLoc());
3317 ExplicitArgs.
setRAngleLoc(ArgsWritten->getRAngleLoc());
3318 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3326 SemaRef.FindInstantiatedDecl(D->
getLocation(), FTD, TemplateArgs))
3332 if (SemaRef.CheckFunctionTemplateSpecialization(
3333 Method, DFTSI->TemplateArgumentsAsWritten ? &ExplicitArgs :
nullptr,
3335 Method->setInvalidDecl();
3337 IsExplicitSpecialization =
true;
3340 SemaRef.LookupQualifiedName(
Previous, DC);
3343 ArgsWritten->getRAngleLoc());
3345 if (SemaRef.SubstTemplateArguments(ArgsWritten->arguments(), TemplateArgs,
3349 if (SemaRef.CheckFunctionTemplateSpecialization(
Method,
3352 Method->setInvalidDecl();
3354 IsExplicitSpecialization =
true;
3382 for (
unsigned P = 0; P < Params.size(); ++P) {
3383 if (!Params[P]->hasDefaultArg())
3385 if (SemaRef.SubstDefaultArgument(StartLoc, Params[P], TemplateArgs)) {
3389 Expr *UninstExpr = Params[P]->getUninstantiatedDefaultArg();
3390 ExprResult ErrorResult = SemaRef.CreateRecoveryExpr(
3392 { UninstExpr }, UninstExpr->
getType());
3394 Params[P]->setDefaultArg(ErrorResult.
get());
3400 IsExplicitSpecialization,
3401 Method->isThisDeclarationADefinition());
3409 if (isFriend &&
Method->getPreviousDecl())
3410 Method->setAccess(
Method->getPreviousDecl()->getAccess());
3416 SemaRef.CheckOverrideControl(
Method);
3430 if (IsExplicitSpecialization && !isFriend)
3443 Method->setIneligibleOrNotSelected(
true);
3444 }
else if (
Method->isCopyAssignmentOperator() ||
3445 Method->isMoveAssignmentOperator()) {
3446 Method->setIneligibleOrNotSelected(
true);
3458 }
else if (isFriend) {
3462 SemaRef.CheckFriendAccess(
Method);
3475 if (
Method->hasAttr<UsedAttr>()) {
3476 if (
const auto *A = dyn_cast<CXXRecordDecl>(Owner)) {
3479 A->getMemberSpecializationInfo())
3480 Loc = MSInfo->getPointOfInstantiation();
3481 else if (
const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(A))
3482 Loc = Spec->getPointOfInstantiation();
3483 SemaRef.MarkFunctionReferenced(Loc,
Method);
3503 return SemaRef.SubstParmVarDecl(D, TemplateArgs, 0,
3508Decl *TemplateDeclInstantiator::VisitTemplateTypeParmDecl(
3512 UnsignedOrNone NumExpanded = std::nullopt;
3516 assert(TC->getTemplateArgsAsWritten() &&
3517 "type parameter can only be an expansion when explicit arguments "
3522 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3523 for (
auto &ArgLoc : TC->getTemplateArgsAsWritten()->arguments())
3524 SemaRef.collectUnexpandedParameterPacks(ArgLoc, Unexpanded);
3529 bool RetainExpansion =
false;
3530 if (SemaRef.CheckParameterPacksForExpansion(
3533 SourceRange(TC->getConceptNameLoc(),
3534 TC->hasExplicitTemplateArgs()
3535 ? TC->getTemplateArgsAsWritten()->getRAngleLoc()
3536 : TC->getConceptNameInfo().getEndLoc()),
3537 Unexpanded, TemplateArgs,
true,
3538 Expand, RetainExpansion, NumExpanded))
3556 if (SemaRef.SubstTypeConstraint(Inst, TC, TemplateArgs,
3557 EvaluateConstraints))
3562 TemplateArgumentLoc Output;
3570 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Inst);
3575Decl *TemplateDeclInstantiator::VisitNonTypeTemplateParmDecl(
3579 SmallVector<TypeSourceInfo *, 4> ExpandedParameterPackTypesAsWritten;
3580 SmallVector<QualType, 4> ExpandedParameterPackTypes;
3581 bool IsExpandedParameterPack =
false;
3582 TypeSourceInfo *TSI;
3592 TypeSourceInfo *NewTSI =
3599 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3603 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3604 ExpandedParameterPackTypes.push_back(NewT);
3607 IsExpandedParameterPack =
true;
3614 PackExpansionTypeLoc Expansion = TL.
castAs<PackExpansionTypeLoc>();
3616 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3617 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
3622 bool RetainExpansion =
false;
3623 UnsignedOrNone OrigNumExpansions =
3625 UnsignedOrNone NumExpansions = OrigNumExpansions;
3626 if (SemaRef.CheckParameterPacksForExpansion(
3627 Expansion.
getEllipsisLoc(), Pattern.getSourceRange(), Unexpanded,
3628 TemplateArgs,
true, Expand,
3629 RetainExpansion, NumExpansions))
3633 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3634 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3635 TypeSourceInfo *NewTSI = SemaRef.SubstType(
3641 SemaRef.CheckNonTypeTemplateParameterType(NewTSI, D->
getLocation());
3645 ExpandedParameterPackTypesAsWritten.push_back(NewTSI);
3646 ExpandedParameterPackTypes.push_back(NewT);
3652 IsExpandedParameterPack =
true;
3658 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3659 TypeSourceInfo *NewPattern = SemaRef.SubstType(Pattern, TemplateArgs,
3665 SemaRef.CheckNonTypeTemplateParameterType(NewPattern, D->
getLocation());
3666 TSI = SemaRef.CheckPackExpansion(NewPattern, Expansion.
getEllipsisLoc(),
3681 T = SemaRef.CheckNonTypeTemplateParameterType(TSI, D->
getLocation());
3683 T = SemaRef.Context.IntTy;
3688 NonTypeTemplateParmDecl *Param;
3689 if (IsExpandedParameterPack)
3692 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3694 ExpandedParameterPackTypes, ExpandedParameterPackTypesAsWritten);
3698 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3702 if (AutoLoc.isConstrained()) {
3703 SourceLocation EllipsisLoc;
3704 if (IsExpandedParameterPack)
3707 else if (
auto *Constraint = dyn_cast_if_present<CXXFoldExpr>(
3709 EllipsisLoc = Constraint->getEllipsisLoc();
3713 if (SemaRef.AttachTypeConstraint(AutoLoc, Param,
3724 EnterExpressionEvaluationContext ConstantEvaluated(
3726 TemplateArgumentLoc
Result;
3734 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3742 for (
const auto &P : *Params) {
3743 if (P->isTemplateParameterPack())
3755TemplateDeclInstantiator::VisitTemplateTemplateParmDecl(
3759 TemplateParameterList *InstParams;
3760 SmallVector<TemplateParameterList*, 8> ExpandedParams;
3762 bool IsExpandedParameterPack =
false;
3771 LocalInstantiationScope Scope(SemaRef,
true);
3772 TemplateParameterList *Expansion =
3776 ExpandedParams.push_back(Expansion);
3779 IsExpandedParameterPack =
true;
3780 InstParams = TempParams;
3785 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3792 bool RetainExpansion =
false;
3793 UnsignedOrNone NumExpansions = std::nullopt;
3794 if (SemaRef.CheckParameterPacksForExpansion(
3796 TemplateArgs,
true, Expand,
3797 RetainExpansion, NumExpansions))
3801 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3802 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
3803 LocalInstantiationScope Scope(SemaRef,
true);
3807 ExpandedParams.push_back(Expansion);
3813 IsExpandedParameterPack =
true;
3816 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
3818 LocalInstantiationScope Scope(SemaRef,
true);
3825 LocalInstantiationScope Scope(SemaRef,
true);
3832 TemplateTemplateParmDecl *Param;
3833 if (IsExpandedParameterPack)
3836 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3842 D->
getDepth() - TemplateArgs.getNumSubstitutedLevels(),
3855 TemplateArgumentLoc(SemaRef.Context, TemplateArgument(TName),
3864 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, Param);
3873 UsingDirectiveDecl *Inst
3883 if (!Owner->isFunctionOrMethod())
3884 Owner->addDecl(Inst);
3893 bool isFunctionScope = Owner->isFunctionOrMethod();
3895 for (
auto *Shadow : D->
shadows()) {
3899 NamedDecl *OldTarget = Shadow->getTargetDecl();
3900 if (
auto *CUSD = dyn_cast<ConstructorUsingShadowDecl>(Shadow))
3901 if (
auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
3902 OldTarget = BaseShadow;
3906 dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
3908 SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
3910 InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
3911 Shadow->getLocation(), OldTarget, TemplateArgs));
3918 SemaRef.CheckUsingShadowDecl(Inst, InstTarget, *Lookup, PrevDecl))
3922 PrevDecl = cast_or_null<UsingShadowDecl>(SemaRef.FindInstantiatedDecl(
3923 Shadow->getLocation(), OldPrev, TemplateArgs));
3926 nullptr, Inst, InstTarget, PrevDecl);
3927 SemaRef.Context.setInstantiatedFromUsingShadowDecl(InstShadow, Shadow);
3929 if (isFunctionScope)
3930 SemaRef.CurrentInstantiationScope->InstantiatedLocal(Shadow, InstShadow);
3936Decl *TemplateDeclInstantiator::VisitUsingDecl(
UsingDecl *D) {
3957 if (
auto *RD = dyn_cast<CXXRecordDecl>(SemaRef.
CurContext))
3963 bool CheckRedeclaration = Owner->
isRecord();
3974 SS.
Adopt(QualifierLoc);
3975 if (CheckRedeclaration) {
3976 Prev.setHideTags(
false);
4009 EnumDecl *EnumD = cast_or_null<EnumDecl>(SemaRef.FindInstantiatedDecl(
4012 if (SemaRef.RequireCompleteEnumDecl(EnumD, EnumD->
getLocation()))
4015 TypeSourceInfo *TSI = SemaRef.SubstType(D->
getEnumType(), TemplateArgs,
4021 UsingEnumDecl *NewUD =
4025 SemaRef.Context.setInstantiatedFromUsingEnumDecl(NewUD, D);
4027 Owner->addDecl(NewUD);
4045Decl *TemplateDeclInstantiator::VisitConstructorUsingShadowDecl(
4051template <
typename T>
4052Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
4053 T *D,
bool InstantiatingPackElement) {
4055 if (D->isPackExpansion() && !InstantiatingPackElement) {
4056 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4057 SemaRef.collectUnexpandedParameterPacks(D->getQualifierLoc(), Unexpanded);
4058 SemaRef.collectUnexpandedParameterPacks(D->getNameInfo(), Unexpanded);
4063 bool RetainExpansion =
false;
4064 UnsignedOrNone NumExpansions = std::nullopt;
4065 if (SemaRef.CheckParameterPacksForExpansion(
4066 D->getEllipsisLoc(), D->getSourceRange(), Unexpanded, TemplateArgs,
4067 true, Expand, RetainExpansion,
4073 assert(!RetainExpansion &&
4074 "should never need to retain an expansion for UsingPackDecl");
4079 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, std::nullopt);
4080 return instantiateUnresolvedUsingDecl(D,
true);
4090 if (D->getDeclContext()->isFunctionOrMethod() && *NumExpansions > 1) {
4091 SemaRef.Diag(D->getEllipsisLoc(),
4092 diag::err_using_decl_redeclaration_expansion);
4097 SmallVector<NamedDecl*, 8> Expansions;
4098 for (
unsigned I = 0; I != *NumExpansions; ++I) {
4099 Sema::ArgPackSubstIndexRAII SubstIndex(SemaRef, I);
4100 Decl *Slice = instantiateUnresolvedUsingDecl(D,
true);
4110 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4112 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4116 UnresolvedUsingTypenameDecl *TD = dyn_cast<UnresolvedUsingTypenameDecl>(D);
4117 SourceLocation TypenameLoc = TD ? TD->
getTypenameLoc() : SourceLocation();
4119 NestedNameSpecifierLoc QualifierLoc
4120 = SemaRef.SubstNestedNameSpecifierLoc(D->getQualifierLoc(),
4126 SS.
Adopt(QualifierLoc);
4128 DeclarationNameInfo NameInfo
4129 = SemaRef.SubstDeclarationNameInfo(D->getNameInfo(), TemplateArgs);
4133 bool InstantiatingSlice =
4134 D->getEllipsisLoc().isValid() && SemaRef.ArgPackSubstIndex;
4135 SourceLocation EllipsisLoc =
4136 InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
4139 NamedDecl *UD = SemaRef.BuildUsingDeclaration(
4140 nullptr, D->getAccess(), D->getUsingLoc(),
4141 TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
4142 ParsedAttributesView(),
4143 true, IsUsingIfExists);
4145 SemaRef.InstantiateAttrs(TemplateArgs, D, UD);
4146 SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
4152Decl *TemplateDeclInstantiator::VisitUnresolvedUsingTypenameDecl(
4154 return instantiateUnresolvedUsingDecl(D);
4157Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
4159 return instantiateUnresolvedUsingDecl(D);
4162Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
4164 llvm_unreachable(
"referring to unresolved decl out of UsingShadowDecl");
4168 SmallVector<NamedDecl*, 8> Expansions;
4170 if (NamedDecl *NewUD =
4171 SemaRef.FindInstantiatedDecl(D->
getLocation(), UD, TemplateArgs))
4172 Expansions.push_back(NewUD);
4177 auto *NewD = SemaRef.BuildUsingPackDecl(D, Expansions);
4179 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewD);
4183Decl *TemplateDeclInstantiator::VisitOMPThreadPrivateDecl(
4185 SmallVector<Expr *, 5> Vars;
4186 for (
auto *I : D->
varlist()) {
4187 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4189 Vars.push_back(Var);
4192 OMPThreadPrivateDecl *TD =
4193 SemaRef.OpenMP().CheckOMPThreadPrivateDecl(D->
getLocation(), Vars);
4203 SmallVector<Expr *, 5> Vars;
4204 for (
auto *I : D->
varlist()) {
4205 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4207 Vars.push_back(Var);
4210 OMPGroupPrivateDecl *TD =
4211 SemaRef.OpenMP().CheckOMPGroupPrivateDecl(D->
getLocation(), Vars);
4220 SmallVector<Expr *, 5> Vars;
4221 for (
auto *I : D->
varlist()) {
4222 Expr *Var = SemaRef.SubstExpr(I, TemplateArgs).get();
4224 Vars.push_back(Var);
4226 SmallVector<OMPClause *, 4> Clauses;
4229 OMPClause *IC =
nullptr;
4230 if (
auto *AC = dyn_cast<OMPAllocatorClause>(
C)) {
4231 ExprResult NewE = SemaRef.SubstExpr(AC->getAllocator(), TemplateArgs);
4234 IC = SemaRef.OpenMP().ActOnOpenMPAllocatorClause(
4235 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4236 }
else if (
auto *AC = dyn_cast<OMPAlignClause>(
C)) {
4237 ExprResult NewE = SemaRef.SubstExpr(AC->getAlignment(), TemplateArgs);
4240 IC = SemaRef.OpenMP().ActOnOpenMPAlignClause(
4241 NewE.
get(), AC->
getBeginLoc(), AC->getLParenLoc(), AC->getEndLoc());
4246 Clauses.push_back(IC);
4258 "Requires directive cannot be instantiated within a dependent context");
4261Decl *TemplateDeclInstantiator::VisitOMPDeclareReductionDecl(
4264 const bool RequiresInstantiation =
4268 QualType SubstReductionType;
4269 if (RequiresInstantiation) {
4270 SubstReductionType = SemaRef.OpenMP().ActOnOpenMPDeclareReductionType(
4275 SubstReductionType = D->
getType();
4277 if (SubstReductionType.
isNull())
4281 bool IsCorrect =
true;
4283 std::pair<QualType, SourceLocation> ReductionTypes[] = {
4284 std::make_pair(SubstReductionType, D->
getLocation())};
4286 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4288 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4291 auto DRD = SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveStart(
4295 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDRD);
4296 Expr *SubstCombiner =
nullptr;
4297 Expr *SubstInitializer =
nullptr;
4300 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerStart(
4302 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4305 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4308 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4309 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4311 SubstCombiner = SemaRef.SubstExpr(Combiner, TemplateArgs).get();
4312 SemaRef.OpenMP().ActOnOpenMPDeclareReductionCombinerEnd(NewDRD,
4317 VarDecl *OmpPrivParm =
4318 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerStart(
4320 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4323 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4327 SubstInitializer = SemaRef.SubstExpr(
Init, TemplateArgs).get();
4331 IsCorrect = IsCorrect && OldPrivParm->hasInit();
4333 SemaRef.InstantiateVariableInitializer(OmpPrivParm, OldPrivParm,
4336 SemaRef.OpenMP().ActOnOpenMPDeclareReductionInitializerEnd(
4337 NewDRD, SubstInitializer, OmpPrivParm);
4339 IsCorrect = IsCorrect && SubstCombiner &&
4342 SubstInitializer) ||
4344 !SubstInitializer));
4346 (void)SemaRef.OpenMP().ActOnOpenMPDeclareReductionDirectiveEnd(
4355 const bool RequiresInstantiation =
4359 QualType SubstMapperTy;
4361 if (RequiresInstantiation) {
4362 SubstMapperTy = SemaRef.OpenMP().ActOnOpenMPDeclareMapperType(
4369 if (SubstMapperTy.
isNull())
4373 if (PrevDeclInScope && !PrevDeclInScope->isInvalidDecl()) {
4375 cast<Decl *>(*SemaRef.CurrentInstantiationScope->findInstantiationOf(
4378 bool IsCorrect =
true;
4379 SmallVector<OMPClause *, 6> Clauses;
4381 DeclarationNameInfo DirName;
4382 SemaRef.OpenMP().StartOpenMPDSABlock(llvm::omp::OMPD_declare_mapper, DirName,
4386 SemaRef.OpenMP().ActOnOpenMPDeclareMapperDirectiveVarDecl(
4388 SemaRef.CurrentInstantiationScope->InstantiatedLocal(
4391 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(Owner);
4392 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, Qualifiers(),
4397 SmallVector<Expr *, 4> NewVars;
4398 for (Expr *OE : OldC->varlist()) {
4399 Expr *
NE = SemaRef.SubstExpr(OE, TemplateArgs).get();
4404 NewVars.push_back(NE);
4408 NestedNameSpecifierLoc NewQualifierLoc =
4409 SemaRef.SubstNestedNameSpecifierLoc(OldC->getMapperQualifierLoc(),
4412 SS.
Adopt(NewQualifierLoc);
4413 DeclarationNameInfo NewNameInfo =
4414 SemaRef.SubstDeclarationNameInfo(OldC->getMapperIdInfo(), TemplateArgs);
4415 OMPVarListLocTy Locs(OldC->getBeginLoc(), OldC->getLParenLoc(),
4417 OMPClause *NewC = SemaRef.OpenMP().ActOnOpenMPMapClause(
4418 OldC->getIteratorModifier(), OldC->getMapTypeModifiers(),
4419 OldC->getMapTypeModifiersLoc(), SS, NewNameInfo, OldC->getMapType(),
4420 OldC->isImplicitMapType(), OldC->getMapLoc(), OldC->getColonLoc(),
4422 Clauses.push_back(NewC);
4424 SemaRef.OpenMP().EndOpenMPDSABlock(
nullptr);
4429 VN, D->
getAccess(), MapperVarRef.
get(), Clauses, PrevDeclInScope);
4431 SemaRef.CurrentInstantiationScope->InstantiatedLocal(D, NewDMD);
4435Decl *TemplateDeclInstantiator::VisitOMPCapturedExprDecl(
4437 llvm_unreachable(
"Should not be met in templates");
4448 Owner->addDecl(Inst);
4457 llvm_unreachable(
"There are only CXXRecordDecls in C++");
4461TemplateDeclInstantiator::VisitClassTemplateSpecializationDecl(
4468 "can only instantiate an explicit specialization "
4469 "for a member class template");
4473 ClassTemplateDecl *InstClassTemplate =
4474 cast_or_null<ClassTemplateDecl>(SemaRef.FindInstantiatedDecl(
4476 if (!InstClassTemplate)
4481 TemplateArgumentListInfo InstTemplateArgs;
4482 if (
const ASTTemplateArgumentListInfo *TemplateArgsInfo =
4484 InstTemplateArgs.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4485 InstTemplateArgs.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4487 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4488 TemplateArgs, InstTemplateArgs))
4494 Sema::CheckTemplateArgumentInfo CTAI;
4495 if (SemaRef.CheckTemplateArgumentList(
4496 InstClassTemplate, D->
getLocation(), InstTemplateArgs,
4503 void *InsertPos =
nullptr;
4504 ClassTemplateSpecializationDecl *PrevDecl =
4511 SemaRef.CheckSpecializationInstantiationRedecl(D->
getLocation(),
4533 SemaRef.Diag(D->
getLocation(), diag::err_redefinition) << PrevDecl;
4535 diag::note_previous_definition);
4540 ClassTemplateSpecializationDecl *InstD =
4562 Owner->addDecl(InstD);
4569 SemaRef.InstantiateClass(D->
getLocation(), InstD, D, TemplateArgs,
4583 "A template specialization without specialized template?");
4586 cast_or_null<VarTemplateDecl>(SemaRef.FindInstantiatedDecl(
4588 if (!InstVarTemplate)
4594 VarTemplateArgsInfo.
setLAngleLoc(TemplateArgsInfo->getLAngleLoc());
4595 VarTemplateArgsInfo.
setRAngleLoc(TemplateArgsInfo->getRAngleLoc());
4597 if (SemaRef.SubstTemplateArguments(TemplateArgsInfo->arguments(),
4598 TemplateArgs, VarTemplateArgsInfo))
4604 if (SemaRef.CheckTemplateArgumentList(
4605 InstVarTemplate, D->
getLocation(), VarTemplateArgsInfo,
4611 void *InsertPos =
nullptr;
4618 if (PrevDecl && SemaRef.CheckSpecializationInstantiationRedecl(
4626 VTSD->setTemplateArgsAsWritten(VarTemplateArgsInfo);
4646 SemaRef.
Diag(D->
getLocation(), diag::err_variable_instantiates_to_function)
4656 void *InsertPos =
nullptr;
4657 VarTemplate->findSpecialization(Converted, InsertPos);
4661 if (SemaRef.getLangOpts().OpenCL)
4662 SemaRef.deduceOpenCLAddressSpace(Var);
4668 SemaRef.BuildVariableInstantiation(Var, D, TemplateArgs, LateAttrs, Owner,
4669 StartingScope,
false, PrevDecl);
4675 llvm_unreachable(
"@defs is not supported in Objective-C++");
4680 unsigned DiagID = SemaRef.getDiagnostics().getCustomDiagID(
4682 "cannot instantiate %0 yet");
4690 llvm_unreachable(
"Concept definitions cannot reside inside a template");
4693Decl *TemplateDeclInstantiator::VisitImplicitConceptSpecializationDecl(
4695 llvm_unreachable(
"Concept specializations cannot reside inside a template");
4705 llvm_unreachable(
"Unexpected decl");
4716 SubstD = Instantiator.Visit(D);
4730 T = SemaRef.Context.getFunctionType(
4731 SemaRef.Context.BoolTy, FPT->getParamTypes(), FPT->getExtProtoInfo());
4740 SemaRef.Context.getTrivialTypeSourceInfo(
T, Orig->
getEndLoc());
4742 assert(OldLoc &&
"type of function is not a function type?");
4744 for (
unsigned I = 0, N = OldLoc.getNumParams(); I != N; ++I)
4745 NewLoc.
setParam(I, OldLoc.getParam(I));
4750 SemaRef.Context.DeclarationNames.getCXXOperatorName(OO_EqualEqual));
4755 if (Spaceship->isInvalidDecl())
4767 if (
auto *MD = dyn_cast<CXXMethodDecl>(Spaceship)) {
4772 assert(Spaceship->getFriendObjectKind() &&
4773 "defaulted spaceship is neither a member nor a friend");
4787 return cast_or_null<FunctionDecl>(R);
4801 unsigned N = L->
size();
4805 for (
auto &P : *L) {
4807 Params.push_back(D);
4827 bool EvaluateConstraints) {
4866 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
4873 if (SemaRef.CheckTemplateArgumentList(
4874 ClassTemplate, PartialSpec->
getLocation(), InstTemplateArgs,
4880 if (SemaRef.CheckTemplatePartialSpecializationArgs(
4887 void *InsertPos =
nullptr;
4890 InstParams, InsertPos);
4895 SemaRef.Context, PartialSpec->
getTagKind(), Owner,
4926 diag::err_partial_spec_redeclared)
4928 SemaRef.Diag(PrevDecl->
getLocation(), diag::note_prev_partial_spec_here)
4929 << SemaRef.Context.getCanonicalTagType(PrevDecl);
4934 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
4940 return InstPartialSpec;
4976 if (SemaRef.SubstTemplateArguments(TemplArgInfo->
arguments(), TemplateArgs,
4984 InstTemplateArgs, {},
4989 if (SemaRef.CheckTemplatePartialSpecializationArgs(
4996 void *InsertPos =
nullptr;
4999 InstParams, InsertPos);
5010 diag::err_variable_instantiates_to_function)
5047 diag::err_var_partial_spec_redeclared)
5050 diag::note_var_prev_partial_spec_here);
5054 SemaRef.CheckTemplatePartialSpecialization(InstPartialSpec);
5058 VarTemplate->AddPartialSpecialization(InstPartialSpec,
nullptr);
5060 SemaRef.BuildVariableInstantiation(InstPartialSpec, PartialSpec, TemplateArgs,
5061 LateAttrs, Owner, StartingScope);
5063 return InstPartialSpec;
5070 assert(OldTInfo &&
"substituting function without type source info");
5071 assert(Params.empty() &&
"parameter vector is non-empty at start");
5077 ThisTypeQuals =
Method->getFunctionObjectParameterType().getQualifiers();
5082 ThisContext, ThisTypeQuals, EvaluateConstraints);
5088 if (NewTInfo != OldTInfo) {
5092 unsigned NewIdx = 0;
5093 for (
unsigned OldIdx = 0, NumOldParams = OldProtoLoc.getNumParams();
5094 OldIdx != NumOldParams; ++OldIdx) {
5095 ParmVarDecl *OldParam = OldProtoLoc.getParam(OldIdx);
5103 NumArgumentsInExpansion =
5104 SemaRef.getNumArgumentsInExpansion(OldParam->
getType(),
5106 if (!NumArgumentsInExpansion) {
5110 Params.push_back(NewParam);
5111 Scope->InstantiatedLocal(OldParam, NewParam);
5114 Scope->MakeInstantiatedLocalArgPack(OldParam);
5115 for (
unsigned I = 0; I != *NumArgumentsInExpansion; ++I) {
5117 Params.push_back(NewParam);
5118 Scope->InstantiatedLocalPackArg(OldParam, NewParam);
5128 for (
unsigned i = 0, i_end = OldProtoLoc.getNumParams(); i != i_end;
5132 Params.push_back(SemaRef.BuildParmVarDeclForTypedef(
5138 cast_or_null<ParmVarDecl>(VisitParmVarDecl(OldParam));
5141 Params.push_back(Parm);
5158 TemplateArgs, ParamTypes, &Params,
5171 for (
auto *
decl : PatternDecl->
decls()) {
5178 auto it = llvm::find_if(
Function->decls(), [&](
Decl *inst) {
5179 VarDecl *InstVD = dyn_cast<VarDecl>(inst);
5180 return InstVD && InstVD->isLocalVarDecl() &&
5181 InstVD->getIdentifier() == II;
5187 Scope.InstantiatedLocal(VD, *it);
5194bool Sema::addInstantiatedParametersToScope(
5198 unsigned FParamIdx = 0;
5199 for (
unsigned I = 0, N = PatternDecl->
getNumParams(); I != N; ++I) {
5200 const ParmVarDecl *PatternParam = PatternDecl->
getParamDecl(I);
5203 assert(FParamIdx < Function->getNumParams());
5228 UnsignedOrNone NumArgumentsInExpansion =
5230 if (NumArgumentsInExpansion) {
5231 QualType PatternType =
5232 PatternParam->
getType()->
castAs<PackExpansionType>()->getPattern();
5233 for (
unsigned Arg = 0; Arg < *NumArgumentsInExpansion; ++Arg) {
5237 Sema::ArgPackSubstIndexRAII SubstIndex(*
this, Arg);
5257 assert(Param->hasUninstantiatedDefaultArg());
5289 false, std::nullopt,
5298 L->DefaultArgumentInstantiated(Param);
5311 if (AlreadyInstantiating) {
5314 Diag(PointOfInstantiation, diag::err_exception_spec_cycle) <<
Decl;
5335 false, std::nullopt,
5368 SemaRef.Context.setManglingNumber(
New,
5369 SemaRef.Context.getManglingNumber(Tmpl));
5382 ActiveInstType &ActiveInst = SemaRef.CodeSynthesisContexts.back();
5383 if (ActiveInst.Kind == ActiveInstType::ExplicitTemplateArgumentSubstitution ||
5384 ActiveInst.Kind == ActiveInstType::DeducedTemplateArgumentSubstitution) {
5386 atTemplateEnd(SemaRef.TemplateInstCallbacks, SemaRef, ActiveInst);
5387 ActiveInst.Kind = ActiveInstType::TemplateInstantiation;
5388 ActiveInst.Entity =
New;
5394 assert(Proto &&
"Function template without prototype?");
5403 if (SemaRef.getLangOpts().CPlusPlus11 &&
5418 assert(NewProto &&
"Template instantiation without function prototype?");
5423 New->setType(SemaRef.Context.getFunctionType(
5427 SemaRef.SubstExceptionSpec(
New, Proto, TemplateArgs);
5436 LateAttrs, StartingScope);
5457 New->setVirtualAsWritten(
true);
5468 Lookups.reserve(DFI->getUnqualifiedLookups().size());
5469 bool AnyChanged =
false;
5471 NamedDecl *D = SemaRef.FindInstantiatedDecl(
New->getLocation(),
5472 DA.getDecl(), TemplateArgs);
5475 AnyChanged |= (D != DA.getDecl());
5481 New->setDefaultedOrDeletedInfo(
5483 SemaRef.Context, Lookups)
5511 bool DefinitionRequired,
5519 Function->getTemplateSpecializationKindForInstantiation();
5526 !DefinitionRequired)
5531 if (
Function->isDefined(ExistingDefn,
5546 assert(!AlreadyInstantiating &&
"should have been caught by caller");
5551 assert(PatternDecl &&
"instantiating a non-template");
5554 Stmt *Pattern =
nullptr;
5556 Pattern = PatternDef->
getBody(PatternDef);
5557 PatternDecl = PatternDef;
5559 PatternDef =
nullptr;
5563 bool Unreachable =
false;
5568 Function->getInstantiatedFromMemberFunction(), PatternDecl,
5570 DefinitionRequired, &Unreachable)) {
5571 if (DefinitionRequired)
5574 (
Function->isConstexpr() && !Recursive)) {
5578 Function->setInstantiationIsPending(
true);
5581 if (llvm::isTimeTraceVerbose()) {
5582 llvm::timeTraceAddInstantEvent(
"DeferInstantiation", [&] {
5584 llvm::raw_string_ostream
OS(Name);
5593 Diag(PointOfInstantiation, diag::warn_func_template_missing)
5599 diag::note_unreachable_template_decl);
5603 Diag(PointOfInstantiation, diag::note_inst_declaration_hint)
5615 Function->setInstantiationIsPending(
true);
5617 std::make_pair(
Function, PointOfInstantiation));
5621 llvm::TimeTraceScope TimeScope(
"InstantiateFunction", [&]() {
5622 llvm::TimeTraceMetadata M;
5623 llvm::raw_string_ostream
OS(M.Detail);
5626 if (llvm::isTimeTraceVerbose()) {
5629 M.Line =
SourceMgr.getExpansionLineNumber(Loc);
5655 "missing LateParsedTemplate");
5657 Pattern = PatternDecl->
getBody(PatternDecl);
5664 "unexpected kind of function template definition");
5679 for (
auto *D =
Function->getMostRecentDecl(); ;
5681 D->setImplicitlyInline();
5691 "instantiating function definition");
5695 Function->setVisibleDespiteOwningModule();
5721 auto NameLocPointsToPattern = [&] {
5732 return PatternNameLoc;
5742 return PatternNameLoc;
5750 assert(PatternTSI &&
"Pattern is supposed to have an associated TSI");
5758 Function->setDeclarationNameLoc(NameLocPointsToPattern());
5766 ThisContext =
Method->getParent();
5767 ThisTypeQuals =
Method->getMethodQualifiers();
5777 bool MergeWithParentScope =
false;
5779 MergeWithParentScope =
5780 Rec->isLocalClass() && !
Function->isFunctionTemplateSpecialization();
5783 auto RebuildTypeSourceInfoForDefaultSpecialMembers = [&]() {
5789 "Special member needs to be defaulted");
5797 auto *NewRec = dyn_cast<CXXRecordDecl>(
Function->getDeclContext());
5798 const auto *PatternRec =
5800 if (!NewRec || !PatternRec)
5802 if (!PatternRec->isLambda())
5805 struct SpecialMemberTypeInfoRebuilder
5825 getDerived().TransformDecl(TL.
getNameLoc(),
T->getDecl()));
5827 return Base::TransformRecordType(TLB, TL);
5841 } IR{*
this, PatternRec, NewRec};
5844 assert(NewSI &&
"Type Transform failed?");
5846 Function->setTypeSourceInfo(NewSI);
5850 assert(NewParmSI &&
"Type transformation failed.");
5856 RebuildTypeSourceInfoForDefaultSpecialMembers();
5860 std::optional<ArrayRef<TemplateArgument>> Innermost;
5861 if (
auto *Primary =
Function->getPrimaryTemplate();
5864 Function->getTemplateSpecializationKind() !=
5866 auto It = llvm::find_if(Primary->redecls(),
5868 return cast<FunctionTemplateDecl>(RTD)
5869 ->isCompatibleWithDefinition();
5871 assert(It != Primary->redecls().end() &&
5872 "Should't get here without a definition");
5874 ->getTemplatedDecl()
5878 DC = (*It)->getLexicalDeclContext();
5879 Innermost.emplace(
Function->getTemplateSpecializationArgs()->asArray());
5882 Function, DC,
false, Innermost,
false, PatternDecl);
5900 if (addInstantiatedParametersToScope(
Function, PatternDecl,
Scope,
5916 if (
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
5917 Ctor->isDefaultConstructor()) {
5923 Body =
SubstStmt(Pattern, TemplateArgs);
5932 checkReferenceToTULocalFromOtherTU(
Function, PointOfInstantiation);
5937 Listener->FunctionDefinitionInstantiated(
Function);
5947 bool ShouldSkipCG = [&] {
5948 auto *RD = dyn_cast<CXXRecordDecl>(
Function->getParent());
5949 if (!RD || !RD->isLambda())
5953 return Context.isUnevaluated() ||
Context.isImmediateFunctionContext();
5956 if (!ShouldSkipCG) {
5963 LocalInstantiations.
perform();
5965 GlobalInstantiations.perform();
5990 bool IsMemberSpec =
false;
5992 if (
auto *PartialSpec =
5993 dyn_cast<VarTemplatePartialSpecializationDecl>(FromVar)) {
5994 assert(PartialSpecArgs);
5995 IsMemberSpec = PartialSpec->isMemberSpecialization();
5997 PartialSpec, PartialSpecArgs->
asArray(),
false);
6000 IsMemberSpec =
VarTemplate->isMemberSpecialization();
6020 "don't have a definition to instantiate from");
6049 bool InstantiatingVarTemplate,
6053 bool InstantiatingVarTemplatePartialSpec =
6058 bool InstantiatingSpecFromTemplate =
6084 if (OldVar->
isUsed(
false))
6109 }
else if (PrevDeclForVarTemplateSpecialization) {
6110 Previous.addDecl(PrevDeclForVarTemplateSpecialization);
6114 if (!InstantiatingVarTemplate) {
6132 !InstantiatingSpecFromTemplate)
6139 dyn_cast<VarTemplateSpecializationDecl>(OldVar)) {
6147 Context.setManglingNumber(NewVar,
Context.getManglingNumber(OldVar));
6148 Context.setStaticLocalNumber(NewVar,
Context.getStaticLocalNumber(OldVar));
6151 if (InstantiatingVarTemplate || InstantiatingVarTemplatePartialSpec) {
6156 }
else if (InstantiatingSpecFromTemplate ||
6178 L->VariableDefinitionInstantiated(Var);
6204 if (!
Init.isInvalid()) {
6207 if (Var->
hasAttr<DLLImportAttr>() &&
6211 }
else if (InitExpr) {
6247 bool DefinitionRequired,
bool AtEndOfTU) {
6259 if (AlreadyInstantiating)
6264 assert(PatternDecl &&
"no pattern for templated variable");
6269 dyn_cast<VarTemplateSpecializationDecl>(Var);
6280 (PatternDecl = PatternDecl->
getFirstDecl())->hasInit() &&
6288 "instantiating variable initializer");
6299 Recursive, AtEndOfTU);
6308 PreviousContext.
pop();
6312 LocalInstantiations.
perform();
6314 GlobalInstantiations.
perform();
6318 "not a static data member?");
6327 if (!Def && !DefinitionRequired) {
6334 Diag(PointOfInstantiation, diag::warn_var_template_missing)
6338 Diag(PointOfInstantiation, diag::note_inst_declaration_hint) << Var;
6349 PatternDecl, Def, TSK,
6350 DefinitionRequired))
6367 struct PassToConsumerRAII {
6374 ~PassToConsumerRAII() {
6375 Consumer.HandleCXXStaticMemberVarInstantiation(Var);
6377 } PassToConsumerRAII(
Consumer, Var);
6384 PointOfInstantiation);
6392 "instantiating variable definition");
6414 }
else if (!VarSpec) {
6459 PreviousContext.
pop();
6462 PassToConsumerRAII.Var = Var;
6469 LocalInstantiations.
perform();
6471 GlobalInstantiations.
perform();
6483 for (
const auto *
Init : Tmpl->
inits()) {
6486 if (!
Init->isWritten())
6491 if (
Init->isPackExpansion()) {
6493 TypeLoc BaseTL =
Init->getTypeSourceInfo()->getTypeLoc();
6497 bool ShouldExpand =
false;
6498 bool RetainExpansion =
false;
6502 TemplateArgs,
true, ShouldExpand,
6503 RetainExpansion, NumExpansions)) {
6505 New->setInvalidDecl();
6508 assert(ShouldExpand &&
"Partial instantiation of base initializer?");
6511 for (
unsigned I = 0; I != *NumExpansions; ++I) {
6525 Init->getSourceLocation(),
6526 New->getDeclName());
6534 BaseTInfo, TempInit.
get(),
6542 NewInits.push_back(NewInit.
get());
6557 if (
Init->isDelegatingInitializer() ||
Init->isBaseInitializer()) {
6560 Init->getSourceLocation(),
6561 New->getDeclName());
6564 New->setInvalidDecl();
6568 if (
Init->isBaseInitializer())
6570 New->getParent(), EllipsisLoc);
6574 }
else if (
Init->isMemberInitializer()) {
6576 Init->getMemberLocation(),
6581 New->setInvalidDecl();
6586 Init->getSourceLocation());
6587 }
else if (
Init->isIndirectMemberInitializer()) {
6590 Init->getMemberLocation(),
6591 Init->getIndirectMember(), TemplateArgs));
6593 if (!IndirectMember) {
6595 New->setInvalidDecl();
6600 Init->getSourceLocation());
6605 New->setInvalidDecl();
6607 NewInits.push_back(NewInit.
get());
6626 Instance = Instance->getCanonicalDecl();
6627 if (Pattern == Instance)
return true;
6628 Instance = Instance->getInstantiatedFromMemberTemplate();
6639 Instance = Instance->getCanonicalDecl();
6640 if (Pattern == Instance)
return true;
6641 Instance = Instance->getInstantiatedFromMemberTemplate();
6654 Instance->getCanonicalDecl());
6655 if (Pattern == Instance)
6657 Instance = Instance->getInstantiatedFromMember();
6668 Instance = Instance->getCanonicalDecl();
6669 if (Pattern == Instance)
return true;
6670 Instance = Instance->getInstantiatedFromMemberClass();
6681 Instance = Instance->getCanonicalDecl();
6682 if (Pattern == Instance)
return true;
6683 Instance = Instance->getInstantiatedFromMemberFunction();
6694 Instance = Instance->getCanonicalDecl();
6695 if (Pattern == Instance)
return true;
6696 Instance = Instance->getInstantiatedFromMemberEnum();
6723 bool OtherIsPackExpansion;
6725 if (
auto *OtherUUD = dyn_cast<T>(
Other)) {
6726 OtherIsPackExpansion = OtherUUD->isPackExpansion();
6728 }
else if (
auto *OtherUPD = dyn_cast<UsingPackDecl>(
Other)) {
6729 OtherIsPackExpansion =
true;
6730 OtherFrom = OtherUPD->getInstantiatedFromUsingDecl();
6731 }
else if (
auto *OtherUD = dyn_cast<UsingDecl>(
Other)) {
6732 OtherIsPackExpansion =
false;
6737 return Pattern->isPackExpansion() == OtherIsPackExpansion &&
6743 assert(Instance->isStaticDataMember());
6748 Instance = Instance->getCanonicalDecl();
6749 if (Pattern == Instance)
return true;
6750 Instance = Instance->getInstantiatedFromStaticDataMember();
6759 if (
auto *UUD = dyn_cast<UnresolvedUsingTypenameDecl>(D))
6762 if (
auto *UUD = dyn_cast<UnresolvedUsingValueDecl>(D))
6768 if (
auto *
Record = dyn_cast<CXXRecordDecl>(
Other))
6771 if (
auto *Function = dyn_cast<FunctionDecl>(
Other))
6774 if (
auto *
Enum = dyn_cast<EnumDecl>(
Other))
6777 if (
auto *Var = dyn_cast<VarDecl>(
Other))
6781 if (
auto *Temp = dyn_cast<ClassTemplateDecl>(
Other))
6784 if (
auto *Temp = dyn_cast<FunctionTemplateDecl>(
Other))
6787 if (
auto *PartialSpec =
6788 dyn_cast<ClassTemplatePartialSpecializationDecl>(
Other))
6792 if (
auto *Field = dyn_cast<FieldDecl>(
Other)) {
6793 if (!Field->getDeclName()) {
6800 if (
auto *Using = dyn_cast<UsingDecl>(
Other))
6803 if (
auto *Shadow = dyn_cast<UsingShadowDecl>(
Other))
6810template<
typename ForwardIterator>
6813 ForwardIterator first,
6814 ForwardIterator last) {
6815 for (; first != last; ++first)
6824 if (
NamedDecl *D = dyn_cast<NamedDecl>(DC)) {
6826 return cast_or_null<DeclContext>(ID);
6841 return cast<Decl>(DC)->getTemplateDepth() > Level;
6846 bool FindingInstantiatedContext) {
6884 if (
auto *BD = dyn_cast<BindingDecl>(FD);
6892 "found declaration pack but not pack expanding");
6922 bool NeedInstantiate =
false;
6924 NeedInstantiate = RD->isLocalClass();
6927 NeedInstantiate =
true;
6930 if (NeedInstantiate) {
6941 assert(Inst &&
"Failed to instantiate label??");
6948 if (!
Record->isDependentContext())
6957 dyn_cast<ClassTemplateSpecializationDecl>(
Record))
6958 ClassTemplate = Spec->getSpecializedTemplate()->getCanonicalDecl();
6969 if (
CXXRecordDecl *InstRecord = dyn_cast<CXXRecordDecl>(DC)) {
6973 = dyn_cast<ClassTemplateSpecializationDecl>(InstRecord)){
6993 auto *Guide = dyn_cast<CXXDeductionGuideDecl>(FD);
6994 if (Guide && Guide->isImplicit()) {
7002 Unpacked = Arg.pack_elements();
7015 if (
T.isNull() ||
T->containsErrors())
7025 assert(
SemaRef.RebuildingImmediateInvocation ||
7038 if (FindingInstantiatedContext &&
7041 Diag(Loc, diag::err_specialization_not_primary_template)
7058 if (!ParentDependsOnArgs)
7072 bool IsBeingInstantiated =
false;
7073 if (
auto *Spec = dyn_cast<CXXRecordDecl>(ParentDC)) {
7074 if (!Spec->isDependentContext()) {
7075 if (Spec->isEntityBeingDefined())
7076 IsBeingInstantiated =
true;
7078 diag::err_incomplete_type))
7081 ParentDC = Spec->getDefinitionOrSelf();
7120 }
else if (IsBeingInstantiated) {
7126 Diag(Loc, diag::err_member_not_yet_instantiated)
7139 Diag(Loc, diag::err_enumerator_does_not_exist)
7143 <<
Context.getCanonicalTagType(Spec);
7146 llvm_unreachable(
"Unable to find instantiation of declaration!");
7157 std::deque<PendingImplicitInstantiation> DelayedImplicitInstantiations;
7162 bool LocalInstantiation =
false;
7169 LocalInstantiation =
true;
7174 bool DefinitionRequired =
Function->getTemplateSpecializationKind() ==
7179 [
this, Inst, DefinitionRequired, AtEndOfTU](
FunctionDecl *CurFD) {
7181 DefinitionRequired, AtEndOfTU);
7187 DefinitionRequired, AtEndOfTU);
7189 Function->setInstantiationIsPending(
false);
7192 if (!LocalOnly &&
LangOpts.PCHInstantiateTemplates &&
7194 DelayedImplicitInstantiations.push_back(Inst);
7195 else if (!AtEndOfTU &&
Function->instantiationIsPending() &&
7196 !LocalInstantiation)
7197 DelayedImplicitInstantiations.push_back(Inst);
7206 "Not a static data member, nor a variable template"
7207 " specialization?");
7219 llvm_unreachable(
"Cannot instantitiate an undeclared specialization.");
7234 "instantiating variable definition");
7241 DefinitionRequired, AtEndOfTU);
7244 if (!DelayedImplicitInstantiations.empty())
7250 for (
auto *DD : Pattern->
ddiags()) {
7251 switch (DD->getKind()) {
Defines the clang::ASTContext interface.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Record Record
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis functions specific to AMDGPU.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
This file declares semantic analysis for CUDA constructs.
static const NamedDecl * getDefinition(const Decl *D)
This file declares semantic analysis for HLSL constructs.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
This file declares semantic analysis functions specific to Swift.
static void instantiateDependentAMDGPUWavesPerEUAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUWavesPerEUAttr &Attr, Decl *New)
static NamedDecl * findInstantiationOf(ASTContext &Ctx, NamedDecl *D, ForwardIterator first, ForwardIterator last)
static void instantiateDependentAMDGPUMaxNumWorkGroupsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUMaxNumWorkGroupsAttr &Attr, Decl *New)
static void instantiateDependentAMDGPUFlatWorkGroupSizeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AMDGPUFlatWorkGroupSizeAttr &Attr, Decl *New)
static void instantiateDependentCUDAClusterDimsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const CUDAClusterDimsAttr &Attr, Decl *New)
static void sharedInstantiateConstructorDestructorAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Decl *New, ASTContext &C)
static void instantiateDependentDiagnoseIfAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const DiagnoseIfAttr *DIA, const Decl *Tmpl, FunctionDecl *New)
static QualType adjustFunctionTypeForInstantiation(ASTContext &Context, FunctionDecl *D, TypeSourceInfo *TInfo)
Adjust the given function type for an instantiation of the given declaration, to cope with modificati...
static bool isRelevantAttr(Sema &S, const Decl *D, const Attr *A)
Determine whether the attribute A might be relevant to the declaration D.
static void instantiateDependentReqdWorkGroupSizeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const ReqdWorkGroupSizeAttr &Attr, Decl *New)
#define CLAUSE_NOT_ON_DECLS(CLAUSE_NAME)
static bool isDependentContextAtLevel(DeclContext *DC, unsigned Level)
Determine whether the given context is dependent on template parameters at level Level or below.
static void instantiateDependentModeAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const ModeAttr &Attr, Decl *New)
static void instantiateDependentCUDALaunchBoundsAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const CUDALaunchBoundsAttr &Attr, Decl *New)
static bool isDeclWithinFunction(const Decl *D)
static void instantiateDependentAssumeAlignedAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AssumeAlignedAttr *Aligned, Decl *New)
static bool SubstQualifier(Sema &SemaRef, const DeclT *OldDecl, DeclT *NewDecl, const MultiLevelTemplateArgumentList &TemplateArgs)
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static void instantiateDependentHLSLParamModifierAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const HLSLParamModifierAttr *Attr, const Decl *Old, Decl *New)
static DeclT * getPreviousDeclForInstantiation(DeclT *D)
Get the previous declaration of a declaration for the purposes of template instantiation.
static Expr * instantiateDependentFunctionAttrCondition(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const Attr *A, Expr *OldCond, const Decl *Tmpl, FunctionDecl *New)
static bool isInstantiationOf(ClassTemplateDecl *Pattern, ClassTemplateDecl *Instance)
static void instantiateDependentAllocAlignAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AllocAlignAttr *Align, Decl *New)
static bool isInstantiationOfStaticDataMember(VarDecl *Pattern, VarDecl *Instance)
static void instantiateOMPDeclareSimdDeclAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OMPDeclareSimdDeclAttr &Attr, Decl *New)
Instantiation of 'declare simd' attribute and its arguments.
static void instantiateDependentSYCLKernelAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const SYCLKernelAttr &Attr, Decl *New)
static void instantiateDependentAlignValueAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AlignValueAttr *Aligned, Decl *New)
static void instantiateDependentAlignedAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AlignedAttr *Aligned, Decl *New, bool IsPackExpansion)
static void instantiateOMPDeclareVariantAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OMPDeclareVariantAttr &Attr, Decl *New)
Instantiation of 'declare variant' attribute and its arguments.
static void instantiateDependentEnableIfAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const EnableIfAttr *EIA, const Decl *Tmpl, FunctionDecl *New)
static void instantiateDependentAnnotationAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const AnnotateAttr *Attr, Decl *New)
static Sema::RetainOwnershipKind attrToRetainOwnershipKind(const Attr *A)
static void instantiateDependentOpenACCRoutineDeclAttr(Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs, const OpenACCRoutineDeclAttr *OldAttr, const Decl *Old, Decl *New)
static bool isInstantiationOfUnresolvedUsingDecl(T *Pattern, Decl *Other, ASTContext &Ctx)
static bool isInvalid(LocType Loc, bool *Invalid)
Defines the SourceManager interface.
Defines the clang::TypeLoc interface and its subclasses.
ASTConsumer - This is an abstract interface that should be implemented by clients that read ASTs.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
void setInstantiatedFromUsingDecl(NamedDecl *Inst, NamedDecl *Pattern)
Remember that the using decl Inst is an instantiation of the using decl Pattern of a class template.
QualType mergeFunctionTypes(QualType, QualType, bool OfBlockPointer=false, bool Unqualified=false, bool AllowCXX=false, bool IsConditionalOperator=false)
NamedDecl * getInstantiatedFromUsingDecl(NamedDecl *Inst)
If the given using decl Inst is an instantiation of another (possibly unresolved) using decl,...
DeclarationNameTable DeclarationNames
void forEachMultiversionedFunctionVersion(const FunctionDecl *FD, llvm::function_ref< void(FunctionDecl *)> Pred) const
Visits all versions of a multiversioned function with the passed predicate.
OMPTraitInfo & getNewOMPTraitInfo()
Return a new OMPTraitInfo object owned by this context.
FieldDecl * getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field) const
CanQualType UnsignedLongLongTy
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
CanQualType getCanonicalTagType(const TagDecl *TD) const
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents an access specifier followed by colon ':'.
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
SourceLocation getColonLoc() const
The location of the colon following the access specifier.
SourceLocation getAccessSpecifierLoc() const
The location of the access specifier.
Attr - This represents one attribute.
attr::Kind getKind() const
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
SourceRange getRange() const
SourceLocation getLoc() const
Represents a C++ declaration that introduces decls from somewhere else.
shadow_range shadows() const
A binding in a decomposition declaration.
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
ArrayRef< BindingDecl * > getBindingPackDecls() const
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
Represents a C++ constructor within a class.
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ conversion function within a class.
static CXXConversionDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, ExplicitSpecifier ES, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ deduction guide declaration.
static CXXDeductionGuideDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, ExplicitSpecifier ES, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, SourceLocation EndLocation, CXXConstructorDecl *Ctor=nullptr, DeductionCandidate Kind=DeductionCandidate::Normal, const AssociatedConstraint &TrailingRequiresClause={}, const CXXDeductionGuideDecl *SourceDG=nullptr, SourceDeductionGuideKind SK=SourceDeductionGuideKind::None)
Represents a C++ destructor within a class.
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
Represents a static or instance method of a struct/union/class.
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
Represents a C++ struct/union/class.
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
unsigned getLambdaDependencyKind() const
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
bool isLambda() const
Determine whether this class describes a lambda function object.
CXXRecordDecl * getDefinition() const
static CXXRecordDecl * CreateLambda(const ASTContext &C, DeclContext *DC, TypeSourceInfo *Info, SourceLocation Loc, unsigned DependencyKind, bool IsGeneric, LambdaCaptureDefault CaptureDefault)
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
TypeSourceInfo * getLambdaTypeInfo() const
void setInstantiationOfMemberClass(CXXRecordDecl *RD, TemplateSpecializationKind TSK)
Specify that this record is an instantiation of the member class RD.
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
LambdaCaptureDefault getLambdaCaptureDefault() const
void setDescribedClassTemplate(ClassTemplateDecl *Template)
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a class template node.
ClassTemplateDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
ClassTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *D)
Find a class template partial specialization which was instantiated from the given member partial spe...
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
void setCommonPtr(Common *C)
Common * getCommonPtr() const
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
void setInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *PartialSpec)
static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, CanQualType CanonInjectedTST, ClassTemplatePartialSpecializationDecl *PrevDecl)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, bool StrictPackMatch, ClassTemplateSpecializationDecl *PrevDecl)
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void setSpecializationKind(TemplateSpecializationKind TSK)
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
Declaration of a C++20 concept.
const TypeClass * getTypePtr() const
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
bool isFileContext() const
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
ddiag_range ddiags() const
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
bool isFunctionOrMethod() const
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
decl_iterator decls_begin() const
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
SourceLocation getEndLoc() const LLVM_READONLY
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
void setLocalExternDecl()
Changes the namespace of this declaration to reflect that it's a function-local extern declaration.
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isInIdentifierNamespace(unsigned NS) const
@ FOK_None
Not a friend object.
bool isReferenced() const
Whether any declaration of this entity was referenced.
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
void setObjectOfFriendDecl(bool PerformFriendInjection=false)
Changes the namespace of this declaration to reflect that it's the object of a friend declaration.
bool isFromASTFile() const
Determine whether this declaration came from an AST file (such as a precompiled header or module) rat...
bool isInLocalScopeForInstantiation() const
Determine whether a substitution into this declaration would occur as part of a substitution into a d...
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
llvm::iterator_range< specific_attr_iterator< T > > specific_attrs() const
void setAccess(AccessSpecifier AS)
SourceLocation getLocation() const
const char * getDeclKindName() const
@ IDNS_Ordinary
Ordinary names.
void setImplicit(bool I=true)
void setReferenced(bool R=true)
void setIsUsed()
Set whether the declaration is used, in the sense of odr-use.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
SourceLocation getBeginLoc() const LLVM_READONLY
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setNonMemberOperator()
Specifies that this declaration is a C++ overloaded non-member.
void setLexicalDeclContext(DeclContext *DC)
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
DeclarationNameLoc - Additional source/type location info for a declaration name.
static DeclarationNameLoc makeNamedTypeLoc(TypeSourceInfo *TInfo)
Construct location information for a constructor, destructor or conversion operator.
The name of a declaration.
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
TemplateParameterList * getTemplateParameterList(unsigned index) const
SourceLocation getTypeSpecStartLoc() const
SourceLocation getBeginLoc() const LLVM_READONLY
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
unsigned getNumTemplateParameterLists() const
void setTypeSourceInfo(TypeSourceInfo *TI)
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypeSourceInfo * getTypeSourceInfo() const
A decomposition declaration.
ArrayRef< BindingDecl * > bindings() const
static DecompositionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation LSquareLoc, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< BindingDecl * > Bindings)
Provides information about a dependent function-template specialization declaration.
RAII object that enters a new function expression evaluation context.
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
enumerator_range enumerators() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists,...
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
EnumDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
EnumDecl * getDefinition() const
TemplateSpecializationKind getTemplateSpecializationKind() const
If this enumeration is a member of a specialization of a templated class, determine what kind of temp...
Store information needed for an explicit specifier.
ExplicitSpecKind getKind() const
bool isInvalid() const
Determine if the explicit specifier is invalid.
static ExplicitSpecifier Invalid()
const Expr * getExpr() const
static ExplicitSpecifier getFromDecl(FunctionDecl *Function)
This represents one expression.
static bool isPotentialConstantExprUnevaluated(Expr *E, const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExprUnevaluated - Return true if this expression might be usable in a constant exp...
bool isValueDependent() const
Determines whether the value of this expression depends on.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
bool isConstantInitializer(ASTContext &Ctx, bool ForRef, const Expr **Culprit=nullptr) const
isConstantInitializer - Returns true if this expression can be emitted to IR as a constant,...
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Declaration context for names declared as extern "C" in C++.
Abstract interface for external sources of AST nodes.
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
bool isUnsupportedFriend() const
Determines if this friend kind is unsupported.
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, SourceLocation FriendL, SourceLocation EllipsisLoc={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
SourceLocation getFriendLoc() const
Retrieves the location of the 'friend' keyword.
void setUnsupportedFriend(bool Unsupported)
SourceRange getSourceRange() const override LLVM_READONLY
Retrieves the source range for the friend declaration.
SourceLocation getEllipsisLoc() const
Retrieves the location of the '...', if present.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
bool isPackExpansion() const
Declaration of a friend template.
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Represents a function declaration or definition.
void setInstantiationIsPending(bool IC)
State that the instantiation of this function is pending.
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
const ParmVarDecl * getParamDecl(unsigned i) const
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
ConstexprSpecKind getConstexprKind() const
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
bool UsesFPIntrin() const
Determine whether the function was declared in source context that requires constrained FP intrinsics...
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
FunctionDecl * getTemplateInstantiationPattern(bool ForDefinition=true) const
Retrieve the function declaration from which this function could be instantiated, if it is an instant...
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
bool hasWrittenPrototype() const
Whether this function has a written prototype.
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
DependentFunctionTemplateSpecializationInfo * getDependentSpecializationInfo() const
bool isDeleted() const
Whether this function has been deleted.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a member function.
bool FriendConstraintRefersToEnclosingTemplate() const
bool isDeletedAsWritten() const
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
bool hasSkippedBody() const
True if the function was a definition but its body was skipped.
FunctionDecl * getDefinition()
Get the definition for this declaration.
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
bool isDefaulted() const
Whether this function is defaulted.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
DeclarationNameInfo getNameInfo() const
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
DefaultedOrDeletedFunctionInfo * getDefalutedOrDeletedInfo() const
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
const ASTTemplateArgumentListInfo * getTemplateSpecializationArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
Represents a prototype with parameter type info, e.g.
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
QualType getParamType(unsigned i) const
bool hasExceptionSpec() const
Return whether this function has any kind of exception spec.
ExtProtoInfo getExtProtoInfo() const
FunctionDecl * getExceptionSpecTemplate() const
If this function type has an uninstantiated exception specification, this is the function whose excep...
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionTemplateDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionTemplateDecl * getInstantiatedFromMemberTemplate() const
void setInstantiatedFromMemberTemplate(FunctionTemplateDecl *D)
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
ParmVarDecl * getParam(unsigned i) const
void setParam(unsigned i, ParmVarDecl *VD)
ExtInfo getExtInfo() const
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
QualType getReturnType() const
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
Represents a field injected from an anonymous union/struct into the parent scope.
unsigned getChainingSize() const
static IndirectFieldDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, const IdentifierInfo *Id, QualType T, MutableArrayRef< NamedDecl * > CH)
ArrayRef< NamedDecl * > chain() const
Description of a constructor that was inherited from a base class.
const TypeClass * getTypePtr() const
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Represents the declaration of a label.
static LabelDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdentL, IdentifierInfo *II)
A stack-allocated class that identifies which local variable declaration instantiations are present i...
SmallVector< ValueDecl *, 4 > DeclArgumentPack
A set of declarations.
void InstantiatedLocal(const Decl *D, Decl *Inst)
void InstantiatedLocalPackArg(const Decl *D, VarDecl *Inst)
void MakeInstantiatedLocalArgPack(const Decl *D)
Represents the results of name lookup.
An instance of this class represents the declaration of a property member.
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
IdentifierInfo * getGetterId() const
IdentifierInfo * getSetterId() const
Provides information a specialization of a member of a class template, which may be a member function...
Data structure that captures multiple levels of template argument lists for use in template instantia...
const ArgList & getInnermost() const
Retrieve the innermost template argument list.
void addOuterTemplateArguments(Decl *AssociatedDecl, ArgList Args, bool Final)
Add a new outmost level to the multi-level template argument list.
void setKind(TemplateSubstitutionKind K)
void addOuterRetainedLevels(unsigned Num)
unsigned getNumRetainedOuterLevels() const
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
bool hasLinkage() const
Determine whether this declaration has linkage.
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Represents a C++ namespace alias.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
SourceLocation getAliasLoc() const
Returns the location of the alias name, i.e.
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
SourceLocation getNamespaceLoc() const
Returns the location of the namespace keyword.
SourceLocation getTargetNameLoc() const
Returns the location of the identifier in the named namespace.
NamespaceDecl * getNamespace()
Retrieve the namespace declaration aliased by this directive.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
bool hasQualifier() const
Evaluates true when this nested-name-specifier location is non-empty.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
TypeSourceInfo * getExpansionTypeSourceInfo(unsigned I) const
Retrieve a particular expansion type source info within an expanded parameter pack.
unsigned getNumExpansionTypes() const
Retrieves the number of expansion types in an expanded parameter pack.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Expr * getPlaceholderTypeConstraint() const
Return the constraint introduced by the placeholder type of this non-type template parameter (if any)...
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
This represents 'pragma omp allocate ...' directive.
clauselist_range clauselists()
Pseudo declaration for capturing expressions.
This represents 'pragma omp declare mapper ...' directive.
OMPDeclareMapperDecl * getPrevDeclInScope()
Get reference to previous declare mapper construct in the same scope with the same name.
clauselist_iterator clauselist_begin()
clauselist_range clauselists()
DeclarationName getVarName()
Get the name of the variable declared in the mapper.
Expr * getMapperVarRef()
Get the variable declared in the mapper.
This represents 'pragma omp declare reduction ...' directive.
Expr * getInitializer()
Get initializer expression (if specified) of the declare reduction construct.
Expr * getInitPriv()
Get Priv variable of the initializer.
Expr * getCombinerOut()
Get Out variable of the combiner.
Expr * getCombinerIn()
Get In variable of the combiner.
Expr * getCombiner()
Get combiner expression of the declare reduction construct.
OMPDeclareReductionDecl * getPrevDeclInScope()
Get reference to previous declare reduction construct in the same scope with the same name.
Expr * getInitOrig()
Get Orig variable of the initializer.
OMPDeclareReductionInitKind getInitializerKind() const
Get initializer kind.
This represents 'pragma omp groupprivate ...' directive.
This represents 'pragma omp requires...' directive.
This represents 'pragma omp threadprivate ...' directive.
Helper data structure representing the traits in a match clause of an declare variant or metadirectiv...
bool anyScoreOrCondition(llvm::function_ref< bool(Expr *&, bool)> Cond)
Represents a field declaration created by an @defs(...).
static OpaquePtr make(QualType P)
static OpenACCBindClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, const IdentifierInfo *ID, SourceLocation EndLoc)
OpenACCDirectiveKind getDirectiveKind() const
ArrayRef< const OpenACCClause * > clauses() const
SourceLocation getDirectiveLoc() const
static OpenACCCopyClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyInClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCopyOutClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCCreateClause * Create(const ASTContext &C, OpenACCClauseKind Spelling, SourceLocation BeginLoc, SourceLocation LParenLoc, OpenACCModifierKind Mods, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDevicePtrClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCDeviceResidentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
A 'device_type' or 'dtype' clause, takes a list of either an 'asterisk' or an identifier.
static OpenACCDeviceTypeClause * Create(const ASTContext &C, OpenACCClauseKind K, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< DeviceTypeArgument > Archs, SourceLocation EndLoc)
static OpenACCLinkClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
static OpenACCNoHostClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCPresentClause * Create(const ASTContext &C, SourceLocation BeginLoc, SourceLocation LParenLoc, ArrayRef< Expr * > VarList, SourceLocation EndLoc)
SourceLocation getRParenLoc() const
const Expr * getFunctionReference() const
SourceLocation getLParenLoc() const
static OpenACCSeqClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation EndLoc)
static OpenACCVectorClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
static OpenACCWorkerClause * Create(const ASTContext &Ctx, SourceLocation BeginLoc, SourceLocation LParenLoc, Expr *IntExpr, SourceLocation EndLoc)
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a parameter to a function.
Represents a #pragma detect_mismatch line.
PrettyDeclStackTraceEntry - If a crash occurs in the parser while parsing something related to a decl...
A (possibly-)qualified type.
bool isRestrictQualified() const
Determine whether this type is restrict-qualified.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getAtomicUnqualifiedType() const
Remove all qualifiers including _Atomic.
The collection of all-type qualifiers we support.
Represents a struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Wrapper for source info for record types.
Declaration of a redeclarable template.
void setInstantiatedFromMemberTemplate(RedeclarableTemplateDecl *TD)
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Represents the body of a requires-expression.
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
Scope - A scope is a transient data structure that is used while parsing the program.
void addAMDGPUFlatWorkGroupSizeAttr(Decl *D, const AttributeCommonInfo &CI, Expr *Min, Expr *Max)
addAMDGPUFlatWorkGroupSizeAttr - Adds an amdgpu_flat_work_group_size attribute to a particular declar...
void addAMDGPUWavesPerEUAttr(Decl *D, const AttributeCommonInfo &CI, Expr *Min, Expr *Max)
addAMDGPUWavePersEUAttr - Adds an amdgpu_waves_per_eu attribute to a particular declaration.
void addAMDGPUMaxNumWorkGroupsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *XExpr, Expr *YExpr, Expr *ZExpr)
addAMDGPUMaxNumWorkGroupsAttr - Adds an amdgpu_max_num_work_groups attribute to a particular declarat...
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void checkAllowedInitializer(VarDecl *VD)
QualType getInoutParameterType(QualType Ty)
bool inferObjCARCLifetime(ValueDecl *decl)
void AddXConsumedAttr(Decl *D, const AttributeCommonInfo &CI, Sema::RetainOwnershipKind K, bool IsTemplateInstantiation)
A type to represent all the data for an OpenACC Clause that has been parsed, but not yet created/sema...
OpenACCDirectiveKind getDirectiveKind() const
OpenACCClauseKind getClauseKind() const
void ActOnOpenMPDeclareVariantDirective(FunctionDecl *FD, Expr *VariantRef, OMPTraitInfo &TI, ArrayRef< Expr * > AdjustArgsNothing, ArrayRef< Expr * > AdjustArgsNeedDevicePtr, ArrayRef< Expr * > AdjustArgsNeedDeviceAddr, ArrayRef< OMPInteropInfo > AppendArgs, SourceLocation AdjustArgsLoc, SourceLocation AppendArgsLoc, SourceRange SR)
Called on well-formed '#pragma omp declare variant' after parsing of the associated method/function.
std::optional< std::pair< FunctionDecl *, Expr * > > checkOpenMPDeclareVariantFunction(DeclGroupPtrTy DG, Expr *VariantRef, OMPTraitInfo &TI, unsigned NumAppendArgs, SourceRange SR)
Checks '#pragma omp declare variant' variant function and original functions after parsing of the ass...
DeclGroupPtrTy ActOnOpenMPDeclareSimdDirective(DeclGroupPtrTy DG, OMPDeclareSimdDeclAttr::BranchStateTy BS, Expr *Simdlen, ArrayRef< Expr * > Uniforms, ArrayRef< Expr * > Aligneds, ArrayRef< Expr * > Alignments, ArrayRef< Expr * > Linears, ArrayRef< unsigned > LinModifiers, ArrayRef< Expr * > Steps, SourceRange SR)
Called on well-formed '#pragma omp declare simd' after parsing of the associated method/function.
void AddParameterABIAttr(Decl *D, const AttributeCommonInfo &CI, ParameterABI abi)
RAII object used to change the argument pack substitution index within a Sema object.
RAII object used to temporarily allow the C++ 'this' expression to be used, with the given qualifiers...
CXXSpecialMemberKind asSpecialMember() const
A helper class for building up ExtParameterInfos.
Records and restores the CurFPFeatures state on entry/exit of compound statements.
RAII class used to indicate that we are performing provisional semantic analysis to determine the val...
Sema - This implements semantic analysis and AST building for C.
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
SmallVector< CodeSynthesisContext, 16 > CodeSynthesisContexts
List of active code synthesis contexts.
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
@ LookupRedeclarationWithLinkage
Look up an ordinary name that is going to be redeclared as a name with linkage.
Decl * ActOnSkippedFunctionBody(Decl *Decl)
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param)
void AddAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, bool IsPackExpansion)
AddAlignedAttr - Adds an aligned attribute to a particular declaration.
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
void InstantiateExceptionSpec(SourceLocation PointOfInstantiation, FunctionDecl *Function)
void AddAssumeAlignedAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E, Expr *OE)
AddAssumeAlignedAttr - Adds an assume_aligned attribute to a particular declaration.
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
void deduceOpenCLAddressSpace(ValueDecl *decl)
PragmaStack< FPOptionsOverride > FpPragmaStack
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
VarTemplateSpecializationDecl * BuildVarTemplateInstantiation(VarTemplateDecl *VarTemplate, VarDecl *FromVar, const TemplateArgumentList *PartialSpecArgs, SmallVectorImpl< TemplateArgument > &Converted, SourceLocation PointOfInstantiation, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *StartingScope=nullptr)
Decl * ActOnFinishFunctionBody(Decl *Decl, Stmt *Body, bool IsInstantiation=false, bool RetainFunctionScopeInfo=false)
Performs semantic analysis at the end of a function body.
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
ExpressionEvaluationContextRecord & parentEvaluationContext()
LateParsedTemplateMapT LateParsedTemplateMap
bool SubstExprs(ArrayRef< Expr * > Exprs, bool IsCall, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< Expr * > &Outputs)
Substitute the given template arguments into a list of expressions, expanding pack expansions if requ...
StmtResult SubstStmt(Stmt *S, const MultiLevelTemplateArgumentList &TemplateArgs)
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
void InstantiateMemInitializers(CXXConstructorDecl *New, const CXXConstructorDecl *Tmpl, const MultiLevelTemplateArgumentList &TemplateArgs)
void CleanupVarDeclMarking()
ASTContext & getASTContext() const
TypeSourceInfo * SubstType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, bool AllowDeducedTST=false)
Perform substitution on the type T with a given set of template arguments.
void InstantiateVariableDefinition(SourceLocation PointOfInstantiation, VarDecl *Var, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given variable from its template.
SmallVector< LateInstantiatedAttribute, 1 > LateInstantiatedAttrVec
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
void HandleDependentAccessCheck(const DependentDiagnostic &DD, const MultiLevelTemplateArgumentList &TemplateArgs)
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
NamedReturnInfo getNamedReturnInfo(Expr *&E, SimplerImplicitMoveMode Mode=SimplerImplicitMoveMode::Normal)
Determine whether the given expression might be move-eligible or copy-elidable in either a (co_)retur...
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
const LangOptions & getLangOpts() const
void AddModeAttr(Decl *D, const AttributeCommonInfo &CI, IdentifierInfo *Name, bool InInstantiation=false)
AddModeAttr - Adds a mode attribute to a particular declaration.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
const LangOptions & LangOpts
Decl * ActOnStartOfFunctionDef(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists, SkipBodyInfo *SkipBody=nullptr, FnBodyKind BodyKind=FnBodyKind::Other)
VarTemplateSpecializationDecl * CompleteVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *VarSpec, VarDecl *PatternDecl, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiates a variable template specialization by completing it with appropriate type information an...
void updateAttrsForLateParsedTemplate(const Decl *Pattern, Decl *Inst)
Update instantiation attributes after template was late parsed.
void InstantiateVariableInitializer(VarDecl *Var, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the initializer of a variable.
SmallVector< PendingImplicitInstantiation, 1 > LateParsedInstantiations
Queue of implicit template instantiations that cannot be performed eagerly.
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
const VarDecl * getCopyElisionCandidate(NamedReturnInfo &Info, QualType ReturnType)
Updates given NamedReturnInfo's move-eligible and copy-elidable statuses, considering the function re...
void AddAllocAlignAttr(Decl *D, const AttributeCommonInfo &CI, Expr *ParamExpr)
AddAllocAlignAttr - Adds an alloc_align attribute to a particular declaration.
UnsignedOrNone getNumArgumentsInExpansion(QualType T, const MultiLevelTemplateArgumentList &TemplateArgs)
Determine the number of arguments in the given pack expansion type.
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
ExplicitSpecifier instantiateExplicitSpecifier(const MultiLevelTemplateArgumentList &TemplateArgs, ExplicitSpecifier ES)
bool CheckVariableDeclaration(VarDecl *NewVD, LookupResult &Previous)
Perform semantic checking on a newly-created variable declaration.
sema::BlockScopeInfo * getCurBlock()
Retrieve the current block, if any.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MultiLevelTemplateArgumentList getTemplateInstantiationArgs(const NamedDecl *D, const DeclContext *DC=nullptr, bool Final=false, std::optional< ArrayRef< TemplateArgument > > Innermost=std::nullopt, bool RelativeToPrimary=false, const FunctionDecl *Pattern=nullptr, bool ForConstraintInstantiation=false, bool SkipForSpecialization=false, bool ForDefaultArgumentSubstitution=false)
Retrieve the template argument list(s) that should be used to instantiate the definition of the given...
std::deque< PendingImplicitInstantiation > PendingLocalImplicitInstantiations
The queue of implicit template instantiations that are required and must be performed within the curr...
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
SourceManager & getSourceManager() const
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
void PerformPendingInstantiations(bool LocalOnly=false, bool AtEndOfTU=true)
Performs template instantiation for all implicit template instantiations we have seen until this poin...
Decl * SubstDecl(Decl *D, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs)
void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, ArrayRef< CXXCtorInitializer * > MemInits, bool AnyErrors)
ActOnMemInitializers - Handle the member initializers for a constructor.
TemplateParameterList * SubstTemplateParams(TemplateParameterList *Params, DeclContext *Owner, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraints=true)
void AddLaunchBoundsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *MaxThreads, Expr *MinBlocks, Expr *MaxBlocks)
AddLaunchBoundsAttr - Adds a launch_bounds attribute to a particular declaration.
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
RedeclarationKind forRedeclarationInCurContext() const
void InstantiateFunctionDefinition(SourceLocation PointOfInstantiation, FunctionDecl *Function, bool Recursive=false, bool DefinitionRequired=false, bool AtEndOfTU=false)
Instantiate the definition of the given function from its template.
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
bool SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
void InstantiateAttrsForDecl(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
std::deque< PendingImplicitInstantiation > PendingInstantiations
The queue of implicit template instantiations that are required but have not yet been performed.
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
void addClusterDimsAttr(Decl *D, const AttributeCommonInfo &CI, Expr *X, Expr *Y, Expr *Z)
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
LateTemplateParserCB * LateTemplateParser
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true, bool *Unreachable=nullptr)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
SourceManager & SourceMgr
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
bool CheckAlignasTypeArgument(StringRef KWName, TypeSourceInfo *TInfo, SourceLocation OpLoc, SourceRange R)
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
Attr * CreateAnnotationAttr(const AttributeCommonInfo &CI, StringRef Annot, MutableArrayRef< Expr * > Args)
CreateAnnotationAttr - Creates an annotation Annot with Args arguments.
@ TPC_FriendFunctionTemplate
@ TPC_FriendFunctionTemplateDefinition
void DiagnoseUnusedDecl(const NamedDecl *ND)
void ActOnUninitializedDecl(Decl *dcl)
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
void BuildVariableInstantiation(VarDecl *NewVar, VarDecl *OldVar, const MultiLevelTemplateArgumentList &TemplateArgs, LateInstantiatedAttrVec *LateAttrs, DeclContext *Owner, LocalInstantiationScope *StartingScope, bool InstantiatingVarTemplate=false, VarTemplateSpecializationDecl *PrevVTSD=nullptr)
BuildVariableInstantiation - Used after a new variable has been created.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
std::pair< ValueDecl *, SourceLocation > PendingImplicitInstantiation
An entity for which implicit template instantiation is required.
DeclContext * FindInstantiatedContext(SourceLocation Loc, DeclContext *DC, const MultiLevelTemplateArgumentList &TemplateArgs)
Finds the instantiation of the given declaration context within the current instantiation.
void AddAlignValueAttr(Decl *D, const AttributeCommonInfo &CI, Expr *E)
AddAlignValueAttr - Adds an align_value attribute to a particular declaration.
ArrayRef< sema::FunctionScopeInfo * > getFunctionScopes() const
void PerformDependentDiagnostics(const DeclContext *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
ASTMutationListener * getASTMutationListener() const
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Encodes a location in the source.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
Represents a C++11 static_assert declaration.
SourceLocation getRParenLoc() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
SourceLocation getBeginLoc() const LLVM_READONLY
Represents the declaration of a struct/union/class/enum.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier (with source-location information) that qualifies the name of this...
TypedefNameDecl * getTypedefNameForAnonDecl() const
void setTypedefNameForAnonDecl(TypedefNameDecl *TDD)
void setQualifierInfo(NestedNameSpecifierLoc QualifierLoc)
bool hasNameForLinkage() const
Is this tag type named, either directly or via being defined in a typedef of this type?
TagKind getTagKind() const
SourceLocation getNameLoc() const
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
void setNameLoc(SourceLocation Loc)
void setElaboratedKeywordLoc(SourceLocation Loc)
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
void addArgument(const TemplateArgumentLoc &Loc)
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
SourceLocation getTemplateNameLoc() const
SourceLocation getTemplateKWLoc() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
@ Pack
The template argument is actually a parameter pack.
@ RewriteSpaceshipAsEqualEqual
void setEvaluateConstraints(bool B)
Decl * VisitDecl(Decl *D)
VarTemplateSpecializationDecl * VisitVarTemplateSpecializationDecl(VarTemplateDecl *VarTemplate, VarDecl *FromVar, ArrayRef< TemplateArgument > Converted, VarTemplateSpecializationDecl *PrevDecl=nullptr)
Decl * VisitVarDecl(VarDecl *D, bool InstantiatingVarTemplate, ArrayRef< BindingDecl * > *Bindings=nullptr)
bool InitMethodInstantiation(CXXMethodDecl *New, CXXMethodDecl *Tmpl)
Initializes common fields of an instantiated method declaration (New) from the corresponding fields o...
bool InitFunctionInstantiation(FunctionDecl *New, FunctionDecl *Tmpl)
Initializes the common fields of an instantiation function declaration (New) from the corresponding f...
VarTemplatePartialSpecializationDecl * InstantiateVarTemplatePartialSpecialization(VarTemplateDecl *VarTemplate, VarTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a variable template partial specialization.
void adjustForRewrite(RewriteKind RK, FunctionDecl *Orig, QualType &T, TypeSourceInfo *&TInfo, DeclarationNameInfo &NameInfo)
TypeSourceInfo * SubstFunctionType(FunctionDecl *D, SmallVectorImpl< ParmVarDecl * > &Params)
void InstantiateEnumDefinition(EnumDecl *Enum, EnumDecl *Pattern)
Decl * VisitFunctionDecl(FunctionDecl *D, TemplateParameterList *TemplateParams, RewriteKind RK=RewriteKind::None)
Normal class members are of more specific types and therefore don't make it here.
Decl * VisitCXXMethodDecl(CXXMethodDecl *D, TemplateParameterList *TemplateParams, RewriteKind RK=RewriteKind::None)
Decl * InstantiateTypeAliasTemplateDecl(TypeAliasTemplateDecl *D)
Decl * VisitBaseUsingDecls(BaseUsingDecl *D, BaseUsingDecl *Inst, LookupResult *Lookup)
bool SubstQualifier(const DeclaratorDecl *OldDecl, DeclaratorDecl *NewDecl)
TemplateParameterList * SubstTemplateParams(TemplateParameterList *List)
Instantiates a nested template parameter list in the current instantiation context.
Decl * InstantiateTypedefNameDecl(TypedefNameDecl *D, bool IsTypeAlias)
ClassTemplatePartialSpecializationDecl * InstantiateClassTemplatePartialSpecialization(ClassTemplateDecl *ClassTemplate, ClassTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a class template partial specialization.
bool SubstDefaultedFunction(FunctionDecl *New, FunctionDecl *Tmpl)
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
bool isNull() const
Determine whether this template name is NULL.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SourceRange getSourceRange() const LLVM_READONLY
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
ArrayRef< NamedDecl * > asArray()
SourceLocation getTemplateLoc() const
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
bool wasDeclaredWithTypename() const
Whether this template template parameter was declared with the 'typename' keyword.
TemplateParameterList * getExpansionTemplateParameters(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
unsigned getNumExpansionTemplateParameters() const
Retrieves the number of expansion template parameters in an expanded parameter pack.
TemplateNameKind templateParameterKind() const
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, TemplateNameKind ParameterKind, bool Typename, TemplateParameterList *Params)
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
unsigned getDepth() const
Get the nesting depth of the template parameter.
bool isExpandedParameterPack() const
Whether this parameter is a template template parameter pack that has a known list of different templ...
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
bool wasDeclaredWithTypename() const
Whether this template type parameter was declared with the 'typename' keyword.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getIndex() const
Retrieve the index of the template parameter.
bool hasTypeConstraint() const
Determine whether this template parameter has a type-constraint.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
UnsignedOrNone getNumExpansionParameters() const
Whether this parameter is a template type parameter pack that has a known list of different type-cons...
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool isParameterPack() const
Returns whether this is a parameter pack.
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
unsigned getDepth() const
Retrieve the depth of the template parameter.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
bool isPackExpansion() const
Whether this parameter pack is a pack expansion.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Declaration of an alias template.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
const Type * getTypeForDecl() const
SourceLocation getBeginLoc() const LLVM_READONLY
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
void pushTrivial(ASTContext &Context, QualType T, SourceLocation Loc)
Pushes 'T' with all locations pointing to 'Loc'.
Base wrapper for a particular "section" of type source info.
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
TypeLoc IgnoreParens() const
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
AutoTypeLoc getContainedAutoTypeLoc() const
Get the typeloc of an AutoType whose type will be deduced for a variable with an initializer of this ...
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
SourceLocation getBeginLoc() const
Get the begin source location.
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
QualType getType() const
Return the type wrapped by this type source info.
The base class of the type hierarchy.
bool isRValueReferenceType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isLValueReferenceType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isTemplateTypeParmType() const
bool isAtomicType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
bool isFunctionType() const
const T * getAs() const
Member-template getAs<specific type>'.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
static TypedefDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Base class for declarations which introduce a typedef-name.
TypeSourceInfo * getTypeSourceInfo() const
QualType getUnderlyingType() const
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Represents a dependent using declaration which was marked with typename.
SourceLocation getTypenameLoc() const
Returns the source location of the 'typename' keyword.
Represents a dependent using declaration which was not marked with typename.
Represents a C++ using-declaration.
bool hasTypename() const
Return true if the using declaration has 'typename'.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name, with source-location information.
DeclarationNameInfo getNameInfo() const
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Represents C++ using-directive.
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
NamespaceDecl * getNominatedNamespace()
Returns the namespace nominated by this using-directive.
DeclContext * getCommonAncestor()
Returns the common ancestor context of this using-directive and its nominated namespace.
SourceLocation getNamespaceKeyLocation() const
Returns the location of the namespace keyword.
SourceLocation getIdentLocation() const
Returns the location of this using declaration's identifier.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies the name of the namespace, with source-location inf...
Represents a C++ using-enum-declaration.
SourceLocation getEnumLoc() const
The source location of the 'enum' keyword.
EnumDecl * getEnumDecl() const
TypeSourceInfo * getEnumType() const
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
SourceLocation getUsingLoc() const
The source location of the 'using' keyword.
Represents a pack of using declarations that a single using-declarator pack-expanded into.
ArrayRef< NamedDecl * > expansions() const
Get the set of using declarations that this pack expanded into.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
void setType(QualType newType)
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
void setObjCForDecl(bool FRD)
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
void setCXXForRangeDecl(bool FRD)
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
void setInstantiationOfStaticDataMember(VarDecl *VD, TemplateSpecializationKind TSK)
Specify that this variable is an instantiation of the static data member VD.
TLSKind getTLSKind() const
void setInitStyle(InitializationStyle Style)
VarDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
InitializationStyle getInitStyle() const
The style of initialization for this declaration.
void setInitCapture(bool IC)
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
bool isOutOfLine() const override
Determine whether this is or was instantiated from an out-of-line definition of a static data member.
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
@ CallInit
Call-style initialization (C++98)
bool isObjCForDecl() const
Determine whether this variable is a for-loop declaration for a for-in statement in Objective-C.
void setPreviousDeclInSameBlockScope(bool Same)
bool isInlineSpecified() const
bool isStaticDataMember() const
Determines whether this is a static data member.
VarDecl * getTemplateInstantiationPattern() const
Retrieve the variable declaration from which this variable could be instantiated, if it is an instant...
bool isCXXForRangeDecl() const
Determine whether this variable is the for-range-declaration in a C++0x for-range statement.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool mightBeUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value might be usable in a constant expression, according to the re...
bool isNRVOVariable() const
Determine whether this local variable can be used with the named return value optimization (NRVO).
void setInlineSpecified()
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
void setTSCSpec(ThreadStorageClassSpecifier TSC)
void setNRVOVariable(bool NRVO)
bool isInline() const
Whether this variable is (C++1z) inline.
ThreadStorageClassSpecifier getTSCSpec() const
const Expr * getInit() const
void setConstexpr(bool IC)
void setDescribedVarTemplate(VarTemplateDecl *Template)
bool isDirectInit() const
Whether the initializer is a direct-initializer (list or call).
StorageClass getStorageClass() const
Returns the storage class as written in the source.
void setImplicitlyInline()
bool isPreviousDeclInSameBlockScope() const
Whether this local extern variable declaration's previous declaration was declared in the same block ...
VarDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
SourceLocation getPointOfInstantiation() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
TemplateSpecializationKind getTemplateSpecializationKindForInstantiation() const
Get the template specialization kind of this variable for the purposes of template instantiation.
TemplateSpecializationKind getTemplateSpecializationKind() const
If this variable is an instantiation of a variable template or a static data member of a class templa...
Declaration of a variable template.
VarDecl * getTemplatedDecl() const
Get the underlying variable declarations of the template.
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
llvm::FoldingSetVector< VarTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
VarTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
VarTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(VarTemplatePartialSpecializationDecl *D)
Find a variable template partial specialization which was instantiated from the given member partial ...
static VarTemplatePartialSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
void setInstantiatedFromMember(VarTemplatePartialSpecializationDecl *PartialSpec)
Represents a variable template specialization, which refers to a variable template with a given set o...
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
void setTemplateArgsAsWritten(const ASTTemplateArgumentListInfo *ArgsWritten)
Set the template argument list as written in the sources.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate the initializer of the vari...
static VarTemplateSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
llvm::PointerUnion< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the variable template or variable template partial specialization which was specialized by t...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
void setCompleteDefinition()
Decl * Visit(PTR(Decl) D)
QualType FunctionType
BlockType - The function type of the block, if one was given.
void addCapture(ValueDecl *Var, bool isBlock, bool isByref, bool isNested, SourceLocation Loc, SourceLocation EllipsisLoc, QualType CaptureType, bool Invalid)
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
bool NE(InterpState &S, CodePtr OpPC)
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Attr * instantiateTemplateAttribute(const Attr *At, ASTContext &C, Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs)
Attr * instantiateTemplateAttributeForDecl(const Attr *At, ASTContext &C, Sema &S, const MultiLevelTemplateArgumentList &TemplateArgs)
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
bool isa(CodeGen::Address addr)
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
@ Rewrite
We are substituting template parameters for (typically) other template parameters in order to rewrite...
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
@ DevicePtr
'deviceptr' clause, allowed on Compute and Combined Constructs, plus 'data' and 'declare'.
@ VectorLength
'vector_length' clause, allowed on 'parallel', 'kernels', 'parallel loop', and 'kernels loop' constru...
@ Async
'async' clause, allowed on Compute, Data, 'update', 'wait', and Combined constructs.
@ Collapse
'collapse' clause, allowed on 'loop' and Combined constructs.
@ DeviceNum
'device_num' clause, allowed on 'init', 'shutdown', and 'set' constructs.
@ DefaultAsync
'default_async' clause, allowed on 'set' construct.
@ Attach
'attach' clause, allowed on Compute and Combined constructs, plus 'data' and 'enter data'.
@ NumGangs
'num_gangs' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ UseDevice
'use_device' clause, allowed on 'host_data' construct.
@ NoCreate
'no_create' clause, allowed on allowed on Compute and Combined constructs, plus 'data'.
@ Reduction
'reduction' clause, allowed on Parallel, Serial, Loop, and the combined constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ FirstPrivate
'firstprivate' clause, allowed on 'parallel', 'serial', 'parallel loop', and 'serial loop' constructs...
@ Tile
'tile' clause, allowed on 'loop' and Combined constructs.
@ Independent
'independent' clause, allowed on 'loop' directives.
@ NumWorkers
'num_workers' clause, allowed on 'parallel', 'kernels', parallel loop', and 'kernels loop' constructs...
@ IfPresent
'if_present' clause, allowed on 'host_data' and 'update' directives.
@ Detach
'detach' clause, allowed on the 'exit data' construct.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ Finalize
'finalize' clause, allowed on 'exit data' directive.
StorageClass
Storage classes.
bool isGenericLambdaCallOperatorOrStaticInvokerSpecialization(const DeclContext *DC)
@ Property
The type of a property.
@ Result
The result type of a method or function.
ActionResult< CXXCtorInitializer * > MemInitResult
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
@ FunctionTemplate
The name was classified as a function template name.
@ VarTemplate
The name was classified as a variable template name.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
ActionResult< Expr * > ExprResult
@ Other
Other implicit parameter.
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_Uninstantiated
not instantiated yet
@ EST_None
no exception specification
@ EST_BasicNoexcept
noexcept
@ EST_Unevaluated
not evaluated yet, for special member function
ActionResult< Stmt * > StmtResult
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
ArrayRef< TemplateArgumentLoc > arguments() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
const DeclarationNameLoc & getInfo() const
TypeSourceInfo * getNamedTypeInfo() const
getNamedTypeInfo - Returns the source type info associated to the name.
Holds information about the various types of exception specification.
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
FunctionDecl * SourceTemplate
The function template whose exception specification this is instantiated from, for EST_Uninstantiated...
ExceptionSpecificationType Type
The kind of exception specification this is.
Extra information about a function prototype.
ExceptionSpecInfo ExceptionSpec
FunctionType::ExtInfo ExtInfo
bool StrictPackMatch
Is set to true when, in the context of TTP matching, a pack parameter matches non-pack arguments.
SmallVector< TemplateArgument, 4 > CanonicalConverted
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
SynthesisKind
The kind of template instantiation we are performing.
@ BuildingDeductionGuides
We are building deduction guides for a class.
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
bool InLifetimeExtendingContext
Whether we are currently in a context in which all temporaries must be lifetime-extended,...
bool RebuildDefaultArgOrDefaultInit
Whether we should rebuild CXXDefaultArgExpr and CXXDefaultInitExpr.
A stack object to be created when performing template instantiation.
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.