Go to the documentation of this file.
22 using namespace clang;
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);
75 for (
unsigned i = 0; i < NumArgs; ++i) {
89 ID.AddInteger(Name.getCXXOverloadedOperator());
100 auto *Template = Name.getCXXDeductionGuideTemplate();
110 assert(NNS &&
"Expecting non-null pointer.");
139 auto Kind = Name.getKind();
144 AddDecl(Name.getAsTemplateDecl());
163 llvm_unreachable(
"Expected valid TemplateArgument");
190 assert(TPL &&
"Expecting non-null pointer.");
192 ID.AddInteger(TPL->
size());
193 for (
auto *ND : TPL->
asArray()) {
209 const unsigned size = Bools.size();
210 const unsigned remainder = size % unsigned_bits;
211 const unsigned loops = size / unsigned_bits;
212 auto I = Bools.rbegin();
214 for (
unsigned i = 0; i <
remainder; ++i) {
219 ID.AddInteger(value);
221 for (
unsigned i = 0; i < loops; ++i) {
223 for (
unsigned j = 0; j < unsigned_bits; ++j) {
228 ID.AddInteger(value);
231 assert(I == Bools.rend());
233 return ID.ComputeHash();
241 llvm::FoldingSetNodeID &
ID;
245 ODRDeclVisitor(llvm::FoldingSetNodeID &
ID,
ODRHash &Hash)
246 :
ID(
ID), Hash(Hash) {}
248 void AddStmt(
const Stmt *S) {
266 void AddDecl(
const Decl *D) {
277 void Visit(
const Decl *D) {
282 void VisitNamedDecl(
const NamedDecl *D) {
284 Inherited::VisitNamedDecl(D);
287 void VisitValueDecl(
const ValueDecl *D) {
288 if (!isa<FunctionDecl>(D)) {
291 Inherited::VisitValueDecl(D);
294 void VisitVarDecl(
const VarDecl *D) {
297 const bool HasInit = D->
hasInit();
302 Inherited::VisitVarDecl(D);
307 Inherited::VisitParmVarDecl(D);
312 Inherited::VisitAccessSpecDecl(D);
319 Inherited::VisitStaticAssertDecl(D);
322 void VisitFieldDecl(
const FieldDecl *D) {
333 Inherited::VisitFieldDecl(D);
340 Inherited::VisitFunctionDecl(D);
346 Inherited::VisitCXXMethodDecl(D);
352 Inherited::VisitTypedefNameDecl(D);
356 Inherited::VisitTypedefDecl(D);
360 Inherited::VisitTypeAliasDecl(D);
375 const bool hasDefaultArgument =
378 if (hasDefaultArgument) {
388 Inherited::VisitTemplateTypeParmDecl(D);
393 const bool hasDefaultArgument =
396 if (hasDefaultArgument) {
401 Inherited::VisitNonTypeTemplateParmDecl(D);
406 const bool hasDefaultArgument =
409 if (hasDefaultArgument) {
414 Inherited::VisitTemplateTemplateParmDecl(D);
420 Inherited::VisitTemplateDecl(D);
425 Inherited::VisitRedeclarableTemplateDecl(D);
431 Inherited::VisitFunctionTemplateDecl(D);
436 Inherited::VisitEnumConstantDecl(D);
450 case Decl::AccessSpec:
451 case Decl::CXXConstructor:
452 case Decl::CXXDestructor:
453 case Decl::CXXMethod:
454 case Decl::EnumConstant:
457 case Decl::FunctionTemplate:
458 case Decl::StaticAssert:
459 case Decl::TypeAlias:
467 assert(D &&
"Expecting non-null pointer.");
469 ODRDeclVisitor(ID, *
this).Visit(D);
474 "Expected non-null record to be a definition.");
478 if (isa<ClassTemplateSpecializationDecl>(DC)) {
491 Decls.push_back(SubDecl);
492 if (
auto *Function = dyn_cast<FunctionDecl>(SubDecl)) {
494 Function->getODRHash();
499 ID.AddInteger(Decls.size());
500 for (
auto SubDecl : Decls) {
511 auto Bases = Record->
bases();
512 for (
auto Base : Bases) {
514 ID.AddInteger(
Base.isVirtual());
515 ID.AddInteger(
Base.getAccessSpecifierAsWritten());
521 assert(Function &&
"Expecting non-null pointer.");
526 if (isa<ClassTemplateSpecializationDecl>(DC))
return;
527 if (
auto *F = dyn_cast<FunctionDecl>(DC)) {
528 if (F->isFunctionTemplateSpecialization()) {
529 if (!isa<CXXMethodDecl>(DC))
return;
538 ID.AddInteger(Function->getDeclKind());
540 const auto *SpecializationArgs = Function->getTemplateSpecializationArgs();
542 if (SpecializationArgs) {
543 ID.AddInteger(SpecializationArgs->size());
549 if (
const auto *Method = dyn_cast<CXXMethodDecl>(Function)) {
554 ID.AddInteger(Function->getStorageClass());
559 AddBoolean(Function->isExplicitlyDefaulted());
565 ID.AddInteger(Function->param_size());
566 for (
auto Param : Function->parameters())
574 const bool HasBody = Function->isThisDeclarationADefinition() &&
575 !Function->isDefaulted() && !Function->isDeleted() &&
576 !Function->isLateTemplateParsed();
582 auto *Body = Function->getBody();
590 for (
Decl *SubDecl : Function->decls()) {
592 Decls.push_back(SubDecl);
596 ID.AddInteger(Decls.size());
597 for (
auto SubDecl : Decls) {
607 if (Enum->isScoped())
610 if (Enum->getIntegerTypeSourceInfo())
616 for (
Decl *SubDecl : Enum->decls()) {
618 assert(isa<EnumConstantDecl>(SubDecl) &&
"Unexpected Decl");
619 Decls.push_back(SubDecl);
623 ID.AddInteger(Decls.size());
624 for (
auto SubDecl : Decls) {
631 assert(D &&
"Expecting non-null pointer.");
634 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
644 dyn_cast<ClassTemplateSpecializationDecl>(D);
648 ID.AddInteger(List.size());
657 class ODRTypeVisitor :
public TypeVisitor<ODRTypeVisitor> {
659 llvm::FoldingSetNodeID &
ID;
663 ODRTypeVisitor(llvm::FoldingSetNodeID &
ID,
ODRHash &Hash)
664 :
ID(
ID), Hash(Hash) {}
666 void AddStmt(
Stmt *S) {
673 void AddDecl(
Decl *D) {
684 void AddType(
const Type *T) {
711 static const Type *RemoveTypedef(
const Type *T) {
712 const auto *TypedefT = dyn_cast<TypedefType>(T);
724 const auto *ElaboratedT = dyn_cast<ElaboratedType>(UnderlyingType);
729 if (ElaboratedT->getQualifier() !=
nullptr) {
733 QualType NamedType = ElaboratedT->getNamedType();
738 const auto *RecordT = dyn_cast<RecordType>(NamedType);
743 const IdentifierInfo *TypedefII = TypedefT->getDecl()->getIdentifier();
744 const IdentifierInfo *RecordII = RecordT->getDecl()->getIdentifier();
745 if (!TypedefII || !RecordII ||
753 void Visit(
const Type *T) {
754 T = RemoveTypedef(T);
759 void VisitType(
const Type *T) {}
769 if (
auto Pointer = dyn_cast<PointerType>(split.
Ty)) {
770 if (
Pointer->getPointeeType() == Original) {
773 AddQualType(Original);
783 AddQualType(Original);
784 AddQualType(Adjusted);
792 VisitAdjustedType(T);
795 void VisitArrayType(
const ArrayType *T) {
850 VisitDecltypeType(T);
858 void VisitAutoType(
const AutoType *T) {
870 void VisitDeducedTemplateSpecializationType(
898 VisitFunctionType(T);
904 AddQualType(ParamType);
906 VisitFunctionType(T);
929 ID.AddInteger(TypeArgs.size());
930 for (
auto Arg : TypeArgs) {
935 ID.AddInteger(Protocols.size());
936 for (
auto Protocol : Protocols) {
947 VisitObjCObjectType(T);
953 ID.AddInteger(Protocols.size());
954 for (
auto Protocol : Protocols) {
966 void VisitParenType(
const ParenType *T) {
971 void VisitPipeType(
const PipeType *T) {
988 VisitReferenceType(T);
992 VisitReferenceType(T);
1008 void VisitTagType(
const TagType *T) {
1013 void VisitRecordType(
const RecordType *T) { VisitTagType(T); }
1014 void VisitEnumType(
const EnumType *T) { VisitTagType(T); }
1038 dyn_cast<TypedefType>(UnderlyingType.
getTypePtr())) {
1039 UnderlyingType = Underlying->getDecl()->getUnderlyingType();
1043 dyn_cast<ElaboratedType>(UnderlyingType.
getTypePtr())) {
1044 UnderlyingType = Underlying->getNamedType();
1075 VisitTypeWithKeyword(T);
1078 void VisitDependentTemplateSpecializationType(
1086 VisitTypeWithKeyword(T);
1092 VisitTypeWithKeyword(T);
1120 assert(T &&
"Expecting non-null pointer.");
1121 ODRTypeVisitor(ID, *
this).Visit(T);
1134 Bools.push_back(
Value);
This class is used for builtin types like 'int'.
const IdentifierInfo * getIdentifier() const
Represents an access specifier followed by colon ':'.
Represents a C++17 deduced template specialization type.
QualType getInnerType() const
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
void AddDecl(const Decl *D)
Expr * getSizeExpr() const
QualType getType() const
Return the type wrapped by this type source info.
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.
An attributed type is a type to which a type attribute has been applied.
TemplateTypeParmDecl * getDecl() const
TemplateArgument getArgumentPack() const
bool isConstrained() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
ConceptDecl * getTypeConstraintConcept() const
QualType getDefaultArgument() const
Retrieve the default argument, if any.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
QualType getElementType() const
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
Represents the canonical version of C arrays with a specified constant size.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
void AddBoolean(bool value)
Expr * getSizeExpr() const
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
const llvm::APInt & getSize() const
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
This represents a decl that may have a name.
Expr * getAddrSpaceExpr() const
A (possibly-)qualified type.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
Expr * getUnderlyingExpr() const
Represents a member of a struct/union/class.
The collection of all-type qualifiers we support.
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Represents a parameter to a function.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
const Expr * getInitExpr() const
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
Represents a type template specialization; the template must be a class template, a type alias templa...
void AddTemplateParameterList(const TemplateParameterList *TPL)
ExtInfo getExtInfo() const
QualType getElementType() const
ObjCTypeParamDecl * getDecl() const
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
unsigned getAsOpaqueValue() const
QualType getPointeeTypeAsWritten() const
ArrayRef< TemplateArgument > getTypeConstraintArguments() const
Declaration of a redeclarable template.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
FunctionType - C99 6.7.5.3 - Function Declarators.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
ObjCInterfaceDecl * getInterface() const
Gets the interface declaration for this object type, if the base type really is an interface.
const TemplateTypeParmType * getReplacedParameter() const
Gets the template parameter that was substituted for.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
The name of a declaration.
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
The base class of the type hierarchy.
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
const TemplateTypeParmType * getReplacedParameter() const
Gets the template parameter that was substituted for.
Represents a class type in Objective C.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
unsigned getODRHash()
Returns ODRHash of the function.
Declaration of a template function.
QualType getPattern() const
Retrieve the pattern of this pack expansion, which is the type that will be repeatedly instantiated w...
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
@ Namespace
A namespace, stored as a NamespaceDecl*.
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
ArgKind getKind() const
Return the kind of stored template argument.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
Represents a pack expansion of types.
void AddQualType(QualType T)
AccessSpecifier getAccess() const
unsigned getIndex() const
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
Represents a GCC generic vector type.
Expr * getBitWidth() const
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
static bool isDeclToBeProcessed(const Decl *D, const DeclContext *Parent)
QualType getPointeeType() const
Represents typeof(type), a GCC extension.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
AutoTypeKeyword getKeyword() const
Represents a template argument.
StringLiteral * getMessage()
QualType getReplacementType() const
Gets the type that was substituted for the template parameter.
void AddTemplateName(TemplateName Name)
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
QualType getUnderlyingType() const
QualType desugar() const
Remove a single level of sugar.
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Expr * getSizeExpr() const
void AddIdentifierInfo(const IdentifierInfo *II)
void AddTemplateArgument(TemplateArgument TA)
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Represents a variable declaration or definition.
const TemplateArgument & getArgument() const
ArrayRef< QualType > getParamTypes() const
Represents the dependent type named by a dependently-scoped typename using declaration,...
@ Template
A single template declaration.
Stores a list of template parameters for a TemplateDecl and its derived classes.
@ Global
The global specifier '::'. There is no stored value.
const Type * Ty
The locally-unqualified type.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
Represents an extended address space qualifier where the input address space value is dependent.
Represents the result of substituting a type for a template type parameter.
QualType getPointeeType() const
An instance of this object exists for each enum constant that is defined.
const Type * getClass() const
Represents the result of substituting a set of types for a template type parameter pack.
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
ArrayRef< TemplateArgument > template_arguments() const
Declaration of a template type parameter.
TypeClass getTypeClass() const
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
bool isMutable() const
Determines whether this field is mutable (C++ only).
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
TagDecl * getDecl() const
Represents a C array with an unspecified size.
VectorKind getVectorKind() const
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
QualType getDeducedType() const
Get the type deduced for this placeholder type, or null if it's either not been deduced or was deduce...
@ CXXConversionFunctionName
Qualifiers getIndexTypeQualifiers() const
unsigned getNumArgs() const
Retrieve the number of template arguments.
QualType getUnderlyingType() const
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
unsigned getNumArgs() const
Retrieve the number of template arguments.
ArraySizeModifier getSizeModifier() const
#define remainder(__x, __y)
Represents a pointer to an Objective C object.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template.
Represents a C++ struct/union/class.
unsigned getNumArgs() const
Retrieve the number of template arguments.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
QualType getAdjustedType() const
Represents an array type in C++ whose size is a value-dependent expression.
Represents a C array with a specified size that is not an integer-constant-expression.
bool isBitField() const
Determines whether this field is a bitfield.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in this nested name specifier.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
Expr * getDefaultArgument() const
Retrieve the default argument, if any.
const TypeConstraint * getTypeConstraint() const
Returns the type constraint associated with this template parameter (if any).
Represents a C++11 static_assert declaration.
TypedefNameDecl * getDecl() const
QualType getNamedType() const
Retrieve the type named by the qualified-id.
Declaration of a class template.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Complex values, per C99 6.2.5p11.
A simple visitor class that helps create declaration visitors.
Represents a C++ template name within the type system.
Represents the type decltype(expr) (C++11).
void AddType(const Type *T)
bool isKindOfType() const
Whether this ia a "__kindof" type (semantically).
Represents a prototype with parameter type info, e.g.
Expr * getUnderlyingExpr() const
DeclContext * getParent()
getParent - Returns the containing DeclContext.
The base class of all kinds of template declarations (e.g., class, function, etc.).
QualType getPointeeType() const
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Decl - This represents one declaration (or definition), e.g.
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
QualType getElementType() const
unsigned getNumParams() const
void AddCXXRecordDecl(const CXXRecordDecl *Record)
The injected class name of a C++ class template or class template partial specialization.
A template argument list.
ArrayRef< TemplateArgument > template_arguments() const
bool isFileContext() const
void Profile(llvm::FoldingSetNodeID &ID) const
const Expr * getInit() const
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
One of these records is kept for each identifier that is lexed.
ArrayRef< NamedDecl * > asArray()
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Represents a typeof (or typeof) expression (a GCC extension).
A helper class for Type nodes having an ElaboratedTypeKeyword.
bool isParameterPack() const
Returns whether this is a parameter pack.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Represents a template specialization type whose template cannot be resolved, e.g.
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
An rvalue reference type, per C++11 [dcl.ref].
UnresolvedUsingTypenameDecl * getDecl() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
void AddStmt(const Stmt *S)
ArrayRef< ObjCProtocolDecl * > getProtocols() const
Retrieve all of the protocol qualifiers.
StringRef getName() const
Return the actual identifier string.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
@ Type
The template argument is a type.
QualType getEquivalentType() const
unsigned getDepth() const
Dataflow Directional Tag Classes.
QualType getElementType() const
Smart pointer class that efficiently represents Objective-C method names.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
QualType getUnderlyingType() const
@ Template
The template argument is a template name that was provided for a template template parameter.
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
Stmt - This represents one statement.
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
bool hasDefinition() const
A container of type source information.
QualType getReturnType() const
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
NestedNameSpecifier * getQualifier() const
Base class for declarations which introduce a typedef-name.
void AddSubDecl(const Decl *D)
@ OverloadedTemplate
A set of overloaded template declarations.
void AddEnumDecl(const EnumDecl *Enum)
Represents a qualified type name for which the type name is dependent.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
TemplateName getTemplateName() const
Retrieve the name of the template that we are deducing.
ExtVectorType - Extended vector type.
Base for LValueReferenceType and RValueReferenceType.
QualType getPointeeType() const
@ TypeSpec
A type, stored as a Type*.
unsigned getNumElements() const
unsigned pack_size() const
The number of template arguments in the given template argument pack.
Represents a type parameter type in Objective C.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
CXXRecordDecl * getDecl() const
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
QualType getElementType() const
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
bool isParameterPack() const
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
bool isSugared() const
Returns whether this type directly provides sugar.
Represents an extended vector type where either the type or size is dependent.
QualType getModifiedType() const
Qualifiers Quals
The local qualifiers.
const IdentifierInfo * getIdentifier() const
Retrieve the type named by the typename specifier as an identifier.
Represents a function declaration or definition.
ElaboratedTypeKeyword getKeyword() const
Internal representation of canonical, dependent decltype(expr) types.
Interfaces are the core concept in Objective-C for object oriented design.
ArrayRef< QualType > getTypeArgsAsWritten() const
Retrieve the type arguments of this object type as they were written.
Represents a pointer type decayed from an array or function type.
QualType getOriginalType() const
Sugar for parentheses used when specifying types.
bool hasLocalQualifiers() const
Determine whether this particular QualType instance has any qualifiers, without looking through any t...
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
QualType getAsType() const
Retrieve the type for a type template argument.
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
An lvalue reference type, per C++11 [dcl.ref].
@ Pack
The template argument is actually a parameter pack.
Represents a static or instance method of a struct/union/class.
DeclContext * getDeclContext()
TemplateName getTemplateName() const
Retrieve the name of the template that we are specializing.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).