25 assert(S &&
"Expecting non-null pointer.");
26 S->ProcessODRHash(ID, *
this);
30 assert(II &&
"Expecting non-null pointer.");
39 AddDeclarationNameImpl(Name);
48 auto Result = DeclNameMap.insert(std::make_pair(Name, DeclNameMap.size()));
49 ID.AddInteger(
Result.first->second);
60 auto Kind = Name.getNameKind();
73 unsigned NumArgs = S.getNumArgs();
74 ID.AddInteger(NumArgs);
77 unsigned SlotsToCheck = NumArgs > 0 ? NumArgs : 1;
78 for (
unsigned i = 0; i < SlotsToCheck; ++i) {
92 ID.AddInteger(Name.getCXXOverloadedOperator());
103 auto *Template = Name.getCXXDeductionGuideTemplate();
113 assert(NNS &&
"Expecting non-null pointer.");
142 auto Kind = Name.getKind();
147 AddDecl(Name.getAsTemplateDecl());
162 const auto Kind = TA.
getKind();
167 llvm_unreachable(
"Expected valid TemplateArgument");
175 ID.AddPointer(
nullptr);
204 assert(TPL &&
"Expecting non-null pointer.");
206 ID.AddInteger(TPL->
size());
207 for (
auto *ND : TPL->
asArray()) {
223 const unsigned size = Bools.size();
224 const unsigned remainder = size % unsigned_bits;
225 const unsigned loops = size / unsigned_bits;
226 auto I = Bools.rbegin();
228 for (
unsigned i = 0; i <
remainder; ++i) {
233 ID.AddInteger(value);
235 for (
unsigned i = 0; i < loops; ++i) {
237 for (
unsigned j = 0; j < unsigned_bits; ++j) {
242 ID.AddInteger(value);
245 assert(I == Bools.rend());
247 return ID.ComputeHash();
255 llvm::FoldingSetNodeID &
ID;
259 ODRDeclVisitor(llvm::FoldingSetNodeID &
ID,
ODRHash &Hash)
260 :
ID(
ID), Hash(Hash) {}
262 void AddStmt(
const Stmt *S) {
280 void AddDecl(
const Decl *D) {
291 void Visit(
const Decl *D) {
296 void VisitNamedDecl(
const NamedDecl *D) {
298 Inherited::VisitNamedDecl(D);
301 void VisitValueDecl(
const ValueDecl *D) {
302 if (
auto *DD = dyn_cast<DeclaratorDecl>(D); DD && DD->getTypeSourceInfo())
303 AddQualType(DD->getTypeSourceInfo()->getType());
305 Inherited::VisitValueDecl(D);
308 void VisitVarDecl(
const VarDecl *D) {
311 const bool HasInit = D->
hasInit();
316 Inherited::VisitVarDecl(D);
321 Inherited::VisitParmVarDecl(D);
326 Inherited::VisitAccessSpecDecl(D);
333 Inherited::VisitStaticAssertDecl(D);
336 void VisitFieldDecl(
const FieldDecl *D) {
347 Inherited::VisitFieldDecl(D);
352 Inherited::VisitObjCIvarDecl(D);
361 Inherited::VisitObjCPropertyDecl(D);
368 Inherited::VisitFunctionDecl(D);
374 Inherited::VisitCXXMethodDecl(D);
392 ID.AddInteger(llvm::to_underlying(
Cmd->getParameterKind()));
397 ID.AddInteger(llvm::to_underlying(Self->getParameterKind()));
422 Decls.push_back(SubDecl);
424 ID.AddInteger(Decls.size());
425 for (
auto SubDecl : Decls)
432 Inherited::VisitObjCMethodDecl(Method);
438 Inherited::VisitTypedefNameDecl(D);
442 Inherited::VisitTypedefDecl(D);
446 Inherited::VisitTypeAliasDecl(D);
461 const bool hasDefaultArgument =
464 if (hasDefaultArgument) {
474 Inherited::VisitTemplateTypeParmDecl(D);
479 const bool hasDefaultArgument =
482 if (hasDefaultArgument) {
487 Inherited::VisitNonTypeTemplateParmDecl(D);
492 const bool hasDefaultArgument =
495 if (hasDefaultArgument) {
500 Inherited::VisitTemplateTemplateParmDecl(D);
506 Inherited::VisitTemplateDecl(D);
511 Inherited::VisitRedeclarableTemplateDecl(D);
517 Inherited::VisitFunctionTemplateDecl(D);
522 Inherited::VisitEnumConstantDecl(D);
536 case Decl::AccessSpec:
537 case Decl::CXXConstructor:
538 case Decl::CXXDestructor:
539 case Decl::CXXMethod:
540 case Decl::EnumConstant:
543 case Decl::FunctionTemplate:
544 case Decl::StaticAssert:
545 case Decl::TypeAlias:
548 case Decl::ObjCMethod:
550 case Decl::ObjCProperty:
556 assert(D &&
"Expecting non-null pointer.");
558 ODRDeclVisitor(ID, *
this).Visit(D);
563 "Expected non-null record to be a definition.");
567 if (isa<ClassTemplateSpecializationDecl>(DC)) {
580 Decls.push_back(SubDecl);
581 if (
auto *
Function = dyn_cast<FunctionDecl>(SubDecl)) {
588 ID.AddInteger(Decls.size());
589 for (
auto SubDecl : Decls) {
599 ID.AddInteger(
Record->getNumBases());
600 auto Bases =
Record->bases();
601 for (
const auto &
Base : Bases) {
603 ID.AddInteger(
Base.isVirtual());
604 ID.AddInteger(
Base.getAccessSpecifierAsWritten());
609 assert(!isa<CXXRecordDecl>(
Record) &&
610 "For CXXRecordDecl should call AddCXXRecordDecl.");
618 Decls.push_back(SubDecl);
621 ID.AddInteger(Decls.size());
622 for (
const Decl *SubDecl : Decls)
632 ID.AddInteger(SuperClass->getODRHash());
646 Decls.push_back(SubDecl);
648 ID.AddInteger(Decls.size());
649 for (
auto *SubDecl : Decls)
655 assert(
Function &&
"Expecting non-null pointer.");
660 if (isa<ClassTemplateSpecializationDecl>(DC))
return;
661 if (
auto *F = dyn_cast<FunctionDecl>(DC)) {
662 if (F->isFunctionTemplateSpecialization()) {
663 if (!isa<CXXMethodDecl>(DC))
return;
667 if (F->getDependentSpecializationInfo())
676 ID.AddInteger(
Function->getDeclKind());
678 const auto *SpecializationArgs =
Function->getTemplateSpecializationArgs();
680 if (SpecializationArgs) {
681 ID.AddInteger(SpecializationArgs->size());
687 if (
const auto *Method = dyn_cast<CXXMethodDecl>(
Function)) {
692 ID.AddInteger(
Function->getStorageClass());
703 ID.AddString(DeletedMessage->
getBytes());
709 ID.AddInteger(
Function->param_size());
710 for (
auto *Param :
Function->parameters())
718 const bool HasBody =
Function->isThisDeclarationADefinition() &&
736 Decls.push_back(SubDecl);
740 ID.AddInteger(Decls.size());
741 for (
auto SubDecl : Decls) {
751 if (
Enum->isScoped())
754 if (
Enum->getIntegerTypeSourceInfo())
760 for (
Decl *SubDecl :
Enum->decls()) {
762 assert(isa<EnumConstantDecl>(SubDecl) &&
"Unexpected Decl");
763 Decls.push_back(SubDecl);
767 ID.AddInteger(Decls.size());
768 for (
auto SubDecl : Decls) {
778 ID.AddInteger(
P->getReferencedProtocols().size());
787 for (
Decl *SubDecl :
P->decls()) {
789 Decls.push_back(SubDecl);
793 ID.AddInteger(Decls.size());
794 for (
auto *SubDecl : Decls) {
800 assert(D &&
"Expecting non-null pointer.");
803 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
813 dyn_cast<ClassTemplateSpecializationDecl>(D);
817 ID.AddInteger(List.size());
826class ODRTypeVisitor :
public TypeVisitor<ODRTypeVisitor> {
828 llvm::FoldingSetNodeID &
ID;
832 ODRTypeVisitor(llvm::FoldingSetNodeID &
ID,
ODRHash &Hash)
833 :
ID(
ID), Hash(Hash) {}
835 void AddStmt(
Stmt *S) {
842 void AddDecl(
const Decl *D) {
853 void AddType(
const Type *
T) {
880 static const Type *RemoveTypedef(
const Type *
T) {
881 const auto *TypedefT = dyn_cast<TypedefType>(
T);
893 const auto *ElaboratedT = dyn_cast<ElaboratedType>(UnderlyingType);
898 if (ElaboratedT->getQualifier() !=
nullptr) {
902 QualType NamedType = ElaboratedT->getNamedType();
907 const auto *RecordT = dyn_cast<RecordType>(NamedType);
912 const IdentifierInfo *TypedefII = TypedefT->getDecl()->getIdentifier();
913 const IdentifierInfo *RecordII = RecordT->getDecl()->getIdentifier();
914 if (!TypedefII || !RecordII ||
922 void Visit(
const Type *
T) {
923 T = RemoveTypedef(
T);
928 void VisitType(
const Type *
T) {}
931 AddQualType(
T->getOriginalType());
939 VisitAdjustedType(
T);
943 AddQualType(
T->getElementType());
944 ID.AddInteger(llvm::to_underlying(
T->getSizeModifier()));
945 VisitQualifiers(
T->getIndexTypeQualifiers());
954 VisitConstantArrayType(
T);
958 AddStmt(
T->getSizeExpr());
967 AddStmt(
T->getSizeExpr());
972 ID.AddInteger(
T->getAttrKind());
973 AddQualType(
T->getModifiedType());
984 ID.AddInteger(
T->getKind());
989 AddQualType(
T->getElementType());
994 AddStmt(
T->getUnderlyingExpr());
999 VisitDecltypeType(
T);
1003 AddQualType(
T->getDeducedType());
1008 ID.AddInteger((
unsigned)
T->getKeyword());
1009 ID.AddInteger(
T->isConstrained());
1010 if (
T->isConstrained()) {
1011 AddDecl(
T->getTypeConstraintConcept());
1012 ID.AddInteger(
T->getTypeConstraintArguments().size());
1013 for (
const auto &TA :
T->getTypeConstraintArguments())
1016 VisitDeducedType(
T);
1019 void VisitDeducedTemplateSpecializationType(
1022 VisitDeducedType(
T);
1027 AddStmt(
T->getAddrSpaceExpr());
1032 AddQualType(
T->getElementType());
1033 AddStmt(
T->getSizeExpr());
1047 VisitFunctionType(
T);
1053 AddQualType(ParamType);
1055 VisitFunctionType(
T);
1059 AddDecl(
T->getDecl());
1065 AddType(
T->getClass());
1075 AddDecl(
T->getInterface());
1077 auto TypeArgs =
T->getTypeArgsAsWritten();
1078 ID.AddInteger(TypeArgs.size());
1079 for (
auto Arg : TypeArgs) {
1083 auto Protocols =
T->getProtocols();
1084 ID.AddInteger(Protocols.size());
1085 for (
auto *Protocol : Protocols) {
1096 VisitObjCObjectType(
T);
1100 AddDecl(
T->getDecl());
1101 auto Protocols =
T->getProtocols();
1102 ID.AddInteger(Protocols.size());
1103 for (
auto *Protocol : Protocols) {
1111 AddQualType(
T->getPattern());
1116 AddQualType(
T->getInnerType());
1121 AddQualType(
T->getElementType());
1132 AddQualType(
T->getPointeeTypeAsWritten());
1137 VisitReferenceType(
T);
1141 VisitReferenceType(
T);
1146 AddDecl(
T->getAssociatedDecl());
1152 AddDecl(
T->getAssociatedDecl());
1153 AddQualType(
T->getReplacementType());
1157 void VisitTagType(
const TagType *
T) {
1158 AddDecl(
T->getDecl());
1162 void VisitRecordType(
const RecordType *
T) { VisitTagType(
T); }
1163 void VisitEnumType(
const EnumType *
T) { VisitTagType(
T); }
1166 ID.AddInteger(
T->template_arguments().size());
1167 for (
const auto &TA :
T->template_arguments()) {
1175 ID.AddInteger(
T->getDepth());
1176 ID.AddInteger(
T->getIndex());
1178 AddDecl(
T->getDecl());
1182 AddDecl(
T->getDecl());
1187 AddStmt(
T->getUnderlyingExpr());
1193 AddQualType(
T->getUnmodifiedType());
1198 ID.AddInteger(llvm::to_underlying(
T->getKeyword()));
1203 AddNestedNameSpecifier(
T->getQualifier());
1204 AddIdentifierInfo(
T->getIdentifier());
1205 VisitTypeWithKeyword(
T);
1208 void VisitDependentTemplateSpecializationType(
1210 AddIdentifierInfo(
T->getIdentifier());
1211 AddNestedNameSpecifier(
T->getQualifier());
1212 ID.AddInteger(
T->template_arguments().size());
1213 for (
const auto &TA :
T->template_arguments()) {
1216 VisitTypeWithKeyword(
T);
1220 AddNestedNameSpecifier(
T->getQualifier());
1221 AddQualType(
T->getNamedType());
1222 VisitTypeWithKeyword(
T);
1226 AddQualType(
T->getUnderlyingType());
1227 AddQualType(
T->getBaseType());
1232 AddDecl(
T->getDecl());
1237 AddQualType(
T->getElementType());
1238 ID.AddInteger(
T->getNumElements());
1239 ID.AddInteger(llvm::to_underlying(
T->getVectorKind()));
1250 assert(
T &&
"Expecting non-null pointer.");
1251 ODRTypeVisitor(ID, *
this).Visit(
T);
1264 Bools.push_back(
Value);
1278 ID.AddInteger(
Value.getLValueOffset().getQuantity());
1284 ID.AddInteger(
Value.getLValueOffset().getQuantity());
1286 bool OnePastTheEnd =
Value.isLValueOnePastTheEnd();
1287 if (
Value.hasLValuePath()) {
1291 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
1292 OnePastTheEnd |= CAT->getSize() == E.getAsArrayIndex();
1293 TypeSoFar = AT->getElementType();
1295 const Decl *D = E.getAsBaseOrMember().getPointer();
1296 if (
const auto *FD = dyn_cast<FieldDecl>(D)) {
1297 if (FD->getParent()->isUnion())
1298 ID.AddInteger(FD->getFieldIndex());
1299 TypeSoFar = FD->getType();
1308 if (
Value.isNullPointer())
1312 if (
Value.hasLValuePath())
llvm::MachO::Record Record
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes,...
A non-discriminated union of a base, field, or array index.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
CharUnits getMemberPointerPathAdjustment(const APValue &MP) const
Find the 'this' offset for the member path in a pointer-to-member APValue.
QualType getRecordType(const RecordDecl *Decl) const
Represents an access specifier followed by colon ':'.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Represents a constant array type that does not decay to a pointer when used as a function parameter.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
An attributed type is a type to which a type attribute has been applied.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
This class is used for builtin types like 'int'.
Represents a static or instance method of a struct/union/class.
Represents a C++ struct/union/class.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Declaration of a class template.
Complex values, per C99 6.2.5p11.
A simple visitor class that helps create declaration visitors.
Represents the canonical version of C arrays with a specified constant size.
Represents a pointer type decayed from an array or function type.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isFileContext() const
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Decl::Kind getDeclKind() const
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
@ CXXConversionFunctionName
Represents the type decltype(expr) (C++11).
Represents a C++17 deduced template specialization type.
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
Represents an extended address space qualifier where the input address space value is dependent.
Internal representation of canonical, dependent decltype(expr) types.
Represents a qualified type name for which the type name is dependent.
Represents an array type in C++ whose size is a value-dependent expression.
Represents an extended vector type where either the type or size is dependent.
Represents a template specialization type whose template cannot be resolved, e.g.
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
An instance of this object exists for each enum constant that is defined.
const Expr * getInitExpr() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
ExtVectorType - Extended vector type.
Represents a member of a struct/union/class.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
bool isBitField() const
Determines whether this field is a bitfield.
Expr * getBitWidth() const
Returns the expression that represents the bit width, if this field is a bit field.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
Represents a function declaration or definition.
unsigned getODRHash()
Returns ODRHash of the function.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx)
ArrayRef< QualType > getParamTypes() const
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
void Profile(llvm::FoldingSetNodeID &ID) const
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
QualType getReturnType() const
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
Represents a C array with an unspecified size.
The injected class name of a C++ class template or class template partial specialization.
An lvalue reference type, per C++11 [dcl.ref].
A pointer to member type per C++ 8.3.3 - Pointers to members.
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.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
@ TypeSpec
A type, stored as a Type*.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace, stored as a NamespaceDecl*.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in 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.
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
Whether this parameter is a non-type template parameter pack.
Expr * getDefaultArgument() const
Retrieve the default argument, if any.
void AddDecl(const Decl *D)
void AddStmt(const Stmt *S)
void AddStructuralValue(const APValue &)
void AddCXXRecordDecl(const CXXRecordDecl *Record)
void AddIdentifierInfo(const IdentifierInfo *II)
void AddObjCProtocolDecl(const ObjCProtocolDecl *P)
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
void AddObjCInterfaceDecl(const ObjCInterfaceDecl *Record)
void AddType(const Type *T)
void AddEnumDecl(const EnumDecl *Enum)
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
void AddBoolean(bool value)
void AddTemplateName(TemplateName Name)
void AddRecordDecl(const RecordDecl *Record)
void AddSubDecl(const Decl *D)
void AddQualType(QualType T)
void AddTemplateParameterList(const TemplateParameterList *TPL)
void AddTemplateArgument(TemplateArgument TA)
static bool isSubDeclToBeProcessed(const Decl *D, const DeclContext *Parent)
Represents an ObjC class declaration.
protocol_range protocols() const
const ObjCProtocolList & getReferencedProtocols() const
ObjCInterfaceDecl * getSuperClass() const
Interfaces are the core concept in Objective-C for object oriented design.
ObjCIvarDecl - Represents an ObjC instance variable.
AccessControl getCanonicalAccessControl() const
ObjCMethodDecl - Represents an instance or class method declaration.
ImplicitParamDecl * getSelfDecl() const
bool hasBody() const override
Determine whether this method has a body.
ArrayRef< ParmVarDecl * > parameters() const
unsigned param_size() const
Stmt * getBody() const override
Retrieve the body of this method, if it has one.
TypeSourceInfo * getReturnTypeSourceInfo() const
bool isSynthesizedAccessorStub() const
bool isDirectMethod() const
True if the method is tagged as objc_direct.
ImplicitParamDecl * getCmdDecl() const
bool isInstanceMethod() const
bool isThisDeclarationADefinition() const
Returns whether this specific method is a definition.
bool isThisDeclarationADesignatedInitializer() const
Returns true if this specific method declaration is marked with the designated initializer attribute.
ObjCMethodFamily getMethodFamily() const
Determines the family of this method.
ObjCImplementationControl getImplementationControl() const
bool hasSkippedBody() const
True if the method was a definition but its body was skipped.
Represents a pointer to an Objective C object.
Represents a class type in Objective C.
Represents one property declaration in an Objective-C interface.
TypeSourceInfo * getTypeSourceInfo() const
ObjCPropertyAttribute::Kind getPropertyAttributes() const
PropertyControl getPropertyImplementation() const
Represents an Objective-C protocol declaration.
Represents a type parameter type in Objective C.
Represents a pack expansion of types.
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
The collection of all-type qualifiers we support.
uint64_t getAsOpaqueValue() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Declaration of a redeclarable template.
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
Base for LValueReferenceType and RValueReferenceType.
Smart pointer class that efficiently represents Objective-C method names.
Represents a C++11 static_assert declaration.
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
StringRef getBytes() const
Allow access to clients that need the byte representation, such as ASTWriterStmt::VisitStringLiteral(...
Represents the result of substituting a set of types for a template type parameter pack.
Represents the result of substituting a type for a template type parameter.
A template argument list.
const TemplateArgument & getArgument() const
Represents a template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a 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.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ 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.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ 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.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
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.
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
Stores a list of template parameters for a TemplateDecl and its derived classes.
ArrayRef< NamedDecl * > asArray()
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.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Declaration of a template type parameter.
QualType getDefaultArgument() const
Retrieve the default argument, if any.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
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.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
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,...
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
A helper class for Type nodes having an ElaboratedTypeKeyword.
The base class of the type hierarchy.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
TypeClass getTypeClass() const
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Base class for declarations which introduce a typedef-name.
QualType getUnderlyingType() const
Represents the dependent type named by a dependently-scoped typename using declaration,...
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 isConstexpr() const
Whether this variable is (C++11) constexpr.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
const Expr * getInit() const
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
The JSON file list parser is used to communicate input to InstallAPI.
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
@ Result
The result type of a method or function.
const FunctionProtoType * T
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
#define remainder(__x, __y)