27#include "llvm/ADT/ArrayRef.h"
28#include "llvm/ADT/FoldingSet.h"
29#include "llvm/ADT/PointerUnion.h"
30#include "llvm/ADT/STLExtras.h"
31#include "llvm/ADT/SmallVector.h"
32#include "llvm/Support/Casting.h"
33#include "llvm/Support/ErrorHandling.h"
47template <
class TemplateParam>
50 return P.hasDefaultArgument() &&
51 P.getDefaultArgument().getArgument().containsUnexpandedParameterPack();
54TemplateParameterList::TemplateParameterList(
const ASTContext&
C,
60 : TemplateLoc(TemplateLoc), LAngleLoc(LAngleLoc), RAngleLoc(RAngleLoc),
61 NumParams(Params.size()), ContainsUnexpandedParameterPack(
false),
62 HasRequiresClause(RequiresClause != nullptr),
63 HasConstrainedParameters(
false) {
64 for (
unsigned Idx = 0; Idx < NumParams; ++Idx) {
68 bool IsPack =
P->isTemplateParameterPack();
69 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
P)) {
70 if (!IsPack && (NTTP->getType()->containsUnexpandedParameterPack() ||
72 ContainsUnexpandedParameterPack =
true;
73 if (NTTP->hasPlaceholderTypeConstraint())
74 HasConstrainedParameters =
true;
75 }
else if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
P)) {
77 (TTP->getTemplateParameters()->containsUnexpandedParameterPack() ||
79 ContainsUnexpandedParameterPack =
true;
81 }
else if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
P)) {
83 ContainsUnexpandedParameterPack =
true;
87 ContainsUnexpandedParameterPack =
true;
89 if (TTP->hasTypeConstraint())
90 HasConstrainedParameters =
true;
92 llvm_unreachable(
"unexpected template parameter type");
96 if (HasRequiresClause) {
98 ContainsUnexpandedParameterPack =
true;
99 *getTrailingObjects<Expr *>() = RequiresClause;
103bool TemplateParameterList::containsUnexpandedParameterPack()
const {
104 if (ContainsUnexpandedParameterPack)
106 if (!HasConstrainedParameters)
113 if (!Param->isImplicit())
116 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
117 const auto *TC = TTP->getTypeConstraint();
118 if (TC && TC->getImmediatelyDeclaredConstraint()
119 ->containsUnexpandedParameterPack())
132 void *Mem =
C.Allocate(totalSizeToAlloc<NamedDecl *, Expr *>(
133 Params.size(), RequiresClause ? 1u : 0u),
136 RAngleLoc, RequiresClause);
142 ID.AddBoolean(RC !=
nullptr);
147 if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
D)) {
149 ID.AddBoolean(NTTP->isParameterPack());
150 NTTP->getType().getCanonicalType().Profile(ID);
151 ID.AddBoolean(NTTP->hasPlaceholderTypeConstraint());
152 if (
const Expr *
E = NTTP->getPlaceholderTypeConstraint())
156 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
D)) {
158 ID.AddBoolean(TTP->isParameterPack());
159 ID.AddBoolean(TTP->hasTypeConstraint());
161 TC->getImmediatelyDeclaredConstraint()->Profile(ID,
C,
165 const auto *TTP = cast<TemplateTemplateParmDecl>(
D);
167 ID.AddBoolean(TTP->isParameterPack());
168 TTP->getTemplateParameters()->Profile(ID,
C);
173 unsigned NumRequiredArgs = 0;
175 if (
P->isTemplateParameterPack()) {
177 NumRequiredArgs += *Expansions;
183 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(
P)) {
184 if (TTP->hasDefaultArgument())
186 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(
P)) {
187 if (NTTP->hasDefaultArgument())
189 }
else if (cast<TemplateTemplateParmDecl>(
P)->hasDefaultArgument())
195 return NumRequiredArgs;
203 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(FirstParm))
204 return TTP->getDepth();
205 else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(FirstParm))
206 return NTTP->getDepth();
208 return cast<TemplateTemplateParmDecl>(FirstParm)->getDepth();
215 P->setDeclContext(Owner);
217 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(
P))
221 if (
P->isInvalidDecl())
229 if (HasConstrainedParameters)
231 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
232 if (
const auto *TC = TTP->getTypeConstraint())
233 AC.push_back(TC->getImmediatelyDeclaredConstraint());
234 }
else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
235 if (
const Expr *
E = NTTP->getPlaceholderTypeConstraint())
239 if (HasRequiresClause)
244 return HasRequiresClause || HasConstrainedParameters;
253 if (
const auto *ParamValueDecl =
254 dyn_cast<NonTypeTemplateParmDecl>(TemplParam))
255 if (ParamValueDecl->getType()->getContainedDeducedType())
263 return new (
C)
char[
sizeof(
void*) * 2];
275 :
NamedDecl(DK, DC, L, Name), TemplatedDecl(
Decl), TemplateParams(Params) {}
277void TemplateDecl::anchor() {}
283 if (
const Expr *TRC = FD->getTrailingRequiresClause())
291 return FD->getTrailingRequiresClause();
297 case TemplateDecl::TypeAliasTemplate:
298 case TemplateDecl::BuiltinTemplate:
309void RedeclarableTemplateDecl::anchor() {}
325 PrevDecls.push_back(Prev);
351 unsigned SpecSize = (*Specs++).getRawValue();
352 for (
unsigned I = 0; I != SpecSize; ++I)
357template<
class EntryType,
typename... ProfileArguments>
360 llvm::FoldingSetVector<EntryType> &Specs,
void *&InsertPos,
361 ProfileArguments&&... ProfileArgs) {
364 llvm::FoldingSetNodeID ID;
365 EntryType::Profile(ID, std::forward<ProfileArguments>(ProfileArgs)...,
367 EntryType *Entry = Specs.FindNodeOrInsertPos(ID, InsertPos);
368 return Entry ? SETraits::getDecl(Entry)->getMostRecentDecl() :
nullptr;
371template<
class Derived,
class EntryType>
373 llvm::FoldingSetVector<EntryType> &Specializations, EntryType *Entry,
379 void *CorrectInsertPos;
382 SETraits::getTemplateArgs(Entry)) &&
383 InsertPos == CorrectInsertPos &&
384 "given incorrect InsertPos for specialization");
386 Specializations.InsertNode(Entry, InsertPos);
388 EntryType *Existing = Specializations.GetOrInsertNode(Entry);
391 "non-canonical specialization?");
395 L->AddedCXXTemplateSpecialization(cast<Derived>(
this),
396 SETraits::getDecl(Entry));
402 if (!CommonPtr->InjectedArgs) {
406 CommonPtr->InjectedArgs =
408 std::copy(TemplateArgs.begin(), TemplateArgs.end(),
409 CommonPtr->InjectedArgs);
438 auto *CommonPtr =
new (
C)
Common;
439 C.addDestruction(CommonPtr);
447llvm::FoldingSetVector<FunctionTemplateSpecializationInfo> &
473 Common *ThisCommon =
static_cast<Common *
>(Base::Common);
474 Common *PrevCommon =
nullptr;
477 if (Prev->Base::Common) {
478 PrevCommon =
static_cast<Common *
>(Prev->Base::Common);
481 PreviousDecls.push_back(Prev);
487 for (
auto *
D : PreviousDecls)
488 D->Base::Common = ThisCommon;
494 "Can't merge incompatible declarations!");
496 Base::Common = PrevCommon;
525llvm::FoldingSetVector<ClassTemplateSpecializationDecl> &
531llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &
539 auto *CommonPtr =
new (
C)
Common;
540 C.addDestruction(CommonPtr);
566 ID.AddInteger(TemplateArgs.size());
581 assert(Existing->
isCanonicalDecl() &&
"Non-canonical specialization?");
585 L->AddedCXXTemplateSpecialization(
this,
D);
590 llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs
593 PS.reserve(PartialSpecs.size());
595 PS.push_back(
P.getMostRecentDecl());
603 if (Context.
hasSameType(
P.getInjectedSpecializationType(),
T))
604 return P.getMostRecentDecl();
615 if (
P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
616 return P.getMostRecentDecl();
653 bool Typename,
bool ParameterPack,
bool HasTypeConstraint,
654 std::optional<unsigned> NumExpanded) {
657 additionalSizeToAlloc<TypeConstraint>(HasTypeConstraint ? 1 : 0))
659 HasTypeConstraint, NumExpanded);
660 QualType TTPType =
C.getTemplateTypeParmType(
D,
P, ParameterPack, TTPDecl);
661 TTPDecl->setTypeForDecl(TTPType.
getTypePtr());
669 false,
false, std::nullopt);
674 bool HasTypeConstraint) {
676 additionalSizeToAlloc<TypeConstraint>(HasTypeConstraint ? 1 : 0))
678 false, HasTypeConstraint, std::nullopt);
701 DefaultArgument.
set(
nullptr);
720 assert(HasTypeConstraint &&
721 "HasTypeConstraint=true must be passed at construction in order to "
722 "call setTypeConstraint");
723 assert(!TypeConstraintInitialized &&
724 "TypeConstraint was already initialized!");
725 new (getTrailingObjects<TypeConstraint>())
727 TypeConstraintInitialized =
true;
734NonTypeTemplateParmDecl::NonTypeTemplateParmDecl(
740 ExpandedParameterPack(
true), NumExpandedTypes(ExpandedTypes.size()) {
741 if (!ExpandedTypes.empty() && !ExpandedTInfos.empty()) {
743 getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
744 for (
unsigned I = 0; I != NumExpandedTypes; ++I) {
745 new (&TypesAndInfos[I].first)
QualType(ExpandedTypes[I]);
746 TypesAndInfos[I].second = ExpandedTInfos[I];
758 additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>,
772 additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>,
776 ExpandedTypes, ExpandedTInfos);
781 bool HasTypeConstraint) {
782 return new (
C, ID, additionalSizeToAlloc<std::pair<
QualType,
785 HasTypeConstraint ? 1 : 0))
787 0, 0,
nullptr,
QualType(),
false,
nullptr);
792 unsigned NumExpandedTypes,
793 bool HasTypeConstraint) {
796 additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>,
Expr *>(
797 NumExpandedTypes, HasTypeConstraint ? 1 : 0))
800 std::nullopt, std::nullopt);
801 NTTP->NumExpandedTypes = NumExpandedTypes;
820 DefaultArgument.
set(
nullptr);
829void TemplateTemplateParmDecl::anchor() {}
831TemplateTemplateParmDecl::TemplateTemplateParmDecl(
837 ExpandedParameterPack(
true), NumExpandedParams(Expansions.size()) {
838 if (!Expansions.empty())
839 std::uninitialized_copy(Expansions.begin(), Expansions.end(),
840 getTrailingObjects<TemplateParameterList *>());
859 additionalSizeToAlloc<TemplateParameterList *>(Expansions.size()))
866 false,
nullptr,
false,
nullptr);
871 unsigned NumExpansions) {
873 new (
C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
875 false,
nullptr, std::nullopt);
876 TTP->NumExpandedParams = NumExpansions;
888 DefaultArgument.
set(
nullptr);
897 : NumArguments(Args.size()) {
898 std::uninitialized_copy(Args.begin(), Args.end(),
899 getTrailingObjects<TemplateArgument>());
905 void *Mem = Context.
Allocate(totalSizeToAlloc<TemplateArgument>(Args.size()));
915 if (TemplateArgsAsWritten)
917 *TemplateArgsAsWritten);
920 C.Allocate(totalSizeToAlloc<MemberSpecializationInfo *>(MSInfo ? 1 : 0));
922 FD, Template, TSK, TemplateArgs, ArgsAsWritten, POI, MSInfo);
938 SpecializedTemplate(SpecializedTemplate),
959 Context, ClassTemplateSpecialization, TK, DC, StartLoc, IdLoc,
960 SpecializedTemplate, Args, PrevDecl);
961 Result->setMayHaveOutOfDateDef(
false);
968 Result->setHasExternalLexicalStorage(
980 Result->setMayHaveOutOfDateDef(
false);
988 const auto *PS = dyn_cast<ClassTemplatePartialSpecializationDecl>(
this);
990 PS ? PS->getTemplateArgsAsWritten() :
nullptr) {
992 OS, ArgsAsWritten->arguments(), Policy,
997 OS, TemplateArgs.
asArray(), Policy,
1004 if (
const auto *PartialSpec =
1005 SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization*>())
1006 return PartialSpec->PartialSpecialization->getSpecializedTemplate();
1018 assert(!Pattern.isNull() &&
1019 "Class template specialization without pattern?");
1020 if (
const auto *CTPSD =
1022 return CTPSD->getSourceRange();
1045 llvm_unreachable(
"unhandled template specialization kind");
1056 ExplicitInfo = Info;
1058 Info->ExternKeywordLoc =
Loc;
1070 ExplicitInfo = Info;
1072 Info->TemplateKeywordLoc =
Loc;
1081 Expr *ConstraintExpr) {
1100ImplicitConceptSpecializationDecl::ImplicitConceptSpecializationDecl(
1103 :
Decl(ImplicitConceptSpecialization, DC, SL),
1104 NumTemplateArgs(ConvertedArgs.size()) {
1105 setTemplateArguments(ConvertedArgs);
1108ImplicitConceptSpecializationDecl::ImplicitConceptSpecializationDecl(
1109 EmptyShell
Empty,
unsigned NumTemplateArgs)
1110 :
Decl(ImplicitConceptSpecialization,
Empty),
1111 NumTemplateArgs(NumTemplateArgs) {}
1117 additionalSizeToAlloc<TemplateArgument>(ConvertedArgs.size()))
1124 return new (
C, ID, additionalSizeToAlloc<TemplateArgument>(NumTemplateArgs))
1130 assert(Converted.size() == NumTemplateArgs);
1131 std::uninitialized_copy(Converted.begin(), Converted.end(),
1132 getTrailingObjects<TemplateArgument>());
1138void ClassTemplatePartialSpecializationDecl::anchor() {}
1140ClassTemplatePartialSpecializationDecl::ClassTemplatePartialSpecializationDecl(
1146 Context, ClassTemplatePartialSpecialization, TK, DC, StartLoc, IdLoc,
1147 SpecializedTemplate, Args, PrevDecl),
1148 TemplateParams(Params), InstantiatedFromMember(nullptr,
false) {
1161 Context, TK, DC, StartLoc, IdLoc, Params, SpecializedTemplate, Args,
1164 Result->setMayHaveOutOfDateDef(
false);
1174 Result->setMayHaveOutOfDateDef(
false);
1182 return MT->getSourceRange();
1194void FriendTemplateDecl::anchor() {}
1202 if (!Params.empty()) {
1204 llvm::copy(Params, TPL);
1206 return new (Context, DC)
1238 auto *CommonPtr =
new (
C)
Common;
1239 C.addDestruction(CommonPtr);
1278llvm::FoldingSetVector<VarTemplateSpecializationDecl> &
1284llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &
1292 auto *CommonPtr =
new (
C)
Common;
1293 C.addDestruction(CommonPtr);
1318 ID.AddInteger(TemplateArgs.size());
1332 assert(Existing->
isCanonicalDecl() &&
"Non-canonical specialization?");
1336 L->AddedCXXTemplateSpecialization(
this,
D);
1341 llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs =
1344 PS.reserve(PartialSpecs.size());
1346 PS.push_back(
P.getMostRecentDecl());
1354 if (
P.getInstantiatedFromMember()->getCanonicalDecl() == DCanon)
1355 return P.getMostRecentDecl();
1369 :
VarDecl(DK, Context, DC, StartLoc, IdLoc,
1371 SpecializedTemplate(SpecializedTemplate),
1386 VarTemplateSpecialization, Context, DC, StartLoc, IdLoc,
1387 SpecializedTemplate,
T, TInfo, S, Args);
1401 const auto *PS = dyn_cast<VarTemplatePartialSpecializationDecl>(
this);
1403 PS ? PS->getTemplateArgsAsWritten() :
nullptr) {
1405 OS, ArgsAsWritten->arguments(), Policy,
1410 OS, TemplateArgs.
asArray(), Policy,
1416 if (
const auto *PartialSpec =
1417 SpecializedTemplate.dyn_cast<SpecializedPartialSpecialization *>())
1418 return PartialSpec->PartialSpecialization->getSpecializedTemplate();
1429 assert(!Pattern.isNull() &&
1430 "Variable template specialization without pattern?");
1431 if (
const auto *VTPSD =
1433 return VTPSD->getSourceRange();
1461 llvm_unreachable(
"unhandled template specialization kind");
1472 ExplicitInfo = Info;
1474 Info->ExternKeywordLoc =
Loc;
1485 ExplicitInfo = Info;
1487 Info->TemplateKeywordLoc =
Loc;
1494void VarTemplatePartialSpecializationDecl::anchor() {}
1496VarTemplatePartialSpecializationDecl::VarTemplatePartialSpecializationDecl(
1502 DC, StartLoc, IdLoc, SpecializedTemplate,
T,
1504 TemplateParams(Params), InstantiatedFromMember(nullptr,
false) {
1516 Context, DC, StartLoc, IdLoc, Params, SpecializedTemplate,
T, TInfo, S,
1532 return MT->getSourceRange();
1545 nullptr,
true,
false,
1547 T->setImplicit(
true);
1551 C.getTrivialTypeSourceInfo(
QualType(
T->getTypeForDecl(), 0));
1554 nullptr, TI->
getType(),
true, TI);
1555 N->setImplicit(
true);
1565 false,
nullptr,
false, TPL);
1566 TemplateTemplateParm->setImplicit(
true);
1571 nullptr,
true,
false,
1573 TemplateTypeParm->setImplicit(
true);
1577 QualType(TemplateTypeParm->getTypeForDecl(), 0));
1580 nullptr, TInfo->
getType(),
false, TInfo);
1581 NamedDecl *Params[] = {TemplateTemplateParm, TemplateTypeParm,
1582 NonTypeTemplateParm};
1595 nullptr, TInfo->
getType(),
false, TInfo);
1600 nullptr,
true,
true,
1602 Ts->setImplicit(
true);
1620 llvm_unreachable(
"unhandled BuiltinTemplateKind!");
1623void BuiltinTemplateDecl::anchor() {}
1637 C.addDestruction(&TPOD->Value);
1644 C.addDestruction(&TPOD->Value);
1650 OS <<
"<template param ";
1676 case Decl::Kind::CXXRecord:
1677 return cast<CXXRecordDecl>(
D)
1678 ->getDescribedTemplate()
1679 ->getTemplateParameters();
1680 case Decl::Kind::ClassTemplate:
1681 return cast<ClassTemplateDecl>(
D)->getTemplateParameters();
1682 case Decl::Kind::ClassTemplateSpecialization: {
1683 const auto *CTSD = cast<ClassTemplateSpecializationDecl>(
D);
1684 auto P = CTSD->getSpecializedTemplateOrPartial();
1685 if (
const auto *CTPSD =
1687 return CTPSD->getTemplateParameters();
1688 return cast<ClassTemplateDecl *>(
P)->getTemplateParameters();
1690 case Decl::Kind::ClassTemplatePartialSpecialization:
1691 return cast<ClassTemplatePartialSpecializationDecl>(
D)
1692 ->getTemplateParameters();
1693 case Decl::Kind::TypeAliasTemplate:
1694 return cast<TypeAliasTemplateDecl>(
D)->getTemplateParameters();
1695 case Decl::Kind::BuiltinTemplate:
1696 return cast<BuiltinTemplateDecl>(
D)->getTemplateParameters();
1697 case Decl::Kind::CXXDeductionGuide:
1698 case Decl::Kind::CXXConversion:
1699 case Decl::Kind::CXXConstructor:
1700 case Decl::Kind::CXXDestructor:
1701 case Decl::Kind::CXXMethod:
1702 case Decl::Kind::Function:
1703 return cast<FunctionDecl>(
D)
1704 ->getTemplateSpecializationInfo()
1706 ->getTemplateParameters();
1707 case Decl::Kind::FunctionTemplate:
1708 return cast<FunctionTemplateDecl>(
D)->getTemplateParameters();
1709 case Decl::Kind::VarTemplate:
1710 return cast<VarTemplateDecl>(
D)->getTemplateParameters();
1711 case Decl::Kind::VarTemplateSpecialization: {
1712 const auto *VTSD = cast<VarTemplateSpecializationDecl>(
D);
1713 auto P = VTSD->getSpecializedTemplateOrPartial();
1714 if (
const auto *VTPSD =
1716 return VTPSD->getTemplateParameters();
1717 return cast<VarTemplateDecl *>(
P)->getTemplateParameters();
1719 case Decl::Kind::VarTemplatePartialSpecialization:
1720 return cast<VarTemplatePartialSpecializationDecl>(
D)
1721 ->getTemplateParameters();
1722 case Decl::Kind::TemplateTemplateParm:
1723 return cast<TemplateTemplateParmDecl>(
D)->getTemplateParameters();
1724 case Decl::Kind::Concept:
1725 return cast<ConceptDecl>(
D)->getTemplateParameters();
1727 llvm_unreachable(
"Unhandled templated declaration kind");
Defines the clang::ASTContext interface.
Defines enum values for all the target-independent builtin functions.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static TemplateParameterList * createTypePackElementParameterList(const ASTContext &C, DeclContext *DC)
static bool DefaultTemplateArgumentContainsUnexpandedPack(const TemplateParam &P)
static TemplateParameterList * createMakeIntegerSeqParameterList(const ASTContext &C, DeclContext *DC)
static bool AdoptTemplateParameterList(TemplateParameterList *Params, DeclContext *Owner)
static TemplateParameterList * createBuiltinTemplateParameterList(const ASTContext &C, DeclContext *DC, BuiltinTemplateKind BTK)
Defines the C++ template declaration subclasses.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static StringRef getIdentifier(const Token &Tok)
Defines the clang::SourceLocation class and associated facilities.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
void printPretty(raw_ostream &OS, const ASTContext &Ctx, QualType Ty) const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getTemplateSpecializationType(TemplateName T, ArrayRef< TemplateArgument > Args, QualType Canon=QualType()) const
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const
getInjectedClassNameType - Return the unique reference to the injected class name type for the specif...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS, bool TemplateKeyword, TemplateName Template) const
Retrieve the template name that represents a qualified template name such as std::vector.
void getInjectedTemplateArgs(const TemplateParameterList *Params, SmallVectorImpl< TemplateArgument > &Args)
Get a template argument list with one argument per template parameter in a template parameter list,...
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
void * Allocate(size_t Size, unsigned Align=8) const
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
bool isConstrained() const
Represents a C++ struct/union/class.
Declaration of a class template.
void AddPartialSpecialization(ClassTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
llvm::FoldingSetVector< ClassTemplateSpecializationDecl > & getSpecializations() const
Retrieve the set of specializations of this class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
ClassTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
CommonBase * newCommon(ASTContext &C) const override
static ClassTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a class template node.
ClassTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(ClassTemplatePartialSpecializationDecl *D)
Find a class template partial specialization which was instantiated from the given member partial spe...
void LoadLazySpecializations() const
Load any lazily-loaded specializations from the external source.
void AddSpecialization(ClassTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
QualType getInjectedClassNameSpecialization()
Retrieve the template specialization type of the injected-class-name for this class template.
Common * getCommonPtr() const
ClassTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
static ClassTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty class template node.
ClassTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member class template partial specialization from which this particular class template p...
static ClassTemplatePartialSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, QualType CanonInjectedType, ClassTemplatePartialSpecializationDecl *PrevDecl)
void Profile(llvm::FoldingSetNodeID &ID) const
bool isMemberSpecialization() const
Determines whether this class template partial specialization template was a specialization of a memb...
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static ClassTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
ClassTemplateSpecializationDecl(ASTContext &Context, Kind DK, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, ClassTemplateSpecializationDecl *PrevDecl)
static ClassTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
llvm::PointerUnion< ClassTemplateDecl *, ClassTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the class template or class template partial specialization which was specialized by this.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
static ClassTemplateSpecializationDecl * Create(ASTContext &Context, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, ClassTemplateDecl *SpecializedTemplate, ArrayRef< TemplateArgument > Args, ClassTemplateSpecializationDecl *PrevDecl)
Declaration of a C++20 concept.
static ConceptDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
static ConceptDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, Expr *ConstraintExpr=nullptr)
A reference to a concept and its template args, as it appears in the code.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
bool hasExternalLexicalStorage() const
Whether this DeclContext has external storage containing additional declarations that are lexically i...
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
ASTMutationListener * getASTMutationListener() const
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Kind
Lists the kind of concrete classes of Decl.
bool isCanonicalDecl() const
Whether this particular Decl is a canonical one.
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
Represents a ValueDecl that came out of a declarator.
SourceLocation getOuterLocStart() const
Return start of source range taking into account any outer template declarations.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
unsigned getNumTemplateParameterLists() const
void set(ArgType Arg)
Set the default argument.
This represents one expression.
bool containsUnexpandedParameterPack() const
Whether this expression contains an unexpanded parameter pack (for C++11 variadic templates).
virtual Decl * GetExternalDecl(GlobalDeclID ID)
Resolve a declaration ID into a declaration, potentially building a new declaration.
Declaration of a friend template.
static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, MutableArrayRef< TemplateParameterList * > Params, FriendUnion Friend, SourceLocation FriendLoc)
llvm::PointerUnion< NamedDecl *, TypeSourceInfo * > FriendUnion
static FriendTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a function declaration or definition.
Declaration of a template function.
FunctionDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
void addSpecialization(FunctionTemplateSpecializationInfo *Info, void *InsertPos)
Add a specialization of this function template.
CommonBase * newCommon(ASTContext &C) const override
Common * getCommonPtr() const
FunctionTemplateDecl * getPreviousDecl()
Retrieve the previous declaration of this function template, or nullptr if no such declaration exists...
static FunctionTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty function template node.
static FunctionTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > & getSpecializations() const
Retrieve the set of function template specializations of this function template.
void mergePrevDecl(FunctionTemplateDecl *Prev)
Merge Prev with our RedeclarableTemplateDecl::Common.
void LoadLazySpecializations() const
Load any lazily-loaded specializations from the external source.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
static FunctionTemplateSpecializationInfo * Create(ASTContext &C, FunctionDecl *FD, FunctionTemplateDecl *Template, TemplateSpecializationKind TSK, TemplateArgumentList *TemplateArgs, const TemplateArgumentListInfo *TemplateArgsAsWritten, SourceLocation POI, MemberSpecializationInfo *MSInfo)
One of these records is kept for each identifier that is lexed.
void setTemplateArguments(ArrayRef< TemplateArgument > Converted)
static ImplicitConceptSpecializationDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation SL, ArrayRef< TemplateArgument > ConvertedArgs)
static ImplicitConceptSpecializationDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID, unsigned NumTemplateArgs)
Provides information a specialization of a member of a class template, which may be a member function...
This represents a decl that may have a name.
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.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
static NonTypeTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID, bool HasTypeConstraint)
SourceLocation getDefaultArgumentLoc() const
Retrieve the location of the default argument, if any.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
static NonTypeTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D, unsigned P, const IdentifierInfo *Id, QualType T, bool ParameterPack, TypeSourceInfo *TInfo)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Declaration of a redeclarable template.
CommonBase * getCommonPtr() const
Retrieves the "common" pointer shared by all (re-)declarations of the same template.
SpecEntryTraits< EntryType >::DeclType * findSpecializationImpl(llvm::FoldingSetVector< EntryType > &Specs, void *&InsertPos, ProfileArguments &&...ProfileArgs)
CommonBase * Common
Pointer to the common data shared by all declarations of this template.
virtual CommonBase * newCommon(ASTContext &C) const =0
void addSpecializationImpl(llvm::FoldingSetVector< EntryType > &Specs, EntryType *Entry, void *InsertPos)
void loadLazySpecializationsImpl() const
ArrayRef< TemplateArgument > getInjectedTemplateArgs()
Retrieve the "injected" template arguments that correspond to the template parameters of this templat...
RedeclarableTemplateDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
RedeclarableTemplateDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
SourceLocation getBegin() const
void setEnd(SourceLocation e)
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context, bool Canonical, bool ProfileLambdaExpr=false) const
Produce a unique representation of the given statement.
bool isThisDeclarationADefinition() const
Return true if this declaration is a completion definition of the type.
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
unsigned getNumTemplateParameterLists() const
A convenient class for passing around template argument information.
A template argument list.
static TemplateArgumentList * CreateCopy(ASTContext &Context, ArrayRef< TemplateArgument > Args)
Create a new template argument list that copies the given set of template arguments.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Location wrapper for a TemplateArgument.
SourceLocation getLocation() const
const TemplateArgument & getArgument() const
SourceRange getSourceRange() const LLVM_READONLY
Represents a template argument.
bool isNull() const
Determine whether this template argument has no value.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * TemplateParams
bool hasAssociatedConstraints() const
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void getAssociatedConstraints(llvm::SmallVectorImpl< const Expr * > &AC) const
Get the total constraint-expression associated with this template, including constraint-expressions d...
TemplateDecl(Kind DK, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
A template parameter object.
void printAsExpr(llvm::raw_ostream &OS) const
Print this object as an equivalent expression.
const APValue & getValue() const
void printName(llvm::raw_ostream &OS, const PrintingPolicy &Policy) const override
Print this template parameter object in a human-readable format.
void printAsInit(llvm::raw_ostream &OS) const
Print this object as an initializer suitable for a variable of the object's type.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
bool hasAssociatedConstraints() const
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to form a template specialization.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) const
void getAssociatedConstraints(llvm::SmallVectorImpl< const Expr * > &AC) const
All associated constraints derived from this template parameter list, including the requires clause a...
ArrayRef< NamedDecl * > asArray()
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
Defines the position of a template parameter within a template parameter list.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
static TemplateTemplateParmDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
SourceLocation getDefaultArgumentLoc() const
Retrieve the location of the default argument, if any.
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter, and whether that default argument was inherited...
static TemplateTemplateParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D, unsigned P, bool ParameterPack, IdentifierInfo *Id, bool Typename, TemplateParameterList *Params)
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
SourceLocation getDefaultArgumentLoc() const
Retrieves the location of the default argument declaration.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
unsigned getIndex() const
Retrieve the index of the template parameter.
static TemplateTypeParmDecl * CreateDeserialized(const ASTContext &C, GlobalDeclID ID)
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, unsigned D, unsigned P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, std::optional< unsigned > NumExpanded=std::nullopt)
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool isParameterPack() const
Returns whether this is a parameter pack.
unsigned getDepth() const
Retrieve the depth of the template parameter.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
void setTypeConstraint(ConceptReference *CR, Expr *ImmediatelyDeclaredConstraint)
void setDefaultArgument(const ASTContext &C, const TemplateArgumentLoc &DefArg)
Set the default argument for this template parameter.
Declaration of an alias template.
CommonBase * newCommon(ASTContext &C) const override
static TypeAliasTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty alias template node.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
const Type * getTypeForDecl() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
SourceLocation getBeginLoc() const LLVM_READONLY
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
const T * castAs() const
Member-template castAs<specific type>.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Represents a variable declaration or definition.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
@ Definition
This declaration is definitely a definition.
Declaration of a variable template.
VarTemplateDecl * getDefinition()
VarTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this template.
void AddPartialSpecialization(VarTemplatePartialSpecializationDecl *D, void *InsertPos)
Insert the specified partial specialization knowing that it is not already in.
Common * getCommonPtr() const
VarTemplatePartialSpecializationDecl * findPartialSpecialization(ArrayRef< TemplateArgument > Args, TemplateParameterList *TPL, void *&InsertPos)
Return the partial specialization with the provided arguments if it exists, otherwise return the inse...
void LoadLazySpecializations() const
Load any lazily-loaded specializations from the external source.
void AddSpecialization(VarTemplateSpecializationDecl *D, void *InsertPos)
Insert the specified specialization knowing that it is not already in.
VarTemplateDecl * getPreviousDecl()
Retrieve the previous declaration of this variable template, or nullptr if no such declaration exists...
CommonBase * newCommon(ASTContext &C) const override
static VarTemplateDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Create an empty variable template node.
static VarTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, VarDecl *Decl)
Create a variable template node.
llvm::FoldingSetVector< VarTemplatePartialSpecializationDecl > & getPartialSpecializations() const
Retrieve the set of partial specializations of this class template.
llvm::FoldingSetVector< VarTemplateSpecializationDecl > & getSpecializations() const
Retrieve the set of specializations of this variable template.
bool isThisDeclarationADefinition() const
Returns whether this template declaration defines the primary variable pattern.
VarTemplateSpecializationDecl * findSpecialization(ArrayRef< TemplateArgument > Args, void *&InsertPos)
Return the specialization with the provided arguments if it exists, otherwise return the insertion po...
VarTemplatePartialSpecializationDecl * findPartialSpecInstantiatedFromMember(VarTemplatePartialSpecializationDecl *D)
Find a variable template partial specialization which was instantiated from the given member partial ...
static VarTemplatePartialSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, TemplateParameterList *Params, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
VarTemplatePartialSpecializationDecl * getInstantiatedFromMember() const
Retrieve the member variable template partial specialization from which this particular variable temp...
bool isMemberSpecialization() const
Determines whether this variable template partial specialization was a specialization of a member par...
void Profile(llvm::FoldingSetNodeID &ID) const
static VarTemplatePartialSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
Represents a variable template specialization, which refers to a variable template with a given set o...
VarTemplateSpecializationDecl(Kind DK, ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
Retrieve the template argument list as written in the sources, if any.
void setTemplateKeywordLoc(SourceLocation Loc)
Sets the location of the template keyword.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the variable template specialization.
SourceLocation getTemplateKeywordLoc() const
Gets the location of the template keyword, if present.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
static VarTemplateSpecializationDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, VarTemplateDecl *SpecializedTemplate, QualType T, TypeSourceInfo *TInfo, StorageClass S, ArrayRef< TemplateArgument > Args)
llvm::PointerUnion< VarTemplateDecl *, VarTemplatePartialSpecializationDecl * > getSpecializedTemplateOrPartial() const
Retrieve the variable template or variable template partial specialization which was specialized by t...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
VarTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SourceLocation getExternKeywordLoc() const
Gets the location of the extern keyword, if present.
static VarTemplateSpecializationDecl * CreateDeserialized(ASTContext &C, GlobalDeclID ID)
void setExternKeywordLoc(SourceLocation Loc)
Sets the location of the extern keyword.
void getNameForDiagnostic(raw_ostream &OS, const PrintingPolicy &Policy, bool Qualified) const override
Appends a human-readable name for this declaration into the given stream.
The JSON file list parser is used to communicate input to InstallAPI.
StorageClass
Storage classes.
void * allocateDefaultArgStorageChain(const ASTContext &C)
@ Result
The result type of a method or function.
TemplateParameterList * getReplacedTemplateParameterList(Decl *D)
Internal helper used by Subst* nodes to retrieve the parameter list for their AssociatedDecl.
TagTypeKind
The kind of a tag type.
BuiltinTemplateKind
Kinds of BuiltinTemplateDecl.
@ BTK__type_pack_element
This names the __type_pack_element BuiltinTemplateDecl.
@ BTK__make_integer_seq
This names the __make_integer_seq BuiltinTemplateDecl.
std::optional< unsigned > getExpandedPackSize(const NamedDecl *Param)
Check whether the template parameter is a pack expansion, and if so, determine the number of paramete...
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.
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
@ Struct
The "struct" keyword introduces the elaborated-type-specifier.
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
static const ASTTemplateArgumentListInfo * Create(const ASTContext &C, const TemplateArgumentListInfo &List)
Data that is common to all of the declarations of a given class template.
llvm::FoldingSetVector< ClassTemplatePartialSpecializationDecl > PartialSpecializations
The class template partial specializations for this class template.
llvm::FoldingSetVector< ClassTemplateSpecializationDecl > Specializations
The class template specializations for this class template, including explicit specializations and in...
QualType InjectedClassNameType
The injected-class-name type for this class template.
A placeholder type used to construct an empty shell of a decl-derived type that will be filled in lat...
Provides information about an explicit instantiation of a variable or class template.
const ASTTemplateArgumentListInfo * TemplateArgsAsWritten
The template arguments as written..
Data that is common to all of the declarations of a given function template.
llvm::FoldingSetVector< FunctionTemplateSpecializationInfo > Specializations
The function template specializations for this function template, including explicit specializations ...
Describes how types, statements, expressions, and declarations should be printed.
unsigned AlwaysIncludeTypeForTemplateArgument
Whether to use type suffixes (eg: 1U) on integral non-type template parameters.
GlobalDeclID * LazySpecializations
If non-null, points to an array of specializations (including partial specializations) known only by ...
Data that is common to all of the declarations of a given variable template.
llvm::FoldingSetVector< VarTemplatePartialSpecializationDecl > PartialSpecializations
The variable template partial specializations for this variable template.
llvm::FoldingSetVector< VarTemplateSpecializationDecl > Specializations
The variable template specializations for this variable template, including explicit specializations ...