23 using namespace clang;
26 assert(S &&
"Expecting non-null pointer.");
31 assert(II &&
"Expecting non-null pointer.");
40 AddDeclarationNameImpl(Name);
49 auto Result = DeclNameMap.insert(std::make_pair(Name, DeclNameMap.size()));
50 ID.AddInteger(
Result.first->second);
75 for (
unsigned i = 0; i < NumArgs; ++i) {
106 assert(NNS &&
"Expecting non-null pointer.");
158 llvm_unreachable(
"Expected valid TemplateArgument");
185 assert(TPL &&
"Expecting non-null pointer.");
187 ID.AddInteger(TPL->
size());
188 for (
auto *ND : TPL->
asArray()) {
203 const unsigned unsigned_bits =
sizeof(unsigned) *
CHAR_BIT;
204 const unsigned size = Bools.size();
205 const unsigned remainder = size % unsigned_bits;
206 const unsigned loops = size / unsigned_bits;
207 auto I = Bools.rbegin();
209 for (
unsigned i = 0; i <
remainder; ++i) {
214 ID.AddInteger(value);
216 for (
unsigned i = 0; i < loops; ++i) {
218 for (
unsigned j = 0; j < unsigned_bits; ++j) {
223 ID.AddInteger(value);
226 assert(I == Bools.rend());
228 return ID.ComputeHash();
236 llvm::FoldingSetNodeID &ID;
240 ODRDeclVisitor(llvm::FoldingSetNodeID &ID,
ODRHash &Hash)
241 : ID(ID), Hash(Hash) {}
272 void Visit(
const Decl *D) {
277 void VisitNamedDecl(
const NamedDecl *D) {
279 Inherited::VisitNamedDecl(D);
282 void VisitValueDecl(
const ValueDecl *D) {
283 if (!isa<FunctionDecl>(D)) {
286 Inherited::VisitValueDecl(D);
289 void VisitVarDecl(
const VarDecl *D) {
292 const bool HasInit = D->
hasInit();
297 Inherited::VisitVarDecl(D);
302 Inherited::VisitParmVarDecl(D);
307 Inherited::VisitAccessSpecDecl(D);
314 Inherited::VisitStaticAssertDecl(D);
317 void VisitFieldDecl(
const FieldDecl *D) {
328 Inherited::VisitFieldDecl(D);
335 Inherited::VisitFunctionDecl(D);
341 Inherited::VisitCXXMethodDecl(D);
347 Inherited::VisitTypedefNameDecl(D);
351 Inherited::VisitTypedefDecl(D);
355 Inherited::VisitTypeAliasDecl(D);
370 const bool hasDefaultArgument =
373 if (hasDefaultArgument) {
378 Inherited::VisitTemplateTypeParmDecl(D);
383 const bool hasDefaultArgument =
386 if (hasDefaultArgument) {
391 Inherited::VisitNonTypeTemplateParmDecl(D);
396 const bool hasDefaultArgument =
399 if (hasDefaultArgument) {
404 Inherited::VisitTemplateTemplateParmDecl(D);
410 Inherited::VisitTemplateDecl(D);
415 Inherited::VisitRedeclarableTemplateDecl(D);
421 Inherited::VisitFunctionTemplateDecl(D);
426 Inherited::VisitEnumConstantDecl(D);
440 case Decl::AccessSpec:
441 case Decl::CXXConstructor:
442 case Decl::CXXDestructor:
443 case Decl::CXXMethod:
444 case Decl::EnumConstant:
447 case Decl::FunctionTemplate:
448 case Decl::StaticAssert:
449 case Decl::TypeAlias:
457 assert(D &&
"Expecting non-null pointer.");
459 ODRDeclVisitor(ID, *
this).Visit(D);
464 "Expected non-null record to be a definition.");
468 if (isa<ClassTemplateSpecializationDecl>(DC)) {
481 Decls.push_back(SubDecl);
482 if (
auto *Function = dyn_cast<FunctionDecl>(SubDecl)) {
484 Function->getODRHash();
489 ID.AddInteger(Decls.size());
490 for (
auto SubDecl : Decls) {
501 auto Bases = Record->
bases();
502 for (
auto Base : Bases) {
504 ID.AddInteger(
Base.isVirtual());
505 ID.AddInteger(
Base.getAccessSpecifierAsWritten());
511 assert(Function &&
"Expecting non-null pointer.");
516 if (isa<ClassTemplateSpecializationDecl>(DC))
return;
517 if (
auto *F = dyn_cast<FunctionDecl>(DC)) {
518 if (F->isFunctionTemplateSpecialization()) {
519 if (!isa<CXXMethodDecl>(DC))
return;
532 if (SpecializationArgs) {
533 ID.AddInteger(SpecializationArgs->size());
539 if (
const auto *Method = dyn_cast<CXXMethodDecl>(Function)) {
572 auto *Body = Function->
getBody();
580 for (
Decl *SubDecl : Function->
decls()) {
582 Decls.push_back(SubDecl);
586 ID.AddInteger(Decls.size());
587 for (
auto SubDecl : Decls) {
608 assert(isa<EnumConstantDecl>(SubDecl) &&
"Unexpected Decl");
609 Decls.push_back(SubDecl);
613 ID.AddInteger(Decls.size());
614 for (
auto SubDecl : Decls) {
621 assert(D &&
"Expecting non-null pointer.");
633 const auto *Specialization =
636 if (Specialization) {
638 ID.AddInteger(List.
size());
647 class ODRTypeVisitor :
public TypeVisitor<ODRTypeVisitor> {
649 llvm::FoldingSetNodeID &ID;
653 ODRTypeVisitor(llvm::FoldingSetNodeID &ID,
ODRHash &Hash)
654 : ID(ID), Hash(Hash) {}
699 void Visit(
const Type *T) {
704 void VisitType(
const Type *T) {}
715 VisitAdjustedType(T);
718 void VisitArrayType(
const ArrayType *T) {
773 VisitDecltypeType(T);
781 void VisitAutoType(
const AutoType *T) {
786 void VisitDeducedTemplateSpecializationType(
814 VisitFunctionType(T);
822 VisitFunctionType(T);
845 ID.AddInteger(TypeArgs.size());
846 for (
auto Arg : TypeArgs) {
851 ID.AddInteger(Protocols.size());
852 for (
auto Protocol : Protocols) {
863 VisitObjCObjectType(T);
869 ID.AddInteger(Protocols.size());
870 for (
auto Protocol : Protocols) {
882 void VisitParenType(
const ParenType *T) {
887 void VisitPipeType(
const PipeType *T) {
904 VisitReferenceType(T);
908 VisitReferenceType(T);
924 void VisitTagType(
const TagType *T) {
929 void VisitRecordType(
const RecordType *T) { VisitTagType(T); }
930 void VisitEnumType(
const EnumType *T) { VisitTagType(T); }
951 VisitQualifiers(UnderlyingType.getQualifiers());
954 dyn_cast<TypedefType>(UnderlyingType.getTypePtr())) {
955 UnderlyingType = Underlying->getDecl()->getUnderlyingType();
959 dyn_cast<ElaboratedType>(UnderlyingType.getTypePtr())) {
960 UnderlyingType = Underlying->getNamedType();
966 AddType(UnderlyingType.getTypePtr());
991 VisitTypeWithKeyword(T);
994 void VisitDependentTemplateSpecializationType(
1002 VisitTypeWithKeyword(T);
1008 VisitTypeWithKeyword(T);
1036 assert(T &&
"Expecting non-null pointer.");
1037 ODRTypeVisitor(ID, *
this).Visit(T);
1050 Bools.push_back(Value);
QualType getPattern() const
Retrieve the pattern of this pack expansion, which is the type that will be repeatedly instantiated w...
QualType getDeducedType() const
Get the type deduced for this placeholder type, or null if it's either not been deduced or was deduce...
Represents a type that was referred to using an elaborated type keyword, e.g., struct S...
const Type * Ty
The locally-unqualified type.
Represents a function declaration or definition.
Smart pointer class that efficiently represents Objective-C method names.
PointerType - C99 6.7.5.1 - Pointer Declarators.
ArrayRef< QualType > getTypeArgsAsWritten() const
Retrieve the type arguments of this object type as they were written.
QualType getElementType() const
QualType getPointeeType() const
Represents the dependent type named by a dependently-scoped typename using declaration, e.g.
A (possibly-)qualified type.
void AddBoolean(bool value)
unsigned getNumBases() const
Retrieves the number of base classes of this class.
void AddDeclarationName(DeclarationName Name, bool TreatAsDecl=false)
QualType getDecayedType() const
This file contains the declaration of the ODRHash class, which calculates a hash based on AST nodes...
void Profile(llvm::FoldingSetNodeID &ID) const
Expr * getUnderlyingExpr() const
Stmt - This represents one statement.
Expr * getBitWidth() const
void AddQualType(QualType T)
FunctionType - C99 6.7.5.3 - Function Declarators.
An instance of this object exists for each enum constant that is defined.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in...
Represents a qualified type name for which the type name is dependent.
The template argument is an expression, and we've not resolved it to one of the other forms yet...
unsigned size() const
Retrieve the number of template arguments in this template argument list.
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
Decl - This represents one declaration (or definition), e.g.
TagDecl * getDecl() const
ArrayRef< NamedDecl * > asArray()
Selector getObjCSelector() const
Get the Objective-C selector stored in this declaration name.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
Represents a C++11 auto or C++14 decltype(auto) type.
The base class of the type hierarchy.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
The template argument is a declaration that was provided for a pointer, reference, or pointer to member non-type template parameter.
A container of type source information.
bool isEmpty() const
Evaluates true when this declaration name is empty.
TemplateTypeParmDecl * getDecl() const
A template template parameter that has been substituted for some other template name.
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
size_t param_size() const
QualType getElementType() const
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template...
TemplateName getTemplateName() const
Retrieve the name of the template that we are deducing.
An identifier, stored as an IdentifierInfo*.
FriendDecl - Represents the declaration of a friend entity, which can be a function, a type, or a templated function or type.
Represents a variable declaration or definition.
Declaration of a redeclarable template.
ArrayRef< ObjCProtocolDecl * > getProtocols() const
Retrieve all of the protocol qualifiers.
QualType getReturnType() const
unsigned getNumParams() const
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
Represents an empty template argument, e.g., one that has not been deduced.
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Represents a C++17 deduced template specialization type.
A namespace, stored as a NamespaceDecl*.
Stores a list of template parameters for a TemplateDecl and its derived classes.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
void AddTemplateArgument(TemplateArgument TA)
bool hasDefinition() const
Represents a parameter to a function.
Represents the result of substituting a type for a template type parameter.
The collection of all-type qualifiers we support.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
QualType getOriginalType() const
TypeSourceInfo * getIntegerTypeSourceInfo() const
Return the type source info for the underlying integer type, if no type source info exists...
Represents a class template specialization, which refers to a class template with a given set of temp...
One of these records is kept for each identifier that is lexed.
TypeSourceInfo * getFriendType() const
If this friend declaration names an (untemplated but possibly dependent) type, return the type; other...
StringLiteral * getMessage()
Represents a class type in Objective C.
QualType getPointeeType() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
ArrayRef< QualType > getParamTypes() const
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
TemplateDecl * getAsTemplateDecl() const
Retrieve the underlying template declaration that this template name refers to, if known...
NameKind getNameKind() const
Determine what kind of name this is.
Represents a member of a struct/union/class.
TemplateName getTemplateName() const
Retrieve the name of the template that we are specializing.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
NamedDecl * getFriendDecl() const
If this friend declaration doesn't name a type, return the inner declaration.
Represents the result of substituting a set of types for a template type parameter pack...
void AddTemplateParameterList(const TemplateParameterList *TPL)
Represents an access specifier followed by colon ':'.
ArrayRef< ParmVarDecl * > parameters() const
bool isUnarySelector() const
An rvalue reference type, per C++11 [dcl.ref].
UnresolvedUsingTypenameDecl * getDecl() const
bool isBitField() const
Determines whether this field is a bitfield.
IdentifierInfo * getAsIdentifier() const
Retrieve the identifier stored in this nested name specifier.
A qualified template name, where the qualification is kept to describe the source code as written...
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
void AddDecl(const Decl *D)
void AddFunctionDecl(const FunctionDecl *Function, bool SkipBody=false)
bool isMemberSpecialization() const
Determines whether this template was a specialization of a member template.
NamespaceAliasDecl * getAsNamespaceAlias() const
Retrieve the namespace alias stored in this nested name specifier.
Represents a typeof (or typeof) expression (a GCC extension).
const Type * getClass() const
CXXRecordDecl * getDecl() const
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
#define remainder(__x, __y)
QualType getPointeeType() const
Expr * getSizeExpr() const
const Expr * getInitExpr() const
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
ObjCInterfaceDecl * getInterface() const
Gets the interface declaration for this object type, if the base type really is an interface...
bool isParameterPack() const
Whether this template template parameter is a template parameter pack.
Expr * getSizeExpr() const
QualType getPointeeTypeAsWritten() const
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
QualType getElementType() const
Represents an extended vector type where either the type or size is dependent.
void AddTemplateName(TemplateName Name)
Represents a K&R-style 'int foo()' function, which has no information available about its arguments...
Expr * getAddrSpaceExpr() const
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Represents a prototype with parameter type info, e.g.
A dependent template name that has not been resolved to a template (or set of templates).
bool isParameterPack() const
Whether this parameter is a non-type template parameter pack.
ObjCTypeParamDecl * getDecl() const
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
Represents an array type in C++ whose size is a value-dependent expression.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
QualType getElementType() const
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function)...
unsigned getNumArgs() const
Retrieve the number of template arguments.
NamespaceDecl * getAsNamespace() const
Retrieve the namespace stored in this nested name specifier.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
bool isDefaulted() const
Whether this function is defaulted per C++0x.
unsigned getAsOpaqueValue() const
bool isScopedUsingClassTag() const
Returns true if this is a C++11 scoped enumeration.
Declaration of a template type parameter.
unsigned getIndex() const
Internal representation of canonical, dependent decltype(expr) types.
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isFileContext() const
DeclContext * getDeclContext()
const IdentifierInfo * getIdentifier() const
Retrieve the type named by the typename specifier as an identifier.
void ProcessODRHash(llvm::FoldingSetNodeID &ID, ODRHash &Hash) const
Calculate a unique representation for a statement that is stable across compiler invocations.
StorageClass getStorageClass() const
Returns the storage class as written in the source.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents a C++ template name within the type system.
Represents the type decltype(expr) (C++11).
A namespace alias, stored as a NamespaceAliasDecl*.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
QualType desugar() const
Remove a single level of sugar.
Qualifiers Quals
The local qualifiers.
DeclContext * getParent()
getParent - Returns the containing DeclContext.
A helper class for Type nodes having an ElaboratedTypeKeyword.
Represents a GCC generic vector type.
ArraySizeModifier getSizeModifier() const
An lvalue reference type, per C++11 [dcl.ref].
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
unsigned getNumArgs() const
Common base class for placeholders for types that get replaced by placeholder type deduction: C++11 a...
The result type of a method or function.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
A type, stored as a Type*.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template...
Expr * getUnderlyingExpr() const
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
A template template parameter pack that has been substituted for a template template argument pack...
Decl::Kind getDeclKind() const
ElaboratedTypeKeyword getKeyword() const
IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
bool isParameterPack() const
Returns whether this is a parameter pack.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Sugar for parentheses used when specifying types.
QualType getAdjustedType() const
QualType getReturnType() const
bool isPure() const
Whether this virtual function is pure, i.e.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums...
Represents typeof(type), a GCC extension.
Interfaces are the core concept in Objective-C for object oriented design.
void AddType(const Type *T)
TemplateArgument getArgumentPack() const
void AddIdentifierInfo(const IdentifierInfo *II)
QualType getElementType() const
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set...
Represents a static or instance method of a struct/union/class.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
bool isParameterPack() const
unsigned pack_size() const
The number of template arguments in the given template argument pack.
const TemplateTypeParmType * getReplacedParameter() const
Gets the template parameter that was substituted for.
QualType getEquivalentType() const
bool isScoped() const
Returns true if this is a C++11 scoped enumeration.
QualType getInnerType() const
bool hasDefaultArgument() const
Determine whether this template parameter has a default argument.
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
unsigned getODRHash()
Returns ODRHash of the function.
AutoTypeKeyword getKeyword() const
Qualifiers getIndexTypeQualifiers() const
TypeClass getTypeClass() const
void AddNestedNameSpecifier(const NestedNameSpecifier *NNS)
ArrayRef< TemplateArgument > template_arguments() const
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted per C++0x.
Represents a C++11 static_assert declaration.
void AddSubDecl(const Decl *D)
void AddEnumDecl(const EnumDecl *Enum)
Represents a pointer type decayed from an array or function type.
The injected class name of a C++ class template or class template partial specialization.
QualType getPointeeType() const
Represents a pack expansion of types.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
StringRef getName() const
Return the actual identifier string.
Base class for declarations which introduce a typedef-name.
Represents a template argument.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons...
Dataflow Directional Tag Classes.
ExtInfo getExtInfo() const
const TemplateArgument & getArgument() const
bool isLateTemplateParsed() const
Whether this templated function will be late parsed.
NestedNameSpecifier * getQualifier() const
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
The base class of all kinds of template declarations (e.g., class, function, etc.).
The template argument is a pack expansion of a template name that was provided for a template templat...
QualType getUnderlyingType() const
AccessSpecifier getAccess() const
const Expr * getInit() const
QualType getUnderlyingType() const
void AddCXXRecordDecl(const CXXRecordDecl *Record)
The name of a declaration.
VectorKind getVectorKind() const
bool isKeywordSelector() const
bool isKindOfType() const
Whether this ia a "__kindof" type (semantically).
A pointer to member type per C++ 8.3.3 - Pointers to members.
Expr * getDefaultArgument() const
Retrieve the default argument, if any.
bool defaultArgumentWasInherited() const
Determines whether the default argument was inherited from a previous declaration of this template...
A type that was preceded by the 'template' keyword, stored as a Type*.
const TemplateTypeParmType * getReplacedParameter() const
Gets the template parameter that was substituted for.
QualType getModifiedType() const
Represents a pointer to an Objective C object.
bool isSugared() const
Returns whether this type directly provides sugar.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Complex values, per C99 6.2.5p11.
unsigned getNumArgs() const
Retrieve the number of template arguments.
const llvm::APInt & getSize() const
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
ExtVectorType - Extended vector type.
Base for LValueReferenceType and RValueReferenceType.
The template argument is a type.
QualType getUnderlyingType() const
The template argument is actually a parameter pack.
const TemplateArgumentLoc & getDefaultArgument() const
Retrieve the default argument, if any.
A template argument list.
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
TypedefNameDecl * getDecl() const
ArgKind getKind() const
Return the kind of stored template argument.
unsigned getDepth() const
An attributed type is a type to which a type attribute has been applied.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name...
Represents a type parameter type in Objective C.
bool isMutable() const
Determines whether this field is mutable (C++ only).
Represents a C++ struct/union/class.
Represents a template specialization type whose template cannot be resolved, e.g. ...
ArrayRef< TemplateArgument > template_arguments() const
The template argument is a template name that was provided for a template template parameter...
Represents a C array with an unspecified size.
QualType getNamedType() const
Retrieve the type named by the qualified-id.
bool isNull() const
Determine whether this is the empty selector.
QualType getReplacementType() const
Gets the type that was substituted for the template parameter.
Declaration of a class template.
This class is used for builtin types like 'int'.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
void AddStmt(const Stmt *S)
unsigned getNumElements() const
QualType getAsType() const
Retrieve the type for a type template argument.
Represents an extended address space qualifier where the input address space value is dependent...
Represents a type template specialization; the template must be a class template, a type alias templa...
bool isDeleted() const
Whether this function has been deleted.
static bool isWhitelistedDecl(const Decl *D, const DeclContext *Parent)
QualType getDefaultArgument() const
Retrieve the default argument, if any.
IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it...
A set of overloaded template declarations.
This represents a decl that may have a name.
Represents a C array with a specified size that is not an integer-constant-expression.
A simple visitor class that helps create declaration visitors.
The global specifier '::'. There is no stored value.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion, return the pattern as a template name.
Represents the canonical version of C arrays with a specified constant size.
Declaration of a template function.
bool isDeletedAsWritten() const
QualType getPointeeType() const
QualType getType() const
Return the type wrapped by this type source info.
A single template declaration.
const IdentifierInfo * getIdentifier() const
Expr * getSizeExpr() const
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.