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());
164 llvm_unreachable(
"Expected valid TemplateArgument");
191 assert(TPL &&
"Expecting non-null pointer.");
193 ID.AddInteger(TPL->
size());
194 for (
auto *ND : TPL->
asArray()) {
210 const unsigned size = Bools.size();
211 const unsigned remainder = size % unsigned_bits;
212 const unsigned loops = size / unsigned_bits;
213 auto I = Bools.rbegin();
215 for (
unsigned i = 0; i <
remainder; ++i) {
220 ID.AddInteger(value);
222 for (
unsigned i = 0; i < loops; ++i) {
224 for (
unsigned j = 0; j < unsigned_bits; ++j) {
229 ID.AddInteger(value);
232 assert(I == Bools.rend());
234 return ID.ComputeHash();
242 llvm::FoldingSetNodeID &
ID;
246 ODRDeclVisitor(llvm::FoldingSetNodeID &
ID,
ODRHash &Hash)
247 :
ID(
ID), Hash(Hash) {}
249 void AddStmt(
const Stmt *S) {
267 void AddDecl(
const Decl *D) {
278 void Visit(
const Decl *D) {
283 void VisitNamedDecl(
const NamedDecl *D) {
285 Inherited::VisitNamedDecl(D);
288 void VisitValueDecl(
const ValueDecl *D) {
289 if (!isa<FunctionDecl>(D)) {
292 Inherited::VisitValueDecl(D);
295 void VisitVarDecl(
const VarDecl *D) {
298 const bool HasInit = D->
hasInit();
303 Inherited::VisitVarDecl(D);
308 Inherited::VisitParmVarDecl(D);
313 Inherited::VisitAccessSpecDecl(D);
320 Inherited::VisitStaticAssertDecl(D);
323 void VisitFieldDecl(
const FieldDecl *D) {
334 Inherited::VisitFieldDecl(D);
341 Inherited::VisitFunctionDecl(D);
347 Inherited::VisitCXXMethodDecl(D);
353 Inherited::VisitTypedefNameDecl(D);
357 Inherited::VisitTypedefDecl(D);
361 Inherited::VisitTypeAliasDecl(D);
376 const bool hasDefaultArgument =
379 if (hasDefaultArgument) {
389 Inherited::VisitTemplateTypeParmDecl(D);
394 const bool hasDefaultArgument =
397 if (hasDefaultArgument) {
402 Inherited::VisitNonTypeTemplateParmDecl(D);
407 const bool hasDefaultArgument =
410 if (hasDefaultArgument) {
415 Inherited::VisitTemplateTemplateParmDecl(D);
421 Inherited::VisitTemplateDecl(D);
426 Inherited::VisitRedeclarableTemplateDecl(D);
432 Inherited::VisitFunctionTemplateDecl(D);
437 Inherited::VisitEnumConstantDecl(D);
451 case Decl::AccessSpec:
452 case Decl::CXXConstructor:
453 case Decl::CXXDestructor:
454 case Decl::CXXMethod:
455 case Decl::EnumConstant:
458 case Decl::FunctionTemplate:
459 case Decl::StaticAssert:
460 case Decl::TypeAlias:
468 assert(D &&
"Expecting non-null pointer.");
470 ODRDeclVisitor(ID, *
this).Visit(D);
475 "Expected non-null record to be a definition.");
479 if (isa<ClassTemplateSpecializationDecl>(DC)) {
492 Decls.push_back(SubDecl);
493 if (
auto *Function = dyn_cast<FunctionDecl>(SubDecl)) {
495 Function->getODRHash();
500 ID.AddInteger(Decls.size());
501 for (
auto SubDecl : Decls) {
512 auto Bases = Record->
bases();
513 for (
auto Base : Bases) {
515 ID.AddInteger(
Base.isVirtual());
516 ID.AddInteger(
Base.getAccessSpecifierAsWritten());
522 assert(Function &&
"Expecting non-null pointer.");
527 if (isa<ClassTemplateSpecializationDecl>(DC))
return;
528 if (
auto *F = dyn_cast<FunctionDecl>(DC)) {
529 if (F->isFunctionTemplateSpecialization()) {
530 if (!isa<CXXMethodDecl>(DC))
return;
539 ID.AddInteger(Function->getDeclKind());
541 const auto *SpecializationArgs = Function->getTemplateSpecializationArgs();
543 if (SpecializationArgs) {
544 ID.AddInteger(SpecializationArgs->size());
550 if (
const auto *Method = dyn_cast<CXXMethodDecl>(Function)) {
555 ID.AddInteger(Function->getStorageClass());
560 AddBoolean(Function->isExplicitlyDefaulted());
566 ID.AddInteger(Function->param_size());
567 for (
auto Param : Function->parameters())
575 const bool HasBody = Function->isThisDeclarationADefinition() &&
576 !Function->isDefaulted() && !Function->isDeleted() &&
577 !Function->isLateTemplateParsed();
583 auto *Body = Function->getBody();
591 for (
Decl *SubDecl : Function->decls()) {
593 Decls.push_back(SubDecl);
597 ID.AddInteger(Decls.size());
598 for (
auto SubDecl : Decls) {
608 if (Enum->isScoped())
611 if (Enum->getIntegerTypeSourceInfo())
617 for (
Decl *SubDecl : Enum->decls()) {
619 assert(isa<EnumConstantDecl>(SubDecl) &&
"Unexpected Decl");
620 Decls.push_back(SubDecl);
624 ID.AddInteger(Decls.size());
625 for (
auto SubDecl : Decls) {
632 assert(D &&
"Expecting non-null pointer.");
635 const NamedDecl *ND = dyn_cast<NamedDecl>(D);
645 dyn_cast<ClassTemplateSpecializationDecl>(D);
649 ID.AddInteger(List.size());
658 class ODRTypeVisitor :
public TypeVisitor<ODRTypeVisitor> {
660 llvm::FoldingSetNodeID &
ID;
664 ODRTypeVisitor(llvm::FoldingSetNodeID &
ID,
ODRHash &Hash)
665 :
ID(
ID), Hash(Hash) {}
667 void AddStmt(
Stmt *S) {
674 void AddDecl(
Decl *D) {
685 void AddType(
const Type *T) {
712 static const Type *RemoveTypedef(
const Type *T) {
713 const auto *TypedefT = dyn_cast<TypedefType>(T);
725 const auto *ElaboratedT = dyn_cast<ElaboratedType>(UnderlyingType);
730 if (ElaboratedT->getQualifier() !=
nullptr) {
734 QualType NamedType = ElaboratedT->getNamedType();
739 const auto *RecordT = dyn_cast<RecordType>(NamedType);
744 const IdentifierInfo *TypedefII = TypedefT->getDecl()->getIdentifier();
745 const IdentifierInfo *RecordII = RecordT->getDecl()->getIdentifier();
746 if (!TypedefII || !RecordII ||
754 void Visit(
const Type *T) {
755 T = RemoveTypedef(T);
760 void VisitType(
const Type *T) {}
770 if (
auto Pointer = dyn_cast<PointerType>(split.
Ty)) {
771 if (
Pointer->getPointeeType() == Original) {
774 AddQualType(Original);
784 AddQualType(Original);
785 AddQualType(Adjusted);
793 VisitAdjustedType(T);
796 void VisitArrayType(
const ArrayType *T) {
851 VisitDecltypeType(T);
859 void VisitAutoType(
const AutoType *T) {
871 void VisitDeducedTemplateSpecializationType(
899 VisitFunctionType(T);
905 AddQualType(ParamType);
907 VisitFunctionType(T);
930 ID.AddInteger(TypeArgs.size());
931 for (
auto Arg : TypeArgs) {
936 ID.AddInteger(Protocols.size());
937 for (
auto Protocol : Protocols) {
948 VisitObjCObjectType(T);
954 ID.AddInteger(Protocols.size());
955 for (
auto Protocol : Protocols) {
967 void VisitParenType(
const ParenType *T) {
972 void VisitPipeType(
const PipeType *T) {
989 VisitReferenceType(T);
993 VisitReferenceType(T);
1009 void VisitTagType(
const TagType *T) {
1014 void VisitRecordType(
const RecordType *T) { VisitTagType(T); }
1015 void VisitEnumType(
const EnumType *T) { VisitTagType(T); }
1039 dyn_cast<TypedefType>(UnderlyingType.
getTypePtr())) {
1040 UnderlyingType = Underlying->getDecl()->getUnderlyingType();
1044 dyn_cast<ElaboratedType>(UnderlyingType.
getTypePtr())) {
1045 UnderlyingType = Underlying->getNamedType();
1076 VisitTypeWithKeyword(T);
1079 void VisitDependentTemplateSpecializationType(
1087 VisitTypeWithKeyword(T);
1093 VisitTypeWithKeyword(T);
1121 assert(T &&
"Expecting non-null pointer.");
1122 ODRTypeVisitor(ID, *
this).Visit(T);
1135 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 has not been deduced.
@ 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
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).
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...