37#include "llvm/ADT/SmallVectorExtras.h"
38#include "llvm/ADT/StringExtras.h"
39#include "llvm/Support/ErrorHandling.h"
40#include "llvm/Support/SaveAndRestore.h"
41#include "llvm/Support/TimeProfiler.h"
54 const Decl *NextDecl =
nullptr;
56 bool ClearRelativeToPrimary =
true;
57 static Response Done() {
62 static Response ChangeDecl(
const Decl *ND) {
67 static Response ChangeDecl(
const DeclContext *Ctx) {
73 static Response UseNextDecl(
const Decl *CurDecl) {
77 static Response DontClearRelativeToPrimaryNextDecl(
const Decl *CurDecl) {
78 Response R = Response::UseNextDecl(CurDecl);
79 R.ClearRelativeToPrimary =
false;
88getPrimaryTemplateOfGenericLambda(
const FunctionDecl *LambdaCallOperator) {
90 return LambdaCallOperator;
92 if (
auto *FTD = dyn_cast_if_present<FunctionTemplateDecl>(
94 FTD && FTD->getInstantiatedFromMemberTemplate()) {
96 FTD->getInstantiatedFromMemberTemplate()->getTemplatedDecl();
103 ->getInstantiatedFromMemberFunction())
104 LambdaCallOperator = Prev;
108 return LambdaCallOperator;
111struct EnclosingTypeAliasTemplateDetails {
121EnclosingTypeAliasTemplateDetails
122getEnclosingTypeAliasTemplateDecl(
Sema &SemaRef) {
125 TypeAliasTemplateInstantiation)
127 EnclosingTypeAliasTemplateDetails Result;
129 *
Next = TATD->getInstantiatedFromMemberTemplate();
133 CSC.template_arguments(),
136 Result.PrimaryTypeAliasDecl =
Next;
137 Next =
Next->getInstantiatedFromMemberTemplate();
150bool isLambdaEnclosedByTypeAliasDecl(
154 Visitor(
const FunctionDecl *CallOperator) : CallOperator(CallOperator) {}
155 bool VisitLambdaExpr(
LambdaExpr *LE)
override {
158 return getPrimaryTemplateOfGenericLambda(LE->getCallOperator()) !=
167 return !Visitor(getPrimaryTemplateOfGenericLambda(LambdaCallOperator))
168 .TraverseType(Underlying);
175 bool SkipForSpecialization) {
179 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec);
184 return Response::Done();
189 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
192 dyn_cast<VarTemplatePartialSpecializationDecl *>(Specialized)) {
193 if (!SkipForSpecialization)
194 Result.addOuterTemplateArguments(
197 if (Partial->isMemberSpecialization())
198 return Response::Done();
201 if (!SkipForSpecialization)
202 Result.addOuterTemplateArguments(
206 return Response::Done();
208 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec);
220 for (
unsigned I = 0, N = TTP->
getDepth() + 1; I != N; ++I)
221 Result.addOuterTemplateArguments(std::nullopt);
222 return Response::Done();
225Response HandlePartialClassTemplateSpec(
228 if (!SkipForSpecialization)
230 return Response::Done();
237 bool SkipForSpecialization) {
242 return Response::Done();
244 if (!SkipForSpecialization)
245 Result.addOuterTemplateArguments(
254 return Response::Done();
260 if (
auto *InstFromPartialTempl =
263 return Response::ChangeDecl(
264 InstFromPartialTempl->getLexicalDeclContext());
266 return Response::UseNextDecl(ClassTemplSpec);
272 bool ForConstraintInstantiation,
273 bool ForDefaultArgumentSubstitution) {
275 if (!RelativeToPrimary &&
276 Function->getTemplateSpecializationKindForInstantiation() ==
278 return Response::Done();
280 if (!RelativeToPrimary &&
285 return Response::UseNextDecl(Function);
287 Function->getTemplateSpecializationArgs()) {
289 Result.addOuterTemplateArguments(
const_cast<FunctionDecl *
>(Function),
290 TemplateArgs->asArray(),
293 if (RelativeToPrimary &&
294 (Function->getTemplateSpecializationKind() ==
296 (Function->getFriendObjectKind() &&
297 !Function->getPrimaryTemplate()->getFriendObjectKind())))
298 return Response::UseNextDecl(Function);
302 assert(Function->getPrimaryTemplate() &&
"No function template?");
303 if (!ForDefaultArgumentSubstitution &&
304 Function->getPrimaryTemplate()->isMemberSpecialization())
305 return Response::Done();
308 if (!ForConstraintInstantiation &&
310 return Response::Done();
312 }
else if (
auto *
Template = Function->getDescribedFunctionTemplate()) {
314 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) &&
315 "Outer template not instantiated?");
316 if (ForConstraintInstantiation) {
324 Result.addOuterTemplateArguments(
Template, Inst.template_arguments(),
335 if ((Function->getFriendObjectKind() || Function->isLocalExternDecl()) &&
336 Function->getNonTransparentDeclContext()->isFileContext() &&
338 return Response::ChangeDecl(Function->getLexicalDeclContext());
341 if (ForConstraintInstantiation && Function->getFriendObjectKind())
342 return Response::ChangeDecl(Function->getLexicalDeclContext());
343 return Response::UseNextDecl(Function);
346Response HandleFunctionTemplateDecl(
Sema &SemaRef,
350 Result.addOuterTemplateArguments(
363 Ty = std::exchange(NextTy,
nullptr)) {
366 NextTy = P.getAsType();
367 const auto *TSTy = dyn_cast<TemplateSpecializationType>(Ty);
389 if (TSTy->isCurrentInstantiation()) {
390 auto *RD = TSTy->getCanonicalTypeInternal()->getAsCXXRecordDecl();
392 Arguments = CTD->getInjectedTemplateArgs(SemaRef.
Context);
394 dyn_cast<ClassTemplateSpecializationDecl>(RD))
395 Arguments =
Specialization->getTemplateInstantiationArgs().asArray();
397 Result.addOuterTemplateArguments(
398 TSTy->getTemplateName().getAsTemplateDecl(), Arguments,
409 bool ForConstraintInstantiation) {
412 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) &&
413 "Outer template not instantiated?");
414 if (ClassTemplate->isMemberSpecialization())
415 return Response::Done();
416 if (ForConstraintInstantiation)
417 Result.addOuterTemplateArguments(
419 ClassTemplate->getInjectedTemplateArgs(SemaRef.
Context),
426 return Response::Done();
431 if (ForConstraintInstantiation && IsFriend &&
440 return Response::ChangeDecl(LCD);
444 if (
auto TypeAlias = getEnclosingTypeAliasTemplateDecl(SemaRef);
445 ForConstraintInstantiation &&
TypeAlias) {
448 Result.addOuterTemplateArguments(
TypeAlias.Template,
464 return Response::ChangeDecl(
TypeAlias.Template->getDeclContext());
469 return Response::UseNextDecl(Rec);
472Response HandleImplicitConceptSpecializationDecl(
475 Result.addOuterTemplateArguments(
479 return Response::UseNextDecl(CSD);
482Response HandleGenericDeclContext(
const Decl *CurDecl) {
483 return Response::UseNextDecl(CurDecl);
491 const FunctionDecl *Pattern,
bool ForConstraintInstantiation,
492 bool SkipForSpecialization,
bool ForDefaultArgumentSubstitution) {
493 assert((ND || DC) &&
"Can't find arguments for a decl if one isn't provided");
498 const Decl *CurDecl = ND;
501 Result.addOuterTemplateArguments(
const_cast<NamedDecl *
>(ND), *Innermost,
511 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl))
512 HandleDefaultTempArgIntoTempTempParam(TTP,
Result);
514 : Response::UseNextDecl(CurDecl).NextDecl;
520 if (
const auto *VarTemplSpec =
521 dyn_cast<VarTemplateSpecializationDecl>(CurDecl)) {
522 R = HandleVarTemplateSpec(VarTemplSpec,
Result, SkipForSpecialization);
523 }
else if (
const auto *PartialClassTemplSpec =
524 dyn_cast<ClassTemplatePartialSpecializationDecl>(CurDecl)) {
525 R = HandlePartialClassTemplateSpec(PartialClassTemplSpec,
Result,
526 SkipForSpecialization);
527 }
else if (
const auto *ClassTemplSpec =
528 dyn_cast<ClassTemplateSpecializationDecl>(CurDecl)) {
529 R = HandleClassTemplateSpec(ClassTemplSpec,
Result,
530 SkipForSpecialization);
531 }
else if (
const auto *
Function = dyn_cast<FunctionDecl>(CurDecl)) {
532 R = HandleFunction(*
this,
Function,
Result, Pattern, RelativeToPrimary,
533 ForConstraintInstantiation,
534 ForDefaultArgumentSubstitution);
535 }
else if (
const auto *Rec = dyn_cast<CXXRecordDecl>(CurDecl)) {
537 ForConstraintInstantiation);
538 }
else if (
const auto *CSD =
539 dyn_cast<ImplicitConceptSpecializationDecl>(CurDecl)) {
540 R = HandleImplicitConceptSpecializationDecl(CSD,
Result);
541 }
else if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(CurDecl)) {
542 R = HandleFunctionTemplateDecl(*
this, FTD,
Result);
543 }
else if (
const auto *CTD = dyn_cast<ClassTemplateDecl>(CurDecl)) {
544 R = Response::ChangeDecl(CTD->getLexicalDeclContext());
546 R = Response::DontClearRelativeToPrimaryNextDecl(CurDecl);
547 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl)) {
548 R = HandleDefaultTempArgIntoTempTempParam(TTP,
Result);
551 R = HandleGenericDeclContext(CurDecl);
556 if (R.ClearRelativeToPrimary)
557 RelativeToPrimary =
false;
559 CurDecl = R.NextDecl;
604 llvm_unreachable(
"Invalid SynthesisKind!");
615 if (
SemaRef.Diags.hasFatalErrorOccurred() &&
616 SemaRef.hasUncompilableErrorOccurred()) {
629 Inst.InConstraintSubstitution =
631 Inst.InParameterMappingSubstitution =
633 if (!
SemaRef.CodeSynthesisContexts.empty()) {
634 Inst.InConstraintSubstitution |=
635 SemaRef.CodeSynthesisContexts.back().InConstraintSubstitution;
636 Inst.InParameterMappingSubstitution |=
637 SemaRef.CodeSynthesisContexts.back().InParameterMappingSubstitution;
650 PointOfInstantiation, InstantiationRange, Entity) {}
657 PointOfInstantiation, InstantiationRange, Entity) {}
696 PointOfInstantiation, InstantiationRange, PartialSpec,
nullptr,
705 PointOfInstantiation, InstantiationRange, PartialSpec,
nullptr,
714 PointOfInstantiation, InstantiationRange, Param,
nullptr,
724 PointOfInstantiation, InstantiationRange, Param,
Template,
734 PointOfInstantiation, InstantiationRange, Param,
Template,
743 PointOfInstantiation, InstantiationRange, Entity,
752 PointOfInstantiation, InstantiationRange, Param,
Template,
760 PointOfInstantiation, InstantiationRange,
nullptr,
769 PointOfInstantiation, InstantiationRange,
nullptr,
777 PointOfInstantiation, InstantiationRange,
nullptr,
802 PointOfInstantiation, InstantiationRange,
Template) {}
810 PointOfInstantiation, InstantiationRange,
Template) {}
817 PointOfInstantiation, InstantiationRange, Entity) {}
823 ArgLoc, InstantiationRange, PArg) {}
829 assert(
SemaRef.NonInstantiationEntries <=
830 SemaRef.CodeSynthesisContexts.size());
831 if ((
SemaRef.CodeSynthesisContexts.size() -
832 SemaRef.NonInstantiationEntries) >
833 SemaRef.getLangOpts().InstantiationDepth) {
835 diag::err_template_recursion_depth_exceeded)
838 diag::note_template_recursion_depth)
839 <<
SemaRef.getLangOpts().InstantiationDepth;
854 if (!Active.isInstantiationRecord()) {
862 "forgot to remove a lookup module for a template instantiation");
882 SemaRef.CodeSynthesisContexts.back());
884 SemaRef.popCodeSynthesisContext();
892 llvm::raw_string_ostream
OS(Result);
893 llvm::ListSeparator Comma;
894 for (
const Expr *Arg : Args) {
896 Arg->IgnoreParens()->printPretty(
OS,
nullptr,
906 llvm::raw_string_ostream
OS(Result);
907 llvm::ListSeparator Comma;
909 for (
const Expr *Arg : Args) {
911 const char *ValueCategory =
913 : (EVK ==
VK_XValue ?
"xvalue" :
"prvalue"));
914 OS << Comma << ValueCategory <<
" of type '";
925 unsigned Limit =
Diags.getTemplateBacktraceLimit();
927 SkipStart = Limit / 2 + Limit % 2;
932 unsigned InstantiationIdx = 0;
937 ++Active, ++InstantiationIdx) {
939 if (InstantiationIdx >= SkipStart && InstantiationIdx < SkipEnd) {
940 if (InstantiationIdx == SkipStart) {
942 DiagFunc(Active->PointOfInstantiation,
943 PDiag(diag::note_instantiation_contexts_suppressed)
949 switch (Active->Kind) {
951 Decl *D = Active->Entity;
953 unsigned DiagID = diag::note_template_member_class_here;
955 DiagID = diag::note_template_class_instantiation_here;
956 DiagFunc(Active->PointOfInstantiation,
957 PDiag(DiagID) <<
Record << Active->InstantiationRange);
961 DiagID = diag::note_function_template_spec_here;
963 DiagID = diag::note_template_member_function_here;
964 DiagFunc(Active->PointOfInstantiation,
966 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(D)) {
967 DiagFunc(Active->PointOfInstantiation,
968 PDiag(VD->isStaticDataMember()
969 ? diag::note_template_static_data_member_def_here
970 : diag::note_template_variable_def_here)
971 << VD << Active->InstantiationRange);
972 }
else if (
EnumDecl *ED = dyn_cast<EnumDecl>(D)) {
973 DiagFunc(Active->PointOfInstantiation,
974 PDiag(diag::note_template_enum_def_here)
975 << ED << Active->InstantiationRange);
976 }
else if (
FieldDecl *FD = dyn_cast<FieldDecl>(D)) {
977 DiagFunc(Active->PointOfInstantiation,
978 PDiag(diag::note_template_nsdmi_here)
979 << FD << Active->InstantiationRange);
981 DiagFunc(Active->PointOfInstantiation,
982 PDiag(diag::note_template_class_instantiation_here)
983 << CTD << Active->InstantiationRange);
991 llvm::raw_svector_ostream
OS(TemplateArgsStr);
993 printTemplateArgumentList(
OS, Active->template_arguments(),
995 DiagFunc(Active->PointOfInstantiation,
996 PDiag(diag::note_default_arg_instantiation_here)
997 <<
OS.str() << Active->InstantiationRange);
1003 DiagFunc(Active->PointOfInstantiation,
1004 PDiag(diag::note_explicit_template_arg_substitution_here)
1008 Active->NumTemplateArgs)
1009 << Active->InstantiationRange);
1015 dyn_cast<FunctionTemplateDecl>(Active->Entity)) {
1017 Active->PointOfInstantiation,
1018 PDiag(diag::note_function_template_deduction_instantiation_here)
1021 FnTmpl->getTemplateParameters(), Active->TemplateArgs,
1022 Active->NumTemplateArgs)
1023 << Active->InstantiationRange);
1027 bool IsTemplate =
false;
1029 if (
auto *D = dyn_cast<TemplateDecl>(Active->Entity)) {
1031 Params = D->getTemplateParameters();
1032 }
else if (
auto *D = dyn_cast<ClassTemplatePartialSpecializationDecl>(
1034 Params = D->getTemplateParameters();
1035 }
else if (
auto *D = dyn_cast<VarTemplatePartialSpecializationDecl>(
1037 Params = D->getTemplateParameters();
1039 llvm_unreachable(
"unexpected template kind");
1042 DiagFunc(Active->PointOfInstantiation,
1043 PDiag(diag::note_deduced_template_arg_substitution_here)
1046 Active->TemplateArgs,
1047 Active->NumTemplateArgs)
1048 << Active->InstantiationRange);
1058 llvm::raw_svector_ostream
OS(TemplateArgsStr);
1060 printTemplateArgumentList(
OS, Active->template_arguments(),
1062 DiagFunc(Active->PointOfInstantiation,
1063 PDiag(diag::note_default_function_arg_instantiation_here)
1064 <<
OS.str() << Active->InstantiationRange);
1072 Name = std::string(
" '") + Parm->
getName().str() +
"'";
1076 TemplateParams =
Template->getTemplateParameters();
1080 ->getTemplateParameters();
1081 DiagFunc(Active->PointOfInstantiation,
1082 PDiag(diag::note_prior_template_arg_substitution)
1085 Active->TemplateArgs,
1086 Active->NumTemplateArgs)
1087 << Active->InstantiationRange);
1094 TemplateParams =
Template->getTemplateParameters();
1098 ->getTemplateParameters();
1100 DiagFunc(Active->PointOfInstantiation,
1101 PDiag(diag::note_template_default_arg_checking)
1103 Active->TemplateArgs,
1104 Active->NumTemplateArgs)
1105 << Active->InstantiationRange);
1110 DiagFunc(Active->PointOfInstantiation,
1111 PDiag(diag::note_evaluating_exception_spec_here)
1116 DiagFunc(Active->PointOfInstantiation,
1117 PDiag(diag::note_template_exception_spec_instantiation_here)
1119 << Active->InstantiationRange);
1123 DiagFunc(Active->PointOfInstantiation,
1124 PDiag(diag::note_template_requirement_instantiation_here)
1125 << Active->InstantiationRange);
1128 DiagFunc(Active->PointOfInstantiation,
1129 PDiag(diag::note_template_requirement_params_instantiation_here)
1130 << Active->InstantiationRange);
1134 DiagFunc(Active->PointOfInstantiation,
1135 PDiag(diag::note_nested_requirement_here)
1136 << Active->InstantiationRange);
1140 DiagFunc(Active->PointOfInstantiation,
1141 PDiag(diag::note_in_declaration_of_implicit_special_member)
1143 << Active->SpecialMember);
1148 Active->Entity->getLocation(),
1149 PDiag(diag::note_in_declaration_of_implicit_equality_comparison));
1155 auto *FD = dyn_cast<FunctionDecl>(Active->Entity);
1163 DiagFunc(Active->PointOfInstantiation,
1164 PDiag(diag::note_member_synthesized_at)
1166 <<
Context.getCanonicalTagType(MD->getParent()));
1168 QualType RecordType = FD->getParamDecl(0)
1170 .getNonReferenceType()
1171 .getUnqualifiedType();
1172 DiagFunc(Active->PointOfInstantiation,
1173 PDiag(diag::note_comparison_synthesized_at)
1180 DiagFunc(Active->Entity->getLocation(),
1181 PDiag(diag::note_rewriting_operator_as_spaceship));
1185 DiagFunc(Active->PointOfInstantiation,
1186 PDiag(diag::note_in_binding_decl_init)
1191 DiagFunc(Active->PointOfInstantiation,
1192 PDiag(diag::note_due_to_dllexported_class)
1198 DiagFunc(Active->PointOfInstantiation,
1199 PDiag(diag::note_building_builtin_dump_struct_call)
1202 Active->NumCallArgs)));
1209 DiagFunc(Active->PointOfInstantiation,
1210 PDiag(diag::note_lambda_substitution_here));
1213 unsigned DiagID = 0;
1214 if (!Active->Entity) {
1215 DiagFunc(Active->PointOfInstantiation,
1216 PDiag(diag::note_nested_requirement_here)
1217 << Active->InstantiationRange);
1221 DiagID = diag::note_concept_specialization_here;
1223 DiagID = diag::note_checking_constraints_for_template_id_here;
1225 DiagID = diag::note_checking_constraints_for_var_spec_id_here;
1227 DiagID = diag::note_checking_constraints_for_class_spec_id_here;
1230 DiagID = diag::note_checking_constraints_for_function_here;
1233 llvm::raw_svector_ostream
OS(TemplateArgsStr);
1236 printTemplateArgumentList(
OS, Active->template_arguments(),
1239 DiagFunc(Active->PointOfInstantiation,
1240 PDiag(DiagID) <<
OS.str() << Active->InstantiationRange);
1244 DiagFunc(Active->PointOfInstantiation,
1245 PDiag(diag::note_constraint_substitution_here)
1246 << Active->InstantiationRange);
1249 DiagFunc(Active->PointOfInstantiation,
1250 PDiag(diag::note_constraint_normalization_here)
1252 << Active->InstantiationRange);
1255 DiagFunc(Active->PointOfInstantiation,
1256 PDiag(diag::note_parameter_mapping_substitution_here)
1257 << Active->InstantiationRange);
1260 DiagFunc(Active->PointOfInstantiation,
1261 PDiag(diag::note_building_deduction_guide_here));
1268 if (Active->NumTemplateArgs == 0)
1270 DiagFunc(Active->PointOfInstantiation,
1271 PDiag(diag::note_template_type_alias_instantiation_here)
1273 << Active->InstantiationRange);
1276 DiagFunc(Active->PointOfInstantiation,
1277 PDiag(diag::note_template_arg_template_params_mismatch));
1280 DiagFunc(ParamLoc,
PDiag(diag::note_template_prev_declaration)
1282 << Active->InstantiationRange);
1285 const auto *SKEPAttr =
1286 Active->Entity->getAttr<SYCLKernelEntryPointAttr>();
1287 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
1288 assert(!SKEPAttr->isInvalidAttr() &&
1289 "sycl_kernel_entry_point attribute is invalid");
1290 DiagFunc(SKEPAttr->getLocation(),
PDiag(diag::note_sycl_runtime_defect));
1291 DiagFunc(SKEPAttr->getLocation(),
1292 PDiag(diag::note_sycl_kernel_launch_lookup_here)
1293 << SKEPAttr->getKernelName());
1297 const auto *SKEPAttr =
1298 Active->Entity->getAttr<SYCLKernelEntryPointAttr>();
1299 assert(SKEPAttr &&
"Missing sycl_kernel_entry_point attribute");
1300 assert(!SKEPAttr->isInvalidAttr() &&
1301 "sycl_kernel_entry_point attribute is invalid");
1302 DiagFunc(SKEPAttr->getLocation(),
PDiag(diag::note_sycl_runtime_defect));
1303 DiagFunc(SKEPAttr->getLocation(),
1304 PDiag(diag::note_sycl_kernel_launch_overload_resolution_here)
1305 << SKEPAttr->getKernelName()
1308 Active->NumCallArgs)));
1320 class TemplateInstantiator :
public TreeTransform<TemplateInstantiator> {
1325 bool EvaluateConstraints =
true;
1328 bool IsIncomplete =
false;
1330 bool BailOutOnIncomplete;
1332 std::optional<llvm::FoldingSetNodeID> TemplateArgsHashValue;
1337 bool maybeInstantiateFunctionParameterToScope(
ParmVarDecl *OldParm);
1342 TemplateInstantiator(
Sema &SemaRef,
1345 bool BailOutOnIncomplete =
false)
1346 : inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc),
1347 Entity(Entity), BailOutOnIncomplete(BailOutOnIncomplete) {}
1349 void setEvaluateConstraints(
bool B) {
1350 EvaluateConstraints = B;
1352 bool getEvaluateConstraints() {
1353 return EvaluateConstraints;
1356 inline static struct ForParameterMappingSubstitution_t {
1357 } ForParameterMappingSubstitution;
1359 TemplateInstantiator(ForParameterMappingSubstitution_t, Sema &SemaRef,
1361 const MultiLevelTemplateArgumentList &TemplateArgs)
1362 : inherited(SemaRef), TemplateArgs(TemplateArgs), Loc(Loc),
1363 BailOutOnIncomplete(
false) {
1366 auto &
V = TemplateArgsHashValue.emplace();
1368 for (
auto &Arg :
Level.Args)
1377 bool AlreadyTransformed(QualType T);
1380 SourceLocation getBaseLocation() {
return Loc; }
1383 DeclarationName getBaseEntity() {
return Entity; }
1386 bool getIsIncomplete()
const {
return IsIncomplete; }
1390 void setBase(SourceLocation Loc, DeclarationName Entity) {
1392 this->Entity = Entity;
1395 unsigned TransformTemplateDepth(
unsigned Depth) {
1396 return TemplateArgs.getNewDepth(Depth);
1399 bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
1400 SourceRange PatternRange,
1401 ArrayRef<UnexpandedParameterPack> Unexpanded,
1402 bool FailOnPackProducingTemplates,
1403 bool &ShouldExpand,
bool &RetainExpansion,
1409 NamedDecl *VD = ParmPack.first.dyn_cast<NamedDecl *>();
1410 if (
auto *PVD = dyn_cast_if_present<ParmVarDecl>(VD);
1411 PVD && maybeInstantiateFunctionParameterToScope(PVD))
1416 return getSema().CheckParameterPacksForExpansion(
1417 EllipsisLoc, PatternRange, Unexpanded, TemplateArgs,
1418 FailOnPackProducingTemplates, ShouldExpand, RetainExpansion,
1422 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) {
1426 TemplateArgument ForgetPartiallySubstitutedPack() {
1430 MultiLevelTemplateArgumentList &TemplateArgs =
1431 const_cast<MultiLevelTemplateArgumentList &
>(this->TemplateArgs);
1432 unsigned Depth, Index;
1435 Result = TemplateArgs(Depth, Index);
1436 TemplateArgs.
setArgument(Depth, Index, TemplateArgument());
1438 IsIncomplete =
true;
1439 if (BailOutOnIncomplete)
1440 return TemplateArgument();
1447 void RememberPartiallySubstitutedPack(TemplateArgument Arg) {
1453 MultiLevelTemplateArgumentList &TemplateArgs =
1454 const_cast<MultiLevelTemplateArgumentList &
>(this->TemplateArgs);
1455 unsigned Depth, Index;
1461 MultiLevelTemplateArgumentList ForgetSubstitution() {
1462 MultiLevelTemplateArgumentList
New;
1465 MultiLevelTemplateArgumentList Old =
1466 const_cast<MultiLevelTemplateArgumentList &
>(this->TemplateArgs);
1467 const_cast<MultiLevelTemplateArgumentList &
>(this->TemplateArgs) =
1472 void RememberSubstitution(MultiLevelTemplateArgumentList Old) {
1473 const_cast<MultiLevelTemplateArgumentList &
>(this->TemplateArgs) =
1478 getTemplateArgumentPackPatternForRewrite(
const TemplateArgument &TA) {
1484 "unexpected pack arguments in template rewrite");
1493 Decl *TransformDecl(SourceLocation Loc, Decl *D);
1495 void transformAttrs(Decl *Old, Decl *
New) {
1499 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> NewDecls) {
1501 (NewDecls.size() != 1 || !NewDecls.front()->isParameterPack())) {
1503 for (
auto *
New : NewDecls)
1509 assert(NewDecls.size() == 1 &&
1510 "should only have multiple expansions for a pack");
1516 auto *NewMD = dyn_cast<CXXMethodDecl>(
New);
1518 auto *OldMD = dyn_cast<CXXMethodDecl>(Old);
1519 if (
auto *NewTD = NewMD->getDescribedFunctionTemplate())
1520 NewTD->setInstantiatedFromMemberTemplate(
1521 OldMD->getDescribedFunctionTemplate());
1523 NewMD->setInstantiationOfMemberFunction(OldMD,
1531 if (
auto *DC = dyn_cast<DeclContext>(Old);
1532 DC && DC->isDependentContext() && DC->isFunctionOrMethod())
1538 Decl *TransformDefinition(SourceLocation Loc, Decl *D);
1542 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc);
1544 bool TransformExceptionSpec(SourceLocation Loc,
1545 FunctionProtoType::ExceptionSpecInfo &ESI,
1546 SmallVectorImpl<QualType> &Exceptions,
1551 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
1552 TypeSourceInfo *Declarator,
1553 SourceLocation StartLoc,
1554 SourceLocation NameLoc,
1555 IdentifierInfo *Name);
1559 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1560 TypeSourceInfo *TSInfo, QualType T);
1563 TransformTemplateName(NestedNameSpecifierLoc &QualifierLoc,
1565 SourceLocation NameLoc,
1566 QualType ObjectType = QualType(),
1567 NamedDecl *FirstQualifierInScope =
nullptr,
1568 bool AllowInjectedClassName =
false);
1570 const AnnotateAttr *TransformAnnotateAttr(
const AnnotateAttr *AA);
1571 const CXXAssumeAttr *TransformCXXAssumeAttr(
const CXXAssumeAttr *AA);
1572 const LoopHintAttr *TransformLoopHintAttr(
const LoopHintAttr *LH);
1573 const NoInlineAttr *TransformStmtNoInlineAttr(
const Stmt *OrigS,
1575 const NoInlineAttr *A);
1576 const AlwaysInlineAttr *
1577 TransformStmtAlwaysInlineAttr(
const Stmt *OrigS,
const Stmt *InstS,
1578 const AlwaysInlineAttr *A);
1579 const CodeAlignAttr *TransformCodeAlignAttr(
const CodeAlignAttr *CA);
1580 const OpenACCRoutineDeclAttr *
1581 TransformOpenACCRoutineDeclAttr(
const OpenACCRoutineDeclAttr *A);
1582 ExprResult TransformPredefinedExpr(PredefinedExpr *E);
1583 ExprResult TransformDeclRefExpr(DeclRefExpr *E);
1584 ExprResult TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E);
1586 ExprResult TransformTemplateParmRefExpr(DeclRefExpr *E,
1587 NonTypeTemplateParmDecl *D);
1590 ExprResult RebuildVarDeclRefExpr(ValueDecl *PD, SourceLocation Loc);
1593 ExprResult TransformFunctionParmPackRefExpr(DeclRefExpr *E, ValueDecl *PD);
1598 ExprResult TransformFunctionParmPackExpr(FunctionParmPackExpr *E);
1600 QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
1601 FunctionProtoTypeLoc TL) {
1603 return inherited::TransformFunctionProtoType(TLB, TL);
1606 QualType TransformTagType(TypeLocBuilder &TLB, TagTypeLoc TL) {
1607 auto Type = inherited::TransformTagType(TLB, TL);
1613 if (
const auto *ICNT = dyn_cast<InjectedClassNameType>(TL.
getTypePtr());
1616 Type = inherited::TransformType(
1617 ICNT->getDecl()->getCanonicalTemplateSpecializationType(
1627 bool TransformTemplateArgument(
const TemplateArgumentLoc &Input,
1628 TemplateArgumentLoc &Output,
1629 bool Uneval =
false) {
1630 const TemplateArgument &Arg = Input.
getArgument();
1632 Cache && TemplateArgsHashValue) {
1633 llvm::FoldingSetNodeID
ID = *TemplateArgsHashValue;
1643 if (
auto Iter =
Cache->find(ID); Iter !=
Cache->end()) {
1644 Output = Iter->second;
1647 bool Ret = inherited::TransformTemplateArgument(Input, Output, Uneval);
1654 std::vector<TemplateArgument> TArgs;
1662 pack, QualType(), SourceLocation{});
1663 TemplateArgumentLoc Output;
1664 if (TransformTemplateArgument(Input, Output, Uneval))
1669 TemplateArgument(llvm::ArrayRef(TArgs).copy(SemaRef.
Context)),
1670 QualType(), SourceLocation{});
1676 return inherited::TransformTemplateArgument(Input, Output, Uneval);
1681 TransformTemplateSpecializationType(TypeLocBuilder &TLB,
1682 TemplateSpecializationTypeLoc TL) {
1684 if (!getSema().ArgPackSubstIndex || !T->isSugared() ||
1694 QualType
R = TransformType(T->desugar());
1700 ArrayRef<TemplateArgument> PackArgs) {
1711 return std::nullopt;
1713 return inherited::ComputeSizeOfPackExprWithoutSubstitution(PackArgs);
1716 template<
typename Fn>
1717 QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
1718 FunctionProtoTypeLoc TL,
1719 CXXRecordDecl *ThisContext,
1720 Qualifiers ThisTypeQuals,
1721 Fn TransformExceptionSpec);
1723 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
1724 int indexAdjustment,
1726 bool ExpectParameterPack);
1728 using inherited::TransformTemplateTypeParmType;
1731 QualType TransformTemplateTypeParmType(TypeLocBuilder &TLB,
1732 TemplateTypeParmTypeLoc TL,
1733 bool SuppressObjCLifetime);
1735 QualType BuildSubstTemplateTypeParmType(
1736 TypeLocBuilder &TLB,
bool SuppressObjCLifetime,
bool Final,
1738 TemplateArgument Arg, SourceLocation NameLoc);
1743 using inherited::TransformSubstTemplateTypeParmPackType;
1745 TransformSubstTemplateTypeParmPackType(TypeLocBuilder &TLB,
1746 SubstTemplateTypeParmPackTypeLoc TL,
1747 bool SuppressObjCLifetime);
1749 TransformSubstBuiltinTemplatePackType(TypeLocBuilder &TLB,
1750 SubstBuiltinTemplatePackTypeLoc TL);
1753 ComputeLambdaDependency(LambdaScopeInfo *LSI) {
1755 TemplateInstArgsHelpers::getEnclosingTypeAliasTemplateDecl(
1757 TypeAlias && TemplateInstArgsHelpers::isLambdaEnclosedByTypeAliasDecl(
1759 unsigned TypeAliasDeclDepth =
TypeAlias.Template->getTemplateDepth();
1761 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent;
1762 for (
const TemplateArgument &TA :
TypeAlias.AssociatedTemplateArguments)
1764 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent;
1766 return inherited::ComputeLambdaDependency(LSI);
1774 LocalInstantiationScope Scope(SemaRef,
true,
1776 Sema::ConstraintEvalRAII<TemplateInstantiator> RAII(*
this);
1778 return inherited::TransformLambdaExpr(E);
1781 ExprResult TransformBlockExpr(BlockExpr *E) {
1782 LocalInstantiationScope Scope(SemaRef,
true,
1784 return inherited::TransformBlockExpr(E);
1787 ExprResult RebuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
1788 LambdaScopeInfo *LSI) {
1791 assert(PVD &&
"null in a parameter list");
1792 if (!PVD->hasDefaultArg())
1794 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
1796 SourceLocation EqualLoc = UninstExpr->
getBeginLoc();
1805 PVD->setDefaultArg(ErrorResult.
get());
1808 return inherited::RebuildLambdaExpr(StartLoc, EndLoc, LSI);
1821 llvm::SaveAndRestore _(EvaluateConstraints,
true);
1822 return inherited::TransformLambdaBody(E, Body);
1826 LocalInstantiationScope Scope(SemaRef,
true);
1827 ExprResult TransReq = inherited::TransformRequiresExpr(E);
1830 assert(TransReq.
get() != E &&
1831 "Do not change value of isSatisfied for the existing expression. "
1832 "Create a new expression instead.");
1834 Sema::SFINAETrap Trap(SemaRef);
1839 if (Trap.hasErrorOccurred())
1845 bool TransformRequiresExprRequirements(
1846 ArrayRef<concepts::Requirement *> Reqs,
1847 SmallVectorImpl<concepts::Requirement *> &Transformed) {
1848 bool SatisfactionDetermined =
false;
1849 for (concepts::Requirement *Req : Reqs) {
1850 concepts::Requirement *TransReq =
nullptr;
1851 if (!SatisfactionDetermined) {
1852 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
1853 TransReq = TransformTypeRequirement(TypeReq);
1854 else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
1855 TransReq = TransformExprRequirement(ExprReq);
1857 TransReq = TransformNestedRequirement(
1867 SatisfactionDetermined =
true;
1870 Transformed.push_back(TransReq);
1875 TemplateParameterList *TransformTemplateParameterList(
1876 TemplateParameterList *OrigTPL) {
1877 if (!OrigTPL || !OrigTPL->
size())
return OrigTPL;
1880 TemplateDeclInstantiator DeclInstantiator(getSema(),
1881 Owner, TemplateArgs);
1882 DeclInstantiator.setEvaluateConstraints(EvaluateConstraints);
1883 return DeclInstantiator.SubstTemplateParams(OrigTPL);
1886 concepts::TypeRequirement *
1887 TransformTypeRequirement(concepts::TypeRequirement *Req);
1888 concepts::ExprRequirement *
1889 TransformExprRequirement(concepts::ExprRequirement *Req);
1890 concepts::NestedRequirement *
1891 TransformNestedRequirement(concepts::NestedRequirement *Req);
1893 SourceLocation KWLoc, SourceLocation RBraceLoc,
const RequiresExpr *RE,
1894 RequiresExprBodyDecl *Body, ArrayRef<ParmVarDecl *> Params,
1895 SmallVectorImpl<QualType> &PTypes,
1896 SmallVectorImpl<ParmVarDecl *> &TransParams,
1897 Sema::ExtParameterInfoBuilder &PInfos);
1901bool TemplateInstantiator::AlreadyTransformed(QualType T) {
1909 getSema().MarkDeclarationsReferencedInType(Loc, T);
1913Decl *TemplateInstantiator::TransformDecl(SourceLocation Loc, Decl *D) {
1917 if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) {
1924 TTP->getPosition())) {
1925 IsIncomplete =
true;
1926 return BailOutOnIncomplete ?
nullptr : D;
1929 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition());
1931 if (TTP->isParameterPack()) {
1933 "Missing argument pack");
1934 Arg =
SemaRef.getPackSubstitutedTemplateArgument(Arg);
1939 "Wrong kind of template template argument");
1940 return Template.getAsTemplateDecl();
1947 if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(D);
1948 PVD &&
SemaRef.CurrentInstantiationScope &&
1949 (
SemaRef.inConstraintSubstitution() ||
1950 SemaRef.inParameterMappingSubstitution()) &&
1951 maybeInstantiateFunctionParameterToScope(PVD))
1957bool TemplateInstantiator::maybeInstantiateFunctionParameterToScope(
1958 ParmVarDecl *OldParm) {
1959 if (
SemaRef.CurrentInstantiationScope->getInstantiationOfIfExists(OldParm))
1963 return !TransformFunctionTypeParam(OldParm, 0,
1967 SmallVector<UnexpandedParameterPack, 2> Unexpanded;
1971 PackExpansionTypeLoc ExpansionTL = TL.
castAs<PackExpansionTypeLoc>();
1973 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
1974 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
1976 bool ShouldExpand =
false;
1977 bool RetainExpansion =
false;
1979 ExpansionTL.
getTypePtr()->getNumExpansions();
1982 Pattern.getSourceRange(), Unexpanded,
1984 ShouldExpand, RetainExpansion, NumExpansions))
1987 assert(ShouldExpand && !RetainExpansion &&
1988 "Shouldn't preserve pack expansion when evaluating constraints");
1989 ExpandingFunctionParameterPack(OldParm);
1990 for (
unsigned I = 0; I != *NumExpansions; ++I) {
1991 Sema::ArgPackSubstIndexRAII SubstIndex(getSema(), I);
1992 if (!TransformFunctionTypeParam(OldParm, 0,
2000Decl *TemplateInstantiator::TransformDefinition(SourceLocation Loc, Decl *D) {
2001 Decl *Inst = getSema().SubstDecl(D, getSema().
CurContext, TemplateArgs);
2005 getSema().CurrentInstantiationScope->InstantiatedLocal(D, Inst);
2009bool TemplateInstantiator::TransformExceptionSpec(
2010 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
2011 SmallVectorImpl<QualType> &Exceptions,
bool &Changed) {
2016 return inherited::TransformExceptionSpec(Loc, ESI, Exceptions, Changed);
2020TemplateInstantiator::TransformFirstQualifierInScope(NamedDecl *D,
2021 SourceLocation Loc) {
2024 if (TemplateTypeParmDecl *TTPD = dyn_cast_or_null<TemplateTypeParmDecl>(D)) {
2025 const TemplateTypeParmType *TTP
2030 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getIndex());
2032 if (TTP->isParameterPack()) {
2034 "Missing argument pack");
2039 Arg =
SemaRef.getPackSubstitutedTemplateArgument(Arg);
2044 return cast_or_null<NamedDecl>(TransformDecl(Loc, D));
2046 if (
const TagType *Tag = T->
getAs<TagType>())
2047 return Tag->getDecl();
2050 getSema().Diag(Loc, diag::err_nested_name_spec_non_tag) << T;
2055 return cast_or_null<NamedDecl>(TransformDecl(Loc, D));
2059TemplateInstantiator::RebuildExceptionDecl(VarDecl *ExceptionDecl,
2060 TypeSourceInfo *Declarator,
2061 SourceLocation StartLoc,
2062 SourceLocation NameLoc,
2063 IdentifierInfo *Name) {
2064 VarDecl *Var = inherited::RebuildExceptionDecl(ExceptionDecl, Declarator,
2065 StartLoc, NameLoc, Name);
2067 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
2071VarDecl *TemplateInstantiator::RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
2072 TypeSourceInfo *TSInfo,
2074 VarDecl *Var = inherited::RebuildObjCExceptionDecl(ExceptionDecl, TSInfo, T);
2076 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
2080TemplateName TemplateInstantiator::TransformTemplateName(
2081 NestedNameSpecifierLoc &QualifierLoc, SourceLocation TemplateKWLoc,
2082 TemplateName Name, SourceLocation NameLoc, QualType ObjectType,
2083 NamedDecl *FirstQualifierInScope,
bool AllowInjectedClassName) {
2085 assert(!QualifierLoc &&
"Unexpected qualifier");
2088 TTP && TTP->getDepth() < TemplateArgs.
getNumLevels()) {
2094 TTP->getPosition())) {
2095 IsIncomplete =
true;
2099 TemplateArgument Arg = TemplateArgs(TTP->getDepth(), TTP->getPosition());
2104 Arg = getTemplateArgumentPackPatternForRewrite(Arg);
2106 "unexpected nontype template argument kind in template rewrite");
2110 auto [AssociatedDecl, Final] =
2113 if (TTP->isParameterPack()) {
2115 "Missing argument pack");
2121 return getSema().Context.getSubstTemplateTemplateParmPack(
2122 Arg, AssociatedDecl, TTP->getIndex(), Final);
2125 PackIndex =
SemaRef.getPackIndex(Arg);
2126 Arg =
SemaRef.getPackSubstitutedTemplateArgument(Arg);
2130 assert(!
Template.isNull() &&
"Null template template argument");
2131 return getSema().Context.getSubstTemplateTemplateParm(
2132 Template, AssociatedDecl, TTP->getIndex(), PackIndex, Final);
2136 if (SubstTemplateTemplateParmPackStorage *SubstPack
2141 TemplateArgument Pack = SubstPack->getArgumentPack();
2143 SemaRef.getPackSubstitutedTemplateArgument(Pack).getAsTemplate();
2144 return getSema().Context.getSubstTemplateTemplateParm(
2145 Template, SubstPack->getAssociatedDecl(), SubstPack->getIndex(),
2146 SemaRef.getPackIndex(Pack), SubstPack->getFinal());
2149 return inherited::TransformTemplateName(
2150 QualifierLoc, TemplateKWLoc, Name, NameLoc, ObjectType,
2151 FirstQualifierInScope, AllowInjectedClassName);
2155TemplateInstantiator::TransformPredefinedExpr(PredefinedExpr *E) {
2163TemplateInstantiator::TransformTemplateParmRefExpr(DeclRefExpr *E,
2164 NonTypeTemplateParmDecl *NTTP) {
2171 IsIncomplete =
true;
2172 return BailOutOnIncomplete ?
ExprError() : E;
2180 Arg = getTemplateArgumentPackPatternForRewrite(Arg);
2182 "unexpected nontype template argument kind in template rewrite");
2188 auto [AssociatedDecl, Final] =
2193 "Missing argument pack");
2199 QualType TargetType =
SemaRef.SubstType(NTTP->
getType(), TemplateArgs,
2208 return new (
SemaRef.Context) SubstNonTypeTemplateParmPackExpr(
2212 PackIndex =
SemaRef.getPackIndex(Arg);
2213 Arg =
SemaRef.getPackSubstitutedTemplateArgument(Arg);
2215 return SemaRef.BuildSubstNonTypeTemplateParmExpr(
2216 AssociatedDecl, NTTP, E->
getLocation(), Arg, PackIndex, Final);
2220TemplateInstantiator::TransformAnnotateAttr(
const AnnotateAttr *AA) {
2221 SmallVector<Expr *> Args;
2222 for (Expr *Arg : AA->args()) {
2223 ExprResult Res = getDerived().TransformExpr(Arg);
2225 Args.push_back(Res.
get());
2227 return AnnotateAttr::CreateImplicit(getSema().
Context, AA->getAnnotation(),
2228 Args.data(), Args.size(), AA->getRange());
2231const CXXAssumeAttr *
2232TemplateInstantiator::TransformCXXAssumeAttr(
const CXXAssumeAttr *AA) {
2233 ExprResult Res = getDerived().TransformExpr(AA->getAssumption());
2237 if (!(Res.
get()->
getDependence() & ExprDependence::TypeValueInstantiation)) {
2238 Res = getSema().BuildCXXAssumeExpr(Res.
get(), AA->getAttrName(),
2244 return CXXAssumeAttr::CreateImplicit(getSema().
Context, Res.
get(),
2249TemplateInstantiator::TransformLoopHintAttr(
const LoopHintAttr *LH) {
2250 ExprResult TransformedExprResult = getDerived().TransformExpr(LH->getValue());
2251 if (!TransformedExprResult.
isUsable() ||
2252 TransformedExprResult.
get() == LH->getValue())
2254 Expr *TransformedExpr = TransformedExprResult.
get();
2258 LH->getSemanticSpelling() ==
2259 LoopHintAttr::Pragma_unroll))
2262 LoopHintAttr::OptionType Option = LH->getOption();
2263 LoopHintAttr::LoopHintState State = LH->getState();
2270 if (Option == LoopHintAttr::UnrollCount &&
2272 llvm::APSInt ValueAPS =
2276 if (ValueAPS.isZero() || ValueAPS.isOne()) {
2277 Option = LoopHintAttr::Unroll;
2278 State = LoopHintAttr::Disable;
2284 return LoopHintAttr::CreateImplicit(getSema().
Context, Option, State,
2285 TransformedExpr, *LH);
2287const NoInlineAttr *TemplateInstantiator::TransformStmtNoInlineAttr(
2288 const Stmt *OrigS,
const Stmt *InstS,
const NoInlineAttr *A) {
2294const AlwaysInlineAttr *TemplateInstantiator::TransformStmtAlwaysInlineAttr(
2295 const Stmt *OrigS,
const Stmt *InstS,
const AlwaysInlineAttr *A) {
2302const CodeAlignAttr *
2303TemplateInstantiator::TransformCodeAlignAttr(
const CodeAlignAttr *CA) {
2304 Expr *TransformedExpr = getDerived().TransformExpr(CA->getAlignment()).get();
2305 return getSema().BuildCodeAlignAttr(*CA, TransformedExpr);
2307const OpenACCRoutineDeclAttr *
2308TemplateInstantiator::TransformOpenACCRoutineDeclAttr(
2309 const OpenACCRoutineDeclAttr *A) {
2310 llvm_unreachable(
"RoutineDecl should only be a declaration attribute, as it "
2311 "applies to a Function Decl (and a few places for VarDecl)");
2314ExprResult TemplateInstantiator::RebuildVarDeclRefExpr(ValueDecl *PD,
2315 SourceLocation Loc) {
2316 DeclarationNameInfo NameInfo(PD->
getDeclName(), Loc);
2317 return getSema().BuildDeclarationNameExpr(CXXScopeSpec(), NameInfo, PD);
2321TemplateInstantiator::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
2325 ValueDecl *VD = cast_or_null<ValueDecl>(TransformDecl(E->
getExprLoc(), D));
2328 return RebuildVarDeclRefExpr(VD, E->
getExprLoc());
2331 QualType T = TransformType(E->
getType());
2337 SmallVector<ValueDecl *, 8> Vars;
2341 ValueDecl *D = cast_or_null<ValueDecl>(TransformDecl(E->
getExprLoc(), *I));
2350 getSema().MarkFunctionParmPackReferenced(PackExpr);
2355TemplateInstantiator::TransformFunctionParmPackRefExpr(DeclRefExpr *E,
2358 llvm::PointerUnion<Decl *, DeclArgumentPack *> *
Found
2359 = getSema().CurrentInstantiationScope->findInstantiationOf(PD);
2360 assert(
Found &&
"no instantiation for parameter pack");
2362 Decl *TransformedDecl;
2363 if (DeclArgumentPack *Pack = dyn_cast<DeclArgumentPack *>(*
Found)) {
2367 QualType T = TransformType(E->
getType());
2372 getSema().MarkFunctionParmPackReferenced(PackExpr);
2376 TransformedDecl = (*Pack)[*getSema().ArgPackSubstIndex];
2387TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) {
2392 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
2394 return TransformTemplateParmRefExpr(E, NTTP);
2401 if (VarDecl *PD = dyn_cast<VarDecl>(D))
2403 return TransformFunctionParmPackRefExpr(E, PD);
2405 return inherited::TransformDeclRefExpr(E);
2408ExprResult TemplateInstantiator::TransformCXXDefaultArgExpr(
2409 CXXDefaultArgExpr *E) {
2411 getDescribedFunctionTemplate() &&
2412 "Default arg expressions are never formed in dependent cases.");
2413 return SemaRef.BuildCXXDefaultArgExpr(
2418template<
typename Fn>
2419QualType TemplateInstantiator::TransformFunctionProtoType(TypeLocBuilder &TLB,
2420 FunctionProtoTypeLoc TL,
2421 CXXRecordDecl *ThisContext,
2422 Qualifiers ThisTypeQuals,
2423 Fn TransformExceptionSpec) {
2431 LocalInstantiationScope *Current = getSema().CurrentInstantiationScope;
2432 std::optional<LocalInstantiationScope> Scope;
2436 return inherited::TransformFunctionProtoType(
2437 TLB, TL, ThisContext, ThisTypeQuals, TransformExceptionSpec);
2440ParmVarDecl *TemplateInstantiator::TransformFunctionTypeParam(
2441 ParmVarDecl *OldParm,
int indexAdjustment,
UnsignedOrNone NumExpansions,
2442 bool ExpectParameterPack) {
2443 auto NewParm =
SemaRef.SubstParmVarDecl(
2444 OldParm, TemplateArgs, indexAdjustment, NumExpansions,
2445 ExpectParameterPack, EvaluateConstraints);
2446 if (NewParm &&
SemaRef.getLangOpts().OpenCL)
2447 SemaRef.deduceOpenCLAddressSpace(NewParm);
2451QualType TemplateInstantiator::BuildSubstTemplateTypeParmType(
2452 TypeLocBuilder &TLB,
bool SuppressObjCLifetime,
bool Final,
2454 TemplateArgument Arg, SourceLocation NameLoc) {
2459 if (SuppressObjCLifetime) {
2461 RQs = Replacement.getQualifiers();
2464 SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), RQs);
2468 QualType
Result = getSema().Context.getSubstTemplateTypeParmType(
2469 Replacement, AssociatedDecl, Index, PackIndex, Final);
2470 SubstTemplateTypeParmTypeLoc NewTL =
2471 TLB.
push<SubstTemplateTypeParmTypeLoc>(
Result);
2477TemplateInstantiator::TransformTemplateTypeParmType(TypeLocBuilder &TLB,
2478 TemplateTypeParmTypeLoc TL,
2479 bool SuppressObjCLifetime) {
2480 const TemplateTypeParmType *T = TL.
getTypePtr();
2490 IsIncomplete =
true;
2491 if (BailOutOnIncomplete)
2494 TemplateTypeParmTypeLoc NewTL
2495 = TLB.
push<TemplateTypeParmTypeLoc>(TL.
getType());
2500 TemplateArgument Arg = TemplateArgs(T->getDepth(), T->getIndex());
2505 Arg = getTemplateArgumentPackPatternForRewrite(Arg);
2507 "unexpected nontype template argument kind in template rewrite");
2513 auto [AssociatedDecl, Final] =
2516 if (T->isParameterPack() ||
2523 (T->getDecl() && T->getDecl()->isTemplateParameterPack())) {
2525 "Missing argument pack");
2531 QualType
Result = getSema().Context.getSubstTemplateTypeParmPackType(
2532 AssociatedDecl, T->getIndex(), Final, Arg);
2533 SubstTemplateTypeParmPackTypeLoc NewTL
2534 = TLB.
push<SubstTemplateTypeParmPackTypeLoc>(
Result);
2540 PackIndex =
SemaRef.getPackIndex(Arg);
2541 Arg =
SemaRef.getPackSubstitutedTemplateArgument(Arg);
2545 "Template argument kind mismatch");
2547 return BuildSubstTemplateTypeParmType(TLB, SuppressObjCLifetime, Final,
2548 AssociatedDecl, T->getIndex(),
2556 TemplateTypeParmDecl *NewTTPDecl =
nullptr;
2557 if (TemplateTypeParmDecl *OldTTPDecl = T->getDecl())
2558 NewTTPDecl = cast_or_null<TemplateTypeParmDecl>(
2560 QualType
Result = getSema().Context.getTemplateTypeParmType(
2562 T->isParameterPack(), NewTTPDecl);
2563 TemplateTypeParmTypeLoc NewTL = TLB.
push<TemplateTypeParmTypeLoc>(
Result);
2568QualType TemplateInstantiator::TransformSubstTemplateTypeParmPackType(
2569 TypeLocBuilder &TLB, SubstTemplateTypeParmPackTypeLoc TL,
2570 bool SuppressObjCLifetime) {
2571 const SubstTemplateTypeParmPackType *T = TL.
getTypePtr();
2573 Decl *NewReplaced = TransformDecl(TL.
getNameLoc(), T->getAssociatedDecl());
2578 if (NewReplaced != T->getAssociatedDecl())
2579 Result = getSema().Context.getSubstTemplateTypeParmPackType(
2580 NewReplaced, T->getIndex(), T->getFinal(), T->getArgumentPack());
2581 SubstTemplateTypeParmPackTypeLoc NewTL =
2582 TLB.
push<SubstTemplateTypeParmPackTypeLoc>(
Result);
2587 TemplateArgument Pack = T->getArgumentPack();
2588 TemplateArgument Arg =
SemaRef.getPackSubstitutedTemplateArgument(Pack);
2589 return BuildSubstTemplateTypeParmType(
2590 TLB, SuppressObjCLifetime, T->getFinal(), NewReplaced, T->getIndex(),
2594QualType TemplateInstantiator::TransformSubstBuiltinTemplatePackType(
2595 TypeLocBuilder &TLB, SubstBuiltinTemplatePackTypeLoc TL) {
2597 return TreeTransform::TransformSubstBuiltinTemplatePackType(TLB, TL);
2598 TemplateArgument
Result =
SemaRef.getPackSubstitutedTemplateArgument(
2602 return Result.getAsType();
2605static concepts::Requirement::SubstitutionDiagnostic *
2615 ErrorLoc = PDA.first;
2620 llvm::raw_svector_ostream
OS(Entity);
2624 C.backupStr(Entity), ErrorLoc,
C.backupStr(Message)};
2627concepts::Requirement::SubstitutionDiagnostic *
2630 llvm::raw_svector_ostream
OS(Entity);
2634 C.backupStr(Entity),
2635 Location, StringRef()};
2638ExprResult TemplateInstantiator::TransformRequiresTypeParams(
2651 if (getDerived().TransformFunctionTypeParams(
2652 KWLoc, Params,
nullptr,
nullptr, PTypes,
2653 &TransParams, PInfos, &ErrorIdx) ||
2654 Trap.hasErrorOccurred()) {
2660 SemaRef, Info, [&](llvm::raw_ostream &
OS) {
OS << *FailedDecl; })));
2661 return getDerived().RebuildRequiresExpr(KWLoc, Body, RE->
getLParenLoc(),
2663 TransReqs, RBraceLoc);
2669concepts::TypeRequirement *
2670TemplateInstantiator::TransformTypeRequirement(concepts::TypeRequirement *Req) {
2674 if (AlwaysRebuild())
2675 return RebuildTypeRequirement(
2681 Sema::SFINAETrap Trap(
SemaRef, Info);
2682 Sema::InstantiatingTemplate TypeInst(
2685 if (TypeInst.isInvalid())
2687 TypeSourceInfo *TransType = TransformType(Req->
getType());
2688 if (!TransType || Trap.hasErrorOccurred())
2690 [&] (llvm::raw_ostream&
OS) {
2693 return RebuildTypeRequirement(TransType);
2696concepts::ExprRequirement *
2697TemplateInstantiator::TransformExprRequirement(concepts::ExprRequirement *Req) {
2701 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *>
2708 Sema::SFINAETrap Trap(
SemaRef, Info);
2711 if (ExprInst.isInvalid())
2714 if (!TransExprRes.
isInvalid() && !Trap.hasErrorOccurred() &&
2716 TransExprRes =
SemaRef.CheckPlaceholderExpr(TransExprRes.
get());
2717 if (TransExprRes.
isInvalid() || Trap.hasErrorOccurred())
2722 TransExpr = TransExprRes.
get();
2725 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
2727 if (RetReq.isEmpty())
2728 TransRetReq.emplace();
2729 else if (RetReq.isSubstitutionFailure())
2730 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
2731 else if (RetReq.isTypeConstraint()) {
2732 TemplateParameterList *OrigTPL =
2733 RetReq.getTypeConstraintTemplateParameterList();
2735 Sema::SFINAETrap Trap(
SemaRef, Info);
2738 if (TPLInst.isInvalid())
2740 TemplateParameterList *TPL = TransformTemplateParameterList(OrigTPL);
2741 if (!TPL || Trap.hasErrorOccurred())
2743 [&] (llvm::raw_ostream&
OS) {
2744 RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint()
2745 ->printPretty(
OS,
nullptr,
SemaRef.getPrintingPolicy());
2749 TransRetReq.emplace(TPL);
2752 assert(TransRetReq &&
"All code paths leading here must set TransRetReq");
2753 if (Expr *E = TransExpr.dyn_cast<Expr *>())
2755 std::move(*TransRetReq));
2756 return RebuildExprRequirement(
2761concepts::NestedRequirement *
2762TemplateInstantiator::TransformNestedRequirement(
2763 concepts::NestedRequirement *Req) {
2768 ConstraintSatisfaction Satisfaction;
2770 auto NestedReqWithDiag = [&
C,
this](Expr *E,
2771 ConstraintSatisfaction Satisfaction) {
2773 SmallString<128> Entity;
2774 llvm::raw_svector_ostream
OS(Entity);
2775 E->printPretty(
OS,
nullptr,
SemaRef.getPrintingPolicy());
2776 return new (
C) concepts::NestedRequirement(
2777 SemaRef.Context,
C.backupStr(Entity), std::move(Satisfaction));
2781 if (AlwaysRebuild())
2787 if (!getEvaluateConstraints()) {
2789 if (TransConstraint.
isInvalid() || !TransConstraint.
get())
2793 concepts::NestedRequirement(TransConstraint.
get());
2794 ConstraintSatisfaction Satisfaction;
2795 return new (
SemaRef.Context) concepts::NestedRequirement(
2796 SemaRef.Context, TransConstraint.
get(), Satisfaction);
2800 Expr *NewConstraint;
2804 Sema::InstantiatingTemplate ConstrInst(
2806 Sema::InstantiatingTemplate::ConstraintsCheck(),
2809 if (ConstrInst.isInvalid())
2813 Req, AssociatedConstraint(Constraint), TemplateArgs,
2815 nullptr, &NewConstraint);
2819 return NestedReqWithDiag(Constraint, Satisfaction);
2823 if (!NewConstraint) {
2825 return NestedReqWithDiag(Constraint, Satisfaction);
2827 NewConstraint = Constraint;
2829 return new (
C) concepts::NestedRequirement(
C, NewConstraint, Satisfaction);
2836 bool AllowDeducedTST) {
2838 "Cannot perform an instantiation without some context on the "
2839 "instantiation stack");
2841 if (!T->getType()->isInstantiationDependentType() &&
2842 !T->getType()->isVariablyModifiedType())
2845 TemplateInstantiator Instantiator(*
this, Args, Loc, Entity);
2846 return AllowDeducedTST ? Instantiator.TransformTypeWithDeducedTST(T)
2847 : Instantiator.TransformType(T);
2855 "Cannot perform an instantiation without some context on the "
2856 "instantiation stack");
2870 TemplateInstantiator Instantiator(*
this, Args, Loc, Entity);
2884 bool *IsIncompleteSubstitution) {
2886 "Cannot perform an instantiation without some context on the "
2887 "instantiation stack");
2891 if (!T->isInstantiationDependentType() && !T->isVariablyModifiedType())
2894 TemplateInstantiator Instantiator(
2895 *
this, TemplateArgs, Loc, Entity,
2896 IsIncompleteSubstitution !=
nullptr);
2897 QualType QT = Instantiator.TransformType(T);
2898 if (IsIncompleteSubstitution && Instantiator.getIsIncomplete())
2899 *IsIncompleteSubstitution =
true;
2904 if (T->getType()->isInstantiationDependentType() ||
2905 T->getType()->isVariablyModifiedType())
2931 bool EvaluateConstraints) {
2933 "Cannot perform an instantiation without some context on the "
2934 "instantiation stack");
2939 TemplateInstantiator Instantiator(*
this, Args, Loc, Entity);
2940 Instantiator.setEvaluateConstraints(EvaluateConstraints);
2956 Result = Instantiator.TransformFunctionProtoType(
2957 TLB, Proto, ThisContext, ThisTypeQuals,
2959 bool &Changed) {
return false; });
2961 Result = Instantiator.TransformType(TLB, TL);
2975 bool Changed =
false;
2976 TemplateInstantiator Instantiator(*
this, Args, Loc,
DeclarationName());
2977 return Instantiator.TransformExceptionSpec(Loc, ESI, ExceptionStorage,
2988 ESI, ExceptionStorage, Args))
2997 struct GetContainedInventedTypeParmVisitor :
2998 public TypeVisitor<GetContainedInventedTypeParmVisitor,
2999 TemplateTypeParmDecl *> {
3000 using TypeVisitor<GetContainedInventedTypeParmVisitor,
3006 return Visit(T.getTypePtr());
3010 const TemplateTypeParmType *T) {
3011 if (!T->getDecl() || !T->getDecl()->isImplicit())
3013 return T->getDecl();
3019 TemplateTypeParmDecl *VisitPointerType(
const PointerType *T) {
3023 TemplateTypeParmDecl *VisitBlockPointerType(
const BlockPointerType *T) {
3027 TemplateTypeParmDecl *VisitReferenceType(
const ReferenceType *T) {
3031 TemplateTypeParmDecl *VisitMemberPointerType(
const MemberPointerType *T) {
3035 TemplateTypeParmDecl *VisitArrayType(
const ArrayType *T) {
3039 TemplateTypeParmDecl *VisitDependentSizedExtVectorType(
3040 const DependentSizedExtVectorType *T) {
3044 TemplateTypeParmDecl *VisitVectorType(
const VectorType *T) {
3048 TemplateTypeParmDecl *VisitFunctionProtoType(
const FunctionProtoType *T) {
3049 return VisitFunctionType(T);
3052 TemplateTypeParmDecl *VisitFunctionType(
const FunctionType *T) {
3056 TemplateTypeParmDecl *VisitParenType(
const ParenType *T) {
3060 TemplateTypeParmDecl *VisitAttributedType(
const AttributedType *T) {
3061 return Visit(T->getModifiedType());
3064 TemplateTypeParmDecl *VisitMacroQualifiedType(
const MacroQualifiedType *T) {
3068 TemplateTypeParmDecl *VisitAdjustedType(
const AdjustedType *T) {
3072 TemplateTypeParmDecl *VisitPackExpansionType(
const PackExpansionType *T) {
3073 return Visit(T->getPattern());
3082 bool EvaluateConstraints) {
3088 bool ContainsUnexpandedPack =
3092 return TA.getArgument().containsUnexpandedParameterPack();
3094 if (!Index && ContainsUnexpandedPack)
3095 Index =
SemaRef.ArgPackSubstIndex;
3124 bool ExpectParameterPack,
bool EvaluateConstraint) {
3144 }
else if (ExpectParameterPack) {
3150 diag::err_function_parameter_pack_without_parameter_packs)
3174 GetContainedInventedTypeParmVisitor().Visit(OldTSI->
getType())) {
3176 auto *Inst = cast_or_null<TemplateTypeParmDecl>(
3181 if (Inst && !Inst->getTypeConstraint()) {
3248 "Cannot perform an instantiation without some context on the "
3249 "instantiation stack");
3251 TemplateInstantiator Instantiator(*
this, TemplateArgs, Loc,
3253 return Instantiator.TransformFunctionTypeParams(
3254 Loc, Params,
nullptr, ExtParamInfos, ParamTypes, OutParams, ParamInfos);
3263 Expr *PatternExpr = Param->getUninstantiatedDefaultArg();
3267 if (AlreadyInstantiating) {
3268 Param->setInvalidDecl();
3269 return Diag(Param->getBeginLoc(), diag::err_recursive_default_argument)
3287 std::optional<LocalInstantiationScope> LIS;
3298 if (addInstantiatedParametersToScope(FD, PatternFD, *LIS, TemplateArgs))
3315 Param->getLocation(),
3320 Result = InitSeq.Perform(*
this, Entity, Kind, ResultE);
3350 auto ComputeInfo = [&S, &TemplateArgs, BaseSourceRange, BaseEllipsisLoc](
3357 if (IsLateExpansionAttempt) {
3362 return P.first.dyn_cast<
const SubstBuiltinTemplatePackType *>();
3364 if (!SawPackTypes) {
3376 BaseEllipsisLoc, BaseSourceRange, Unexpanded, TemplateArgs,
3381 if (ComputeInfo(
Base.getTypeSourceInfo(),
false, Info))
3385 Out =
Base.getTypeSourceInfo();
3395 if (!Out->getType()->containsUnexpandedParameterPack())
3400 if (ComputeInfo(Out,
true, Info))
3413 for (
const auto &
Base : Pattern->
bases()) {
3414 if (!
Base.getType()->isDependentType()) {
3416 if (RD->isInvalidDecl())
3425 if (
Base.isPackExpansion()) {
3437 ArgsForSubst = &EmptyList;
3452 Instantiation,
Base.getSourceRange(),
Base.isVirtual(),
3453 Base.getAccessSpecifierAsWritten(), Expanded,
3455 InstantiatedBases.push_back(InstantiatedBase);
3464 EllipsisLoc =
Base.getEllipsisLoc();
3472 Base.getSourceRange().getBegin(),
3483 Base.getSourceRange(),
3485 Base.getAccessSpecifierAsWritten(),
3488 InstantiatedBases.push_back(InstantiatedBase);
3518 assert(!AlreadyInstantiating &&
"should have been caught by caller");
3521 return InstantiateClassImpl(PointOfInstantiation, Instantiation, Pattern,
3522 TemplateArgs, TSK, Complain);
3525bool Sema::InstantiateClassImpl(
3532 if (DiagnoseUninstantiableTemplate(PointOfInstantiation, Instantiation,
3534 Pattern, PatternDef, TSK, Complain))
3537 llvm::TimeTraceScope TimeScope(
"InstantiateClass", [&]() {
3538 llvm::TimeTraceMetadata M;
3539 llvm::raw_string_ostream OS(M.Detail);
3542 if (llvm::isTimeTraceVerbose()) {
3543 auto Loc = SourceMgr.getExpansionLoc(Instantiation->
getLocation());
3544 M.File = SourceMgr.getFilename(Loc);
3545 M.Line = SourceMgr.getExpansionLineNumber(Loc);
3550 Pattern = PatternDef;
3553 if (MemberSpecializationInfo *MSInfo
3555 MSInfo->setTemplateSpecializationKind(TSK);
3556 MSInfo->setPointOfInstantiation(PointOfInstantiation);
3557 }
else if (ClassTemplateSpecializationDecl *Spec
3558 = dyn_cast<ClassTemplateSpecializationDecl>(Instantiation)) {
3559 Spec->setTemplateSpecializationKind(TSK);
3560 Spec->setPointOfInstantiation(PointOfInstantiation);
3563 NonSFINAEContext _(*
this);
3564 InstantiatingTemplate Inst(*
this, PointOfInstantiation, Instantiation);
3565 if (Inst.isInvalid())
3567 PrettyDeclStackTraceEntry CrashInfo(Context, Instantiation, SourceLocation(),
3568 "instantiating class definition");
3572 ContextRAII SavedContext(*
this, Instantiation);
3573 EnterExpressionEvaluationContext EvalContext(
3574 *
this, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
3580 LocalInstantiationScope Scope(*
this, MergeWithParentScope);
3586 SavePendingParsedClassStateRAII SavedPendingParsedClassState(*
this);
3589 InstantiateAttrs(TemplateArgs, Pattern, Instantiation);
3599 Instantiation->
setTagKind(Pattern->getTagKind());
3602 if (SubstBaseSpecifiers(Instantiation, Pattern, TemplateArgs))
3605 TemplateDeclInstantiator Instantiator(*
this, Instantiation, TemplateArgs);
3606 Instantiator.setEvaluateConstraints(
false);
3607 SmallVector<Decl*, 4> Fields;
3609 LateInstantiatedAttrVec LateAttrs;
3610 Instantiator.enableLateAttributeInstantiation(&LateAttrs);
3612 bool MightHaveConstexprVirtualFunctions =
false;
3613 for (
auto *
Member : Pattern->decls()) {
3623 if (
Member->getDeclContext() != Pattern)
3634 if (
Member->isInvalidDecl()) {
3639 Decl *NewMember = Instantiator.Visit(
Member);
3641 if (FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) {
3642 Fields.push_back(Field);
3643 }
else if (EnumDecl *
Enum = dyn_cast<EnumDecl>(NewMember)) {
3649 Enum->isCompleteDefinition()) {
3650 MemberSpecializationInfo *MSInfo =
Enum->getMemberSpecializationInfo();
3651 assert(MSInfo &&
"no spec info for member enum specialization");
3655 }
else if (StaticAssertDecl *SA = dyn_cast<StaticAssertDecl>(NewMember)) {
3656 if (SA->isFailed()) {
3662 }
else if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewMember)) {
3665 MightHaveConstexprVirtualFunctions =
true;
3679 ActOnFields(
nullptr, Instantiation->
getLocation(), Instantiation, Fields,
3680 SourceLocation(), SourceLocation(), ParsedAttributesView());
3681 CheckCompletedCXXClass(
nullptr, Instantiation);
3686 if (ParsingClassDepth == 0)
3687 ActOnFinishCXXNonNestedClass();
3691 for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(),
3692 E = LateAttrs.end(); I != E; ++I) {
3693 assert(CurrentInstantiationScope == Instantiator.getStartingScope());
3694 CurrentInstantiationScope = I->Scope;
3698 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
3699 CXXThisScopeRAII ThisScope(*
this, ThisContext, Qualifiers(),
3700 ND->isCXXInstanceMember());
3705 I->NewDecl->addAttr(NewAttr);
3707 Instantiator.getStartingScope());
3709 Instantiator.disableLateAttributeInstantiation();
3712 ActOnFinishDelayedMemberInitializers(Instantiation);
3717 Instantiation->
setLocation(Pattern->getLocation());
3718 Instantiation->
setLocStart(Pattern->getInnerLocStart());
3724 if (Pattern->isDependentContext())
3725 PerformDependentDiagnostics(Pattern, TemplateArgs);
3730 P = Instantiator.delayed_partial_spec_begin(),
3731 PEnd = Instantiator.delayed_partial_spec_end();
3733 if (!Instantiator.InstantiateClassTemplatePartialSpecialization(
3734 P->first, P->second)) {
3743 P = Instantiator.delayed_var_partial_spec_begin(),
3744 PEnd = Instantiator.delayed_var_partial_spec_end();
3746 if (!Instantiator.InstantiateVarTemplatePartialSpecialization(
3747 P->first, P->second)) {
3763 MarkVTableUsed(PointOfInstantiation, Instantiation,
true);
3764 else if (MightHaveConstexprVirtualFunctions)
3765 MarkVirtualMembersReferenced(PointOfInstantiation, Instantiation,
3769 Consumer.HandleTagDeclDefinition(Instantiation);
3781 assert(!AlreadyInstantiating &&
"should have been caught by caller");
3787 Pattern, PatternDef, TSK,
true))
3789 Pattern = PatternDef;
3803 "instantiating enum definition");
3838 "pattern and instantiation disagree about init style");
3842 if (AlreadyInstantiating)
3844 return Diag(PointOfInstantiation,
3845 diag::err_default_member_initializer_cycle)
3854 Diag(PointOfInstantiation,
3855 diag::err_default_member_initializer_not_yet_parsed)
3856 << OutermostClass << Pattern;
3857 Diag(Pattern->getEndLoc(),
3858 diag::note_default_member_initializer_not_yet_parsed);
3868 "instantiating default member init");
3876 PointOfInstantiation, Instantiation,
CurContext};
3892 L->DefaultMemberInitializerInstantiated(Instantiation);
3901 struct PartialSpecMatchResult {
3927 !CTPSD->getMostRecentDecl()->isMemberSpecialization())
3947 std::optional<Sema::NonSFINAEContext> NSC(S);
3967 typedef PartialSpecMatchResult MatchResult;
3970 Template->getPartialSpecializations(PartialSpecs);
3983 if (
Template->getMostRecentDecl()->isMemberSpecialization() &&
3984 !Partial->getMostRecentDecl()->isMemberSpecialization())
4002 if (Matched.empty() && PrimaryStrictPackMatch)
4003 Matched = std::move(ExtraMatched);
4009 if (Matched.size() >= 1) {
4011 if (Matched.size() == 1) {
4024 PEnd = Matched.end();
4027 P->Partial, Best->Partial, PointOfInstantiation) ==
4036 PEnd = Matched.end();
4039 P->Partial, Best->Partial,
4040 PointOfInstantiation) != Best->Partial) {
4050 S.
Diag(PointOfInstantiation,
4051 diag::err_partial_spec_ordering_ambiguous)
4052 << ClassTemplateSpec;
4056 PEnd = Matched.end();
4058 S.
Diag(P->Partial->getLocation(), diag::note_partial_spec_match)
4060 P->Partial->getTemplateParameters(), *P->Args);
4075 if (
auto *PartialSpec =
4078 while (PartialSpec->getInstantiatedFromMember()) {
4081 if (PartialSpec->isMemberSpecialization())
4084 PartialSpec = PartialSpec->getInstantiatedFromMember();
4086 Pattern = PartialSpec;
4089 while (
Template->getInstantiatedFromMemberTemplate()) {
4092 if (
Template->isMemberSpecialization())
4097 Pattern =
Template->getTemplatedDecl();
4107 bool PrimaryStrictPackMatch) {
4116 if (AlreadyInstantiating)
4119 bool HadAvaibilityWarning =
4125 ClassTemplateSpec, TSK,
4126 PrimaryStrictPackMatch);
4131 bool Err = InstantiateClassImpl(
4132 PointOfInstantiation, ClassTemplateSpec, Pattern.
get(),
4139 if (!Err && !HadAvaibilityWarning) {
4159 "Unexpected template specialization kind!");
4160 for (
auto *D : Instantiation->
decls()) {
4161 bool SuppressNew =
false;
4162 if (
auto *
Function = dyn_cast<FunctionDecl>(D)) {
4164 Function->getInstantiatedFromMemberFunction()) {
4166 if (
Function->getTrailingRequiresClause()) {
4174 if (
Function->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4178 Function->getTemplateSpecializationKind();
4183 PointOfInstantiation, TSK,
Function, PrevTSK,
4184 Function->getPointOfInstantiation(), SuppressNew) ||
4197 Function->setTemplateSpecializationKind(TSK, PointOfInstantiation);
4207 std::make_pair(
Function, PointOfInstantiation));
4210 }
else if (
auto *Var = dyn_cast<VarDecl>(D)) {
4215 if (Var->
hasAttr<ExcludeFromExplicitInstantiationAttr>())
4219 assert(MSInfo &&
"No member specialization information?");
4248 }
else if (
auto *
Record = dyn_cast<CXXRecordDecl>(D)) {
4249 if (
Record->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4257 if (
Record->isInjectedClassName() ||
Record->getPreviousDecl() ||
4262 assert(MSInfo &&
"No member specialization information?");
4268 if (
Context.getTargetInfo().getTriple().isOSWindows() &&
4288 assert(Pattern &&
"Missing instantiated-from-template information");
4290 if (!
Record->getDefinition()) {
4311 Record->getTemplateSpecializationKind() ==
4313 Record->setTemplateSpecializationKind(TSK);
4318 Pattern = cast_or_null<CXXRecordDecl>(
Record->getDefinition());
4322 }
else if (
auto *
Enum = dyn_cast<EnumDecl>(D)) {
4324 assert(MSInfo &&
"No member specialization information?");
4331 PointOfInstantiation, TSK,
Enum,
4337 if (
Enum->getDefinition())
4340 EnumDecl *Pattern =
Enum->getTemplateInstantiationPattern();
4341 assert(Pattern &&
"Missing instantiated-from-template information");
4352 }
else if (
auto *Field = dyn_cast<FieldDecl>(D)) {
4363 ClassPattern->
lookup(Field->getDeclName());
4396 TemplateInstantiator Instantiator(*
this, TemplateArgs,
4399 return Instantiator.TransformStmt(S);
4407 TemplateInstantiator Instantiator(*
this, TemplateArgs, Loc, Entity);
4408 return Instantiator.TransformTemplateArgument(Input, Output);
4415 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4417 return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out);
4424 TemplateInstantiator Instantiator(
4425 TemplateInstantiator::ForParameterMappingSubstitution, *
this, BaseLoc,
4427 return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out);
4435 TemplateInstantiator Instantiator(*
this, TemplateArgs,
4438 return Instantiator.TransformExpr(E);
4447 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4449 return Instantiator.TransformAddressOfOperand(E);
4465 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4467 Instantiator.setEvaluateConstraints(
false);
4468 return Instantiator.TransformExpr(E);
4474 TemplateInstantiator Instantiator(*
this, MLTAL,
SourceLocation(),
4483 *
this, ArgsAsWritten->
arguments().front().getSourceRange().getBegin(),
4486 ArgsAsWritten->
arguments().front().getSourceRange());
4491 if (Instantiator.TransformConceptTemplateArguments(
4516 struct ConstraintExprTransformer :
TreeTransform<ConstraintExprTransformer> {
4528 case Stmt::BinaryOperatorClass:
4529 case Stmt::ConceptSpecializationExprClass:
4530 case Stmt::ParenExprClass:
4531 case Stmt::UnresolvedLookupExprClass:
4532 return Base::TransformExpr(E);
4543 if (!(E->
getOpcode() == BinaryOperatorKind::BO_LAnd ||
4544 E->
getOpcode() == BinaryOperatorKind::BO_LOr))
4561 bool Uneval =
false) {
4563 return Base::TransformTemplateArgument(Input, Output, Uneval);
4570 bool IsAddressOfOperand =
false) {
4571 if (!E->isConceptReference())
4574 assert(E->getNumDecls() == 1 &&
4575 "ConceptReference must have single declaration");
4579 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(D)) {
4580 unsigned Depth = TTP->getDepth();
4581 unsigned Pos = TTP->getPosition();
4589 if (ResolvedConcept ==
nullptr)
4595 if (TransformTemplateArguments(E->getTemplateArgs(),
4596 E->getNumTemplateArgs(), TransArgs))
4603 ResolvedConcept, ResolvedConcept,
4608 ConstraintExprTransformer Transformer(*
this, MLTALForConstraint);
4610 Transformer.TransformExpr(
const_cast<Expr *
>(ConstraintExpr));
4616 bool CXXDirectInit) {
4617 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4619 return Instantiator.TransformInitializer(
Init, CXXDirectInit);
4628 TemplateInstantiator Instantiator(*
this, TemplateArgs,
4631 return Instantiator.TransformExprs(Exprs.data(), Exprs.size(),
4641 TemplateInstantiator Instantiator(*
this, TemplateArgs, NNS.
getBeginLoc(),
4643 return Instantiator.TransformNestedNameSpecifierLoc(NNS);
4649 TemplateInstantiator Instantiator(*
this, TemplateArgs, NameInfo.
getLoc(),
4651 return Instantiator.TransformDeclarationNameInfo(NameInfo);
4659 TemplateInstantiator Instantiator(*
this, TemplateArgs, NameLoc,
4661 return Instantiator.TransformTemplateName(QualifierLoc, TemplateKWLoc, Name,
4670 if (
const ParmVarDecl *PV = dyn_cast<ParmVarDecl>(D)) {
4671 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(PV->getDeclContext())) {
4672 unsigned i = PV->getFunctionScopeIndex();
4675 if (i < FD->getNumParams() && FD->getParamDecl(i) == PV)
4676 return FD->getCanonicalDecl()->getParamDecl(i);
4682llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
4686 Current = Current->Outer) {
4689 const Decl *CheckD = D;
4691 LocalDeclsMap::iterator
Found = Current->LocalDecls.find(CheckD);
4692 if (
Found != Current->LocalDecls.end())
4693 return &
Found->second;
4697 if (
const TagDecl *Tag = dyn_cast<TagDecl>(CheckD))
4704 if (!Current->CombineWithOuterScope)
4711llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
4724 if (RD->isLocalClass())
4741 assert(
isa<LabelDecl>(D) &&
"declaration not instantiated in this scope");
4747 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D];
4748 if (Stored.isNull()) {
4752 while (Current->CombineWithOuterScope && Current->Outer) {
4753 Current = Current->Outer;
4754 assert(!Current->LocalDecls.contains(D) &&
4755 "Instantiated local in inner and outer scopes");
4759 }
else if (
DeclArgumentPack *Pack = dyn_cast<DeclArgumentPack *>(Stored)) {
4762 assert(
cast<Decl *>(Stored) == Inst &&
"Already instantiated this local");
4770 Pack->push_back(Inst);
4777 Current && Current->CombineWithOuterScope; Current = Current->Outer)
4778 assert(!Current->LocalDecls.contains(D) &&
4779 "Creating local pack after instantiation of local");
4783 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[D];
4786 ArgumentPacks.push_back(Pack);
4791 if (llvm::is_contained(*Pack, D))
4798 unsigned NumExplicitArgs) {
4799 assert((!PartiallySubstitutedPack || PartiallySubstitutedPack == Pack) &&
4800 "Already have a partially-substituted pack");
4801 assert((!PartiallySubstitutedPack
4802 || NumArgsInPartiallySubstitutedPack == NumExplicitArgs) &&
4803 "Wrong number of arguments in partially-substituted pack");
4804 PartiallySubstitutedPack = Pack;
4805 ArgsInPartiallySubstitutedPack = ExplicitArgs;
4806 NumArgsInPartiallySubstitutedPack = NumExplicitArgs;
4811 unsigned *NumExplicitArgs)
const {
4813 *ExplicitArgs =
nullptr;
4814 if (NumExplicitArgs)
4815 *NumExplicitArgs = 0;
4818 Current = Current->Outer) {
4819 if (Current->PartiallySubstitutedPack) {
4821 *ExplicitArgs = Current->ArgsInPartiallySubstitutedPack;
4822 if (NumExplicitArgs)
4823 *NumExplicitArgs = Current->NumArgsInPartiallySubstitutedPack;
4825 return Current->PartiallySubstitutedPack;
4828 if (!Current->CombineWithOuterScope)
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines Expressions and AST nodes for C++2a concepts.
Defines the clang::LangOptions interface.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Record Record
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
static bool PreparePackForExpansion(Sema &S, const CXXBaseSpecifier &Base, const MultiLevelTemplateArgumentList &TemplateArgs, TypeSourceInfo *&Out, UnexpandedInfo &Info)
static const Decl * getCanonicalParmVarDecl(const Decl *D)
static std::string convertCallArgsValueCategoryAndTypeToString(Sema &S, llvm::ArrayRef< const Expr * > Args)
static ActionResult< CXXRecordDecl * > getPatternForClassTemplateSpecialization(Sema &S, SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool PrimaryStrictPackMatch)
Get the instantiation pattern to use to instantiate the definition of a given ClassTemplateSpecializa...
static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T)
static concepts::Requirement::SubstitutionDiagnostic * createSubstDiag(Sema &S, TemplateDeductionInfo &Info, Sema::EntityPrinter Printer)
static std::string convertCallArgsToString(Sema &S, llvm::ArrayRef< const Expr * > Args)
Defines the clang::TypeLoc interface and its subclasses.
TypePropertyCache< Private > Cache
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const clang::PrintingPolicy & getPrintingPolicy() const
The result of parsing/analyzing an expression, statement etc.
QualType getOriginalType() const
QualType getElementType() const
Attr - This represents one attribute.
A builtin binary operation expression such as "x + y" or "x <= y".
SourceLocation getOperatorLoc() const
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
QualType getPointeeType() const
Represents a base class of a C++ class.
SourceLocation getUsedLocation() const
Retrieve the location where this default argument was actually used.
const ParmVarDecl * getParam() const
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
const FunctionDecl * isLocalClass() const
If the class is a local class [class.local], returns the enclosing function declaration.
CXXRecordDecl * getInstantiatedFromMemberClass() const
If this record is an instantiation of a member class, retrieves the member class from which it was in...
bool isLambda() const
Determine whether this class describes a lambda function object.
CXXRecordDecl * getDefinition() const
unsigned getNumBases() const
Retrieves the number of base classes of this class.
const CXXRecordDecl * getTemplateInstantiationPattern() const
Retrieve the record declaration from which this record could be instantiated.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this class is an instantiation of a member class of a class template specialization,...
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Represents a C++ nested-name-specifier or a global scope specifier.
Declaration of a class template.
ClassTemplateDecl * getMostRecentDecl()
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
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.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
bool isClassScopeExplicitSpecialization() const
Is this an explicit specialization at class scope (within the class that owns the primary template)?
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate members of the class templa...
void setInstantiationOf(ClassTemplatePartialSpecializationDecl *PartialSpec, const TemplateArgumentList *TemplateArgs)
Note that this class template specialization is actually an instantiation of the given class template...
Declaration of a C++20 concept.
NamedDecl * getFoundDecl() const
Represents the specialization of a concept - evaluates to a prvalue of type bool.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
ConceptDecl * getNamedConcept() const
const TypeClass * getTypePtr() const
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
bool HasSubstitutionFailure()
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...
bool isFileContext() const
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.
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
SourceLocation getLocation() const
Decl - This represents one declaration (or definition), e.g.
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
TemplateDecl * getDescribedTemplate() const
If this is a declaration that describes some template, this method returns that template declaration.
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
bool isParameterPack() const
Whether this declaration is a parameter pack.
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
bool isFileContextDecl() const
static Decl * castFromDeclContext(const DeclContext *)
unsigned getTemplateDepth() const
Determine the number of levels of template parameter surrounding this declaration.
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setLocation(SourceLocation L)
bool isDefinedOutsideFunctionOrMethod() const
isDefinedOutsideFunctionOrMethod - This predicate returns true if this scoped decl is defined outside...
DeclContext * getDeclContext()
void setDeclContext(DeclContext *DC)
setDeclContext - Set both the semantic and lexical DeclContext to DC.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
void setVisibleDespiteOwningModule()
Set that this declaration is globally visible, even if it came from a module that is not visible.
The name of a declaration.
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
TypeSourceInfo * getTypeSourceInfo() const
QualType getElementType() const
RAII object that enters a new expression evaluation context.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this enumeration is an instantiation of a member enumeration of a class template specialization,...
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
EnumDecl * getDefinition() const
This represents one expression.
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
ExprDependence getDependence() const
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Represents a function declaration or definition.
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...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
ValueDecl * getExpansion(unsigned I) const
Get an expansion of the parameter pack by index.
ValueDecl *const * iterator
Iterators over the parameters which the parameter pack expanded into.
ValueDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
unsigned getNumExpansions() const
Get the number of parameters in this parameter pack.
SourceLocation getParameterPackLocation() const
Get the location of the parameter pack.
Represents a prototype with parameter type info, e.g.
ExtProtoInfo getExtProtoInfo() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
ArrayRef< ParmVarDecl * > getParams() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
QualType getReturnType() const
ArrayRef< TemplateArgument > getTemplateArguments() const
const TypeClass * getTypePtr() const
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
A stack-allocated class that identifies which local variable declaration instantiations are present i...
LocalInstantiationScope(Sema &SemaRef, bool CombineWithOuterScope=false, bool InstantiatingLambdaOrBlock=false)
void SetPartiallySubstitutedPack(NamedDecl *Pack, const TemplateArgument *ExplicitArgs, unsigned NumExplicitArgs)
Note that the given parameter pack has been partially substituted via explicit specification of templ...
NamedDecl * getPartiallySubstitutedPack(const TemplateArgument **ExplicitArgs=nullptr, unsigned *NumExplicitArgs=nullptr) const
Retrieve the partially-substitued template parameter pack.
bool isLocalPackExpansion(const Decl *D)
Determine whether D is a pack expansion created in this scope.
SmallVector< ValueDecl *, 4 > DeclArgumentPack
A set of declarations.
llvm::PointerUnion< Decl *, DeclArgumentPack * > * getInstantiationOfIfExists(const Decl *D)
Similar to findInstantiationOf(), but it wouldn't assert if the instantiation was not found within th...
static void deleteScopes(LocalInstantiationScope *Scope, LocalInstantiationScope *Outermost)
deletes the given scope, and all outer scopes, down to the given outermost scope.
void InstantiatedLocal(const Decl *D, Decl *Inst)
void InstantiatedLocalPackArg(const Decl *D, VarDecl *Inst)
bool isLambdaOrBlock() const
Determine whether this scope is for instantiating a lambda or block.
void MakeInstantiatedLocalArgPack(const Decl *D)
llvm::PointerUnion< Decl *, DeclArgumentPack * > * findInstantiationOf(const Decl *D)
Find the instantiation of the declaration D within the current instantiation scope.
QualType getUnderlyingType() const
QualType getPointeeType() const
Provides information a specialization of a member of a class template, which may be a member function...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the template specialization kind.
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template specialization this is.
SourceLocation getPointOfInstantiation() const
Retrieve the first point of instantiation of this member.
void setPointOfInstantiation(SourceLocation POI)
Set the first point of instantiation.
Describes a module or submodule.
Data structure that captures multiple levels of template argument lists for use in template instantia...
bool hasTemplateArgument(unsigned Depth, unsigned Index) const
Determine whether there is a non-NULL template argument at the given depth and index.
const ArgList & getInnermost() const
Retrieve the innermost template argument list.
std::pair< Decl *, bool > getAssociatedDecl(unsigned Depth) const
A template-like entity which owns the whole pattern being substituted.
unsigned getNumLevels() const
Determine the number of levels in this template argument list.
unsigned getNumSubstitutedLevels() const
Determine the number of substituted levels in this template argument list.
void setArgument(unsigned Depth, unsigned Index, TemplateArgument Arg)
Clear out a specific template argument.
bool isRewrite() const
Determine whether we are rewriting template parameters rather than substituting for them.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
virtual void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const
Appends a human-readable name for this declaration into the given stream.
virtual void printName(raw_ostream &OS, const PrintingPolicy &Policy) const
Pretty-print the unqualified name of this declaration.
A C++ nested-name-specifier augmented with source location information.
SourceLocation getBeginLoc() const
Retrieve the location of the beginning of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
const Type * getAsType() const
@ Type
A type, stored as a Type*.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getDepth() const
Get the nesting depth of the template parameter.
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
QualType getInnerType() const
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
SourceLocation getExplicitObjectParamThisLoc() const
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
void setUninstantiatedDefaultArg(Expr *arg)
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
bool hasUninstantiatedDefaultArg() const
bool hasInheritedDefaultArg() const
void setExplicitObjectParameterLoc(SourceLocation Loc)
Expr * getUninstantiatedDefaultArg()
unsigned getFunctionScopeDepth() const
void setHasInheritedDefaultArg(bool I=true)
QualType getPointeeType() const
PredefinedIdentKind getIdentKind() const
SourceLocation getLocation() const
PrettyDeclStackTraceEntry - If a crash occurs in the parser while parsing something related to a decl...
A (possibly-)qualified type.
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
void addConst()
Add the const type qualifier to this QualType.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
The collection of all-type qualifiers we support.
void removeObjCLifetime()
Represents a struct/union/class.
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
QualType getPointeeTypeAsWritten() const
Represents the body of a requires-expression.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
SourceLocation getLParenLoc() const
SourceLocation getRParenLoc() const
RequiresExprBodyDecl * getBody() const
Scope - A scope is a transient data structure that is used while parsing the program.
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
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...
For a defaulted function, the kind of defaulted function that it is.
DefaultedComparisonKind asComparison() const
bool isSpecialMember() const
bool isComparison() const
CXXSpecialMemberKind asSpecialMember() const
A helper class for building up ExtParameterInfos.
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Sema - This implements semantic analysis and AST building for C.
llvm::DenseSet< Module * > LookupModulesCache
Cache of additional modules that should be used for name lookup within the current template instantia...
bool SubstTypeConstraint(TemplateTypeParmDecl *Inst, const TypeConstraint *TC, const MultiLevelTemplateArgumentList &TemplateArgs, bool EvaluateConstraint)
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.
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
ExprResult SubstConceptTemplateArguments(const ConceptSpecializationExpr *CSE, const Expr *ConstraintExpr, const MultiLevelTemplateArgumentList &MLTAL)
Substitute concept template arguments in the constraint expression of a concept-id.
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
llvm::function_ref< void(SourceLocation, PartialDiagnostic)> InstantiationContextDiagFuncRef
TemplateName SubstTemplateName(SourceLocation TemplateKWLoc, NestedNameSpecifierLoc &QualifierLoc, TemplateName Name, SourceLocation NameLoc, const MultiLevelTemplateArgumentList &TemplateArgs)
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, UnsignedOrNone NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
void InstantiateClassTemplateSpecializationMembers(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)
Instantiate the definitions of all of the members of the given class template specialization,...
ClassTemplatePartialSpecializationDecl * getMoreSpecializedPartialSpecialization(ClassTemplatePartialSpecializationDecl *PS1, ClassTemplatePartialSpecializationDecl *PS2, SourceLocation Loc)
Returns the more specialized class template partial specialization according to the rules of partial ...
ExprResult SubstInitializer(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs, bool CXXDirectInit)
llvm::function_ref< void(llvm::raw_ostream &)> EntityPrinter
void SubstExceptionSpec(FunctionDecl *New, const FunctionProtoType *Proto, const MultiLevelTemplateArgumentList &Args)
concepts::Requirement::SubstitutionDiagnostic * createSubstDiagAt(SourceLocation Location, EntityPrinter Printer)
create a Requirement::SubstitutionDiagnostic with only a SubstitutedEntity and DiagLoc using ASTConte...
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)
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain, bool PrimaryStrictPackMatch)
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool FailOnPackProducingTemplates, bool &ShouldExpand, bool &RetainExpansion, UnsignedOrNone &NumExpansions, bool Diagnose=true)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
ExprResult SubstConstraintExprWithoutSatisfaction(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
void PrintInstantiationStack()
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.
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
bool SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
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 collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool SubstTemplateArgumentsInParameterMapping(ArrayRef< TemplateArgumentLoc > Args, SourceLocation BaseLoc, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Out)
void InstantiateClassMembers(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiates the definitions of all of the member of the given class, which is an instantiation of a ...
DeclarationNameInfo SubstDeclarationNameInfo(const DeclarationNameInfo &NameInfo, const MultiLevelTemplateArgumentList &TemplateArgs)
Do template substitution on declaration name info.
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
TemplateArgument getPackSubstitutedTemplateArgument(TemplateArgument Arg) const
void popCodeSynthesisContext()
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
llvm::DenseMap< llvm::FoldingSetNodeID, TemplateArgumentLoc > * CurrentCachedTemplateArgs
Cache the instantiation results of template parameter mappings within concepts.
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
bool SubstParmTypes(SourceLocation Loc, ArrayRef< ParmVarDecl * > Params, const FunctionProtoType::ExtParameterInfo *ExtParamInfos, const MultiLevelTemplateArgumentList &TemplateArgs, SmallVectorImpl< QualType > &ParamTypes, SmallVectorImpl< ParmVarDecl * > *OutParams, ExtParameterInfoBuilder &ParamInfos)
Substitute the given template arguments into the given set of parameters, producing the set of parame...
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...
ParmVarDecl * CheckParameter(DeclContext *DC, SourceLocation StartLoc, SourceLocation NameLoc, const IdentifierInfo *Name, QualType T, TypeSourceInfo *TSInfo, StorageClass SC)
bool CheckFunctionConstraints(const FunctionDecl *FD, ConstraintSatisfaction &Satisfaction, SourceLocation UsageLoc=SourceLocation(), bool ForOverloadResolution=false)
Check whether the given function decl's trailing requires clause is satisfied, if any.
bool CheckSpecializationInstantiationRedecl(SourceLocation NewLoc, TemplateSpecializationKind ActOnExplicitInstantiationNewTSK, NamedDecl *PrevDecl, TemplateSpecializationKind PrevTSK, SourceLocation PrevPtOfInstantiation, bool &SuppressNew)
Diagnose cases where we have an explicit template specialization before/after an explicit template in...
unsigned NonInstantiationEntries
The number of CodeSynthesisContexts that are not template instantiations and, therefore,...
bool CheckNoInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
bool inConstraintSubstitution() const
Determine whether we are currently performing constraint substitution.
bool CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
void DiagnoseAvailabilityOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass, bool ObjCPropertyAccess, bool AvoidPartialAvailabilityChecks, ObjCInterfaceDecl *ClassReceiver)
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, TemplateDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
std::pair< AvailabilityResult, const NamedDecl * > ShouldDiagnoseAvailabilityOfDecl(const NamedDecl *D, std::string *Message, ObjCInterfaceDecl *ClassReceiver)
The diagnostic we should emit for D, and the declaration that originated it, or AR_Available.
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
UnsignedOrNone ArgPackSubstIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
bool InstantiateClass(SourceLocation PointOfInstantiation, CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK, bool Complain=true)
Instantiate the definition of a class from a given pattern.
bool SubstTemplateArgument(const TemplateArgumentLoc &Input, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentLoc &Output, SourceLocation Loc={}, const DeclarationName &Entity={})
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 SubstDefaultArgument(SourceLocation Loc, ParmVarDecl *Param, const MultiLevelTemplateArgumentList &TemplateArgs, bool ForCallExpr=false)
Substitute the given template arguments into the default argument.
ExprResult SubstConstraintExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
@ 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...
unsigned LastEmittedCodeSynthesisContextDepth
The depth of the context stack at the point when the most recent error or warning was produced.
bool inParameterMappingSubstitution() const
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
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...
DiagnosticsEngine & Diags
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
friend class InitializationSequence
SmallVector< Module *, 16 > CodeSynthesisContextLookupModules
Extra modules inspected when performing a lookup during a template instantiation.
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
void runWithSufficientStackSpace(SourceLocation Loc, llvm::function_ref< void()> Fn)
Run some code with "sufficient" stack space.
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
bool InstantiateEnum(SourceLocation PointOfInstantiation, EnumDecl *Instantiation, EnumDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateSpecializationKind TSK)
Instantiate the definition of an enum from a given pattern.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
ExprResult SubstCXXIdExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
Substitute an expression as if it is a address-of-operand, which makes it act like a CXXIdExpression ...
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
bool SubstBaseSpecifiers(CXXRecordDecl *Instantiation, CXXRecordDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Perform substitution on the base class specifiers of the given class template specialization.
void PerformDependentDiagnostics(const DeclContext *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, UnsignedOrNone NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
ASTMutationListener * getASTMutationListener() const
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
TypeSourceInfo * SubstFunctionDeclType(TypeSourceInfo *T, const MultiLevelTemplateArgumentList &TemplateArgs, SourceLocation Loc, DeclarationName Entity, CXXRecordDecl *ThisContext, Qualifiers ThisTypeQuals, bool EvaluateConstraints=true)
A form of SubstType intended specifically for instantiating the type of a FunctionDecl.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
void startDefinition()
Starts the definition of this tag declaration.
void setBraceRange(SourceRange R)
SourceLocation getNameLoc() const
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
A template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
bool isConceptOrConceptTemplateParameter() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const
Used to insert TemplateArguments into FoldingSets.
QualType getAsType() const
Retrieve the type for a type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
TemplateArgument getPackExpansionPattern() const
When the template argument is a pack expansion, returns the pattern of the pack expansion.
bool isNull() const
Determine whether this template argument has no value.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
@ Template
The template argument is a template name that was provided for a template template parameter.
@ Pack
The template argument is actually a parameter pack.
@ Type
The template argument is a type.
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
SmallVectorImpl< std::pair< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > >::iterator delayed_partial_spec_iterator
void InstantiateEnumDefinition(EnumDecl *Enum, EnumDecl *Pattern)
SmallVectorImpl< std::pair< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > >::iterator delayed_var_partial_spec_iterator
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
@ Template
A single template declaration.
SubstTemplateTemplateParmPackStorage * getAsSubstTemplateTemplateParmPack() const
Retrieve the substituted template template parameter pack, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation getTemplateLoc() const
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
SourceLocation getLocation() const
TemplateSpecCandidate & addCandidate()
Add a new candidate with NumConversions conversion sequence slots to the overload set.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getDepth() const
Get the nesting depth of the template parameter.
Declaration of a template type parameter.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint, UnsignedOrNone ArgPackSubstIndex)
bool isParameterPack() const
Returns whether this is a parameter pack.
Declaration of an alias template.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
UnsignedOrNone getArgPackSubstIndex() const
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
TemplateDecl * getNamedConcept() const
const DeclarationNameInfo & getConceptNameInfo() const
ConceptReference * getConceptReference() const
void setLocStart(SourceLocation L)
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
void reserve(size_t Requested)
Ensures that this buffer has at least as much capacity as described.
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.
QualType getType() const
Get the type for which this source info wrapper provides information.
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.
unsigned getFullDataSize() const
Returns the size of the type source info data block.
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.
SourceLocation getNameLoc() const
void setNameLoc(SourceLocation Loc)
The base class of the type hierarchy.
bool isReferenceType() const
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
QualType getUnderlyingType() const
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Represents a variable declaration or definition.
bool isStaticDataMember() const
Determines whether this is a static data member.
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
VarDecl * getInstantiatedFromStaticDataMember() const
If this variable is an instantiated static data member of a class template specialization,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For a static data member that was instantiated from a static data member of a class template,...
StorageClass getStorageClass() const
Returns the storage class as written in the source.
MemberSpecializationInfo * getMemberSpecializationInfo() const
If this variable is an instantiation of a static data member of a class template specialization,...
Declaration of a variable template.
Represents a variable template specialization, which refers to a variable template with a given set o...
const TemplateArgumentList & getTemplateInstantiationArgs() const
Retrieve the set of template arguments that should be used to instantiate the initializer of the vari...
bool isClassScopeExplicitSpecialization() const
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.
QualType getElementType() const
SubstitutionDiagnostic * getExprSubstitutionDiagnostic() const
bool isExprSubstitutionFailure() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
SourceLocation getNoexceptLoc() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
const ASTConstraintSatisfaction & getConstraintSatisfaction() const
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
StringRef getInvalidConstraintEntity()
A static requirement that can be used in a requires-expression to check properties of types and expre...
bool isSubstitutionFailure() const
SubstitutionDiagnostic * getSubstitutionDiagnostic() const
TypeSourceInfo * getType() const
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgumentList * takeCanonical()
SourceLocation getLocation() const
Returns the location at which template argument is occurring.
bool hasSFINAEDiagnostic() const
Is a SFINAE diagnostic available?
void takeSFINAEDiagnostic(PartialDiagnosticAt &PD)
Take ownership of the SFINAE diagnostic.
bool hasStrictPackMatch() const
Defines the clang::TargetInfo interface.
PRESERVE_NONE bool Ret(InterpState &S, CodePtr &PC)
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.
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)
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
NamedDecl * getAsNamedDecl(TemplateParameter P)
@ OK_Ordinary
An ordinary object is located at an address in memory.
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
bool isPackProducingBuiltinTemplateName(TemplateName N)
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool isGenericLambdaCallOperatorOrStaticInvokerSpecialization(const DeclContext *DC)
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
OptionalUnsigned< unsigned > UnsignedOrNone
@ Template
We are parsing a template declaration.
DeductionFailureInfo MakeDeductionFailureInfo(ASTContext &Context, TemplateDeductionResult TDK, sema::TemplateDeductionInfo &Info)
Convert from Sema's representation of template deduction information to the form used in overload-can...
@ Type
The name was classified as a type.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
for(const auto &A :T->param_types())
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateDeductionResult
Describes the result of template argument deduction.
@ Success
Template argument deduction was successful.
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)
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
@ EST_Uninstantiated
not instantiated yet
@ EST_None
no exception specification
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 ('>').
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments.
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
SourceLocation getLAngleLoc() const
ArrayRef< TemplateArgumentLoc > arguments() const
unsigned getNumTemplateArgs() const
SourceLocation getRAngleLoc() const
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
Holds information about the various types of exception specification.
ExceptionSpecificationType Type
The kind of exception specification this is.
ExceptionSpecInfo ExceptionSpec
constexpr underlying_type toInternalRepresentation() const
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
SourceRange InstantiationRange
The source range that covers the construct that cause the instantiation, e.g., the template-id that c...
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
SynthesisKind
The kind of template instantiation we are performing.
@ MarkingClassDllexported
We are marking a class as __dllexport.
@ RequirementParameterInstantiation
@ DefaultTemplateArgumentInstantiation
We are instantiating a default argument for a template parameter.
@ ExplicitTemplateArgumentSubstitution
We are substituting explicit template arguments provided for a function template.
@ DefaultTemplateArgumentChecking
We are checking the validity of a default template argument that has been used when naming a template...
@ InitializingStructuredBinding
We are initializing a structured binding.
@ ExceptionSpecInstantiation
We are instantiating the exception specification for a function template which was deferred until it ...
@ NestedRequirementConstraintsCheck
We are checking the satisfaction of a nested requirement of a requires expression.
@ BuildingBuiltinDumpStructCall
We are building an implied call from __builtin_dump_struct.
@ ParameterMappingSubstitution
@ DefiningSynthesizedFunction
We are defining a synthesized function (such as a defaulted special member).
@ Memoization
Added for Template instantiation observation.
@ ConstraintNormalization
@ LambdaExpressionSubstitution
We are substituting into a lambda expression.
@ TypeAliasTemplateInstantiation
We are instantiating a type alias template declaration.
@ BuildingDeductionGuides
We are building deduction guides for a class.
@ PartialOrderingTTP
We are performing partial ordering for template template parameters.
@ DeducedTemplateArgumentSubstitution
We are substituting template argument determined as part of template argument deduction for either a ...
@ PriorTemplateArgumentSubstitution
We are substituting prior template arguments into a new template parameter.
@ SYCLKernelLaunchOverloadResolution
We are performing overload resolution for a call to a function template or variable template named 's...
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
@ TemplateInstantiation
We are instantiating a template declaration.
@ DeclaringSpecialMember
We are declaring an implicit special member function.
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
@ DefaultFunctionArgumentInstantiation
We are instantiating a default argument for a function.
@ RewritingOperatorAsSpaceship
We are rewriting a comparison operator in terms of an operator<=>.
@ SYCLKernelLaunchLookup
We are performing name lookup for a function template or variable template named 'sycl_kernel_launch'...
@ RequirementInstantiation
We are instantiating a requirement of a requires expression.
Decl * Entity
The entity that is being synthesized.
bool isInstantiationRecord() const
Determines whether this template is an actual instantiation that should be counted toward the maximum...
A stack object to be created when performing template instantiation.
bool isInvalid() const
Determines whether we have exceeded the maximum recursive template instantiations.
InstantiatingTemplate(Sema &SemaRef, SourceLocation PointOfInstantiation, Decl *Entity, SourceRange InstantiationRange=SourceRange())
Note that we are instantiating a class template, function template, variable template,...
void Clear()
Note that we have finished instantiating this template.
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)
bool ExpandUnderForgetSubstitions
UnsignedOrNone NumExpansions