38#include "llvm/ADT/STLForwardCompat.h"
39#include "llvm/ADT/StringExtras.h"
40#include "llvm/Support/ErrorHandling.h"
41#include "llvm/Support/SaveAndRestore.h"
42#include "llvm/Support/TimeProfiler.h"
55 const Decl *NextDecl =
nullptr;
57 bool ClearRelativeToPrimary =
true;
58 static Response Done() {
63 static Response ChangeDecl(
const Decl *ND) {
68 static Response ChangeDecl(
const DeclContext *Ctx) {
74 static Response UseNextDecl(
const Decl *CurDecl) {
78 static Response DontClearRelativeToPrimaryNextDecl(
const Decl *CurDecl) {
79 Response R = Response::UseNextDecl(CurDecl);
80 R.ClearRelativeToPrimary =
false;
89getPrimaryTemplateOfGenericLambda(
const FunctionDecl *LambdaCallOperator) {
91 return LambdaCallOperator;
93 if (
auto *FTD = dyn_cast_if_present<FunctionTemplateDecl>(
95 FTD && FTD->getInstantiatedFromMemberTemplate()) {
97 FTD->getInstantiatedFromMemberTemplate()->getTemplatedDecl();
103 }
else if (
auto *Prev = cast<CXXMethodDecl>(LambdaCallOperator)
104 ->getInstantiatedFromMemberFunction())
105 LambdaCallOperator = Prev;
109 return LambdaCallOperator;
112struct EnclosingTypeAliasTemplateDetails {
117 explicit operator bool()
noexcept {
return Template; }
122EnclosingTypeAliasTemplateDetails
123getEnclosingTypeAliasTemplateDecl(
Sema &SemaRef) {
126 TypeAliasTemplateInstantiation)
128 EnclosingTypeAliasTemplateDetails Result;
129 auto *TATD = cast<TypeAliasTemplateDecl>(CSC.Entity),
130 *Next = TATD->getInstantiatedFromMemberTemplate();
134 CSC.template_arguments(),
137 Result.PrimaryTypeAliasDecl = Next;
138 Next = Next->getInstantiatedFromMemberTemplate();
151bool isLambdaEnclosedByTypeAliasDecl(
155 Visitor(
const FunctionDecl *CallOperator) : CallOperator(CallOperator) {}
156 bool VisitLambdaExpr(
LambdaExpr *LE)
override {
159 return getPrimaryTemplateOfGenericLambda(LE->getCallOperator()) !=
168 return !Visitor(getPrimaryTemplateOfGenericLambda(LambdaCallOperator))
169 .TraverseType(Underlying);
176 bool SkipForSpecialization) {
180 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec);
184 !isa<VarTemplatePartialSpecializationDecl>(VarTemplSpec))
185 return Response::Done();
190 llvm::PointerUnion<VarTemplateDecl *, VarTemplatePartialSpecializationDecl *>
194 if (!SkipForSpecialization)
195 Result.addOuterTemplateArguments(
198 if (Partial->isMemberSpecialization())
199 return Response::Done();
202 if (!SkipForSpecialization)
203 Result.addOuterTemplateArguments(
207 return Response::Done();
209 return Response::DontClearRelativeToPrimaryNextDecl(VarTemplSpec);
221 for (
unsigned I = 0, N = TTP->
getDepth() + 1; I != N; ++I)
222 Result.addOuterTemplateArguments(std::nullopt);
223 return Response::Done();
226Response HandlePartialClassTemplateSpec(
229 if (!SkipForSpecialization)
231 return Response::Done();
238 bool SkipForSpecialization) {
242 !isa<ClassTemplatePartialSpecializationDecl>(ClassTemplSpec))
243 return Response::Done();
245 if (!SkipForSpecialization)
246 Result.addOuterTemplateArguments(
255 return Response::Done();
261 if (
auto *InstFromPartialTempl =
264 return Response::ChangeDecl(
265 InstFromPartialTempl->getLexicalDeclContext());
267 return Response::UseNextDecl(ClassTemplSpec);
273 bool ForConstraintInstantiation,
274 bool ForDefaultArgumentSubstitution) {
276 if (!RelativeToPrimary &&
277 Function->getTemplateSpecializationKindForInstantiation() ==
279 return Response::Done();
281 if (!RelativeToPrimary &&
286 return Response::UseNextDecl(
Function);
288 Function->getTemplateSpecializationArgs()) {
291 TemplateArgs->asArray(),
294 if (RelativeToPrimary &&
295 (
Function->getTemplateSpecializationKind() ==
298 !
Function->getPrimaryTemplate()->getFriendObjectKind())))
299 return Response::UseNextDecl(
Function);
303 assert(
Function->getPrimaryTemplate() &&
"No function template?");
304 if (!ForDefaultArgumentSubstitution &&
305 Function->getPrimaryTemplate()->isMemberSpecialization())
306 return Response::Done();
309 if (!ForConstraintInstantiation &&
311 return Response::Done();
313 }
else if (
Function->getDescribedFunctionTemplate()) {
315 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) &&
316 "Outer template not instantiated?");
323 Function->getNonTransparentDeclContext()->isFileContext() &&
325 return Response::ChangeDecl(
Function->getLexicalDeclContext());
328 if (ForConstraintInstantiation &&
Function->getFriendObjectKind())
329 return Response::ChangeDecl(
Function->getLexicalDeclContext());
330 return Response::UseNextDecl(
Function);
333Response HandleFunctionTemplateDecl(
Sema &SemaRef,
336 if (!isa<ClassTemplateSpecializationDecl>(FTD->
getDeclContext())) {
337 Result.addOuterTemplateArguments(
366 if (TSTy->isCurrentInstantiation()) {
367 auto *RD = TSTy->getCanonicalTypeInternal()->getAsCXXRecordDecl();
369 Arguments = CTD->getInjectedTemplateArgs(SemaRef.
Context);
371 dyn_cast<ClassTemplateSpecializationDecl>(RD))
375 Result.addOuterTemplateArguments(
376 TSTy->getTemplateName().getAsTemplateDecl(), Arguments,
391 bool ForConstraintInstantiation) {
394 (ForConstraintInstantiation || Result.getNumSubstitutedLevels() == 0) &&
395 "Outer template not instantiated?");
396 if (ClassTemplate->isMemberSpecialization())
397 return Response::Done();
398 if (ForConstraintInstantiation)
399 Result.addOuterTemplateArguments(
401 ClassTemplate->getInjectedTemplateArgs(SemaRef.
Context),
408 return Response::Done();
413 if (ForConstraintInstantiation && IsFriend &&
422 return Response::ChangeDecl(LCD);
426 if (
auto TypeAlias = getEnclosingTypeAliasTemplateDecl(SemaRef);
427 ForConstraintInstantiation && TypeAlias) {
429 TypeAlias.PrimaryTypeAliasDecl)) {
430 Result.addOuterTemplateArguments(TypeAlias.Template,
431 TypeAlias.AssociatedTemplateArguments,
446 return Response::ChangeDecl(TypeAlias.Template->getDeclContext());
451 return Response::UseNextDecl(Rec);
454Response HandleImplicitConceptSpecializationDecl(
457 Result.addOuterTemplateArguments(
461 return Response::UseNextDecl(CSD);
464Response HandleGenericDeclContext(
const Decl *CurDecl) {
465 return Response::UseNextDecl(CurDecl);
473 const FunctionDecl *Pattern,
bool ForConstraintInstantiation,
474 bool SkipForSpecialization,
bool ForDefaultArgumentSubstitution) {
475 assert((ND || DC) &&
"Can't find arguments for a decl if one isn't provided");
479 Result, ND, DC, Final, Innermost, RelativeToPrimary, Pattern,
480 ForConstraintInstantiation, SkipForSpecialization,
481 ForDefaultArgumentSubstitution);
489 const FunctionDecl *Pattern,
bool ForConstraintInstantiation,
490 bool SkipForSpecialization,
bool ForDefaultArgumentSubstitution) {
491 assert((ND || DC) &&
"Can't find arguments for a decl if one isn't provided");
495 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);
513 CurDecl = Response::UseNextDecl(CurDecl).NextDecl;
518 if (
const auto *VarTemplSpec =
519 dyn_cast<VarTemplateSpecializationDecl>(CurDecl)) {
520 R = HandleVarTemplateSpec(VarTemplSpec,
Result, SkipForSpecialization);
521 }
else if (
const auto *PartialClassTemplSpec =
522 dyn_cast<ClassTemplatePartialSpecializationDecl>(CurDecl)) {
523 R = HandlePartialClassTemplateSpec(PartialClassTemplSpec,
Result,
524 SkipForSpecialization);
525 }
else if (
const auto *ClassTemplSpec =
526 dyn_cast<ClassTemplateSpecializationDecl>(CurDecl)) {
527 R = HandleClassTemplateSpec(ClassTemplSpec,
Result,
528 SkipForSpecialization);
529 }
else if (
const auto *
Function = dyn_cast<FunctionDecl>(CurDecl)) {
530 R = HandleFunction(*
this,
Function,
Result, Pattern, RelativeToPrimary,
531 ForConstraintInstantiation,
532 ForDefaultArgumentSubstitution);
533 }
else if (
const auto *Rec = dyn_cast<CXXRecordDecl>(CurDecl)) {
535 ForConstraintInstantiation);
536 }
else if (
const auto *CSD =
537 dyn_cast<ImplicitConceptSpecializationDecl>(CurDecl)) {
538 R = HandleImplicitConceptSpecializationDecl(CSD,
Result);
539 }
else if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(CurDecl)) {
540 R = HandleFunctionTemplateDecl(*
this, FTD,
Result);
541 }
else if (
const auto *CTD = dyn_cast<ClassTemplateDecl>(CurDecl)) {
542 R = Response::ChangeDecl(CTD->getLexicalDeclContext());
543 }
else if (!isa<DeclContext>(CurDecl)) {
544 R = Response::DontClearRelativeToPrimaryNextDecl(CurDecl);
545 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(CurDecl)) {
546 R = HandleDefaultTempArgIntoTempTempParam(TTP,
Result);
549 R = HandleGenericDeclContext(CurDecl);
554 if (R.ClearRelativeToPrimary)
555 RelativeToPrimary =
false;
557 CurDecl = R.NextDecl;
598 llvm_unreachable(
"Invalid SynthesisKind!");
628 AlreadyInstantiating = !Inst.Entity ?
false :
630 .insert({Inst.Entity->getCanonicalDecl(), Inst.Kind})
641 PointOfInstantiation, InstantiationRange, Entity) {}
648 PointOfInstantiation, InstantiationRange, Entity) {}
658 Template, TemplateArgs) {}
668 TemplateArgs, &DeductionInfo) {
682 PointOfInstantiation, InstantiationRange, Template, nullptr,
683 TemplateArgs, &DeductionInfo) {}
693 PointOfInstantiation, InstantiationRange, PartialSpec, nullptr,
694 TemplateArgs, &DeductionInfo) {}
704 PointOfInstantiation, InstantiationRange, PartialSpec, nullptr,
705 TemplateArgs, &DeductionInfo) {}
713 PointOfInstantiation, InstantiationRange, Param, nullptr,
723 PointOfInstantiation, InstantiationRange, Param, Template,
733 PointOfInstantiation, InstantiationRange, Param, Template,
742 PointOfInstantiation, InstantiationRange, Entity,
743 nullptr, TemplateArgs) {}
751 PointOfInstantiation, InstantiationRange, Param, Template,
760 PointOfInstantiation, InstantiationRange, nullptr,
761 nullptr, {}, &DeductionInfo) {}
769 PointOfInstantiation, InstantiationRange, nullptr,
777 PointOfInstantiation, InstantiationRange, nullptr,
778 nullptr, {}, &DeductionInfo) {}
786 PointOfInstantiation, InstantiationRange, Template, nullptr,
795 PointOfInstantiation, InstantiationRange, Template, nullptr,
796 {}, &DeductionInfo) {}
804 PointOfInstantiation, InstantiationRange, Template) {}
812 PointOfInstantiation, InstantiationRange, Template) {}
819 PointOfInstantiation, InstantiationRange, Entity) {}
838 if (!Active.isInstantiationRecord()) {
848 "forgot to remove a lookup module for a template instantiation");
867 if (!AlreadyInstantiating) {
871 {Active.Entity->getCanonicalDecl(), Active.Kind});
885 llvm::raw_string_ostream
OS(
Result);
886 llvm::ListSeparator Comma;
887 for (
const Expr *Arg : Args) {
889 Arg->IgnoreParens()->printPretty(
OS,
nullptr,
895bool Sema::InstantiatingTemplate::CheckInstantiationDepth(
906 diag::err_template_recursion_depth_exceeded)
908 << InstantiationRange;
909 SemaRef.
Diag(PointOfInstantiation, diag::note_template_recursion_depth)
919 SkipStart = Limit / 2 + Limit % 2;
924 unsigned InstantiationIdx = 0;
929 ++Active, ++InstantiationIdx) {
931 if (InstantiationIdx >= SkipStart && InstantiationIdx < SkipEnd) {
932 if (InstantiationIdx == SkipStart) {
935 diag::note_instantiation_contexts_suppressed)
941 switch (Active->Kind) {
943 Decl *
D = Active->Entity;
945 unsigned DiagID = diag::note_template_member_class_here;
946 if (isa<ClassTemplateSpecializationDecl>(
Record))
947 DiagID = diag::note_template_class_instantiation_here;
949 <<
Record << Active->InstantiationRange;
953 DiagID = diag::note_function_template_spec_here;
955 DiagID = diag::note_template_member_function_here;
958 << Active->InstantiationRange;
959 }
else if (
VarDecl *VD = dyn_cast<VarDecl>(
D)) {
961 VD->isStaticDataMember()?
962 diag::note_template_static_data_member_def_here
963 : diag::note_template_variable_def_here)
965 << Active->InstantiationRange;
966 }
else if (
EnumDecl *ED = dyn_cast<EnumDecl>(
D)) {
968 diag::note_template_enum_def_here)
970 << Active->InstantiationRange;
971 }
else if (
FieldDecl *FD = dyn_cast<FieldDecl>(
D)) {
973 diag::note_template_nsdmi_here)
974 << FD << Active->InstantiationRange;
977 diag::note_template_class_instantiation_here)
978 << CTD << Active->InstantiationRange;
984 TemplateDecl *Template = cast<TemplateDecl>(Active->Template);
986 llvm::raw_svector_ostream
OS(TemplateArgsStr);
991 diag::note_default_arg_instantiation_here)
993 << Active->InstantiationRange;
1000 diag::note_explicit_template_arg_substitution_here)
1003 Active->TemplateArgs,
1004 Active->NumTemplateArgs)
1005 << Active->InstantiationRange;
1011 dyn_cast<FunctionTemplateDecl>(Active->Entity)) {
1013 diag::note_function_template_deduction_instantiation_here)
1016 Active->TemplateArgs,
1017 Active->NumTemplateArgs)
1018 << Active->InstantiationRange;
1020 bool IsVar = isa<VarTemplateDecl>(Active->Entity) ||
1021 isa<VarTemplateSpecializationDecl>(Active->Entity);
1022 bool IsTemplate =
false;
1024 if (
auto *
D = dyn_cast<TemplateDecl>(Active->Entity)) {
1026 Params =
D->getTemplateParameters();
1027 }
else if (
auto *
D = dyn_cast<ClassTemplatePartialSpecializationDecl>(
1029 Params =
D->getTemplateParameters();
1030 }
else if (
auto *
D = dyn_cast<VarTemplatePartialSpecializationDecl>(
1032 Params =
D->getTemplateParameters();
1034 llvm_unreachable(
"unexpected template kind");
1038 diag::note_deduced_template_arg_substitution_here)
1039 << IsVar << IsTemplate << cast<NamedDecl>(Active->Entity)
1041 Active->NumTemplateArgs)
1042 << Active->InstantiationRange;
1048 ParmVarDecl *Param = cast<ParmVarDecl>(Active->Entity);
1052 llvm::raw_svector_ostream
OS(TemplateArgsStr);
1057 diag::note_default_function_arg_instantiation_here)
1059 << Active->InstantiationRange;
1064 NamedDecl *Parm = cast<NamedDecl>(Active->Entity);
1067 Name = std::string(
" '") + Parm->
getName().str() +
"'";
1070 if (
TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template))
1071 TemplateParams = Template->getTemplateParameters();
1074 cast<ClassTemplatePartialSpecializationDecl>(Active->Template)
1075 ->getTemplateParameters();
1077 diag::note_prior_template_arg_substitution)
1078 << isa<TemplateTemplateParmDecl>(Parm)
1081 Active->TemplateArgs,
1082 Active->NumTemplateArgs)
1083 << Active->InstantiationRange;
1089 if (
TemplateDecl *Template = dyn_cast<TemplateDecl>(Active->Template))
1090 TemplateParams = Template->getTemplateParameters();
1093 cast<ClassTemplatePartialSpecializationDecl>(Active->Template)
1094 ->getTemplateParameters();
1097 diag::note_template_default_arg_checking)
1099 Active->TemplateArgs,
1100 Active->NumTemplateArgs)
1101 << Active->InstantiationRange;
1107 diag::note_evaluating_exception_spec_here)
1108 << cast<FunctionDecl>(Active->Entity);
1113 diag::note_template_exception_spec_instantiation_here)
1114 << cast<FunctionDecl>(Active->Entity)
1115 << Active->InstantiationRange;
1120 diag::note_template_requirement_instantiation_here)
1121 << Active->InstantiationRange;
1125 diag::note_template_requirement_params_instantiation_here)
1126 << Active->InstantiationRange;
1131 diag::note_nested_requirement_here)
1132 << Active->InstantiationRange;
1137 diag::note_in_declaration_of_implicit_special_member)
1138 << cast<CXXRecordDecl>(Active->Entity)
1139 << llvm::to_underlying(Active->SpecialMember);
1144 diag::note_in_declaration_of_implicit_equality_comparison);
1150 auto *FD = dyn_cast<FunctionDecl>(Active->Entity);
1154 auto *MD = cast<CXXMethodDecl>(FD);
1156 diag::note_member_synthesized_at)
1157 << MD->isExplicitlyDefaulted()
1163 .getNonReferenceType()
1164 .getUnqualifiedType();
1166 diag::note_comparison_synthesized_at)
1174 diag::note_rewriting_operator_as_spaceship);
1179 diag::note_in_binding_decl_init)
1180 << cast<BindingDecl>(Active->Entity);
1185 diag::note_due_to_dllexported_class)
1186 << cast<CXXRecordDecl>(Active->Entity) << !
getLangOpts().CPlusPlus11;
1191 diag::note_building_builtin_dump_struct_call)
1201 diag::note_lambda_substitution_here);
1204 unsigned DiagID = 0;
1205 if (!Active->Entity) {
1207 diag::note_nested_requirement_here)
1208 << Active->InstantiationRange;
1211 if (isa<ConceptDecl>(Active->Entity))
1212 DiagID = diag::note_concept_specialization_here;
1213 else if (isa<TemplateDecl>(Active->Entity))
1214 DiagID = diag::note_checking_constraints_for_template_id_here;
1215 else if (isa<VarTemplatePartialSpecializationDecl>(Active->Entity))
1216 DiagID = diag::note_checking_constraints_for_var_spec_id_here;
1217 else if (isa<ClassTemplatePartialSpecializationDecl>(Active->Entity))
1218 DiagID = diag::note_checking_constraints_for_class_spec_id_here;
1220 assert(isa<FunctionDecl>(Active->Entity));
1221 DiagID = diag::note_checking_constraints_for_function_here;
1224 llvm::raw_svector_ostream
OS(TemplateArgsStr);
1226 if (!isa<FunctionDecl>(Active->Entity)) {
1230 Diags.
Report(Active->PointOfInstantiation, DiagID) <<
OS.str()
1231 << Active->InstantiationRange;
1236 diag::note_constraint_substitution_here)
1237 << Active->InstantiationRange;
1241 diag::note_constraint_normalization_here)
1242 << cast<NamedDecl>(Active->Entity) << Active->InstantiationRange;
1246 diag::note_parameter_mapping_substitution_here)
1247 << Active->InstantiationRange;
1251 diag::note_building_deduction_guide_here);
1255 diag::note_template_type_alias_instantiation_here)
1256 << cast<TypeAliasTemplateDecl>(Active->Entity)
1257 << Active->InstantiationRange;
1265 return std::optional<TemplateDeductionInfo *>(
nullptr);
1270 Active != ActiveEnd;
1273 switch (Active->Kind) {
1277 if (isa<TypeAliasTemplateDecl>(Active->Entity))
1288 return std::nullopt;
1295 return std::nullopt;
1316 assert(Active->DeductionInfo &&
"Missing deduction info pointer");
1317 return Active->DeductionInfo;
1328 return std::nullopt;
1342 if (Active->SavedInNonInstantiationSFINAEContext)
1343 return std::optional<TemplateDeductionInfo *>(
nullptr);
1346 return std::nullopt;
1353 class TemplateInstantiator :
public TreeTransform<TemplateInstantiator> {
1358 bool EvaluateConstraints =
true;
1361 bool IsIncomplete =
false;
1363 bool BailOutOnIncomplete;
1366 bool isSubstitutingConstraints()
const {
1368 return Context.Kind ==
1369 Sema::CodeSynthesisContext::ConstraintSubstitution;
1376 bool maybeInstantiateFunctionParameterToScope(
ParmVarDecl *OldParm);
1381 TemplateInstantiator(
Sema &SemaRef,
1384 bool BailOutOnIncomplete =
false)
1385 : inherited(SemaRef), TemplateArgs(TemplateArgs),
Loc(
Loc),
1386 Entity(Entity), BailOutOnIncomplete(BailOutOnIncomplete) {}
1388 void setEvaluateConstraints(
bool B) {
1389 EvaluateConstraints = B;
1391 bool getEvaluateConstraints() {
1392 return EvaluateConstraints;
1409 bool getIsIncomplete()
const {
return IsIncomplete; }
1415 this->Entity = Entity;
1418 unsigned TransformTemplateDepth(
unsigned Depth) {
1423 int Index = getSema().ArgumentPackSubstitutionIndex;
1425 return std::nullopt;
1432 bool &ShouldExpand,
bool &RetainExpansion,
1433 std::optional<unsigned> &NumExpansions) {
1437 if (!isa_and_present<ParmVarDecl>(VD))
1439 if (maybeInstantiateFunctionParameterToScope(cast<ParmVarDecl>(VD)))
1444 return getSema().CheckParameterPacksForExpansion(
1445 EllipsisLoc, PatternRange, Unexpanded, TemplateArgs, ShouldExpand,
1446 RetainExpansion, NumExpansions);
1449 void ExpandingFunctionParameterPack(
ParmVarDecl *Pack) {
1459 unsigned Depth, Index;
1462 Result = TemplateArgs(Depth, Index);
1465 IsIncomplete =
true;
1466 if (BailOutOnIncomplete)
1482 unsigned Depth, Index;
1492 void transformAttrs(
Decl *Old,
Decl *New) {
1498 (NewDecls.size() != 1 || !NewDecls.front()->isParameterPack())) {
1500 for (
auto *New : NewDecls)
1502 Old, cast<VarDecl>(New));
1506 assert(NewDecls.size() == 1 &&
1507 "should only have multiple expansions for a pack");
1508 Decl *New = NewDecls.front();
1513 auto *NewMD = dyn_cast<CXXMethodDecl>(New);
1515 auto *OldMD = dyn_cast<CXXMethodDecl>(Old);
1516 if (
auto *NewTD = NewMD->getDescribedFunctionTemplate())
1517 NewTD->setInstantiatedFromMemberTemplate(
1518 OldMD->getDescribedFunctionTemplate());
1520 NewMD->setInstantiationOfMemberFunction(OldMD,
1528 if (
auto *DC = dyn_cast<DeclContext>(Old);
1529 DC && DC->isDependentContext() && DC->isFunctionOrMethod())
1570 NamedDecl *FirstQualifierInScope =
nullptr,
1571 bool AllowInjectedClassName =
false);
1573 const AnnotateAttr *TransformAnnotateAttr(
const AnnotateAttr *AA);
1574 const CXXAssumeAttr *TransformCXXAssumeAttr(
const CXXAssumeAttr *AA);
1575 const LoopHintAttr *TransformLoopHintAttr(
const LoopHintAttr *LH);
1576 const NoInlineAttr *TransformStmtNoInlineAttr(
const Stmt *OrigS,
1578 const NoInlineAttr *A);
1579 const AlwaysInlineAttr *
1580 TransformStmtAlwaysInlineAttr(
const Stmt *OrigS,
const Stmt *InstS,
1581 const AlwaysInlineAttr *A);
1582 const CodeAlignAttr *TransformCodeAlignAttr(
const CodeAlignAttr *CA);
1589 ExprResult TransformSubstNonTypeTemplateParmPackExpr(
1591 ExprResult TransformSubstNonTypeTemplateParmExpr(
1608 return inherited::TransformFunctionProtoType(TLB, TL);
1613 auto Type = inherited::TransformInjectedClassNameType(TLB, TL);
1616 if (
Type.isNull() &&
1623 inherited::TransformType(ICT->getInjectedSpecializationType());
1634 bool Uneval =
false) {
1636 std::vector<TemplateArgument> TArgs;
1656 return inherited::TransformTemplateArgument(Input, Output, Uneval);
1659 template<
typename Fn>
1664 Fn TransformExceptionSpec);
1667 TransformFunctionTypeParam(
ParmVarDecl *OldParm,
int indexAdjustment,
1668 std::optional<unsigned> NumExpansions,
1669 bool ExpectParameterPack);
1671 using inherited::TransformTemplateTypeParmType;
1676 bool SuppressObjCLifetime);
1678 QualType BuildSubstTemplateTypeParmType(
1680 Decl *AssociatedDecl,
unsigned Index, std::optional<unsigned> PackIndex,
1686 using inherited::TransformSubstTemplateTypeParmPackType;
1690 bool SuppressObjCLifetime);
1696 if (
Type->getSubstitutionFlag() !=
1697 SubstTemplateTypeParmTypeFlag::ExpandPacksInPlace)
1698 return inherited::TransformSubstTemplateTypeParmType(TLB, TL);
1700 assert(
Type->getPackIndex());
1702 Type->getReplacedParameter()->getDepth(),
Type->getIndex());
1707 return inherited::TransformSubstTemplateTypeParmType(TLB, TL);
1712 if (
auto TypeAlias =
1713 TemplateInstArgsHelpers::getEnclosingTypeAliasTemplateDecl(
1715 TypeAlias && TemplateInstArgsHelpers::isLambdaEnclosedByTypeAliasDecl(
1717 unsigned TypeAliasDeclDepth =
TypeAlias.Template->getTemplateDepth();
1719 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent;
1722 return CXXRecordDecl::LambdaDependencyKind::LDK_AlwaysDependent;
1724 return inherited::ComputeLambdaDependency(LSI);
1736 return inherited::TransformLambdaExpr(
E);
1742 return inherited::TransformBlockExpr(
E);
1749 assert(PVD &&
"null in a parameter list");
1750 if (!PVD->hasDefaultArg())
1752 Expr *UninstExpr = PVD->getUninstantiatedDefaultArg();
1763 PVD->setDefaultArg(ErrorResult.
get());
1766 return inherited::RebuildLambdaExpr(StartLoc, EndLoc, LSI);
1780 return inherited::TransformLambdaBody(
E, Body);
1784 ExprResult Transformed = inherited::TransformSizeOfPackExpr(
E);
1787 auto *TransformedExpr = cast<SizeOfPackExpr>(Transformed.
get());
1790 TransformedExpr->getPack() ==
E->getPack()) {
1792 TransformDecl(
E->getPackLoc(), TransformedExpr->getPack());
1795 TransformedExpr->setPack(cast<NamedDecl>(NewPack));
1797 return TransformedExpr;
1802 ExprResult TransReq = inherited::TransformRequiresExpr(
E);
1805 assert(TransReq.
get() !=
E &&
1806 "Do not change value of isSatisfied for the existing expression. "
1807 "Create a new expression instead.");
1808 if (
E->getBody()->isDependentContext()) {
1814 if (Trap.hasErrorOccurred())
1820 bool TransformRequiresExprRequirements(
1823 bool SatisfactionDetermined =
false;
1826 if (!SatisfactionDetermined) {
1827 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
1828 TransReq = TransformTypeRequirement(TypeReq);
1829 else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
1830 TransReq = TransformExprRequirement(ExprReq);
1832 TransReq = TransformNestedRequirement(
1833 cast<concepts::NestedRequirement>(Req));
1842 SatisfactionDetermined =
true;
1845 Transformed.push_back(TransReq);
1852 if (!OrigTPL || !OrigTPL->
size())
return OrigTPL;
1856 Owner, TemplateArgs);
1857 DeclInstantiator.setEvaluateConstraints(EvaluateConstraints);
1858 return DeclInstantiator.SubstTemplateParams(OrigTPL);
1876 transformNonTypeTemplateParmRef(
Decl *AssociatedDecl,
1879 std::optional<unsigned> PackIndex);
1883bool TemplateInstantiator::AlreadyTransformed(
QualType T) {
1890 getSema().MarkDeclarationsReferencedInType(
Loc,
T);
1915 TTP->getPosition())) {
1916 IsIncomplete =
true;
1917 return BailOutOnIncomplete ? nullptr :
D;
1922 if (TTP->isParameterPack()) {
1933 "Missing argument pack");
1939 "Wrong kind of template template argument");
1948 if (isSubstitutingConstraints() && isa<ParmVarDecl>(
D) &&
1949 maybeInstantiateFunctionParameterToScope(cast<ParmVarDecl>(
D)))
1956bool TemplateInstantiator::maybeInstantiateFunctionParameterToScope(
1967 return !TransformFunctionTypeParam(OldParm, 0,
1978 assert(!Unexpanded.empty() &&
"Pack expansion without parameter packs?");
1980 bool ShouldExpand =
false;
1981 bool RetainExpansion =
false;
1982 std::optional<unsigned> OrigNumExpansions =
1984 std::optional<unsigned> NumExpansions = OrigNumExpansions;
1986 Pattern.getSourceRange(), Unexpanded,
1987 ShouldExpand, RetainExpansion, NumExpansions))
1990 assert(ShouldExpand && !RetainExpansion &&
1991 "Shouldn't preserve pack expansion when evaluating constraints");
1992 ExpandingFunctionParameterPack(OldParm);
1993 for (
unsigned I = 0; I != *NumExpansions; ++I) {
1995 if (!TransformFunctionTypeParam(OldParm, 0,
2004 Decl *Inst = getSema().SubstDecl(
D, getSema().
CurContext, TemplateArgs);
2008 getSema().CurrentInstantiationScope->InstantiatedLocal(
D, Inst);
2012bool TemplateInstantiator::TransformExceptionSpec(
2019 return inherited::TransformExceptionSpec(
Loc, ESI, Exceptions, Changed);
2023TemplateInstantiator::TransformFirstQualifierInScope(
NamedDecl *
D,
2037 "Missing argument pack");
2047 return cast_or_null<NamedDecl>(TransformDecl(
Loc,
D));
2050 return Tag->getDecl();
2053 getSema().Diag(
Loc, diag::err_nested_name_spec_non_tag) <<
T;
2058 return cast_or_null<NamedDecl>(TransformDecl(
Loc,
D));
2062TemplateInstantiator::RebuildExceptionDecl(
VarDecl *ExceptionDecl,
2068 StartLoc, NameLoc, Name);
2070 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
2074VarDecl *TemplateInstantiator::RebuildObjCExceptionDecl(
VarDecl *ExceptionDecl,
2077 VarDecl *Var = inherited::RebuildObjCExceptionDecl(ExceptionDecl, TSInfo,
T);
2079 getSema().CurrentInstantiationScope->InstantiatedLocal(ExceptionDecl, Var);
2084TemplateInstantiator::RebuildElaboratedType(
SourceLocation KeywordLoc,
2102 SemaRef.
Diag(TagLocation, diag::err_use_with_wrong_tag)
2111 return inherited::RebuildElaboratedType(KeywordLoc, Keyword, QualifierLoc,
T);
2114TemplateName TemplateInstantiator::TransformTemplateName(
2117 bool AllowInjectedClassName) {
2119 = dyn_cast_or_null<TemplateTemplateParmDecl>(Name.getAsTemplateDecl())) {
2126 TTP->getPosition())) {
2127 IsIncomplete =
true;
2138 "unexpected pack arguments in template rewrite");
2142 "unexpected nontype template argument kind in template rewrite");
2146 auto [AssociatedDecl, Final] =
2148 std::optional<unsigned> PackIndex;
2151 "Missing argument pack");
2157 return getSema().Context.getSubstTemplateTemplateParmPack(
2158 Arg, AssociatedDecl, TTP->
getIndex(), Final);
2161 PackIndex = getPackIndex(Arg);
2166 assert(!Template.
isNull() &&
"Null template template argument");
2170 return getSema().Context.getSubstTemplateTemplateParm(
2171 Template, AssociatedDecl, TTP->
getIndex(), PackIndex);
2176 = Name.getAsSubstTemplateTemplateParmPack()) {
2183 if (SubstPack->getFinal())
2185 return getSema().Context.getSubstTemplateTemplateParm(
2186 Template, SubstPack->getAssociatedDecl(), SubstPack->getIndex(),
2187 getPackIndex(Pack));
2190 return inherited::TransformTemplateName(SS, Name, NameLoc, ObjectType,
2191 FirstQualifierInScope,
2192 AllowInjectedClassName);
2200 return getSema().BuildPredefinedExpr(
E->getLocation(),
E->getIdentKind());
2204TemplateInstantiator::TransformTemplateParmRefExpr(
DeclRefExpr *
E,
2212 IsIncomplete =
true;
2213 return BailOutOnIncomplete ?
ExprError() :
E;
2223 "unexpected pack arguments in template rewrite");
2227 "unexpected nontype template argument kind in template rewrite");
2234 std::optional<unsigned> PackIndex;
2237 "Missing argument pack");
2255 E->getLocation(), Arg, AssociatedDecl, NTTP->
getPosition());
2257 PackIndex = getPackIndex(Arg);
2261 return transformNonTypeTemplateParmRef(AssociatedDecl, NTTP,
E->getLocation(),
2266TemplateInstantiator::TransformAnnotateAttr(
const AnnotateAttr *AA) {
2268 for (
Expr *Arg : AA->args()) {
2269 ExprResult Res = getDerived().TransformExpr(Arg);
2271 Args.push_back(Res.
get());
2273 return AnnotateAttr::CreateImplicit(getSema().
Context, AA->getAnnotation(),
2274 Args.data(), Args.size(), AA->getRange());
2277const CXXAssumeAttr *
2278TemplateInstantiator::TransformCXXAssumeAttr(
const CXXAssumeAttr *AA) {
2279 ExprResult Res = getDerived().TransformExpr(AA->getAssumption());
2283 Res = getSema().ActOnFinishFullExpr(Res.
get(),
2288 if (!(Res.
get()->
getDependence() & ExprDependence::TypeValueInstantiation)) {
2289 Res = getSema().BuildCXXAssumeExpr(Res.
get(), AA->getAttrName(),
2295 return CXXAssumeAttr::CreateImplicit(getSema().
Context, Res.
get(),
2300TemplateInstantiator::TransformLoopHintAttr(
const LoopHintAttr *LH) {
2301 Expr *TransformedExpr = getDerived().TransformExpr(LH->getValue()).get();
2303 if (TransformedExpr == LH->getValue())
2308 LH->getSemanticSpelling() ==
2309 LoopHintAttr::Pragma_unroll))
2312 LoopHintAttr::OptionType Option = LH->getOption();
2313 LoopHintAttr::LoopHintState State = LH->getState();
2315 llvm::APSInt ValueAPS =
2318 if (ValueAPS.isZero() || ValueAPS.isOne()) {
2319 Option = LoopHintAttr::Unroll;
2320 State = LoopHintAttr::Disable;
2325 return LoopHintAttr::CreateImplicit(getSema().
Context, Option, State,
2326 TransformedExpr, *LH);
2328const NoInlineAttr *TemplateInstantiator::TransformStmtNoInlineAttr(
2329 const Stmt *OrigS,
const Stmt *InstS,
const NoInlineAttr *A) {
2335const AlwaysInlineAttr *TemplateInstantiator::TransformStmtAlwaysInlineAttr(
2336 const Stmt *OrigS,
const Stmt *InstS,
const AlwaysInlineAttr *A) {
2343const CodeAlignAttr *
2344TemplateInstantiator::TransformCodeAlignAttr(
const CodeAlignAttr *CA) {
2345 Expr *TransformedExpr = getDerived().TransformExpr(CA->getAlignment()).get();
2346 return getSema().BuildCodeAlignAttr(*CA, TransformedExpr);
2349ExprResult TemplateInstantiator::transformNonTypeTemplateParmRef(
2352 std::optional<unsigned> PackIndex) {
2357 auto SubstParamType = [&] {
2364 T = cast<PackExpansionType>(
T)->getPattern();
2368 bool refParam =
false;
2374 Expr *argExpr =
arg.getAsExpr();
2379 QualType paramType = SubstParamType();
2394 VD = cast_or_null<ValueDecl>(
2400 QualType paramType =
arg.getNonTypeTemplateArgumentType();
2401 assert(!paramType.
isNull() &&
"type substitution failed for param type");
2402 assert(!paramType->
isDependentType() &&
"param type still dependent");
2406 QualType paramType =
arg.getNonTypeTemplateArgumentType();
2417 Expr *resultExpr = result.
get();
2421 AssociatedDecl, parm->
getIndex(), PackIndex, refParam);
2425TemplateInstantiator::TransformSubstNonTypeTemplateParmPackExpr(
2435 return transformNonTypeTemplateParmRef(
2436 E->getAssociatedDecl(),
E->getParameterPack(),
2437 E->getParameterPackLocation(), Arg, getPackIndex(Pack));
2441TemplateInstantiator::TransformSubstNonTypeTemplateParmExpr(
2443 ExprResult SubstReplacement =
E->getReplacement();
2444 if (!isa<ConstantExpr>(SubstReplacement.
get()))
2445 SubstReplacement = TransformExpr(
E->getReplacement());
2474 SubstReplacement.
get(), SugaredConverted,
2478 return transformNonTypeTemplateParmRef(
E->getAssociatedDecl(),
2480 SugaredConverted,
E->getPackIndex());
2486 return getSema().BuildDeclarationNameExpr(
CXXScopeSpec(), NameInfo, PD);
2497 return RebuildVarDeclRefExpr(VD,
E->
getExprLoc());
2507 Vars.reserve(
E->getNumExpansions());
2518 E->getParameterPackLocation(), Vars);
2519 getSema().MarkFunctionParmPackReferenced(PackExpr);
2524TemplateInstantiator::TransformFunctionParmPackRefExpr(
DeclRefExpr *
E,
2527 llvm::PointerUnion<Decl *, DeclArgumentPack *> *
Found
2528 = getSema().CurrentInstantiationScope->findInstantiationOf(PD);
2529 assert(
Found &&
"no instantiation for parameter pack");
2531 Decl *TransformedDecl;
2532 if (DeclArgumentPack *Pack =
Found->dyn_cast<DeclArgumentPack *>()) {
2541 getSema().MarkFunctionParmPackReferenced(PackExpr);
2545 TransformedDecl = (*Pack)[getSema().ArgumentPackSubstitutionIndex];
2547 TransformedDecl = cast<Decl *>(*
Found);
2551 return RebuildVarDeclRefExpr(cast<VarDecl>(TransformedDecl),
E->
getExprLoc());
2555TemplateInstantiator::TransformDeclRefExpr(
DeclRefExpr *
E) {
2562 return TransformTemplateParmRefExpr(
E, NTTP);
2569 if (
VarDecl *PD = dyn_cast<VarDecl>(
D))
2571 return TransformFunctionParmPackRefExpr(
E, PD);
2573 return inherited::TransformDeclRefExpr(
E);
2576ExprResult TemplateInstantiator::TransformCXXDefaultArgExpr(
2578 assert(!cast<FunctionDecl>(
E->getParam()->getDeclContext())->
2579 getDescribedFunctionTemplate() &&
2580 "Default arg expressions are never formed in dependent cases.");
2582 E->getUsedLocation(), cast<FunctionDecl>(
E->getParam()->getDeclContext()),
2586template<
typename Fn>
2591 Fn TransformExceptionSpec) {
2600 std::optional<LocalInstantiationScope>
Scope;
2601 if (!Current || !Current->isLambdaOrBlock())
2604 return inherited::TransformFunctionProtoType(
2605 TLB, TL, ThisContext, ThisTypeQuals, TransformExceptionSpec);
2608ParmVarDecl *TemplateInstantiator::TransformFunctionTypeParam(
2610 std::optional<unsigned> NumExpansions,
bool ExpectParameterPack) {
2612 OldParm, TemplateArgs, indexAdjustment, NumExpansions,
2613 ExpectParameterPack, EvaluateConstraints);
2619QualType TemplateInstantiator::BuildSubstTemplateTypeParmType(
2621 Decl *AssociatedDecl,
unsigned Index, std::optional<unsigned> PackIndex,
2627 if (SuppressObjCLifetime) {
2629 RQs = Replacement.getQualifiers();
2640 QualType Result = getSema().Context.getSubstTemplateTypeParmType(
2641 Replacement, AssociatedDecl, Index, PackIndex);
2649TemplateInstantiator::TransformTemplateTypeParmType(
TypeLocBuilder &TLB,
2651 bool SuppressObjCLifetime) {
2662 IsIncomplete =
true;
2663 if (BailOutOnIncomplete)
2679 "unexpected pack arguments in template rewrite");
2683 "unexpected nontype template argument kind in template rewrite");
2689 auto [AssociatedDecl, Final] =
2691 std::optional<unsigned> PackIndex;
2692 if (
T->isParameterPack()) {
2694 "Missing argument pack");
2700 QualType Result = getSema().Context.getSubstTemplateTypeParmPackType(
2701 AssociatedDecl,
T->getIndex(), Final, Arg);
2709 PackIndex = getPackIndex(Arg);
2714 "Template argument kind mismatch");
2716 return BuildSubstTemplateTypeParmType(TLB, SuppressObjCLifetime, Final,
2717 AssociatedDecl,
T->getIndex(),
2727 NewTTPDecl = cast_or_null<TemplateTypeParmDecl>(
2731 T->isParameterPack(), NewTTPDecl);
2737QualType TemplateInstantiator::TransformSubstTemplateTypeParmPackType(
2739 bool SuppressObjCLifetime) {
2742 Decl *NewReplaced = TransformDecl(TL.
getNameLoc(),
T->getAssociatedDecl());
2747 if (NewReplaced !=
T->getAssociatedDecl())
2748 Result = getSema().Context.getSubstTemplateTypeParmPackType(
2749 NewReplaced,
T->getIndex(),
T->getFinal(),
T->getArgumentPack());
2758 return BuildSubstTemplateTypeParmType(
2759 TLB, SuppressObjCLifetime,
T->getFinal(), NewReplaced,
T->getIndex(),
2773 ErrorLoc = PDA.first;
2778 llvm::raw_svector_ostream
OS(Entity);
2782 C.backupStr(Entity), ErrorLoc,
C.backupStr(Message)};
2788 llvm::raw_svector_ostream
OS(Entity);
2792 C.backupStr(Entity),
2793 Location, StringRef()};
2796ExprResult TemplateInstantiator::TransformRequiresTypeParams(
2810 if (getDerived().TransformFunctionTypeParams(
2811 KWLoc, Params,
nullptr,
nullptr, PTypes,
2812 &TransParams, PInfos, &ErrorIdx) ||
2813 Trap.hasErrorOccurred()) {
2819 SemaRef, Info, [&](llvm::raw_ostream &
OS) {
OS << *FailedDecl; })));
2820 return getDerived().RebuildRequiresExpr(KWLoc, Body, RE->
getLParenLoc(),
2822 TransReqs, RBraceLoc);
2833 if (AlwaysRebuild())
2834 return RebuildTypeRequirement(
2844 if (TypeInst.isInvalid())
2847 if (!TransType || Trap.hasErrorOccurred())
2849 [&] (llvm::raw_ostream&
OS) {
2852 return RebuildTypeRequirement(TransType);
2862 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *>
2871 if (ExprInst.isInvalid())
2874 if (!TransExprRes.
isInvalid() && !Trap.hasErrorOccurred() &&
2877 if (TransExprRes.
isInvalid() || Trap.hasErrorOccurred())
2882 TransExpr = TransExprRes.
get();
2885 std::optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
2887 if (RetReq.isEmpty())
2888 TransRetReq.emplace();
2889 else if (RetReq.isSubstitutionFailure())
2890 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
2891 else if (RetReq.isTypeConstraint()) {
2893 RetReq.getTypeConstraintTemplateParameterList();
2897 if (TPLInst.isInvalid())
2900 if (!TPL || Trap.hasErrorOccurred())
2902 [&] (llvm::raw_ostream&
OS) {
2903 RetReq.getTypeConstraint()->getImmediatelyDeclaredConstraint()
2908 TransRetReq.emplace(TPL);
2911 assert(TransRetReq &&
"All code paths leading here must set TransRetReq");
2912 if (
Expr *
E = TransExpr.dyn_cast<
Expr *>())
2914 std::move(*TransRetReq));
2915 return RebuildExprRequirement(
2916 cast<concepts::Requirement::SubstitutionDiagnostic *>(TransExpr),
2921TemplateInstantiator::TransformNestedRequirement(
2926 if (AlwaysRebuild())
2935 if (!getEvaluateConstraints()) {
2937 if (TransConstraint.
isInvalid() || !TransConstraint.
get())
2957 if (ConstrInst.isInvalid())
2961 nullptr, {Req->getConstraintExpr()},
Result, TemplateArgs,
2964 TransConstraint =
Result[0];
2965 assert(!Trap.hasErrorOccurred() &&
"Substitution failures must be handled "
2966 "by CheckConstraintSatisfaction.");
2972 if (TransConstraint.
isInvalid() || !TransConstraint.
get() ||
2975 llvm::raw_svector_ostream
OS(Entity);
2989 bool AllowDeducedTST) {
2991 "Cannot perform an instantiation without some context on the "
2992 "instantiation stack");
2998 TemplateInstantiator Instantiator(*
this, Args,
Loc, Entity);
2999 return AllowDeducedTST ? Instantiator.TransformTypeWithDeducedTST(
T)
3000 : Instantiator.TransformType(
T);
3008 "Cannot perform an instantiation without some context on the "
3009 "instantiation stack");
3023 TemplateInstantiator Instantiator(*
this, Args,
Loc, Entity);
3037 bool *IsIncompleteSubstitution) {
3039 "Cannot perform an instantiation without some context on the "
3040 "instantiation stack");
3047 TemplateInstantiator Instantiator(
3048 *
this, TemplateArgs,
Loc, Entity,
3049 IsIncompleteSubstitution !=
nullptr);
3050 QualType QT = Instantiator.TransformType(
T);
3051 if (IsIncompleteSubstitution && Instantiator.getIsIncomplete())
3052 *IsIncompleteSubstitution =
true;
3061 TypeLoc TL =
T->getTypeLoc().IgnoreParens();
3084 bool EvaluateConstraints) {
3086 "Cannot perform an instantiation without some context on the "
3087 "instantiation stack");
3092 TemplateInstantiator Instantiator(*
this, Args,
Loc, Entity);
3093 Instantiator.setEvaluateConstraints(EvaluateConstraints);
3109 Result = Instantiator.TransformFunctionProtoType(
3110 TLB, Proto, ThisContext, ThisTypeQuals,
3112 bool &Changed) {
return false; });
3114 Result = Instantiator.TransformType(TLB, TL);
3128 bool Changed =
false;
3130 return Instantiator.TransformExceptionSpec(
Loc, ESI, ExceptionStorage,
3141 ESI, ExceptionStorage, Args))
3150 struct GetContainedInventedTypeParmVisitor :
3151 public TypeVisitor<GetContainedInventedTypeParmVisitor,
3152 TemplateTypeParmDecl *> {
3153 using TypeVisitor<GetContainedInventedTypeParmVisitor,
3159 return Visit(
T.getTypePtr());
3164 if (!
T->getDecl() || !
T->getDecl()->isImplicit())
3166 return T->getDecl();
3173 return Visit(
T->getNamedType());
3185 return Visit(
T->getPointeeTypeAsWritten());
3193 return Visit(
T->getElementType());
3198 return Visit(
T->getElementType());
3202 return Visit(
T->getElementType());
3206 return VisitFunctionType(
T);
3214 return Visit(
T->getInnerType());
3218 return Visit(
T->getModifiedType());
3222 return Visit(
T->getUnderlyingType());
3226 return Visit(
T->getOriginalType());
3230 return Visit(
T->getPattern());
3238struct ExpandPackedTypeConstraints
3245 ExpandPackedTypeConstraints(
3247 : inherited(SemaRef), TemplateArgs(TemplateArgs) {}
3249 using inherited::TransformTemplateTypeParmType;
3254 if (!
T->isParameterPack()) {
3265 std::optional<unsigned> PackIndex;
3270 TL.
getType(),
T->getDecl(),
T->getIndex(), PackIndex,
3271 SubstTemplateTypeParmTypeFlag::ExpandPacksInPlace);
3281 if (
T->getPackIndex()) {
3287 return inherited::TransformSubstTemplateTypeParmType(TLB, TL);
3292 return inherited::TransformTemplateArguments(Args.begin(), Args.end(), Out);
3301 bool EvaluateConstraints) {
3305 if (!EvaluateConstraints) {
3306 bool ShouldExpandExplicitTemplateArgs =
3308 llvm::any_of(TemplArgInfo->
arguments(), [](
auto &Arg) {
3309 return Arg.getArgument().containsUnexpandedParameterPack();
3326 if (ShouldExpandExplicitTemplateArgs) {
3330 if (ExpandPackedTypeConstraints(*
this, TemplateArgs)
3338 if (
auto *FE = dyn_cast<CXXFoldExpr>(ConstraintExpr)) {
3339 assert(FE->getLHS());
3340 ConstraintExpr = FE->getLHS();
3342 auto *CSE = cast<ConceptSpecializationExpr>(ConstraintExpr);
3343 assert(!CSE->getTemplateArguments().empty() &&
3344 "Empty template arguments?");
3345 ConstrainedType = CSE->getTemplateArguments()[0].getAsType();
3346 assert(!ConstrainedType.
isNull() &&
3347 "Failed to extract the original ConstrainedType?");
3353 Inst, ConstrainedType,
3386 int indexAdjustment, std::optional<unsigned> NumExpansions,
3387 bool ExpectParameterPack,
bool EvaluateConstraint) {
3407 }
else if (ExpectParameterPack) {
3413 diag::err_function_parameter_pack_without_parameter_packs)
3437 GetContainedInventedTypeParmVisitor().Visit(OldDI->
getType())) {
3439 auto *Inst = cast_or_null<TemplateTypeParmDecl>(
3444 if (Inst && !Inst->getTypeConstraint()) {
3513 "Cannot perform an instantiation without some context on the "
3514 "instantiation stack");
3516 TemplateInstantiator Instantiator(*
this, TemplateArgs,
Loc,
3518 return Instantiator.TransformFunctionTypeParams(
3519 Loc, Params,
nullptr, ExtParamInfos, ParamTypes, OutParams, ParamInfos);
3537 Diag(Param->
getBeginLoc(), diag::err_recursive_default_argument) << FD;
3549 std::unique_ptr<LocalInstantiationScope> LIS;
3557 LIS = std::make_unique<LocalInstantiationScope>(*
this);
3560 if (addInstantiatedParametersToScope(FD, PatternFD, *LIS, TemplateArgs))
3582 Result = InitSeq.Perform(*
this, Entity, Kind, ResultE);
3609 for (
const auto &
Base : Pattern->
bases()) {
3610 if (!
Base.getType()->isDependentType()) {
3612 if (RD->isInvalidDecl())
3621 if (
Base.isPackExpansion()) {
3627 bool ShouldExpand =
false;
3628 bool RetainExpansion =
false;
3629 std::optional<unsigned> NumExpansions;
3631 Base.getSourceRange(),
3633 TemplateArgs, ShouldExpand,
3642 for (
unsigned I = 0; I != *NumExpansions; ++I) {
3647 Base.getSourceRange().getBegin(),
3656 Base.getSourceRange(),
3658 Base.getAccessSpecifierAsWritten(),
3661 InstantiatedBases.push_back(InstantiatedBase);
3670 EllipsisLoc =
Base.getEllipsisLoc();
3674 Base.getSourceRange().getBegin(),
3679 Base.getSourceRange().getBegin(),
3690 Base.getSourceRange(),
3692 Base.getAccessSpecifierAsWritten(),
3695 InstantiatedBases.push_back(InstantiatedBase);
3727 Pattern, PatternDef, TSK, Complain))
3730 llvm::TimeTraceScope TimeScope(
"InstantiateClass", [&]() {
3731 llvm::TimeTraceMetadata M;
3732 llvm::raw_string_ostream
OS(M.Detail);
3735 if (llvm::isTimeTraceVerbose()) {
3743 Pattern = PatternDef;
3749 MSInfo->setPointOfInstantiation(PointOfInstantiation);
3751 = dyn_cast<ClassTemplateSpecializationDecl>(Instantiation)) {
3752 Spec->setTemplateSpecializationKind(TSK);
3753 Spec->setPointOfInstantiation(PointOfInstantiation);
3761 "instantiating class definition");
3779 SavePendingParsedClassStateRAII SavedPendingParsedClassState(*
this);
3805 bool MightHaveConstexprVirtualFunctions =
false;
3816 if (
Member->getDeclContext() != Pattern)
3823 if (isa<BlockDecl>(
Member) ||
3824 (isa<CXXRecordDecl>(
Member) && cast<CXXRecordDecl>(
Member)->isLambda()))
3827 if (
Member->isInvalidDecl()) {
3834 if (
FieldDecl *Field = dyn_cast<FieldDecl>(NewMember)) {
3835 Fields.push_back(Field);
3836 }
else if (
EnumDecl *
Enum = dyn_cast<EnumDecl>(NewMember)) {
3842 Enum->isCompleteDefinition()) {
3844 assert(MSInfo &&
"no spec info for member enum specialization");
3849 if (SA->isFailed()) {
3855 }
else if (
CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewMember)) {
3858 MightHaveConstexprVirtualFunctions =
true;
3879 if (ParsingClassDepth == 0)
3884 for (LateInstantiatedAttrVec::iterator I = LateAttrs.begin(),
3885 E = LateAttrs.end(); I !=
E; ++I) {
3890 auto *ND = cast<NamedDecl>(I->NewDecl);
3891 auto *ThisContext = dyn_cast_or_null<CXXRecordDecl>(ND->getDeclContext());
3893 ND->isCXXInstanceMember());
3898 I->NewDecl->addAttr(NewAttr);
3927 P->first,
P->second)) {
3940 P->first,
P->second)) {
3957 else if (MightHaveConstexprVirtualFunctions)
3974 Pattern, PatternDef, TSK,
true))
3976 Pattern = PatternDef;
3982 MSInfo->setPointOfInstantiation(PointOfInstantiation);
3991 "instantiating enum definition");
4026 "pattern and instantiation disagree about init style");
4034 Diag(PointOfInstantiation,
4035 diag::err_default_member_initializer_not_yet_parsed)
4036 << OutermostClass << Pattern;
4037 Diag(Pattern->getEndLoc(),
4038 diag::note_default_member_initializer_not_yet_parsed);
4048 Diag(PointOfInstantiation, diag::err_default_member_initializer_cycle)
4053 "instantiating default member init");
4061 PointOfInstantiation, Instantiation,
CurContext};
4072 assert((!
Init || !isa<ParenListExpr>(
Init)) &&
"call-style init in class");
4077 L->DefaultMemberInitializerInstantiated(Instantiation);
4086 struct PartialSpecMatchResult {
4112 !CTPSD->getMostRecentDecl()->isMemberSpecialization())
4142 if (!isa<ClassTemplatePartialSpecializationDecl *>(Specialized)) {
4171 !Partial->getMostRecentDecl()->isMemberSpecialization())
4185 Matched.push_back(PartialSpecMatchResult());
4186 Matched.back().Partial = Partial;
4195 if (Matched.size() >= 1) {
4197 if (Matched.size() == 1) {
4210 PEnd = Matched.end();
4213 P->Partial, Best->Partial, PointOfInstantiation) ==
4220 bool Ambiguous =
false;
4222 PEnd = Matched.end();
4225 P->Partial, Best->Partial,
4226 PointOfInstantiation) != Best->Partial) {
4236 S.
Diag(PointOfInstantiation,
4237 diag::err_partial_spec_ordering_ambiguous)
4238 << ClassTemplateSpec;
4242 PEnd = Matched.end();
4244 S.
Diag(
P->Partial->getLocation(), diag::note_partial_spec_match)
4246 P->Partial->getTemplateParameters(), *
P->Args);
4261 if (
auto *PartialSpec =
4264 while (PartialSpec->getInstantiatedFromMember()) {
4267 if (PartialSpec->isMemberSpecialization())
4270 PartialSpec = PartialSpec->getInstantiatedFromMember();
4272 Pattern = PartialSpec;
4294 ClassTemplateSpec = cast<ClassTemplateSpecializationDecl>(
4301 ClassTemplateSpec, TSK);
4306 PointOfInstantiation, ClassTemplateSpec, Pattern.
get(),
4322 "Unexpected template specialization kind!");
4323 for (
auto *
D : Instantiation->
decls()) {
4324 bool SuppressNew =
false;
4325 if (
auto *
Function = dyn_cast<FunctionDecl>(
D)) {
4327 Function->getInstantiatedFromMemberFunction()) {
4329 if (
Function->isIneligibleOrNotSelected())
4332 if (
Function->getTrailingRequiresClause()) {
4340 if (
Function->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4344 Function->getTemplateSpecializationKind();
4349 PointOfInstantiation, TSK,
Function, PrevTSK,
4350 Function->getPointOfInstantiation(), SuppressNew) ||
4363 Function->setTemplateSpecializationKind(TSK, PointOfInstantiation);
4373 std::make_pair(
Function, PointOfInstantiation));
4376 }
else if (
auto *Var = dyn_cast<VarDecl>(
D)) {
4377 if (isa<VarTemplateSpecializationDecl>(Var))
4381 if (Var->
hasAttr<ExcludeFromExplicitInstantiationAttr>())
4385 assert(MSInfo &&
"No member specialization information?");
4414 }
else if (
auto *
Record = dyn_cast<CXXRecordDecl>(
D)) {
4415 if (
Record->hasAttr<ExcludeFromExplicitInstantiationAttr>())
4423 if (
Record->isInjectedClassName() ||
Record->getPreviousDecl() ||
4428 assert(MSInfo &&
"No member specialization information?");
4454 assert(Pattern &&
"Missing instantiated-from-template information");
4456 if (!
Record->getDefinition()) {
4477 Record->getTemplateSpecializationKind() ==
4479 Record->setTemplateSpecializationKind(TSK);
4484 Pattern = cast_or_null<CXXRecordDecl>(
Record->getDefinition());
4488 }
else if (
auto *
Enum = dyn_cast<EnumDecl>(
D)) {
4490 assert(MSInfo &&
"No member specialization information?");
4497 PointOfInstantiation, TSK,
Enum,
4503 if (
Enum->getDefinition())
4506 EnumDecl *Pattern =
Enum->getTemplateInstantiationPattern();
4507 assert(Pattern &&
"Missing instantiated-from-template information");
4518 }
else if (
auto *Field = dyn_cast<FieldDecl>(
D)) {
4525 ClassPattern->
lookup(Field->getDeclName());
4558 TemplateInstantiator Instantiator(*
this, TemplateArgs,
4561 return Instantiator.TransformStmt(S);
4569 TemplateInstantiator Instantiator(*
this, TemplateArgs,
Loc, Entity);
4570 return Instantiator.TransformTemplateArgument(Input, Output);
4577 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4579 return Instantiator.TransformTemplateArguments(Args.begin(), Args.end(), Out);
4587 TemplateInstantiator Instantiator(*
this, TemplateArgs,
4590 return Instantiator.TransformExpr(
E);
4606 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4608 Instantiator.setEvaluateConstraints(
false);
4609 return Instantiator.TransformExpr(
E);
4614 bool CXXDirectInit) {
4615 TemplateInstantiator Instantiator(*
this, TemplateArgs,
SourceLocation(),
4617 return Instantiator.TransformInitializer(
Init, CXXDirectInit);
4626 TemplateInstantiator Instantiator(*
this, TemplateArgs,
4629 return Instantiator.TransformExprs(Exprs.data(), Exprs.size(),
4639 TemplateInstantiator Instantiator(*
this, TemplateArgs, NNS.
getBeginLoc(),
4641 return Instantiator.TransformNestedNameSpecifierLoc(NNS);
4647 TemplateInstantiator Instantiator(*
this, TemplateArgs, NameInfo.
getLoc(),
4649 return Instantiator.TransformDeclarationNameInfo(NameInfo);
4656 TemplateInstantiator Instantiator(*
this, TemplateArgs,
Loc,
4659 SS.
Adopt(QualifierLoc);
4660 return Instantiator.TransformTemplateName(SS, Name,
Loc);
4668 if (
const ParmVarDecl *PV = dyn_cast<ParmVarDecl>(
D)) {
4669 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(PV->getDeclContext())) {
4670 unsigned i = PV->getFunctionScopeIndex();
4673 if (i < FD->getNumParams() && FD->getParamDecl(i) == PV)
4680llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
4684 Current = Current->Outer) {
4687 const Decl *CheckD =
D;
4689 LocalDeclsMap::iterator
Found = Current->LocalDecls.find(CheckD);
4690 if (
Found != Current->LocalDecls.end())
4691 return &
Found->second;
4695 if (
const TagDecl *Tag = dyn_cast<TagDecl>(CheckD))
4696 CheckD = Tag->getPreviousDecl();
4702 if (!Current->CombineWithOuterScope)
4709llvm::PointerUnion<Decl *, LocalInstantiationScope::DeclArgumentPack *> *
4711 auto *
Result = findInstantiationUnsafe(
D);
4716 if (isa<NonTypeTemplateParmDecl>(
D) || isa<TemplateTypeParmDecl>(
D) ||
4717 isa<TemplateTemplateParmDecl>(
D))
4722 if (RD->isLocalClass())
4727 if (isa<EnumDecl>(
D))
4732 if (isa<TypedefNameDecl>(
D) &&
4739 assert(isa<LabelDecl>(
D) &&
"declaration not instantiated in this scope");
4745 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[
D];
4746 if (Stored.isNull()) {
4750 while (Current->CombineWithOuterScope && Current->Outer) {
4751 Current = Current->Outer;
4752 assert(!Current->LocalDecls.contains(
D) &&
4753 "Instantiated local in inner and outer scopes");
4758 Pack->push_back(cast<VarDecl>(Inst));
4760 assert(cast<Decl *>(Stored) == Inst &&
"Already instantiated this local");
4768 Pack->push_back(Inst);
4775 Current && Current->CombineWithOuterScope; Current = Current->Outer)
4776 assert(!Current->LocalDecls.contains(
D) &&
4777 "Creating local pack after instantiation of local");
4781 llvm::PointerUnion<Decl *, DeclArgumentPack *> &Stored = LocalDecls[
D];
4784 ArgumentPacks.push_back(Pack);
4789 if (llvm::is_contained(*Pack,
D))
4796 unsigned NumExplicitArgs) {
4797 assert((!PartiallySubstitutedPack || PartiallySubstitutedPack == Pack) &&
4798 "Already have a partially-substituted pack");
4799 assert((!PartiallySubstitutedPack
4800 || NumArgsInPartiallySubstitutedPack == NumExplicitArgs) &&
4801 "Wrong number of arguments in partially-substituted pack");
4802 PartiallySubstitutedPack = Pack;
4803 ArgsInPartiallySubstitutedPack = ExplicitArgs;
4804 NumArgsInPartiallySubstitutedPack = NumExplicitArgs;
4809 unsigned *NumExplicitArgs)
const {
4811 *ExplicitArgs =
nullptr;
4812 if (NumExplicitArgs)
4813 *NumExplicitArgs = 0;
4816 Current = Current->Outer) {
4817 if (Current->PartiallySubstitutedPack) {
4819 *ExplicitArgs = Current->ArgsInPartiallySubstitutedPack;
4820 if (NumExplicitArgs)
4821 *NumExplicitArgs = Current->NumArgsInPartiallySubstitutedPack;
4823 return Current->PartiallySubstitutedPack;
4826 if (!Current->CombineWithOuterScope)
This file provides AST data structures related to concepts.
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines the C++ template declaration subclasses.
Defines Expressions and AST nodes for C++2a concepts.
static void print(llvm::raw_ostream &OS, const T &V, ASTContext &ASTCtx, QualType Ty)
Defines the clang::LangOptions interface.
llvm::MachO::Record Record
MatchFinder::MatchResult MatchResult
static const Decl * getCanonicalParmVarDecl(const Decl *D)
static bool NeedsInstantiationAsFunctionType(TypeSourceInfo *T)
static concepts::Requirement::SubstitutionDiagnostic * createSubstDiag(Sema &S, TemplateDeductionInfo &Info, Sema::EntityPrinter Printer)
static ActionResult< CXXRecordDecl * > getPatternForClassTemplateSpecialization(Sema &S, SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK)
Get the instantiation pattern to use to instantiate the definition of a given ClassTemplateSpecializa...
static std::string convertCallArgsToString(Sema &S, llvm::ArrayRef< const Expr * > Args)
static TemplateArgument getPackSubstitutedTemplateArgument(Sema &S, TemplateArgument Arg)
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
virtual void HandleTagDeclDefinition(TagDecl *D)
HandleTagDeclDefinition - This callback is invoked each time a TagDecl (e.g.
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getSubstTemplateTypeParmType(QualType Replacement, Decl *AssociatedDecl, unsigned Index, std::optional< unsigned > PackIndex, SubstTemplateTypeParmTypeFlag Flag=SubstTemplateTypeParmTypeFlag::None) const
Retrieve a substitution-result type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
const clang::PrintingPolicy & getPrintingPolicy() const
const TargetInfo & getTargetInfo() const
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Attr - This represents one attribute.
An attributed type is a type to which a type attribute has been applied.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Represents a base class of a C++ class.
A default argument (C++ [dcl.fct.default]).
Represents a static or instance method of a struct/union/class.
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.
void setTemplateSpecializationKind(TemplateSpecializationKind TSK)
Set the kind of specialization or template instantiation this is.
Represents a C++ nested-name-specifier or a global scope specifier.
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Declaration of a class template.
ClassTemplateDecl * getMostRecentDecl()
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
ClassTemplateDecl * getInstantiatedFromMemberTemplate() const
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...
NamedDecl * getFoundDecl() 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)
The results of name lookup within a DeclContext.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool isFileContext() const
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.
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
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).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
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.
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name of this declaration, if it was present in ...
SourceLocation getInnerLocStart() const
Return start of source range ignoring outer template declarations.
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceLocation getBeginLoc() const LLVM_READONLY
TypeSourceInfo * getTypeSourceInfo() const
Information about one declarator, including the parsed type information and the identifier.
Represents an extended vector type where either the type or size is dependent.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
bool hasFatalErrorOccurred() const
unsigned getTemplateBacktraceLimit() const
Retrieve the maximum number of template instantiation notes to emit along with a given diagnostic.
Recursive AST visitor that supports extension via dynamic dispatch.
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
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,...
void setTemplateSpecializationKind(TemplateSpecializationKind TSK, SourceLocation PointOfInstantiation=SourceLocation())
For an enumeration member that was instantiated from a member enumeration of a templated class,...
EnumDecl * getInstantiatedFromMemberEnum() const
Returns the enumeration (declared within the template) from which this enumeration type was instantia...
EnumDecl * getDefinition() const
This represents one expression.
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
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 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.
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
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.
Represents a reference to a function parameter pack or init-capture pack that has been substituted bu...
VarDecl *const * iterator
Iterators over the parameters which the parameter pack expanded into.
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, VarDecl *ParamPack, SourceLocation NameLoc, ArrayRef< VarDecl * > Params)
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...
FunctionType - C99 6.7.5.3 - Function Declarators.
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
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 the sequence of initializations required to initialize a given object or reference with a s...
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Wrapper for source info for injected class names of class templates.
The injected class name of a C++ class template or class template partial specialization.
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...
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.
llvm::PointerUnion< Decl *, DeclArgumentPack * > * findInstantiationUnsafe(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)
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.
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
A pointer to member type per C++ 8.3.3 - Pointers to members.
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.
unsigned getNewDepth(unsigned OldDepth) const
Determine how many of the OldDepth outermost template parameter lists would be removed by substitutin...
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>::".
bool isInstantiationDependent() const
Whether this nested name specifier involves a template parameter.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
QualType getExpansionType(unsigned I) const
Retrieve a particular expansion type within an expanded parameter pack.
unsigned getPosition() const
Get the position of the template parameter within its parameter list.
bool isExpandedParameterPack() const
Whether this parameter is a non-type template parameter pack that has a known list of different types...
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
SourceLocation getEllipsisLoc() const
TypeLoc getPatternLoc() const
Represents a pack expansion of types.
std::optional< unsigned > getNumExpansions() const
Retrieve the number of expansions that this pack expansion will generate, if known.
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
void setDefaultArg(Expr *defarg)
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)
PointerType - C99 6.7.5.1 - Pointer Declarators.
[C99 6.4.2.2] - A predefined identifier such as func.
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.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
The collection of all-type qualifiers we support.
void removeObjCLifetime()
Represents a struct/union/class.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
Base for LValueReferenceType and RValueReferenceType.
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
Scope - A scope is a transient data structure that is used while parsing the program.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
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.
bool CheckParameterPacksForExpansion(SourceLocation EllipsisLoc, SourceRange PatternRange, ArrayRef< UnexpandedParameterPack > Unexpanded, const MultiLevelTemplateArgumentList &TemplateArgs, bool &ShouldExpand, bool &RetainExpansion, std::optional< unsigned > &NumExpansions)
Determine whether we could expand a pack expansion with the given set of parameter packs into separat...
TemplateName SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, TemplateName Name, SourceLocation Loc, const MultiLevelTemplateArgumentList &TemplateArgs)
ParmVarDecl * SubstParmVarDecl(ParmVarDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, int indexAdjustment, std::optional< unsigned > NumExpansions, bool ExpectParameterPack, bool EvaluateConstraints=true)
void ActOnFinishCXXNonNestedClass()
NamedDecl * FindInstantiatedDecl(SourceLocation Loc, NamedDecl *D, const MultiLevelTemplateArgumentList &TemplateArgs, bool FindingInstantiatedContext=false)
Find the instantiation of the given declaration within the current instantiation.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
bool DiagnoseUninstantiableTemplate(SourceLocation PointOfInstantiation, NamedDecl *Instantiation, bool InstantiatedFromMember, const NamedDecl *Pattern, const NamedDecl *PatternDef, TemplateSpecializationKind TSK, bool Complain=true)
Determine whether we would be unable to instantiate this template (because it either has no definitio...
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 ...
llvm::DenseSet< std::pair< Decl *, unsigned > > InstantiatingSpecializations
Specializations whose definitions are currently being instantiated.
void deduceOpenCLAddressSpace(ValueDecl *decl)
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...
@ CTAK_Specified
The template argument was specified in the code or was instantiated with some deduced template argume...
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 InNonInstantiationSFINAEContext
Whether we are in a SFINAE context that is not associated with template instantiation.
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
TypeSourceInfo * CheckPackExpansion(TypeSourceInfo *Pattern, SourceLocation EllipsisLoc, std::optional< unsigned > NumExpansions)
Construct a pack expansion type from the pattern of the pack expansion.
ExprResult BuildExpressionFromNonTypeTemplateArgument(const TemplateArgument &Arg, SourceLocation Loc)
ExprResult SubstConstraintExprWithoutSatisfaction(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
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 SubstTemplateArguments(ArrayRef< TemplateArgumentLoc > Args, const MultiLevelTemplateArgumentList &TemplateArgs, TemplateArgumentListInfo &Outputs)
bool isAcceptableTagRedeclaration(const TagDecl *Previous, TagTypeKind NewTag, bool isDefinition, SourceLocation NewTagLoc, const IdentifierInfo *Name)
Determine whether a tag with a given kind is acceptable as a redeclaration of the given tag declarati...
bool InstantiateClassTemplateSpecialization(SourceLocation PointOfInstantiation, ClassTemplateSpecializationDecl *ClassTemplateSpec, TemplateSpecializationKind TSK, bool Complain=true)
void InstantiateAttrs(const MultiLevelTemplateArgumentList &TemplateArgs, const Decl *Pattern, Decl *Inst, LateInstantiatedAttrVec *LateAttrs=nullptr, LocalInstantiationScope *OuterMostScope=nullptr)
const LangOptions & getLangOpts() const
bool AttachTypeConstraint(NestedNameSpecifierLoc NS, DeclarationNameInfo NameInfo, ConceptDecl *NamedConcept, NamedDecl *FoundDecl, const TemplateArgumentListInfo *TemplateArgs, TemplateTypeParmDecl *ConstrainedParameter, QualType ConstrainedType, SourceLocation EllipsisLoc)
Attach a type-constraint to a template parameter.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< const Expr * > ConstraintExprs, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
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 ...
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
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.
std::vector< std::unique_ptr< TemplateInstantiationCallback > > TemplateInstCallbacks
The template instantiation callbacks to trace or track instantiations (objects can be chained).
void PrintInstantiationStack()
Prints the current instantiation stack through a series of notes.
void popCodeSynthesisContext()
bool usesPartialOrExplicitSpecialization(SourceLocation Loc, ClassTemplateSpecializationDecl *ClassTemplateSpec)
void pushCodeSynthesisContext(CodeSynthesisContext Ctx)
bool CheckLoopHintExpr(Expr *E, SourceLocation Loc, bool AllowZero)
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
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...
int ArgumentPackSubstitutionIndex
The current index into pack expansion arguments that will be used for substitution of parameter packs...
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...
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
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 CheckAlwaysInlineAttr(const Stmt *OrigSt, const Stmt *CurSt, const AttributeCommonInfo &A)
ExprResult BuildCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr)
BuildCXXDefaultArgExpr - Creates a CXXDefaultArgExpr, instantiating the default expr if needed.
bool InstantiateInClassInitializer(SourceLocation PointOfInstantiation, FieldDecl *Instantiation, FieldDecl *Pattern, const MultiLevelTemplateArgumentList &TemplateArgs)
Instantiate the definition of a field from the given pattern.
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)
bool hasUncompilableErrorOccurred() const
Whether uncompilable error has occurred.
@ 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 CheckTemplateArgument(NamedDecl *Param, TemplateArgumentLoc &Arg, NamedDecl *Template, SourceLocation TemplateLoc, SourceLocation RAngleLoc, unsigned ArgumentPackIndex, SmallVectorImpl< TemplateArgument > &SugaredConverted, SmallVectorImpl< TemplateArgument > &CanonicalConverted, CheckTemplateArgumentKind CTAK)
Check that the given template argument corresponds to the given template parameter.
NestedNameSpecifierLoc SubstNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, const MultiLevelTemplateArgumentList &TemplateArgs)
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
bool RebuildingImmediateInvocation
Whether the AST is currently being rebuilt to correct immediate invocations.
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
SourceManager & SourceMgr
DiagnosticsEngine & Diags
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
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)
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
ExprResult BuildExpressionFromDeclTemplateArgument(const TemplateArgument &Arg, QualType ParamType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Given a non-type template argument that refers to a declaration and the type of its corresponding non...
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)
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.
Represents an expression that computes the length of a parameter pack.
Encodes a location in the source.
unsigned getExpansionLineNumber(SourceLocation Loc, bool *Invalid=nullptr) const
StringRef getFilename(SourceLocation SpellingLoc) const
Return the filename of the file containing a SourceLocation.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
A trivial tuple used to represent a source range.
void warnOnStackNearlyExhausted(SourceLocation Loc)
Check to see if we're low on stack space and produce a warning if we're low on stack space (Currently...
Represents a C++11 static_assert declaration.
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
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 a reference to a non-type template parameter that has been substituted with a template arg...
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
A structure for storing an already-substituted template template parameter pack.
Wrapper for substituted template type parameters.
Represents the result of substituting a set of types for a template type parameter pack.
Wrapper for substituted template type parameters.
Represents the result of substituting a type for a template type parameter.
Represents the declaration of a struct/union/class/enum.
void setTagKind(TagKind TK)
SourceRange getBraceRange() const
SourceLocation getInnerLocStart() const
Return SourceLocation representing start of source range ignoring outer template declarations.
StringRef getKindName() const
void startDefinition()
Starts the definition of this tag declaration.
TagKind getTagKind() const
void setBraceRange(SourceRange R)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
A convenient class for passing around template argument information.
void setLAngleLoc(SourceLocation Loc)
void setRAngleLoc(SourceLocation Loc)
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.
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.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ 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.
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ 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.
void enableLateAttributeInstantiation(Sema::LateInstantiatedAttrVec *LA)
void disableLateAttributeInstantiation()
delayed_var_partial_spec_iterator delayed_var_partial_spec_end()
delayed_partial_spec_iterator delayed_partial_spec_begin()
Return an iterator to the beginning of the set of "delayed" partial specializations,...
void setEvaluateConstraints(bool B)
SmallVectorImpl< std::pair< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > >::iterator delayed_var_partial_spec_iterator
LocalInstantiationScope * getStartingScope() const
VarTemplatePartialSpecializationDecl * InstantiateVarTemplatePartialSpecialization(VarTemplateDecl *VarTemplate, VarTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a variable template partial specialization.
SmallVectorImpl< std::pair< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > >::iterator delayed_partial_spec_iterator
void InstantiateEnumDefinition(EnumDecl *Enum, EnumDecl *Pattern)
delayed_partial_spec_iterator delayed_partial_spec_end()
Return an iterator to the end of the set of "delayed" partial specializations, which must be passed t...
delayed_var_partial_spec_iterator delayed_var_partial_spec_begin()
ClassTemplatePartialSpecializationDecl * InstantiateClassTemplatePartialSpecialization(ClassTemplateDecl *ClassTemplate, ClassTemplatePartialSpecializationDecl *PartialSpec)
Instantiate the declaration of a class template partial specialization.
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.
bool isNull() const
Determine whether this template name is NULL.
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.
Represents a type template specialization; the template must be a class template, a type alias templa...
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.
bool isParameterPack() const
Returns whether this is a parameter pack.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint)
Wrapper for template type parameters.
bool isParameterPack() const
unsigned getIndex() const
unsigned getDepth() const
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
ConceptDecl * getNamedConcept() const
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() 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 getEndLoc() const
Get the end source location.
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)
static TagTypeKind getTagTypeKindForKeyword(ElaboratedTypeKeyword Keyword)
Converts an elaborated type keyword into a TagTypeKind.
The base class of the type hierarchy.
bool isReferenceType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
bool 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
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
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.
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
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.
Represents a GCC generic vector type.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
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...
A requires-expression requirement which queries the existence of a type name or type template special...
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.
Defines the clang::TargetInfo interface.
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)
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks, const Sema &TheSema, const Sema::CodeSynthesisContext &Inst)
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
NamedDecl * getAsNamedDecl(TemplateParameter P)
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.
TagTypeKind
The kind of a tag type.
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...
llvm::PointerUnion< TemplateTypeParmDecl *, NonTypeTemplateParmDecl *, TemplateTemplateParmDecl * > TemplateParameter
Stores a template parameter of any kind.
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
const FunctionProtoType * T
void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)
Print a template argument list, including the '<' and '>' enclosing the template arguments.
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl * >, SourceLocation > UnexpandedParameterPack
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
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.
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
@ None
No keyword precedes the qualified type name.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
@ EST_Uninstantiated
not instantiated yet
@ EST_None
no exception specification
__DEVICE__ _Tp arg(const std::complex< _Tp > &__c)
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
SourceLocation RAngleLoc
The source location of the right angle bracket ('>').
SourceLocation LAngleLoc
The source location of the left angle bracket ('<').
llvm::ArrayRef< TemplateArgumentLoc > arguments() 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
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
bool SavedInNonInstantiationSFINAEContext
Was the enclosing context a non-instantiation SFINAE context?
const TemplateArgument * TemplateArgs
The list of template arguments we are substituting, if they are not part of the entity.
sema::TemplateDeductionInfo * DeductionInfo
The template deduction info object associated with the substitution or checking of explicit or deduce...
NamedDecl * Template
The template (or partial specialization) in which we are performing the instantiation,...
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.
@ 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.
@ 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<=>.
@ 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.
bool isAlreadyInstantiating() const
Determine whether we are already instantiating this specialization in some surrounding active instant...
void set(DeclAccessPair Found, Decl *Spec, DeductionFailureInfo Info)