mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 11:36:06 +00:00
PR3558: mark "logically const" accessor methods in ASTContext as const,
and mark the fields they use as mutable. This allows us to remove a few const_casts. llvm-svn: 123314
This commit is contained in:
parent
ebbeb79234
commit
39c7980772
@ -79,52 +79,57 @@ namespace clang {
|
||||
class ASTContext {
|
||||
ASTContext &this_() { return *this; }
|
||||
|
||||
std::vector<Type*> Types;
|
||||
llvm::FoldingSet<ExtQuals> ExtQualNodes;
|
||||
llvm::FoldingSet<ComplexType> ComplexTypes;
|
||||
llvm::FoldingSet<PointerType> PointerTypes;
|
||||
llvm::FoldingSet<BlockPointerType> BlockPointerTypes;
|
||||
llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes;
|
||||
llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes;
|
||||
llvm::FoldingSet<MemberPointerType> MemberPointerTypes;
|
||||
llvm::FoldingSet<ConstantArrayType> ConstantArrayTypes;
|
||||
llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes;
|
||||
std::vector<VariableArrayType*> VariableArrayTypes;
|
||||
llvm::FoldingSet<DependentSizedArrayType> DependentSizedArrayTypes;
|
||||
llvm::FoldingSet<DependentSizedExtVectorType> DependentSizedExtVectorTypes;
|
||||
llvm::FoldingSet<VectorType> VectorTypes;
|
||||
llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes;
|
||||
llvm::FoldingSet<FunctionProtoType> FunctionProtoTypes;
|
||||
llvm::FoldingSet<DependentTypeOfExprType> DependentTypeOfExprTypes;
|
||||
llvm::FoldingSet<DependentDecltypeType> DependentDecltypeTypes;
|
||||
llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
|
||||
llvm::FoldingSet<SubstTemplateTypeParmType> SubstTemplateTypeParmTypes;
|
||||
llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
|
||||
mutable std::vector<Type*> Types;
|
||||
mutable llvm::FoldingSet<ExtQuals> ExtQualNodes;
|
||||
mutable llvm::FoldingSet<ComplexType> ComplexTypes;
|
||||
mutable llvm::FoldingSet<PointerType> PointerTypes;
|
||||
mutable llvm::FoldingSet<BlockPointerType> BlockPointerTypes;
|
||||
mutable llvm::FoldingSet<LValueReferenceType> LValueReferenceTypes;
|
||||
mutable llvm::FoldingSet<RValueReferenceType> RValueReferenceTypes;
|
||||
mutable llvm::FoldingSet<MemberPointerType> MemberPointerTypes;
|
||||
mutable llvm::FoldingSet<ConstantArrayType> ConstantArrayTypes;
|
||||
mutable llvm::FoldingSet<IncompleteArrayType> IncompleteArrayTypes;
|
||||
mutable std::vector<VariableArrayType*> VariableArrayTypes;
|
||||
mutable llvm::FoldingSet<DependentSizedArrayType> DependentSizedArrayTypes;
|
||||
mutable llvm::FoldingSet<DependentSizedExtVectorType>
|
||||
DependentSizedExtVectorTypes;
|
||||
mutable llvm::FoldingSet<VectorType> VectorTypes;
|
||||
mutable llvm::FoldingSet<FunctionNoProtoType> FunctionNoProtoTypes;
|
||||
mutable llvm::FoldingSet<FunctionProtoType> FunctionProtoTypes;
|
||||
mutable llvm::FoldingSet<DependentTypeOfExprType> DependentTypeOfExprTypes;
|
||||
mutable llvm::FoldingSet<DependentDecltypeType> DependentDecltypeTypes;
|
||||
mutable llvm::FoldingSet<TemplateTypeParmType> TemplateTypeParmTypes;
|
||||
mutable llvm::FoldingSet<SubstTemplateTypeParmType>
|
||||
SubstTemplateTypeParmTypes;
|
||||
mutable llvm::ContextualFoldingSet<TemplateSpecializationType, ASTContext&>
|
||||
TemplateSpecializationTypes;
|
||||
llvm::FoldingSet<ParenType> ParenTypes;
|
||||
llvm::FoldingSet<ElaboratedType> ElaboratedTypes;
|
||||
llvm::FoldingSet<DependentNameType> DependentNameTypes;
|
||||
llvm::ContextualFoldingSet<DependentTemplateSpecializationType, ASTContext&>
|
||||
mutable llvm::FoldingSet<ParenType> ParenTypes;
|
||||
mutable llvm::FoldingSet<ElaboratedType> ElaboratedTypes;
|
||||
mutable llvm::FoldingSet<DependentNameType> DependentNameTypes;
|
||||
mutable llvm::ContextualFoldingSet<DependentTemplateSpecializationType,
|
||||
ASTContext&>
|
||||
DependentTemplateSpecializationTypes;
|
||||
llvm::FoldingSet<PackExpansionType> PackExpansionTypes;
|
||||
llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
|
||||
llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
|
||||
mutable llvm::FoldingSet<ObjCObjectTypeImpl> ObjCObjectTypes;
|
||||
mutable llvm::FoldingSet<ObjCObjectPointerType> ObjCObjectPointerTypes;
|
||||
llvm::FoldingSet<AttributedType> AttributedTypes;
|
||||
|
||||
llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
|
||||
llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
|
||||
mutable llvm::FoldingSet<QualifiedTemplateName> QualifiedTemplateNames;
|
||||
mutable llvm::FoldingSet<DependentTemplateName> DependentTemplateNames;
|
||||
|
||||
/// \brief The set of nested name specifiers.
|
||||
///
|
||||
/// This set is managed by the NestedNameSpecifier class.
|
||||
llvm::FoldingSet<NestedNameSpecifier> NestedNameSpecifiers;
|
||||
NestedNameSpecifier *GlobalNestedNameSpecifier;
|
||||
mutable llvm::FoldingSet<NestedNameSpecifier> NestedNameSpecifiers;
|
||||
mutable NestedNameSpecifier *GlobalNestedNameSpecifier;
|
||||
friend class NestedNameSpecifier;
|
||||
|
||||
/// ASTRecordLayouts - A cache mapping from RecordDecls to ASTRecordLayouts.
|
||||
/// This is lazily created. This is intentionally not serialized.
|
||||
llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*> ASTRecordLayouts;
|
||||
llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*> ObjCLayouts;
|
||||
mutable llvm::DenseMap<const RecordDecl*, const ASTRecordLayout*>
|
||||
ASTRecordLayouts;
|
||||
mutable llvm::DenseMap<const ObjCContainerDecl*, const ASTRecordLayout*>
|
||||
ObjCLayouts;
|
||||
|
||||
/// KeyFunctions - A cache mapping from CXXRecordDecls to key functions.
|
||||
llvm::DenseMap<const CXXRecordDecl*, const CXXMethodDecl*> KeyFunctions;
|
||||
@ -151,10 +156,11 @@ class ASTContext {
|
||||
static void Profile(llvm::FoldingSetNodeID &ID,
|
||||
TemplateTemplateParmDecl *Parm);
|
||||
};
|
||||
llvm::FoldingSet<CanonicalTemplateTemplateParm> CanonTemplateTemplateParms;
|
||||
mutable llvm::FoldingSet<CanonicalTemplateTemplateParm>
|
||||
CanonTemplateTemplateParms;
|
||||
|
||||
TemplateTemplateParmDecl *getCanonicalTemplateTemplateParmDecl(
|
||||
TemplateTemplateParmDecl *TTP);
|
||||
TemplateTemplateParmDecl *
|
||||
getCanonicalTemplateTemplateParmDecl(TemplateTemplateParmDecl *TTP) const;
|
||||
|
||||
/// \brief Whether __[u]int128_t identifier is installed.
|
||||
bool IsInt128Installed;
|
||||
@ -178,11 +184,11 @@ class ASTContext {
|
||||
QualType ObjCClassTypedefType;
|
||||
|
||||
QualType ObjCConstantStringType;
|
||||
RecordDecl *CFConstantStringTypeDecl;
|
||||
mutable RecordDecl *CFConstantStringTypeDecl;
|
||||
|
||||
RecordDecl *NSConstantStringTypeDecl;
|
||||
mutable RecordDecl *NSConstantStringTypeDecl;
|
||||
|
||||
RecordDecl *ObjCFastEnumerationStateTypeDecl;
|
||||
mutable RecordDecl *ObjCFastEnumerationStateTypeDecl;
|
||||
|
||||
/// \brief The type for the C FILE type.
|
||||
TypeDecl *FILEDecl;
|
||||
@ -194,10 +200,10 @@ class ASTContext {
|
||||
TypeDecl *sigjmp_bufDecl;
|
||||
|
||||
/// \brief Type for the Block descriptor for Blocks CodeGen.
|
||||
RecordDecl *BlockDescriptorType;
|
||||
mutable RecordDecl *BlockDescriptorType;
|
||||
|
||||
/// \brief Type for the Block descriptor for Blocks CodeGen.
|
||||
RecordDecl *BlockDescriptorExtendedType;
|
||||
mutable RecordDecl *BlockDescriptorExtendedType;
|
||||
|
||||
TypeSourceInfo NullTypeSourceInfo;
|
||||
|
||||
@ -286,7 +292,7 @@ class ASTContext {
|
||||
///
|
||||
/// AST objects are never destructed; rather, all memory associated with the
|
||||
/// AST objects will be released when the ASTContext itself is destroyed.
|
||||
llvm::BumpPtrAllocator BumpAlloc;
|
||||
mutable llvm::BumpPtrAllocator BumpAlloc;
|
||||
|
||||
/// \brief Allocator for partial diagnostics.
|
||||
PartialDiagnostic::StorageAllocator DiagAllocator;
|
||||
@ -302,7 +308,7 @@ public:
|
||||
IdentifierTable &Idents;
|
||||
SelectorTable &Selectors;
|
||||
Builtin::Context &BuiltinInfo;
|
||||
DeclarationNameTable DeclarationNames;
|
||||
mutable DeclarationNameTable DeclarationNames;
|
||||
llvm::OwningPtr<ExternalASTSource> ExternalSource;
|
||||
ASTMutationListener *Listener;
|
||||
clang::PrintingPolicy PrintingPolicy;
|
||||
@ -315,10 +321,10 @@ public:
|
||||
|
||||
SourceManager& getSourceManager() { return SourceMgr; }
|
||||
const SourceManager& getSourceManager() const { return SourceMgr; }
|
||||
void *Allocate(unsigned Size, unsigned Align = 8) {
|
||||
void *Allocate(unsigned Size, unsigned Align = 8) const {
|
||||
return BumpAlloc.Allocate(Size, Align);
|
||||
}
|
||||
void Deallocate(void *Ptr) { }
|
||||
void Deallocate(void *Ptr) const { }
|
||||
|
||||
PartialDiagnostic::StorageAllocator &getDiagAllocator() {
|
||||
return DiagAllocator;
|
||||
@ -442,9 +448,9 @@ public:
|
||||
|
||||
private:
|
||||
/// getExtQualType - Return a type with extended qualifiers.
|
||||
QualType getExtQualType(const Type *Base, Qualifiers Quals);
|
||||
QualType getExtQualType(const Type *Base, Qualifiers Quals) const;
|
||||
|
||||
QualType getTypeDeclTypeSlow(const TypeDecl *Decl);
|
||||
QualType getTypeDeclTypeSlow(const TypeDecl *Decl) const;
|
||||
|
||||
public:
|
||||
/// getAddSpaceQualType - Return the uniqued reference to the type for an
|
||||
@ -452,24 +458,24 @@ public:
|
||||
/// The resulting type has a union of the qualifiers from T and the address
|
||||
/// space. If T already has an address space specifier, it is silently
|
||||
/// replaced.
|
||||
QualType getAddrSpaceQualType(QualType T, unsigned AddressSpace);
|
||||
QualType getAddrSpaceQualType(QualType T, unsigned AddressSpace) const;
|
||||
|
||||
/// getObjCGCQualType - Returns the uniqued reference to the type for an
|
||||
/// objc gc qualified type. The retulting type has a union of the qualifiers
|
||||
/// from T and the gc attribute.
|
||||
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr);
|
||||
QualType getObjCGCQualType(QualType T, Qualifiers::GC gcAttr) const;
|
||||
|
||||
/// getRestrictType - Returns the uniqued reference to the type for a
|
||||
/// 'restrict' qualified type. The resulting type has a union of the
|
||||
/// qualifiers from T and 'restrict'.
|
||||
QualType getRestrictType(QualType T) {
|
||||
QualType getRestrictType(QualType T) const {
|
||||
return T.withFastQualifiers(Qualifiers::Restrict);
|
||||
}
|
||||
|
||||
/// getVolatileType - Returns the uniqued reference to the type for a
|
||||
/// 'volatile' qualified type. The resulting type has a union of the
|
||||
/// qualifiers from T and 'volatile'.
|
||||
QualType getVolatileType(QualType T) {
|
||||
QualType getVolatileType(QualType T) const {
|
||||
return T.withFastQualifiers(Qualifiers::Volatile);
|
||||
}
|
||||
|
||||
@ -479,7 +485,7 @@ public:
|
||||
///
|
||||
/// It can be reasonably expected that this will always be
|
||||
/// equivalent to calling T.withConst().
|
||||
QualType getConstType(QualType T) { return T.withConst(); }
|
||||
QualType getConstType(QualType T) const { return T.withConst(); }
|
||||
|
||||
/// adjustFunctionType - Change the ExtInfo on a function type.
|
||||
const FunctionType *adjustFunctionType(const FunctionType *Fn,
|
||||
@ -487,25 +493,25 @@ public:
|
||||
|
||||
/// getComplexType - Return the uniqued reference to the type for a complex
|
||||
/// number with the specified element type.
|
||||
QualType getComplexType(QualType T);
|
||||
CanQualType getComplexType(CanQualType T) {
|
||||
QualType getComplexType(QualType T) const;
|
||||
CanQualType getComplexType(CanQualType T) const {
|
||||
return CanQualType::CreateUnsafe(getComplexType((QualType) T));
|
||||
}
|
||||
|
||||
/// getPointerType - Return the uniqued reference to the type for a pointer to
|
||||
/// the specified type.
|
||||
QualType getPointerType(QualType T);
|
||||
CanQualType getPointerType(CanQualType T) {
|
||||
QualType getPointerType(QualType T) const;
|
||||
CanQualType getPointerType(CanQualType T) const {
|
||||
return CanQualType::CreateUnsafe(getPointerType((QualType) T));
|
||||
}
|
||||
|
||||
/// getBlockPointerType - Return the uniqued reference to the type for a block
|
||||
/// of the specified type.
|
||||
QualType getBlockPointerType(QualType T);
|
||||
QualType getBlockPointerType(QualType T) const;
|
||||
|
||||
/// This gets the struct used to keep track of the descriptor for pointer to
|
||||
/// blocks.
|
||||
QualType getBlockDescriptorType();
|
||||
QualType getBlockDescriptorType() const;
|
||||
|
||||
// Set the type for a Block descriptor type.
|
||||
void setBlockDescriptorType(QualType T);
|
||||
@ -518,13 +524,13 @@ public:
|
||||
|
||||
/// This gets the struct used to keep track of the extended descriptor for
|
||||
/// pointer to blocks.
|
||||
QualType getBlockDescriptorExtendedType();
|
||||
QualType getBlockDescriptorExtendedType() const;
|
||||
|
||||
// Set the type for a Block descriptor extended type.
|
||||
void setBlockDescriptorExtendedType(QualType T);
|
||||
/// Get the BlockDescriptorExtendedType type, or NULL if it hasn't yet been
|
||||
/// built.
|
||||
QualType getRawBlockdescriptorExtendedType() {
|
||||
QualType getRawBlockdescriptorExtendedType() const {
|
||||
if (BlockDescriptorExtendedType)
|
||||
return getTagDeclType(BlockDescriptorExtendedType);
|
||||
return QualType();
|
||||
@ -533,33 +539,34 @@ public:
|
||||
/// This gets the struct used to keep track of pointer to blocks, complete
|
||||
/// with captured variables.
|
||||
QualType getBlockParmType(bool BlockHasCopyDispose,
|
||||
llvm::SmallVectorImpl<const Expr *> &Layout);
|
||||
llvm::SmallVectorImpl<const Expr *> &Layout) const;
|
||||
|
||||
/// This builds the struct used for __block variables.
|
||||
QualType BuildByRefType(llvm::StringRef DeclName, QualType Ty);
|
||||
QualType BuildByRefType(llvm::StringRef DeclName, QualType Ty) const;
|
||||
|
||||
/// Returns true iff we need copy/dispose helpers for the given type.
|
||||
bool BlockRequiresCopying(QualType Ty);
|
||||
bool BlockRequiresCopying(QualType Ty) const;
|
||||
|
||||
/// getLValueReferenceType - Return the uniqued reference to the type for an
|
||||
/// lvalue reference to the specified type.
|
||||
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true);
|
||||
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue = true)
|
||||
const;
|
||||
|
||||
/// getRValueReferenceType - Return the uniqued reference to the type for an
|
||||
/// rvalue reference to the specified type.
|
||||
QualType getRValueReferenceType(QualType T);
|
||||
QualType getRValueReferenceType(QualType T) const;
|
||||
|
||||
/// getMemberPointerType - Return the uniqued reference to the type for a
|
||||
/// member pointer to the specified type in the specified class. The class
|
||||
/// is a Type because it could be a dependent name.
|
||||
QualType getMemberPointerType(QualType T, const Type *Cls);
|
||||
QualType getMemberPointerType(QualType T, const Type *Cls) const;
|
||||
|
||||
/// getVariableArrayType - Returns a non-unique reference to the type for a
|
||||
/// variable array of the specified element type.
|
||||
QualType getVariableArrayType(QualType EltTy, Expr *NumElts,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals,
|
||||
SourceRange Brackets);
|
||||
SourceRange Brackets) const;
|
||||
|
||||
/// getDependentSizedArrayType - Returns a non-unique reference to
|
||||
/// the type for a dependently-sized array of the specified element
|
||||
@ -568,37 +575,37 @@ public:
|
||||
QualType getDependentSizedArrayType(QualType EltTy, Expr *NumElts,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals,
|
||||
SourceRange Brackets);
|
||||
SourceRange Brackets) const;
|
||||
|
||||
/// getIncompleteArrayType - Returns a unique reference to the type for a
|
||||
/// incomplete array of the specified element type.
|
||||
QualType getIncompleteArrayType(QualType EltTy,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals);
|
||||
unsigned EltTypeQuals) const;
|
||||
|
||||
/// getConstantArrayType - Return the unique reference to the type for a
|
||||
/// constant array of the specified element type.
|
||||
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals);
|
||||
unsigned EltTypeQuals) const;
|
||||
|
||||
/// getUnknownSizeVariableArrayType - Return a variable array type with
|
||||
/// all variable indices replaced with unknow [*] size.
|
||||
QualType getUnknownSizeVariableArrayType(QualType Ty);
|
||||
QualType getUnknownSizeVariableArrayType(QualType Ty) const;
|
||||
|
||||
/// getVariableArrayDecayedType - Returns a vla type where known sizes
|
||||
/// are replaced with [*]
|
||||
QualType getVariableArrayDecayedType(QualType Ty);
|
||||
QualType getVariableArrayDecayedType(QualType Ty) const;
|
||||
|
||||
/// getVectorType - Return the unique reference to a vector type of
|
||||
/// the specified element type and size. VectorType must be a built-in type.
|
||||
QualType getVectorType(QualType VectorType, unsigned NumElts,
|
||||
VectorType::VectorKind VecKind);
|
||||
VectorType::VectorKind VecKind) const;
|
||||
|
||||
/// getExtVectorType - Return the unique reference to an extended vector type
|
||||
/// of the specified element type and size. VectorType must be a built-in
|
||||
/// type.
|
||||
QualType getExtVectorType(QualType VectorType, unsigned NumElts);
|
||||
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const;
|
||||
|
||||
/// getDependentSizedExtVectorType - Returns a non-unique reference to
|
||||
/// the type for a dependently-sized vector of the specified element
|
||||
@ -606,14 +613,14 @@ public:
|
||||
/// comparable, at some point.
|
||||
QualType getDependentSizedExtVectorType(QualType VectorType,
|
||||
Expr *SizeExpr,
|
||||
SourceLocation AttrLoc);
|
||||
SourceLocation AttrLoc) const;
|
||||
|
||||
/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
|
||||
///
|
||||
QualType getFunctionNoProtoType(QualType ResultTy,
|
||||
const FunctionType::ExtInfo &Info);
|
||||
const FunctionType::ExtInfo &Info) const;
|
||||
|
||||
QualType getFunctionNoProtoType(QualType ResultTy) {
|
||||
QualType getFunctionNoProtoType(QualType ResultTy) const {
|
||||
return getFunctionNoProtoType(ResultTy, FunctionType::ExtInfo());
|
||||
}
|
||||
|
||||
@ -621,12 +628,12 @@ public:
|
||||
/// argument list.
|
||||
QualType getFunctionType(QualType ResultTy,
|
||||
const QualType *Args, unsigned NumArgs,
|
||||
const FunctionProtoType::ExtProtoInfo &EPI);
|
||||
const FunctionProtoType::ExtProtoInfo &EPI) const;
|
||||
|
||||
/// getTypeDeclType - Return the unique reference to the type for
|
||||
/// the specified type declaration.
|
||||
QualType getTypeDeclType(const TypeDecl *Decl,
|
||||
const TypeDecl *PrevDecl = 0) {
|
||||
const TypeDecl *PrevDecl = 0) const {
|
||||
assert(Decl && "Passed null for Decl param");
|
||||
if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
|
||||
|
||||
@ -641,85 +648,86 @@ public:
|
||||
|
||||
/// getTypedefType - Return the unique reference to the type for the
|
||||
/// specified typename decl.
|
||||
QualType getTypedefType(const TypedefDecl *Decl, QualType Canon = QualType());
|
||||
QualType getTypedefType(const TypedefDecl *Decl, QualType Canon = QualType())
|
||||
const;
|
||||
|
||||
QualType getRecordType(const RecordDecl *Decl);
|
||||
QualType getRecordType(const RecordDecl *Decl) const;
|
||||
|
||||
QualType getEnumType(const EnumDecl *Decl);
|
||||
QualType getEnumType(const EnumDecl *Decl) const;
|
||||
|
||||
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST);
|
||||
QualType getInjectedClassNameType(CXXRecordDecl *Decl, QualType TST) const;
|
||||
|
||||
QualType getAttributedType(AttributedType::Kind attrKind,
|
||||
QualType modifiedType,
|
||||
QualType equivalentType);
|
||||
|
||||
QualType getSubstTemplateTypeParmType(const TemplateTypeParmType *Replaced,
|
||||
QualType Replacement);
|
||||
QualType Replacement) const;
|
||||
|
||||
QualType getTemplateTypeParmType(unsigned Depth, unsigned Index,
|
||||
bool ParameterPack,
|
||||
IdentifierInfo *Name = 0);
|
||||
IdentifierInfo *Name = 0) const;
|
||||
|
||||
QualType getTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
QualType Canon = QualType());
|
||||
QualType Canon = QualType()) const;
|
||||
|
||||
QualType getCanonicalTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs);
|
||||
unsigned NumArgs) const;
|
||||
|
||||
QualType getTemplateSpecializationType(TemplateName T,
|
||||
const TemplateArgumentListInfo &Args,
|
||||
QualType Canon = QualType());
|
||||
QualType Canon = QualType()) const;
|
||||
|
||||
TypeSourceInfo *
|
||||
getTemplateSpecializationTypeInfo(TemplateName T, SourceLocation TLoc,
|
||||
const TemplateArgumentListInfo &Args,
|
||||
QualType Canon = QualType());
|
||||
QualType Canon = QualType()) const;
|
||||
|
||||
QualType getParenType(QualType NamedType);
|
||||
QualType getParenType(QualType NamedType) const;
|
||||
|
||||
QualType getElaboratedType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
QualType NamedType);
|
||||
QualType NamedType) const;
|
||||
QualType getDependentNameType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
QualType Canon = QualType());
|
||||
QualType Canon = QualType()) const;
|
||||
|
||||
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
const TemplateArgumentListInfo &Args);
|
||||
const TemplateArgumentListInfo &Args) const;
|
||||
QualType getDependentTemplateSpecializationType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
unsigned NumArgs,
|
||||
const TemplateArgument *Args);
|
||||
const TemplateArgument *Args) const;
|
||||
|
||||
QualType getPackExpansionType(QualType Pattern);
|
||||
|
||||
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl);
|
||||
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl) const;
|
||||
|
||||
QualType getObjCObjectType(QualType Base,
|
||||
ObjCProtocolDecl * const *Protocols,
|
||||
unsigned NumProtocols);
|
||||
unsigned NumProtocols) const;
|
||||
|
||||
/// getObjCObjectPointerType - Return a ObjCObjectPointerType type
|
||||
/// for the given ObjCObjectType.
|
||||
QualType getObjCObjectPointerType(QualType OIT);
|
||||
QualType getObjCObjectPointerType(QualType OIT) const;
|
||||
|
||||
/// getTypeOfType - GCC extension.
|
||||
QualType getTypeOfExprType(Expr *e);
|
||||
QualType getTypeOfType(QualType t);
|
||||
QualType getTypeOfExprType(Expr *e) const;
|
||||
QualType getTypeOfType(QualType t) const;
|
||||
|
||||
/// getDecltypeType - C++0x decltype.
|
||||
QualType getDecltypeType(Expr *e);
|
||||
QualType getDecltypeType(Expr *e) const;
|
||||
|
||||
/// getTagDeclType - Return the unique reference to the type for the
|
||||
/// specified TagDecl (struct/union/class/enum) decl.
|
||||
QualType getTagDeclType(const TagDecl *Decl);
|
||||
QualType getTagDeclType(const TagDecl *Decl) const;
|
||||
|
||||
/// getSizeType - Return the unique type for "size_t" (C99 7.17), defined
|
||||
/// in <stddef.h>. The sizeof operator requires this (C99 6.5.3.4p4).
|
||||
@ -744,14 +752,14 @@ public:
|
||||
|
||||
// getCFConstantStringType - Return the C structure type used to represent
|
||||
// constant CFStrings.
|
||||
QualType getCFConstantStringType();
|
||||
QualType getCFConstantStringType() const;
|
||||
|
||||
// getNSConstantStringType - Return the C structure type used to represent
|
||||
// constant NSStrings.
|
||||
QualType getNSConstantStringType();
|
||||
QualType getNSConstantStringType() const;
|
||||
/// Get the structure type used to representation NSStrings, or NULL
|
||||
/// if it hasn't yet been built.
|
||||
QualType getRawNSConstantStringType() {
|
||||
QualType getRawNSConstantStringType() const {
|
||||
if (NSConstantStringTypeDecl)
|
||||
return getTagDeclType(NSConstantStringTypeDecl);
|
||||
return QualType();
|
||||
@ -761,7 +769,7 @@ public:
|
||||
|
||||
/// Get the structure type used to representation CFStrings, or NULL
|
||||
/// if it hasn't yet been built.
|
||||
QualType getRawCFConstantStringType() {
|
||||
QualType getRawCFConstantStringType() const {
|
||||
if (CFConstantStringTypeDecl)
|
||||
return getTagDeclType(CFConstantStringTypeDecl);
|
||||
return QualType();
|
||||
@ -775,11 +783,11 @@ public:
|
||||
}
|
||||
|
||||
//// This gets the struct used to keep track of fast enumerations.
|
||||
QualType getObjCFastEnumerationStateType();
|
||||
QualType getObjCFastEnumerationStateType() const;
|
||||
|
||||
/// Get the ObjCFastEnumerationState type, or NULL if it hasn't yet
|
||||
/// been built.
|
||||
QualType getRawObjCFastEnumerationStateType() {
|
||||
QualType getRawObjCFastEnumerationStateType() const {
|
||||
if (ObjCFastEnumerationStateTypeDecl)
|
||||
return getTagDeclType(ObjCFastEnumerationStateTypeDecl);
|
||||
return QualType();
|
||||
@ -791,7 +799,7 @@ public:
|
||||
void setFILEDecl(TypeDecl *FILEDecl) { this->FILEDecl = FILEDecl; }
|
||||
|
||||
/// \brief Retrieve the C FILE type.
|
||||
QualType getFILEType() {
|
||||
QualType getFILEType() const {
|
||||
if (FILEDecl)
|
||||
return getTypeDeclType(FILEDecl);
|
||||
return QualType();
|
||||
@ -803,7 +811,7 @@ public:
|
||||
}
|
||||
|
||||
/// \brief Retrieve the C jmp_buf type.
|
||||
QualType getjmp_bufType() {
|
||||
QualType getjmp_bufType() const {
|
||||
if (jmp_bufDecl)
|
||||
return getTypeDeclType(jmp_bufDecl);
|
||||
return QualType();
|
||||
@ -815,7 +823,7 @@ public:
|
||||
}
|
||||
|
||||
/// \brief Retrieve the C sigjmp_buf type.
|
||||
QualType getsigjmp_bufType() {
|
||||
QualType getsigjmp_bufType() const {
|
||||
if (sigjmp_bufDecl)
|
||||
return getTypeDeclType(sigjmp_bufDecl);
|
||||
return QualType();
|
||||
@ -825,7 +833,7 @@ public:
|
||||
/// given type into \arg S. If \arg NameFields is specified then
|
||||
/// record field names are also encoded.
|
||||
void getObjCEncodingForType(QualType t, std::string &S,
|
||||
const FieldDecl *Field=0);
|
||||
const FieldDecl *Field=0) const;
|
||||
|
||||
void getLegacyIntegralTypeEncoding(QualType &t) const;
|
||||
|
||||
@ -839,11 +847,12 @@ public:
|
||||
|
||||
/// getObjCEncodingForMethodDecl - Return the encoded type for this method
|
||||
/// declaration.
|
||||
void getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, std::string &S);
|
||||
void getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl, std::string &S)
|
||||
const;
|
||||
|
||||
/// getObjCEncodingForBlockDecl - Return the encoded type for this block
|
||||
/// declaration.
|
||||
void getObjCEncodingForBlock(const BlockExpr *Expr, std::string& S);
|
||||
void getObjCEncodingForBlock(const BlockExpr *Expr, std::string& S) const;
|
||||
|
||||
/// getObjCEncodingForPropertyDecl - Return the encoded type for
|
||||
/// this method declaration. If non-NULL, Container must be either
|
||||
@ -851,14 +860,14 @@ public:
|
||||
/// only be NULL when getting encodings for protocol properties.
|
||||
void getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
|
||||
const Decl *Container,
|
||||
std::string &S);
|
||||
std::string &S) const;
|
||||
|
||||
bool ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
|
||||
ObjCProtocolDecl *rProto);
|
||||
ObjCProtocolDecl *rProto) const;
|
||||
|
||||
/// getObjCEncodingTypeSize returns size of type for objective-c encoding
|
||||
/// purpose in characters.
|
||||
CharUnits getObjCEncodingTypeSize(QualType t);
|
||||
CharUnits getObjCEncodingTypeSize(QualType t) const;
|
||||
|
||||
/// \brief Whether __[u]int128_t identifier is installed.
|
||||
bool isInt128Installed() const { return IsInt128Installed; }
|
||||
@ -886,12 +895,12 @@ public:
|
||||
|
||||
/// getCVRQualifiedType - Returns a type with additional const,
|
||||
/// volatile, or restrict qualifiers.
|
||||
QualType getCVRQualifiedType(QualType T, unsigned CVR) {
|
||||
QualType getCVRQualifiedType(QualType T, unsigned CVR) const {
|
||||
return getQualifiedType(T, Qualifiers::fromCVRMask(CVR));
|
||||
}
|
||||
|
||||
/// getQualifiedType - Returns a type with additional qualifiers.
|
||||
QualType getQualifiedType(QualType T, Qualifiers Qs) {
|
||||
QualType getQualifiedType(QualType T, Qualifiers Qs) const {
|
||||
if (!Qs.hasNonFastQualifiers())
|
||||
return T.withFastQualifiers(Qs.getFastQualifiers());
|
||||
QualifierCollector Qc(Qs);
|
||||
@ -900,26 +909,26 @@ public:
|
||||
}
|
||||
|
||||
/// getQualifiedType - Returns a type with additional qualifiers.
|
||||
QualType getQualifiedType(const Type *T, Qualifiers Qs) {
|
||||
QualType getQualifiedType(const Type *T, Qualifiers Qs) const {
|
||||
if (!Qs.hasNonFastQualifiers())
|
||||
return QualType(T, Qs.getFastQualifiers());
|
||||
return getExtQualType(T, Qs);
|
||||
}
|
||||
|
||||
DeclarationNameInfo getNameForTemplate(TemplateName Name,
|
||||
SourceLocation NameLoc);
|
||||
SourceLocation NameLoc) const;
|
||||
|
||||
TemplateName getOverloadedTemplateName(UnresolvedSetIterator Begin,
|
||||
UnresolvedSetIterator End);
|
||||
UnresolvedSetIterator End) const;
|
||||
|
||||
TemplateName getQualifiedTemplateName(NestedNameSpecifier *NNS,
|
||||
bool TemplateKeyword,
|
||||
TemplateDecl *Template);
|
||||
TemplateDecl *Template) const;
|
||||
|
||||
TemplateName getDependentTemplateName(NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name);
|
||||
const IdentifierInfo *Name) const;
|
||||
TemplateName getDependentTemplateName(NestedNameSpecifier *NNS,
|
||||
OverloadedOperatorKind Operator);
|
||||
OverloadedOperatorKind Operator) const;
|
||||
|
||||
enum GetBuiltinTypeError {
|
||||
GE_None, //< No error
|
||||
@ -932,7 +941,7 @@ public:
|
||||
/// arguments to the builtin that are required to be integer constant
|
||||
/// expressions.
|
||||
QualType GetBuiltinType(unsigned ID, GetBuiltinTypeError &Error,
|
||||
unsigned *IntegerConstantArgs = 0);
|
||||
unsigned *IntegerConstantArgs = 0) const;
|
||||
|
||||
private:
|
||||
CanQualType getFromTargetType(unsigned Type) const;
|
||||
@ -967,43 +976,43 @@ public:
|
||||
|
||||
/// getTypeInfo - Get the size and alignment of the specified complete type in
|
||||
/// bits.
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(const Type *T);
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(QualType T) {
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(const Type *T) const;
|
||||
std::pair<uint64_t, unsigned> getTypeInfo(QualType T) const {
|
||||
return getTypeInfo(T.getTypePtr());
|
||||
}
|
||||
|
||||
/// getTypeSize - Return the size of the specified type, in bits. This method
|
||||
/// does not work on incomplete types.
|
||||
uint64_t getTypeSize(QualType T) {
|
||||
uint64_t getTypeSize(QualType T) const {
|
||||
return getTypeInfo(T).first;
|
||||
}
|
||||
uint64_t getTypeSize(const Type *T) {
|
||||
uint64_t getTypeSize(const Type *T) const {
|
||||
return getTypeInfo(T).first;
|
||||
}
|
||||
|
||||
/// getCharWidth - Return the size of the character type, in bits
|
||||
uint64_t getCharWidth() {
|
||||
uint64_t getCharWidth() const {
|
||||
return getTypeSize(CharTy);
|
||||
}
|
||||
|
||||
/// getTypeSizeInChars - Return the size of the specified type, in characters.
|
||||
/// This method does not work on incomplete types.
|
||||
CharUnits getTypeSizeInChars(QualType T);
|
||||
CharUnits getTypeSizeInChars(const Type *T);
|
||||
CharUnits getTypeSizeInChars(QualType T) const;
|
||||
CharUnits getTypeSizeInChars(const Type *T) const;
|
||||
|
||||
/// getTypeAlign - Return the ABI-specified alignment of a type, in bits.
|
||||
/// This method does not work on incomplete types.
|
||||
unsigned getTypeAlign(QualType T) {
|
||||
unsigned getTypeAlign(QualType T) const {
|
||||
return getTypeInfo(T).second;
|
||||
}
|
||||
unsigned getTypeAlign(const Type *T) {
|
||||
unsigned getTypeAlign(const Type *T) const {
|
||||
return getTypeInfo(T).second;
|
||||
}
|
||||
|
||||
/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
|
||||
/// characters. This method does not work on incomplete types.
|
||||
CharUnits getTypeAlignInChars(QualType T);
|
||||
CharUnits getTypeAlignInChars(const Type *T);
|
||||
CharUnits getTypeAlignInChars(QualType T) const;
|
||||
CharUnits getTypeAlignInChars(const Type *T) const;
|
||||
|
||||
std::pair<CharUnits, CharUnits> getTypeInfoInChars(const Type *T);
|
||||
std::pair<CharUnits, CharUnits> getTypeInfoInChars(QualType T);
|
||||
@ -1012,31 +1021,32 @@ public:
|
||||
/// type for the current target in bits. This can be different than the ABI
|
||||
/// alignment in cases where it is beneficial for performance to overalign
|
||||
/// a data type.
|
||||
unsigned getPreferredTypeAlign(const Type *T);
|
||||
unsigned getPreferredTypeAlign(const Type *T) const;
|
||||
|
||||
/// getDeclAlign - Return a conservative estimate of the alignment of
|
||||
/// the specified decl. Note that bitfields do not have a valid alignment, so
|
||||
/// this method will assert on them.
|
||||
/// If @p RefAsPointee, references are treated like their underlying type
|
||||
/// (for alignof), else they're treated like pointers (for CodeGen).
|
||||
CharUnits getDeclAlign(const Decl *D, bool RefAsPointee = false);
|
||||
CharUnits getDeclAlign(const Decl *D, bool RefAsPointee = false) const;
|
||||
|
||||
/// getASTRecordLayout - Get or compute information about the layout of the
|
||||
/// specified record (struct/union/class), which indicates its size and field
|
||||
/// position information.
|
||||
const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D);
|
||||
const ASTRecordLayout &getASTRecordLayout(const RecordDecl *D) const;
|
||||
|
||||
/// getASTObjCInterfaceLayout - Get or compute information about the
|
||||
/// layout of the specified Objective-C interface.
|
||||
const ASTRecordLayout &getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D);
|
||||
const ASTRecordLayout &getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D)
|
||||
const;
|
||||
|
||||
void DumpRecordLayout(const RecordDecl *RD, llvm::raw_ostream &OS);
|
||||
void DumpRecordLayout(const RecordDecl *RD, llvm::raw_ostream &OS) const;
|
||||
|
||||
/// getASTObjCImplementationLayout - Get or compute information about
|
||||
/// the layout of the specified Objective-C implementation. This may
|
||||
/// differ from the interface if synthesized ivars are present.
|
||||
const ASTRecordLayout &
|
||||
getASTObjCImplementationLayout(const ObjCImplementationDecl *D);
|
||||
getASTObjCImplementationLayout(const ObjCImplementationDecl *D) const;
|
||||
|
||||
/// getKeyFunction - Get the key function for the given record decl, or NULL
|
||||
/// if there isn't one. The key function is, according to the Itanium C++ ABI
|
||||
@ -1046,15 +1056,16 @@ public:
|
||||
/// of class definition.
|
||||
const CXXMethodDecl *getKeyFunction(const CXXRecordDecl *RD);
|
||||
|
||||
bool isNearlyEmpty(const CXXRecordDecl *RD);
|
||||
bool isNearlyEmpty(const CXXRecordDecl *RD) const;
|
||||
|
||||
void ShallowCollectObjCIvars(const ObjCInterfaceDecl *OI,
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars);
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars)
|
||||
const;
|
||||
|
||||
void DeepCollectObjCIvars(const ObjCInterfaceDecl *OI, bool leafClass,
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars);
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) const;
|
||||
|
||||
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI);
|
||||
unsigned CountNonClassIvars(const ObjCInterfaceDecl *OI) const;
|
||||
void CollectInheritedProtocols(const Decl *CDecl,
|
||||
llvm::SmallPtrSet<ObjCProtocolDecl*, 8> &Protocols);
|
||||
|
||||
@ -1068,8 +1079,8 @@ public:
|
||||
/// include typedefs, 'typeof' operators, etc. The returned type is guaranteed
|
||||
/// to be free of any of these, allowing two canonical types to be compared
|
||||
/// for exact equality with a simple pointer comparison.
|
||||
CanQualType getCanonicalType(QualType T);
|
||||
const Type *getCanonicalType(const Type *T) {
|
||||
CanQualType getCanonicalType(QualType T) const;
|
||||
const Type *getCanonicalType(const Type *T) const {
|
||||
return T->getCanonicalTypeInternal().getTypePtr();
|
||||
}
|
||||
|
||||
@ -1077,7 +1088,7 @@ public:
|
||||
/// corresponding to the specific potentially non-canonical one.
|
||||
/// Qualifiers are stripped off, functions are turned into function
|
||||
/// pointers, and arrays decay one level into pointers.
|
||||
CanQualType getCanonicalParamType(QualType T);
|
||||
CanQualType getCanonicalParamType(QualType T) const;
|
||||
|
||||
/// \brief Determine whether the given types are equivalent.
|
||||
bool hasSameType(QualType T1, QualType T2) {
|
||||
@ -1136,7 +1147,7 @@ public:
|
||||
/// by declarations in the type system and the canonical type for
|
||||
/// the template type parameter 'T' is template-param-0-0.
|
||||
NestedNameSpecifier *
|
||||
getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS);
|
||||
getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const;
|
||||
|
||||
/// \brief Retrieves the default calling convention to use for
|
||||
/// C++ instance methods.
|
||||
@ -1144,7 +1155,7 @@ public:
|
||||
|
||||
/// \brief Retrieves the canonical representation of the given
|
||||
/// calling convention.
|
||||
CallingConv getCanonicalCallConv(CallingConv CC) {
|
||||
CallingConv getCanonicalCallConv(CallingConv CC) const {
|
||||
if (CC == CC_C)
|
||||
return CC_Default;
|
||||
return CC;
|
||||
@ -1174,7 +1185,7 @@ public:
|
||||
/// template name uses the shortest form of the dependent
|
||||
/// nested-name-specifier, which itself contains all canonical
|
||||
/// types, values, and templates.
|
||||
TemplateName getCanonicalTemplateName(TemplateName Name);
|
||||
TemplateName getCanonicalTemplateName(TemplateName Name) const;
|
||||
|
||||
/// \brief Determine whether the given template names refer to the same
|
||||
/// template.
|
||||
@ -1185,33 +1196,35 @@ public:
|
||||
/// The canonical template argument is the simplest template argument
|
||||
/// (which may be a type, value, expression, or declaration) that
|
||||
/// expresses the value of the argument.
|
||||
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg);
|
||||
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg)
|
||||
const;
|
||||
|
||||
/// Type Query functions. If the type is an instance of the specified class,
|
||||
/// return the Type pointer for the underlying maximally pretty type. This
|
||||
/// is a member of ASTContext because this may need to do some amount of
|
||||
/// canonicalization, e.g. to move type qualifiers into the element type.
|
||||
const ArrayType *getAsArrayType(QualType T);
|
||||
const ConstantArrayType *getAsConstantArrayType(QualType T) {
|
||||
const ArrayType *getAsArrayType(QualType T) const;
|
||||
const ConstantArrayType *getAsConstantArrayType(QualType T) const {
|
||||
return dyn_cast_or_null<ConstantArrayType>(getAsArrayType(T));
|
||||
}
|
||||
const VariableArrayType *getAsVariableArrayType(QualType T) {
|
||||
const VariableArrayType *getAsVariableArrayType(QualType T) const {
|
||||
return dyn_cast_or_null<VariableArrayType>(getAsArrayType(T));
|
||||
}
|
||||
const IncompleteArrayType *getAsIncompleteArrayType(QualType T) {
|
||||
const IncompleteArrayType *getAsIncompleteArrayType(QualType T) const {
|
||||
return dyn_cast_or_null<IncompleteArrayType>(getAsArrayType(T));
|
||||
}
|
||||
const DependentSizedArrayType *getAsDependentSizedArrayType(QualType T) {
|
||||
const DependentSizedArrayType *getAsDependentSizedArrayType(QualType T)
|
||||
const {
|
||||
return dyn_cast_or_null<DependentSizedArrayType>(getAsArrayType(T));
|
||||
}
|
||||
|
||||
/// getBaseElementType - Returns the innermost element type of an array type.
|
||||
/// For example, will return "int" for int[m][n]
|
||||
QualType getBaseElementType(const ArrayType *VAT);
|
||||
QualType getBaseElementType(const ArrayType *VAT) const;
|
||||
|
||||
/// getBaseElementType - Returns the innermost element type of a type
|
||||
/// (which needn't actually be an array type).
|
||||
QualType getBaseElementType(QualType QT);
|
||||
QualType getBaseElementType(QualType QT) const;
|
||||
|
||||
/// getConstantArrayElementCount - Returns number of constant array elements.
|
||||
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const;
|
||||
@ -1222,30 +1235,30 @@ public:
|
||||
/// this returns a pointer to a properly qualified element of the array.
|
||||
///
|
||||
/// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
|
||||
QualType getArrayDecayedType(QualType T);
|
||||
QualType getArrayDecayedType(QualType T) const;
|
||||
|
||||
/// getPromotedIntegerType - Returns the type that Promotable will
|
||||
/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
|
||||
/// integer type.
|
||||
QualType getPromotedIntegerType(QualType PromotableType);
|
||||
QualType getPromotedIntegerType(QualType PromotableType) const;
|
||||
|
||||
/// \brief Whether this is a promotable bitfield reference according
|
||||
/// to C99 6.3.1.1p2, bullet 2 (and GCC extensions).
|
||||
///
|
||||
/// \returns the type this bit-field will promote to, or NULL if no
|
||||
/// promotion occurs.
|
||||
QualType isPromotableBitField(Expr *E);
|
||||
QualType isPromotableBitField(Expr *E) const;
|
||||
|
||||
/// getIntegerTypeOrder - Returns the highest ranked integer type:
|
||||
/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If
|
||||
/// LHS < RHS, return -1.
|
||||
int getIntegerTypeOrder(QualType LHS, QualType RHS);
|
||||
int getIntegerTypeOrder(QualType LHS, QualType RHS) const;
|
||||
|
||||
/// getFloatingTypeOrder - Compare the rank of the two specified floating
|
||||
/// point types, ignoring the domain of the type (i.e. 'double' ==
|
||||
/// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If
|
||||
/// LHS < RHS, return -1.
|
||||
int getFloatingTypeOrder(QualType LHS, QualType RHS);
|
||||
int getFloatingTypeOrder(QualType LHS, QualType RHS) const;
|
||||
|
||||
/// getFloatingTypeOfSizeWithinDomain - Returns a real floating
|
||||
/// point or a complex type (based on typeDomain/typeSize).
|
||||
@ -1256,7 +1269,7 @@ public:
|
||||
|
||||
private:
|
||||
// Helper for integer ordering
|
||||
unsigned getIntegerRank(Type* T);
|
||||
unsigned getIntegerRank(Type* T) const;
|
||||
|
||||
public:
|
||||
|
||||
@ -1322,7 +1335,7 @@ public:
|
||||
|
||||
// The width of an integer, as defined in C99 6.2.6.2. This is the number
|
||||
// of bits in an integer type excluding any padding bits.
|
||||
unsigned getIntWidth(QualType T);
|
||||
unsigned getIntWidth(QualType T) const;
|
||||
|
||||
// Per C99 6.2.5p6, for every signed integer type, there is a corresponding
|
||||
// unsigned integer type. This method takes a signed type, and returns the
|
||||
@ -1347,7 +1360,7 @@ public:
|
||||
|
||||
/// MakeIntValue - Make an APSInt of the appropriate width and
|
||||
/// signedness for the given \arg Value and integer \arg Type.
|
||||
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) {
|
||||
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const {
|
||||
llvm::APSInt Res(getIntWidth(Type), !Type->isSignedIntegerType());
|
||||
Res = Value;
|
||||
return Res;
|
||||
@ -1382,7 +1395,7 @@ public:
|
||||
///
|
||||
/// \param Size the size of the type info to create, or 0 if the size
|
||||
/// should be calculated based on the type.
|
||||
TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0);
|
||||
TypeSourceInfo *CreateTypeSourceInfo(QualType T, unsigned Size = 0) const;
|
||||
|
||||
/// \brief Allocate a TypeSourceInfo where all locations have been
|
||||
/// initialized to a given location, which defaults to the empty
|
||||
@ -1457,10 +1470,11 @@ private:
|
||||
bool ExpandStructures,
|
||||
const FieldDecl *Field,
|
||||
bool OutermostType = false,
|
||||
bool EncodingProperty = false);
|
||||
bool EncodingProperty = false) const;
|
||||
|
||||
const ASTRecordLayout &getObjCLayout(const ObjCInterfaceDecl *D,
|
||||
const ObjCImplementationDecl *Impl);
|
||||
const ASTRecordLayout &
|
||||
getObjCLayout(const ObjCInterfaceDecl *D,
|
||||
const ObjCImplementationDecl *Impl) const;
|
||||
|
||||
private:
|
||||
/// \brief A set of deallocations that should be performed when the
|
||||
@ -1473,8 +1487,8 @@ private:
|
||||
llvm::PointerIntPair<StoredDeclsMap*,1> LastSDM;
|
||||
|
||||
/// \brief A counter used to uniquely identify "blocks".
|
||||
unsigned int UniqueBlockByRefTypeID;
|
||||
unsigned int UniqueBlockParmTypeID;
|
||||
mutable unsigned int UniqueBlockByRefTypeID;
|
||||
mutable unsigned int UniqueBlockParmTypeID;
|
||||
|
||||
friend class DeclContext;
|
||||
friend class DeclarationNameTable;
|
||||
@ -1519,7 +1533,7 @@ static inline Selector GetUnarySelector(const char* name, ASTContext& Ctx) {
|
||||
/// @param Alignment The alignment of the allocated memory (if the underlying
|
||||
/// allocator supports it).
|
||||
/// @return The allocated memory. Could be NULL.
|
||||
inline void *operator new(size_t Bytes, clang::ASTContext &C,
|
||||
inline void *operator new(size_t Bytes, const clang::ASTContext &C,
|
||||
size_t Alignment) throw () {
|
||||
return C.Allocate(Bytes, Alignment);
|
||||
}
|
||||
@ -1529,7 +1543,7 @@ inline void *operator new(size_t Bytes, clang::ASTContext &C,
|
||||
/// invoking it directly; see the new operator for more details. This operator
|
||||
/// is called implicitly by the compiler if a placement new expression using
|
||||
/// the ASTContext throws in the object constructor.
|
||||
inline void operator delete(void *Ptr, clang::ASTContext &C, size_t)
|
||||
inline void operator delete(void *Ptr, const clang::ASTContext &C, size_t)
|
||||
throw () {
|
||||
C.Deallocate(Ptr);
|
||||
}
|
||||
@ -1553,7 +1567,7 @@ inline void operator delete(void *Ptr, clang::ASTContext &C, size_t)
|
||||
/// @param Alignment The alignment of the allocated memory (if the underlying
|
||||
/// allocator supports it).
|
||||
/// @return The allocated memory. Could be NULL.
|
||||
inline void *operator new[](size_t Bytes, clang::ASTContext& C,
|
||||
inline void *operator new[](size_t Bytes, const clang::ASTContext& C,
|
||||
size_t Alignment = 8) throw () {
|
||||
return C.Allocate(Bytes, Alignment);
|
||||
}
|
||||
@ -1564,7 +1578,7 @@ inline void *operator new[](size_t Bytes, clang::ASTContext& C,
|
||||
/// invoking it directly; see the new[] operator for more details. This operator
|
||||
/// is called implicitly by the compiler if a placement new[] expression using
|
||||
/// the ASTContext throws in the object constructor.
|
||||
inline void operator delete[](void *Ptr, clang::ASTContext &C, size_t)
|
||||
inline void operator delete[](void *Ptr, const clang::ASTContext &C, size_t)
|
||||
throw () {
|
||||
C.Deallocate(Ptr);
|
||||
}
|
||||
|
@ -36,19 +36,19 @@ namespace clang {
|
||||
}
|
||||
|
||||
// Defined in ASTContext.h
|
||||
void *operator new(size_t Bytes, clang::ASTContext &C,
|
||||
void *operator new(size_t Bytes, const clang::ASTContext &C,
|
||||
size_t Alignment = 16) throw ();
|
||||
// FIXME: Being forced to not have a default argument here due to redeclaration
|
||||
// rules on default arguments sucks
|
||||
void *operator new[](size_t Bytes, clang::ASTContext &C,
|
||||
void *operator new[](size_t Bytes, const clang::ASTContext &C,
|
||||
size_t Alignment) throw ();
|
||||
|
||||
// It is good practice to pair new/delete operators. Also, MSVC gives many
|
||||
// warnings if a matching delete overload is not declared, even though the
|
||||
// throw() spec guarantees it will not be implicitly called.
|
||||
void operator delete(void *Ptr, clang::ASTContext &C, size_t)
|
||||
void operator delete(void *Ptr, const clang::ASTContext &C, size_t)
|
||||
throw ();
|
||||
void operator delete[](void *Ptr, clang::ASTContext &C, size_t)
|
||||
void operator delete[](void *Ptr, const clang::ASTContext &C, size_t)
|
||||
throw ();
|
||||
|
||||
namespace clang {
|
||||
|
@ -1725,8 +1725,8 @@ protected:
|
||||
}
|
||||
|
||||
public:
|
||||
static FieldDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L,
|
||||
IdentifierInfo *Id, QualType T,
|
||||
static FieldDecl *Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id, QualType T,
|
||||
TypeSourceInfo *TInfo, Expr *BW, bool Mutable);
|
||||
|
||||
/// isMutable - Determines whether this field is mutable (C++ only).
|
||||
@ -2371,11 +2371,11 @@ protected:
|
||||
RecordDecl *PrevDecl, SourceLocation TKL);
|
||||
|
||||
public:
|
||||
static RecordDecl *Create(ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
static RecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation TKL = SourceLocation(),
|
||||
RecordDecl* PrevDecl = 0);
|
||||
static RecordDecl *Create(ASTContext &C, EmptyShell Empty);
|
||||
static RecordDecl *Create(const ASTContext &C, EmptyShell Empty);
|
||||
|
||||
const RecordDecl *getPreviousDeclaration() const {
|
||||
return cast_or_null<RecordDecl>(TagDecl::getPreviousDeclaration());
|
||||
|
@ -481,12 +481,12 @@ public:
|
||||
|
||||
bool hasDefinition() const { return DefinitionData != 0; }
|
||||
|
||||
static CXXRecordDecl *Create(ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
static CXXRecordDecl *Create(const ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation TKL = SourceLocation(),
|
||||
CXXRecordDecl* PrevDecl=0,
|
||||
bool DelayTypeCreation = false);
|
||||
static CXXRecordDecl *Create(ASTContext &C, EmptyShell Empty);
|
||||
static CXXRecordDecl *Create(const ASTContext &C, EmptyShell Empty);
|
||||
|
||||
bool isDynamicClass() const {
|
||||
return data().Polymorphic || data().NumVBases != 0;
|
||||
@ -591,10 +591,10 @@ public:
|
||||
|
||||
/// hasConstCopyConstructor - Determines whether this class has a
|
||||
/// copy constructor that accepts a const-qualified argument.
|
||||
bool hasConstCopyConstructor(ASTContext &Context) const;
|
||||
bool hasConstCopyConstructor(const ASTContext &Context) const;
|
||||
|
||||
/// getCopyConstructor - Returns the copy constructor for this class
|
||||
CXXConstructorDecl *getCopyConstructor(ASTContext &Context,
|
||||
CXXConstructorDecl *getCopyConstructor(const ASTContext &Context,
|
||||
unsigned TypeQuals) const;
|
||||
|
||||
/// \brief Retrieve the copy-assignment operator for this class, if available.
|
||||
|
@ -53,7 +53,7 @@ class TemplateParameterList {
|
||||
SourceLocation RAngleLoc);
|
||||
|
||||
public:
|
||||
static TemplateParameterList *Create(ASTContext &C,
|
||||
static TemplateParameterList *Create(const ASTContext &C,
|
||||
SourceLocation TemplateLoc,
|
||||
SourceLocation LAngleLoc,
|
||||
NamedDecl **Params,
|
||||
@ -915,11 +915,11 @@ class TemplateTypeParmDecl : public TypeDecl {
|
||||
}
|
||||
|
||||
public:
|
||||
static TemplateTypeParmDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
static TemplateTypeParmDecl *Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, unsigned D, unsigned P,
|
||||
IdentifierInfo *Id, bool Typename,
|
||||
bool ParameterPack);
|
||||
static TemplateTypeParmDecl *Create(ASTContext &C, EmptyShell Empty);
|
||||
static TemplateTypeParmDecl *Create(const ASTContext &C, EmptyShell Empty);
|
||||
|
||||
/// \brief Whether this template type parameter was declared with
|
||||
/// the 'typename' keyword. If not, it was declared with the 'class'
|
||||
@ -1008,7 +1008,7 @@ class NonTypeTemplateParmDecl
|
||||
|
||||
public:
|
||||
static NonTypeTemplateParmDecl *
|
||||
Create(ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D,
|
||||
Create(const ASTContext &C, DeclContext *DC, SourceLocation L, unsigned D,
|
||||
unsigned P, IdentifierInfo *Id, QualType T, bool ParameterPack,
|
||||
TypeSourceInfo *TInfo);
|
||||
|
||||
@ -1096,7 +1096,7 @@ class TemplateTemplateParmDecl
|
||||
{ }
|
||||
|
||||
public:
|
||||
static TemplateTemplateParmDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
static TemplateTemplateParmDecl *Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, unsigned D,
|
||||
unsigned P, bool ParameterPack,
|
||||
IdentifierInfo *Id,
|
||||
|
@ -315,7 +315,7 @@ inline bool operator>=(DeclarationName LHS, DeclarationName RHS) {
|
||||
/// retrieved using its member functions (e.g.,
|
||||
/// getCXXConstructorName).
|
||||
class DeclarationNameTable {
|
||||
ASTContext &Ctx;
|
||||
const ASTContext &Ctx;
|
||||
void *CXXSpecialNamesImpl; // Actually a FoldingSet<CXXSpecialName> *
|
||||
CXXOperatorIdName *CXXOperatorNames; // Operator names
|
||||
void *CXXLiteralOperatorNames; // Actually a CXXOperatorIdName*
|
||||
@ -324,7 +324,7 @@ class DeclarationNameTable {
|
||||
DeclarationNameTable& operator=(const DeclarationNameTable&); // NONCOPYABLE
|
||||
|
||||
public:
|
||||
DeclarationNameTable(ASTContext &C);
|
||||
DeclarationNameTable(const ASTContext &C);
|
||||
~DeclarationNameTable();
|
||||
|
||||
/// getIdentifier - Create a declaration name that is a simple
|
||||
|
@ -404,33 +404,33 @@ public:
|
||||
/// any crazy technique (that has nothing to do with language standards) that
|
||||
/// we want to. If this function returns true, it returns the folded constant
|
||||
/// in Result.
|
||||
bool Evaluate(EvalResult &Result, ASTContext &Ctx) const;
|
||||
bool Evaluate(EvalResult &Result, const ASTContext &Ctx) const;
|
||||
|
||||
/// EvaluateAsBooleanCondition - Return true if this is a constant
|
||||
/// which we we can fold and convert to a boolean condition using
|
||||
/// any crazy technique that we want to.
|
||||
bool EvaluateAsBooleanCondition(bool &Result, ASTContext &Ctx) const;
|
||||
bool EvaluateAsBooleanCondition(bool &Result, const ASTContext &Ctx) const;
|
||||
|
||||
/// isEvaluatable - Call Evaluate to see if this expression can be constant
|
||||
/// folded, but discard the result.
|
||||
bool isEvaluatable(ASTContext &Ctx) const;
|
||||
bool isEvaluatable(const ASTContext &Ctx) const;
|
||||
|
||||
/// HasSideEffects - This routine returns true for all those expressions
|
||||
/// which must be evaluated each time and must not be optimized away
|
||||
/// or evaluated at compile time. Example is a function call, volatile
|
||||
/// variable read.
|
||||
bool HasSideEffects(ASTContext &Ctx) const;
|
||||
bool HasSideEffects(const ASTContext &Ctx) const;
|
||||
|
||||
/// EvaluateAsInt - Call Evaluate and return the folded integer. This
|
||||
/// must be called on an expression that constant folds to an integer.
|
||||
llvm::APSInt EvaluateAsInt(ASTContext &Ctx) const;
|
||||
llvm::APSInt EvaluateAsInt(const ASTContext &Ctx) const;
|
||||
|
||||
/// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue
|
||||
/// with link time known address.
|
||||
bool EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const;
|
||||
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const;
|
||||
|
||||
/// EvaluateAsLValue - Evaluate an expression to see if it's a lvalue.
|
||||
bool EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const;
|
||||
bool EvaluateAsAnyLValue(EvalResult &Result, const ASTContext &Ctx) const;
|
||||
|
||||
/// \brief Enumeration used to describe how \c isNullPointerConstant()
|
||||
/// should cope with value-dependent expressions.
|
||||
@ -1732,7 +1732,7 @@ public:
|
||||
|
||||
/// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If
|
||||
/// not, return 0.
|
||||
unsigned isBuiltinCall(ASTContext &Context) const;
|
||||
unsigned isBuiltinCall(const ASTContext &Context) const;
|
||||
|
||||
/// getCallReturnType - Get the return type of the call expr. This is not
|
||||
/// always the type of the expr itself, if the return type is a reference
|
||||
@ -2797,11 +2797,11 @@ public:
|
||||
|
||||
/// isConditionTrue - Return whether the condition is true (i.e. not
|
||||
/// equal to zero).
|
||||
bool isConditionTrue(ASTContext &C) const;
|
||||
bool isConditionTrue(const ASTContext &C) const;
|
||||
|
||||
/// getChosenSubExpr - Return the subexpression chosen according to the
|
||||
/// condition.
|
||||
Expr *getChosenSubExpr(ASTContext &C) const {
|
||||
Expr *getChosenSubExpr(const ASTContext &C) const {
|
||||
return isConditionTrue(C) ? getLHS() : getRHS();
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,7 @@ private:
|
||||
|
||||
/// \brief Either find or insert the given nested name specifier
|
||||
/// mockup in the given context.
|
||||
static NestedNameSpecifier *FindOrInsert(ASTContext &Context,
|
||||
static NestedNameSpecifier *FindOrInsert(const ASTContext &Context,
|
||||
const NestedNameSpecifier &Mockup);
|
||||
|
||||
public:
|
||||
@ -99,17 +99,17 @@ public:
|
||||
/// The prefix must be dependent, since nested name specifiers
|
||||
/// referencing an identifier are only permitted when the identifier
|
||||
/// cannot be resolved.
|
||||
static NestedNameSpecifier *Create(ASTContext &Context,
|
||||
static NestedNameSpecifier *Create(const ASTContext &Context,
|
||||
NestedNameSpecifier *Prefix,
|
||||
IdentifierInfo *II);
|
||||
|
||||
/// \brief Builds a nested name specifier that names a namespace.
|
||||
static NestedNameSpecifier *Create(ASTContext &Context,
|
||||
static NestedNameSpecifier *Create(const ASTContext &Context,
|
||||
NestedNameSpecifier *Prefix,
|
||||
NamespaceDecl *NS);
|
||||
|
||||
/// \brief Builds a nested name specifier that names a type.
|
||||
static NestedNameSpecifier *Create(ASTContext &Context,
|
||||
static NestedNameSpecifier *Create(const ASTContext &Context,
|
||||
NestedNameSpecifier *Prefix,
|
||||
bool Template, Type *T);
|
||||
|
||||
@ -119,11 +119,12 @@ public:
|
||||
/// prefix because the prefix is implied by something outside of the
|
||||
/// nested name specifier, e.g., in "x->Base::f", the "x" has a dependent
|
||||
/// type.
|
||||
static NestedNameSpecifier *Create(ASTContext &Context, IdentifierInfo *II);
|
||||
static NestedNameSpecifier *Create(const ASTContext &Context,
|
||||
IdentifierInfo *II);
|
||||
|
||||
/// \brief Returns the nested name specifier representing the global
|
||||
/// scope.
|
||||
static NestedNameSpecifier *GlobalSpecifier(ASTContext &Context);
|
||||
static NestedNameSpecifier *GlobalSpecifier(const ASTContext &Context);
|
||||
|
||||
/// \brief Return the prefix of this nested name specifier.
|
||||
///
|
||||
|
@ -82,13 +82,13 @@ class ASTRecordLayout {
|
||||
|
||||
friend class ASTContext;
|
||||
|
||||
ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
|
||||
ASTRecordLayout(const ASTContext &Ctx, uint64_t size, unsigned alignment,
|
||||
unsigned datasize, const uint64_t *fieldoffsets,
|
||||
unsigned fieldcount);
|
||||
|
||||
// Constructor for C++ records.
|
||||
typedef CXXRecordLayoutInfo::BaseOffsetsMapTy BaseOffsetsMapTy;
|
||||
ASTRecordLayout(ASTContext &Ctx,
|
||||
ASTRecordLayout(const ASTContext &Ctx,
|
||||
uint64_t size, unsigned alignment, uint64_t datasize,
|
||||
const uint64_t *fieldoffsets, unsigned fieldcount,
|
||||
uint64_t nonvirtualsize, unsigned nonvirtualalign,
|
||||
|
@ -309,7 +309,7 @@ public:
|
||||
/// parameters are identified by index/level rather than their
|
||||
/// declaration pointers) or the exact representation of the statement as
|
||||
/// written in the source.
|
||||
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
bool Canonical);
|
||||
};
|
||||
|
||||
|
@ -319,7 +319,7 @@ public:
|
||||
void print(const PrintingPolicy &Policy, llvm::raw_ostream &Out) const;
|
||||
|
||||
/// \brief Used to insert TemplateArguments into FoldingSets.
|
||||
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context) const;
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) const;
|
||||
};
|
||||
|
||||
/// Location information for a TemplateArgument.
|
||||
|
@ -682,7 +682,7 @@ public:
|
||||
/// concrete.
|
||||
///
|
||||
/// Qualifiers are left in place.
|
||||
QualType getDesugaredType(ASTContext &Context) const {
|
||||
QualType getDesugaredType(const ASTContext &Context) const {
|
||||
return getDesugaredType(*this, Context);
|
||||
}
|
||||
|
||||
@ -759,7 +759,7 @@ private:
|
||||
// "static"-ize them to avoid creating temporary QualTypes in the
|
||||
// caller.
|
||||
static bool isConstant(QualType T, ASTContext& Ctx);
|
||||
static QualType getDesugaredType(QualType T, ASTContext &Context);
|
||||
static QualType getDesugaredType(QualType T, const ASTContext &Context);
|
||||
static SplitQualType getSplitDesugaredType(QualType T);
|
||||
static QualType IgnoreParens(QualType T);
|
||||
};
|
||||
@ -1922,7 +1922,7 @@ public:
|
||||
/// until template instantiation occurs, at which point this will
|
||||
/// become either a ConstantArrayType or a VariableArrayType.
|
||||
class DependentSizedArrayType : public ArrayType {
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
|
||||
/// \brief An assignment expression that will instantiate to the
|
||||
/// size of the array.
|
||||
@ -1934,7 +1934,7 @@ class DependentSizedArrayType : public ArrayType {
|
||||
/// Brackets - The left and right array brackets.
|
||||
SourceRange Brackets;
|
||||
|
||||
DependentSizedArrayType(ASTContext &Context, QualType et, QualType can,
|
||||
DependentSizedArrayType(const ASTContext &Context, QualType et, QualType can,
|
||||
Expr *e, ArraySizeModifier sm, unsigned tq,
|
||||
SourceRange brackets);
|
||||
|
||||
@ -1966,7 +1966,7 @@ public:
|
||||
getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr());
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
QualType ET, ArraySizeModifier SizeMod,
|
||||
unsigned TypeQuals, Expr *E);
|
||||
};
|
||||
@ -1980,13 +1980,13 @@ public:
|
||||
/// }
|
||||
/// @endcode
|
||||
class DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode {
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
Expr *SizeExpr;
|
||||
/// ElementType - The element type of the array.
|
||||
QualType ElementType;
|
||||
SourceLocation loc;
|
||||
|
||||
DependentSizedExtVectorType(ASTContext &Context, QualType ElementType,
|
||||
DependentSizedExtVectorType(const ASTContext &Context, QualType ElementType,
|
||||
QualType can, Expr *SizeExpr, SourceLocation loc);
|
||||
|
||||
friend class ASTContext;
|
||||
@ -2008,7 +2008,7 @@ public:
|
||||
Profile(ID, Context, getElementType(), getSizeExpr());
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
QualType ElementType, Expr *SizeExpr);
|
||||
};
|
||||
|
||||
@ -2512,10 +2512,10 @@ public:
|
||||
/// of this class via TypeOfExprType nodes.
|
||||
class DependentTypeOfExprType
|
||||
: public TypeOfExprType, public llvm::FoldingSetNode {
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
|
||||
public:
|
||||
DependentTypeOfExprType(ASTContext &Context, Expr *E)
|
||||
DependentTypeOfExprType(const ASTContext &Context, Expr *E)
|
||||
: TypeOfExprType(E), Context(Context) { }
|
||||
|
||||
bool isSugared() const { return false; }
|
||||
@ -2525,7 +2525,7 @@ public:
|
||||
Profile(ID, Context, getUnderlyingExpr());
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
Expr *E);
|
||||
};
|
||||
|
||||
@ -2585,10 +2585,10 @@ public:
|
||||
/// canonical, dependent types, only. Clients will only see instances
|
||||
/// of this class via DecltypeType nodes.
|
||||
class DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode {
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
|
||||
public:
|
||||
DependentDecltypeType(ASTContext &Context, Expr *E);
|
||||
DependentDecltypeType(const ASTContext &Context, Expr *E);
|
||||
|
||||
bool isSugared() const { return false; }
|
||||
QualType desugar() const { return QualType(this, 0); }
|
||||
@ -2597,7 +2597,7 @@ public:
|
||||
Profile(ID, Context, getUnderlyingExpr());
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
Expr *E);
|
||||
};
|
||||
|
||||
@ -2946,14 +2946,14 @@ public:
|
||||
}
|
||||
QualType desugar() const { return getCanonicalTypeInternal(); }
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Ctx) {
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Ctx) {
|
||||
Profile(ID, Template, getArgs(), NumArgs, Ctx);
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ASTContext &Context);
|
||||
const ASTContext &Context);
|
||||
|
||||
static bool classof(const Type *T) {
|
||||
return T->getTypeClass() == TemplateSpecialization;
|
||||
@ -3280,12 +3280,12 @@ public:
|
||||
bool isSugared() const { return false; }
|
||||
QualType desugar() const { return QualType(this, 0); }
|
||||
|
||||
void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context) {
|
||||
void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context) {
|
||||
Profile(ID, Context, getKeyword(), NNS, Name, NumArgs, getArgs());
|
||||
}
|
||||
|
||||
static void Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context,
|
||||
const ASTContext &Context,
|
||||
ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *Qualifier,
|
||||
const IdentifierInfo *Name,
|
||||
@ -3696,10 +3696,10 @@ public:
|
||||
}
|
||||
|
||||
/// Apply the collected qualifiers to the given type.
|
||||
QualType apply(ASTContext &Context, QualType QT) const;
|
||||
QualType apply(const ASTContext &Context, QualType QT) const;
|
||||
|
||||
/// Apply the collected qualifiers to the given type.
|
||||
QualType apply(ASTContext &Context, const Type* T) const;
|
||||
QualType apply(const ASTContext &Context, const Type* T) const;
|
||||
};
|
||||
|
||||
|
||||
|
@ -79,7 +79,7 @@ ASTContext::CanonicalTemplateTemplateParm::Profile(llvm::FoldingSetNodeID &ID,
|
||||
|
||||
TemplateTemplateParmDecl *
|
||||
ASTContext::getCanonicalTemplateTemplateParmDecl(
|
||||
TemplateTemplateParmDecl *TTP) {
|
||||
TemplateTemplateParmDecl *TTP) const {
|
||||
// Check if we already have a canonical template template parameter.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
CanonicalTemplateTemplateParm::Profile(ID, TTP);
|
||||
@ -536,7 +536,7 @@ const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
|
||||
/// this method will assert on them.
|
||||
/// If @p RefAsPointee, references are treated like their underlying type
|
||||
/// (for alignof), else they're treated like pointers (for CodeGen).
|
||||
CharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) {
|
||||
CharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const {
|
||||
unsigned Align = Target.getCharWidth();
|
||||
|
||||
bool UseAlignAttrOnly = false;
|
||||
@ -613,7 +613,7 @@ ASTContext::getTypeInfoInChars(QualType T) {
|
||||
/// alignment requirements: getPointerInfo should take an AddrSpace, this
|
||||
/// should take a QualType, &c.
|
||||
std::pair<uint64_t, unsigned>
|
||||
ASTContext::getTypeInfo(const Type *T) {
|
||||
ASTContext::getTypeInfo(const Type *T) const {
|
||||
uint64_t Width=0;
|
||||
unsigned Align=8;
|
||||
switch (T->getTypeClass()) {
|
||||
@ -863,19 +863,19 @@ ASTContext::getTypeInfo(const Type *T) {
|
||||
|
||||
/// getTypeSizeInChars - Return the size of the specified type, in characters.
|
||||
/// This method does not work on incomplete types.
|
||||
CharUnits ASTContext::getTypeSizeInChars(QualType T) {
|
||||
CharUnits ASTContext::getTypeSizeInChars(QualType T) const {
|
||||
return CharUnits::fromQuantity(getTypeSize(T) / getCharWidth());
|
||||
}
|
||||
CharUnits ASTContext::getTypeSizeInChars(const Type *T) {
|
||||
CharUnits ASTContext::getTypeSizeInChars(const Type *T) const {
|
||||
return CharUnits::fromQuantity(getTypeSize(T) / getCharWidth());
|
||||
}
|
||||
|
||||
/// getTypeAlignInChars - Return the ABI-specified alignment of a type, in
|
||||
/// characters. This method does not work on incomplete types.
|
||||
CharUnits ASTContext::getTypeAlignInChars(QualType T) {
|
||||
CharUnits ASTContext::getTypeAlignInChars(QualType T) const {
|
||||
return CharUnits::fromQuantity(getTypeAlign(T) / getCharWidth());
|
||||
}
|
||||
CharUnits ASTContext::getTypeAlignInChars(const Type *T) {
|
||||
CharUnits ASTContext::getTypeAlignInChars(const Type *T) const {
|
||||
return CharUnits::fromQuantity(getTypeAlign(T) / getCharWidth());
|
||||
}
|
||||
|
||||
@ -883,7 +883,7 @@ CharUnits ASTContext::getTypeAlignInChars(const Type *T) {
|
||||
/// type for the current target in bits. This can be different than the ABI
|
||||
/// alignment in cases where it is beneficial for performance to overalign
|
||||
/// a data type.
|
||||
unsigned ASTContext::getPreferredTypeAlign(const Type *T) {
|
||||
unsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
|
||||
unsigned ABIAlign = getTypeAlign(T);
|
||||
|
||||
// Double and long long should be naturally aligned if possible.
|
||||
@ -900,7 +900,7 @@ unsigned ASTContext::getPreferredTypeAlign(const Type *T) {
|
||||
/// Collect all ivars, including those synthesized, in the current class.
|
||||
///
|
||||
void ASTContext::ShallowCollectObjCIvars(const ObjCInterfaceDecl *OI,
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) {
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) const {
|
||||
// FIXME. This need be removed but there are two many places which
|
||||
// assume const-ness of ObjCInterfaceDecl
|
||||
ObjCInterfaceDecl *IDecl = const_cast<ObjCInterfaceDecl *>(OI);
|
||||
@ -917,7 +917,7 @@ void ASTContext::ShallowCollectObjCIvars(const ObjCInterfaceDecl *OI,
|
||||
///
|
||||
void ASTContext::DeepCollectObjCIvars(const ObjCInterfaceDecl *OI,
|
||||
bool leafClass,
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) {
|
||||
llvm::SmallVectorImpl<ObjCIvarDecl*> &Ivars) const {
|
||||
if (const ObjCInterfaceDecl *SuperClass = OI->getSuperClass())
|
||||
DeepCollectObjCIvars(SuperClass, false, Ivars);
|
||||
if (!leafClass) {
|
||||
@ -977,7 +977,7 @@ void ASTContext::CollectInheritedProtocols(const Decl *CDecl,
|
||||
}
|
||||
}
|
||||
|
||||
unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) {
|
||||
unsigned ASTContext::CountNonClassIvars(const ObjCInterfaceDecl *OI) const {
|
||||
unsigned count = 0;
|
||||
// Count ivars declared in class extension.
|
||||
for (const ObjCCategoryDecl *CDecl = OI->getFirstClassExtension(); CDecl;
|
||||
@ -1050,7 +1050,7 @@ void ASTContext::setBlockVarCopyInits(VarDecl*VD, Expr* Init) {
|
||||
/// should refer to how the declarator was written in source code, not to
|
||||
/// what type semantic analysis resolved the declarator to.
|
||||
TypeSourceInfo *ASTContext::CreateTypeSourceInfo(QualType T,
|
||||
unsigned DataSize) {
|
||||
unsigned DataSize) const {
|
||||
if (!DataSize)
|
||||
DataSize = TypeLoc::getFullDataSizeForType(T);
|
||||
else
|
||||
@ -1071,12 +1071,13 @@ TypeSourceInfo *ASTContext::getTrivialTypeSourceInfo(QualType T,
|
||||
}
|
||||
|
||||
const ASTRecordLayout &
|
||||
ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) {
|
||||
ASTContext::getASTObjCInterfaceLayout(const ObjCInterfaceDecl *D) const {
|
||||
return getObjCLayout(D, 0);
|
||||
}
|
||||
|
||||
const ASTRecordLayout &
|
||||
ASTContext::getASTObjCImplementationLayout(const ObjCImplementationDecl *D) {
|
||||
ASTContext::getASTObjCImplementationLayout(
|
||||
const ObjCImplementationDecl *D) const {
|
||||
return getObjCLayout(D->getClassInterface(), D);
|
||||
}
|
||||
|
||||
@ -1084,7 +1085,8 @@ ASTContext::getASTObjCImplementationLayout(const ObjCImplementationDecl *D) {
|
||||
// Type creation/memoization methods
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
QualType ASTContext::getExtQualType(const Type *TypeNode, Qualifiers Quals) {
|
||||
QualType
|
||||
ASTContext::getExtQualType(const Type *TypeNode, Qualifiers Quals) const {
|
||||
unsigned Fast = Quals.getFastQualifiers();
|
||||
Quals.removeFastQualifiers();
|
||||
|
||||
@ -1104,7 +1106,8 @@ QualType ASTContext::getExtQualType(const Type *TypeNode, Qualifiers Quals) {
|
||||
return T;
|
||||
}
|
||||
|
||||
QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) {
|
||||
QualType
|
||||
ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) const {
|
||||
QualType CanT = getCanonicalType(T);
|
||||
if (CanT.getAddressSpace() == AddressSpace)
|
||||
return T;
|
||||
@ -1124,7 +1127,7 @@ QualType ASTContext::getAddrSpaceQualType(QualType T, unsigned AddressSpace) {
|
||||
}
|
||||
|
||||
QualType ASTContext::getObjCGCQualType(QualType T,
|
||||
Qualifiers::GC GCAttr) {
|
||||
Qualifiers::GC GCAttr) const {
|
||||
QualType CanT = getCanonicalType(T);
|
||||
if (CanT.getObjCGCAttr() == GCAttr)
|
||||
return T;
|
||||
@ -1172,7 +1175,7 @@ const FunctionType *ASTContext::adjustFunctionType(const FunctionType *T,
|
||||
|
||||
/// getComplexType - Return the uniqued reference to the type for a complex
|
||||
/// number with the specified element type.
|
||||
QualType ASTContext::getComplexType(QualType T) {
|
||||
QualType ASTContext::getComplexType(QualType T) const {
|
||||
// Unique pointers, to guarantee there is only one pointer of a particular
|
||||
// structure.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -1200,7 +1203,7 @@ QualType ASTContext::getComplexType(QualType T) {
|
||||
|
||||
/// getPointerType - Return the uniqued reference to the type for a pointer to
|
||||
/// the specified type.
|
||||
QualType ASTContext::getPointerType(QualType T) {
|
||||
QualType ASTContext::getPointerType(QualType T) const {
|
||||
// Unique pointers, to guarantee there is only one pointer of a particular
|
||||
// structure.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -1228,7 +1231,7 @@ QualType ASTContext::getPointerType(QualType T) {
|
||||
|
||||
/// getBlockPointerType - Return the uniqued reference to the type for
|
||||
/// a pointer to the specified block.
|
||||
QualType ASTContext::getBlockPointerType(QualType T) {
|
||||
QualType ASTContext::getBlockPointerType(QualType T) const {
|
||||
assert(T->isFunctionType() && "block of function types only");
|
||||
// Unique pointers, to guarantee there is only one block of a particular
|
||||
// structure.
|
||||
@ -1260,7 +1263,8 @@ QualType ASTContext::getBlockPointerType(QualType T) {
|
||||
|
||||
/// getLValueReferenceType - Return the uniqued reference to the type for an
|
||||
/// lvalue reference to the specified type.
|
||||
QualType ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) {
|
||||
QualType
|
||||
ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) const {
|
||||
// Unique pointers, to guarantee there is only one pointer of a particular
|
||||
// structure.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -1297,7 +1301,7 @@ QualType ASTContext::getLValueReferenceType(QualType T, bool SpelledAsLValue) {
|
||||
|
||||
/// getRValueReferenceType - Return the uniqued reference to the type for an
|
||||
/// rvalue reference to the specified type.
|
||||
QualType ASTContext::getRValueReferenceType(QualType T) {
|
||||
QualType ASTContext::getRValueReferenceType(QualType T) const {
|
||||
// Unique pointers, to guarantee there is only one pointer of a particular
|
||||
// structure.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -1332,7 +1336,7 @@ QualType ASTContext::getRValueReferenceType(QualType T) {
|
||||
|
||||
/// getMemberPointerType - Return the uniqued reference to the type for a
|
||||
/// member pointer to the specified type, in the specified class.
|
||||
QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) {
|
||||
QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) const {
|
||||
// Unique pointers, to guarantee there is only one pointer of a particular
|
||||
// structure.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -1366,7 +1370,7 @@ QualType ASTContext::getMemberPointerType(QualType T, const Type *Cls) {
|
||||
QualType ASTContext::getConstantArrayType(QualType EltTy,
|
||||
const llvm::APInt &ArySizeIn,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals) {
|
||||
unsigned EltTypeQuals) const {
|
||||
assert((EltTy->isDependentType() ||
|
||||
EltTy->isIncompleteType() || EltTy->isConstantSizeType()) &&
|
||||
"Constant array of VLAs is illegal!");
|
||||
@ -1406,7 +1410,7 @@ QualType ASTContext::getConstantArrayType(QualType EltTy,
|
||||
|
||||
/// getIncompleteArrayType - Returns a unique reference to the type for a
|
||||
/// incomplete array of the specified element type.
|
||||
QualType ASTContext::getUnknownSizeVariableArrayType(QualType Ty) {
|
||||
QualType ASTContext::getUnknownSizeVariableArrayType(QualType Ty) const {
|
||||
QualType ElemTy = getBaseElementType(Ty);
|
||||
DeclarationName Name;
|
||||
llvm::SmallVector<QualType, 8> ATypes;
|
||||
@ -1436,7 +1440,7 @@ QualType ASTContext::getUnknownSizeVariableArrayType(QualType Ty) {
|
||||
|
||||
/// getVariableArrayDecayedType - Returns a vla type where known sizes
|
||||
/// are replaced with [*]
|
||||
QualType ASTContext::getVariableArrayDecayedType(QualType Ty) {
|
||||
QualType ASTContext::getVariableArrayDecayedType(QualType Ty) const {
|
||||
if (Ty->isPointerType()) {
|
||||
QualType BaseType = Ty->getAs<PointerType>()->getPointeeType();
|
||||
if (isa<VariableArrayType>(BaseType)) {
|
||||
@ -1458,7 +1462,7 @@ QualType ASTContext::getVariableArrayType(QualType EltTy,
|
||||
Expr *NumElts,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals,
|
||||
SourceRange Brackets) {
|
||||
SourceRange Brackets) const {
|
||||
// Since we don't unique expressions, it isn't possible to unique VLA's
|
||||
// that have an expression provided for their size.
|
||||
QualType CanonType;
|
||||
@ -1483,7 +1487,7 @@ QualType ASTContext::getDependentSizedArrayType(QualType EltTy,
|
||||
Expr *NumElts,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals,
|
||||
SourceRange Brackets) {
|
||||
SourceRange Brackets) const {
|
||||
assert((!NumElts || NumElts->isTypeDependent() ||
|
||||
NumElts->isValueDependent()) &&
|
||||
"Size must be type- or value-dependent!");
|
||||
@ -1540,7 +1544,7 @@ QualType ASTContext::getDependentSizedArrayType(QualType EltTy,
|
||||
|
||||
QualType ASTContext::getIncompleteArrayType(QualType EltTy,
|
||||
ArrayType::ArraySizeModifier ASM,
|
||||
unsigned EltTypeQuals) {
|
||||
unsigned EltTypeQuals) const {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
IncompleteArrayType::Profile(ID, EltTy, ASM, EltTypeQuals);
|
||||
|
||||
@ -1574,7 +1578,7 @@ QualType ASTContext::getIncompleteArrayType(QualType EltTy,
|
||||
/// getVectorType - Return the unique reference to a vector type of
|
||||
/// the specified element type and size. VectorType must be a built-in type.
|
||||
QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
|
||||
VectorType::VectorKind VecKind) {
|
||||
VectorType::VectorKind VecKind) const {
|
||||
BuiltinType *BaseType;
|
||||
|
||||
BaseType = dyn_cast<BuiltinType>(getCanonicalType(vecType).getTypePtr());
|
||||
@ -1607,7 +1611,8 @@ QualType ASTContext::getVectorType(QualType vecType, unsigned NumElts,
|
||||
|
||||
/// getExtVectorType - Return the unique reference to an extended vector type of
|
||||
/// the specified element type and size. VectorType must be a built-in type.
|
||||
QualType ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) {
|
||||
QualType
|
||||
ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) const {
|
||||
BuiltinType *baseType;
|
||||
|
||||
baseType = dyn_cast<BuiltinType>(getCanonicalType(vecType).getTypePtr());
|
||||
@ -1638,9 +1643,10 @@ QualType ASTContext::getExtVectorType(QualType vecType, unsigned NumElts) {
|
||||
return QualType(New, 0);
|
||||
}
|
||||
|
||||
QualType ASTContext::getDependentSizedExtVectorType(QualType vecType,
|
||||
Expr *SizeExpr,
|
||||
SourceLocation AttrLoc) {
|
||||
QualType
|
||||
ASTContext::getDependentSizedExtVectorType(QualType vecType,
|
||||
Expr *SizeExpr,
|
||||
SourceLocation AttrLoc) const {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
DependentSizedExtVectorType::Profile(ID, *this, getCanonicalType(vecType),
|
||||
SizeExpr);
|
||||
@ -1681,8 +1687,9 @@ QualType ASTContext::getDependentSizedExtVectorType(QualType vecType,
|
||||
|
||||
/// getFunctionNoProtoType - Return a K&R style C function type like 'int()'.
|
||||
///
|
||||
QualType ASTContext::getFunctionNoProtoType(QualType ResultTy,
|
||||
const FunctionType::ExtInfo &Info) {
|
||||
QualType
|
||||
ASTContext::getFunctionNoProtoType(QualType ResultTy,
|
||||
const FunctionType::ExtInfo &Info) const {
|
||||
const CallingConv CallConv = Info.getCC();
|
||||
// Unique functions, to guarantee there is only one function of a particular
|
||||
// structure.
|
||||
@ -1716,9 +1723,10 @@ QualType ASTContext::getFunctionNoProtoType(QualType ResultTy,
|
||||
|
||||
/// getFunctionType - Return a normal function type with a typed argument
|
||||
/// list. isVariadic indicates whether the argument list includes '...'.
|
||||
QualType ASTContext::getFunctionType(QualType ResultTy,
|
||||
const QualType *ArgArray, unsigned NumArgs,
|
||||
const FunctionProtoType::ExtProtoInfo &EPI) {
|
||||
QualType
|
||||
ASTContext::getFunctionType(QualType ResultTy,
|
||||
const QualType *ArgArray, unsigned NumArgs,
|
||||
const FunctionProtoType::ExtProtoInfo &EPI) const {
|
||||
// Unique functions, to guarantee there is only one function of a particular
|
||||
// structure.
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -1794,7 +1802,7 @@ static bool NeedsInjectedClassNameType(const RecordDecl *D) {
|
||||
/// getInjectedClassNameType - Return the unique reference to the
|
||||
/// injected class name type for the specified templated declaration.
|
||||
QualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
|
||||
QualType TST) {
|
||||
QualType TST) const {
|
||||
assert(NeedsInjectedClassNameType(Decl));
|
||||
if (Decl->TypeForDecl) {
|
||||
assert(isa<InjectedClassNameType>(Decl->TypeForDecl));
|
||||
@ -1812,7 +1820,7 @@ QualType ASTContext::getInjectedClassNameType(CXXRecordDecl *Decl,
|
||||
|
||||
/// getTypeDeclType - Return the unique reference to the type for the
|
||||
/// specified type declaration.
|
||||
QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) {
|
||||
QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) const {
|
||||
assert(Decl && "Passed null for Decl param");
|
||||
assert(!Decl->TypeForDecl && "TypeForDecl present in slow case");
|
||||
|
||||
@ -1844,7 +1852,7 @@ QualType ASTContext::getTypeDeclTypeSlow(const TypeDecl *Decl) {
|
||||
/// getTypedefType - Return the unique reference to the type for the
|
||||
/// specified typename decl.
|
||||
QualType
|
||||
ASTContext::getTypedefType(const TypedefDecl *Decl, QualType Canonical) {
|
||||
ASTContext::getTypedefType(const TypedefDecl *Decl, QualType Canonical) const {
|
||||
if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
|
||||
|
||||
if (Canonical.isNull())
|
||||
@ -1855,7 +1863,7 @@ ASTContext::getTypedefType(const TypedefDecl *Decl, QualType Canonical) {
|
||||
return QualType(Decl->TypeForDecl, 0);
|
||||
}
|
||||
|
||||
QualType ASTContext::getRecordType(const RecordDecl *Decl) {
|
||||
QualType ASTContext::getRecordType(const RecordDecl *Decl) const {
|
||||
if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
|
||||
|
||||
if (const RecordDecl *PrevDecl = Decl->getPreviousDeclaration())
|
||||
@ -1867,7 +1875,7 @@ QualType ASTContext::getRecordType(const RecordDecl *Decl) {
|
||||
return QualType(Decl->TypeForDecl, 0);
|
||||
}
|
||||
|
||||
QualType ASTContext::getEnumType(const EnumDecl *Decl) {
|
||||
QualType ASTContext::getEnumType(const EnumDecl *Decl) const {
|
||||
if (Decl->TypeForDecl) return QualType(Decl->TypeForDecl, 0);
|
||||
|
||||
if (const EnumDecl *PrevDecl = Decl->getPreviousDeclaration())
|
||||
@ -1903,7 +1911,7 @@ QualType ASTContext::getAttributedType(AttributedType::Kind attrKind,
|
||||
/// \brief Retrieve a substitution-result type.
|
||||
QualType
|
||||
ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
|
||||
QualType Replacement) {
|
||||
QualType Replacement) const {
|
||||
assert(Replacement.isCanonical()
|
||||
&& "replacement types must always be canonical");
|
||||
|
||||
@ -1928,7 +1936,7 @@ ASTContext::getSubstTemplateTypeParmType(const TemplateTypeParmType *Parm,
|
||||
/// name.
|
||||
QualType ASTContext::getTemplateTypeParmType(unsigned Depth, unsigned Index,
|
||||
bool ParameterPack,
|
||||
IdentifierInfo *Name) {
|
||||
IdentifierInfo *Name) const {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
TemplateTypeParmType::Profile(ID, Depth, Index, ParameterPack, Name);
|
||||
void *InsertPos = 0;
|
||||
@ -1961,7 +1969,7 @@ TypeSourceInfo *
|
||||
ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
|
||||
SourceLocation NameLoc,
|
||||
const TemplateArgumentListInfo &Args,
|
||||
QualType CanonType) {
|
||||
QualType CanonType) const {
|
||||
QualType TST = getTemplateSpecializationType(Name, Args, CanonType);
|
||||
|
||||
TypeSourceInfo *DI = CreateTypeSourceInfo(TST);
|
||||
@ -1978,7 +1986,7 @@ ASTContext::getTemplateSpecializationTypeInfo(TemplateName Name,
|
||||
QualType
|
||||
ASTContext::getTemplateSpecializationType(TemplateName Template,
|
||||
const TemplateArgumentListInfo &Args,
|
||||
QualType Canon) {
|
||||
QualType Canon) const {
|
||||
unsigned NumArgs = Args.size();
|
||||
|
||||
llvm::SmallVector<TemplateArgument, 4> ArgVec;
|
||||
@ -1994,7 +2002,7 @@ QualType
|
||||
ASTContext::getTemplateSpecializationType(TemplateName Template,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
QualType Canon) {
|
||||
QualType Canon) const {
|
||||
if (!Canon.isNull())
|
||||
Canon = getCanonicalType(Canon);
|
||||
else
|
||||
@ -2018,7 +2026,7 @@ ASTContext::getTemplateSpecializationType(TemplateName Template,
|
||||
QualType
|
||||
ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs) {
|
||||
unsigned NumArgs) const {
|
||||
// Build the canonical template specialization type.
|
||||
TemplateName CanonTemplate = getCanonicalTemplateName(Template);
|
||||
llvm::SmallVector<TemplateArgument, 4> CanonArgs;
|
||||
@ -2056,7 +2064,7 @@ ASTContext::getCanonicalTemplateSpecializationType(TemplateName Template,
|
||||
QualType
|
||||
ASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
QualType NamedType) {
|
||||
QualType NamedType) const {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
ElaboratedType::Profile(ID, Keyword, NNS, NamedType);
|
||||
|
||||
@ -2080,7 +2088,7 @@ ASTContext::getElaboratedType(ElaboratedTypeKeyword Keyword,
|
||||
}
|
||||
|
||||
QualType
|
||||
ASTContext::getParenType(QualType InnerType) {
|
||||
ASTContext::getParenType(QualType InnerType) const {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
ParenType::Profile(ID, InnerType);
|
||||
|
||||
@ -2106,7 +2114,7 @@ ASTContext::getParenType(QualType InnerType) {
|
||||
QualType ASTContext::getDependentNameType(ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
QualType Canon) {
|
||||
QualType Canon) const {
|
||||
assert(NNS->isDependent() && "nested-name-specifier must be dependent");
|
||||
|
||||
if (Canon.isNull()) {
|
||||
@ -2139,7 +2147,7 @@ ASTContext::getDependentTemplateSpecializationType(
|
||||
ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
const TemplateArgumentListInfo &Args) {
|
||||
const TemplateArgumentListInfo &Args) const {
|
||||
// TODO: avoid this copy
|
||||
llvm::SmallVector<TemplateArgument, 16> ArgCopy;
|
||||
for (unsigned I = 0, E = Args.size(); I != E; ++I)
|
||||
@ -2155,7 +2163,7 @@ ASTContext::getDependentTemplateSpecializationType(
|
||||
NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name,
|
||||
unsigned NumArgs,
|
||||
const TemplateArgument *Args) {
|
||||
const TemplateArgument *Args) const {
|
||||
assert(NNS->isDependent() && "nested-name-specifier must be dependent");
|
||||
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -2258,7 +2266,7 @@ static void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols,
|
||||
|
||||
QualType ASTContext::getObjCObjectType(QualType BaseType,
|
||||
ObjCProtocolDecl * const *Protocols,
|
||||
unsigned NumProtocols) {
|
||||
unsigned NumProtocols) const {
|
||||
// If the base type is an interface and there aren't any protocols
|
||||
// to add, then the interface type will do just fine.
|
||||
if (!NumProtocols && isa<ObjCInterfaceType>(BaseType))
|
||||
@ -2306,7 +2314,7 @@ QualType ASTContext::getObjCObjectType(QualType BaseType,
|
||||
|
||||
/// getObjCObjectPointerType - Return a ObjCObjectPointerType type for
|
||||
/// the given object type.
|
||||
QualType ASTContext::getObjCObjectPointerType(QualType ObjectT) {
|
||||
QualType ASTContext::getObjCObjectPointerType(QualType ObjectT) const {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
ObjCObjectPointerType::Profile(ID, ObjectT);
|
||||
|
||||
@ -2336,7 +2344,7 @@ QualType ASTContext::getObjCObjectPointerType(QualType ObjectT) {
|
||||
|
||||
/// getObjCInterfaceType - Return the unique reference to the type for the
|
||||
/// specified ObjC interface decl. The list of protocols is optional.
|
||||
QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl) {
|
||||
QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl) const {
|
||||
if (Decl->TypeForDecl)
|
||||
return QualType(Decl->TypeForDecl, 0);
|
||||
|
||||
@ -2353,7 +2361,7 @@ QualType ASTContext::getObjCInterfaceType(const ObjCInterfaceDecl *Decl) {
|
||||
/// multiple declarations that refer to "typeof(x)" all contain different
|
||||
/// DeclRefExpr's. This doesn't effect the type checker, since it operates
|
||||
/// on canonical type's (which are always unique).
|
||||
QualType ASTContext::getTypeOfExprType(Expr *tofExpr) {
|
||||
QualType ASTContext::getTypeOfExprType(Expr *tofExpr) const {
|
||||
TypeOfExprType *toe;
|
||||
if (tofExpr->isTypeDependent()) {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -2388,7 +2396,7 @@ QualType ASTContext::getTypeOfExprType(Expr *tofExpr) {
|
||||
/// memory savings. Since typeof(t) is fairly uncommon, space shouldn't be
|
||||
/// an issue. This doesn't effect the type checker, since it operates
|
||||
/// on canonical type's (which are always unique).
|
||||
QualType ASTContext::getTypeOfType(QualType tofType) {
|
||||
QualType ASTContext::getTypeOfType(QualType tofType) const {
|
||||
QualType Canonical = getCanonicalType(tofType);
|
||||
TypeOfType *tot = new (*this, TypeAlignment) TypeOfType(tofType, Canonical);
|
||||
Types.push_back(tot);
|
||||
@ -2397,7 +2405,7 @@ QualType ASTContext::getTypeOfType(QualType tofType) {
|
||||
|
||||
/// getDecltypeForExpr - Given an expr, will return the decltype for that
|
||||
/// expression, according to the rules in C++0x [dcl.type.simple]p4
|
||||
static QualType getDecltypeForExpr(const Expr *e, ASTContext &Context) {
|
||||
static QualType getDecltypeForExpr(const Expr *e, const ASTContext &Context) {
|
||||
if (e->isTypeDependent())
|
||||
return Context.DependentTy;
|
||||
|
||||
@ -2432,7 +2440,7 @@ static QualType getDecltypeForExpr(const Expr *e, ASTContext &Context) {
|
||||
/// memory savings. Since decltype(t) is fairly uncommon, space shouldn't be
|
||||
/// an issue. This doesn't effect the type checker, since it operates
|
||||
/// on canonical type's (which are always unique).
|
||||
QualType ASTContext::getDecltypeType(Expr *e) {
|
||||
QualType ASTContext::getDecltypeType(Expr *e) const {
|
||||
DecltypeType *dt;
|
||||
if (e->isTypeDependent()) {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
@ -2463,7 +2471,7 @@ QualType ASTContext::getDecltypeType(Expr *e) {
|
||||
|
||||
/// getTagDeclType - Return the unique reference to the type for the
|
||||
/// specified TagDecl (struct/union/class/enum) decl.
|
||||
QualType ASTContext::getTagDeclType(const TagDecl *Decl) {
|
||||
QualType ASTContext::getTagDeclType(const TagDecl *Decl) const {
|
||||
assert (Decl);
|
||||
// FIXME: What is the design on getTagDeclType when it requires casting
|
||||
// away const? mutable?
|
||||
@ -2501,7 +2509,7 @@ QualType ASTContext::getPointerDiffType() const {
|
||||
// Type Operators
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
CanQualType ASTContext::getCanonicalParamType(QualType T) {
|
||||
CanQualType ASTContext::getCanonicalParamType(QualType T) const {
|
||||
// Push qualifiers into arrays, and then discard any remaining
|
||||
// qualifiers.
|
||||
T = getCanonicalType(T);
|
||||
@ -2525,7 +2533,7 @@ CanQualType ASTContext::getCanonicalParamType(QualType T) {
|
||||
/// include typedefs, 'typeof' operators, etc. The returned type is guaranteed
|
||||
/// to be free of any of these, allowing two canonical types to be compared
|
||||
/// for exact equality with a simple pointer comparison.
|
||||
CanQualType ASTContext::getCanonicalType(QualType T) {
|
||||
CanQualType ASTContext::getCanonicalType(QualType T) const {
|
||||
QualifierCollector Quals;
|
||||
const Type *Ptr = Quals.strip(T);
|
||||
QualType CanType = Ptr->getCanonicalTypeInternal();
|
||||
@ -2653,8 +2661,9 @@ bool ASTContext::UnwrapSimilarPointerTypes(QualType &T1, QualType &T2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
DeclarationNameInfo ASTContext::getNameForTemplate(TemplateName Name,
|
||||
SourceLocation NameLoc) {
|
||||
DeclarationNameInfo
|
||||
ASTContext::getNameForTemplate(TemplateName Name,
|
||||
SourceLocation NameLoc) const {
|
||||
if (TemplateDecl *TD = Name.getAsTemplateDecl())
|
||||
// DNInfo work in progress: CHECKME: what about DNLoc?
|
||||
return DeclarationNameInfo(TD->getDeclName(), NameLoc);
|
||||
@ -2680,7 +2689,7 @@ DeclarationNameInfo ASTContext::getNameForTemplate(TemplateName Name,
|
||||
return DeclarationNameInfo((*Storage->begin())->getDeclName(), NameLoc);
|
||||
}
|
||||
|
||||
TemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) {
|
||||
TemplateName ASTContext::getCanonicalTemplateName(TemplateName Name) const {
|
||||
if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
|
||||
if (TemplateTemplateParmDecl *TTP
|
||||
= dyn_cast<TemplateTemplateParmDecl>(Template))
|
||||
@ -2704,7 +2713,7 @@ bool ASTContext::hasSameTemplateName(TemplateName X, TemplateName Y) {
|
||||
}
|
||||
|
||||
TemplateArgument
|
||||
ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) {
|
||||
ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) const {
|
||||
switch (Arg.getKind()) {
|
||||
case TemplateArgument::Null:
|
||||
return Arg;
|
||||
@ -2752,7 +2761,7 @@ ASTContext::getCanonicalTemplateArgument(const TemplateArgument &Arg) {
|
||||
}
|
||||
|
||||
NestedNameSpecifier *
|
||||
ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) {
|
||||
ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const {
|
||||
if (!NNS)
|
||||
return 0;
|
||||
|
||||
@ -2811,7 +2820,7 @@ ASTContext::getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) {
|
||||
}
|
||||
|
||||
|
||||
const ArrayType *ASTContext::getAsArrayType(QualType T) {
|
||||
const ArrayType *ASTContext::getAsArrayType(QualType T) const {
|
||||
// Handle the non-qualified case efficiently.
|
||||
if (!T.hasLocalQualifiers()) {
|
||||
// Handle the common positive case fast.
|
||||
@ -2878,7 +2887,7 @@ const ArrayType *ASTContext::getAsArrayType(QualType T) {
|
||||
/// this returns a pointer to a properly qualified element of the array.
|
||||
///
|
||||
/// See C99 6.7.5.3p7 and C99 6.3.2.1p3.
|
||||
QualType ASTContext::getArrayDecayedType(QualType Ty) {
|
||||
QualType ASTContext::getArrayDecayedType(QualType Ty) const {
|
||||
// Get the element type with 'getAsArrayType' so that we don't lose any
|
||||
// typedefs in the element type of the array. This also handles propagation
|
||||
// of type qualifiers from the array type into the element type if present
|
||||
@ -2892,14 +2901,14 @@ QualType ASTContext::getArrayDecayedType(QualType Ty) {
|
||||
return getQualifiedType(PtrTy, PrettyArrayType->getIndexTypeQualifiers());
|
||||
}
|
||||
|
||||
QualType ASTContext::getBaseElementType(QualType QT) {
|
||||
QualType ASTContext::getBaseElementType(QualType QT) const {
|
||||
QualifierCollector Qs;
|
||||
while (const ArrayType *AT = getAsArrayType(QualType(Qs.strip(QT), 0)))
|
||||
QT = AT->getElementType();
|
||||
return Qs.apply(*this, QT);
|
||||
}
|
||||
|
||||
QualType ASTContext::getBaseElementType(const ArrayType *AT) {
|
||||
QualType ASTContext::getBaseElementType(const ArrayType *AT) const {
|
||||
QualType ElemTy = AT->getElementType();
|
||||
|
||||
if (const ArrayType *AT = getAsArrayType(ElemTy))
|
||||
@ -2963,7 +2972,7 @@ QualType ASTContext::getFloatingTypeOfSizeWithinDomain(QualType Size,
|
||||
/// point types, ignoring the domain of the type (i.e. 'double' ==
|
||||
/// '_Complex double'). If LHS > RHS, return 1. If LHS == RHS, return 0. If
|
||||
/// LHS < RHS, return -1.
|
||||
int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) {
|
||||
int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) const {
|
||||
FloatingRank LHSR = getFloatingRank(LHS);
|
||||
FloatingRank RHSR = getFloatingRank(RHS);
|
||||
|
||||
@ -2977,7 +2986,7 @@ int ASTContext::getFloatingTypeOrder(QualType LHS, QualType RHS) {
|
||||
/// getIntegerRank - Return an integer conversion rank (C99 6.3.1.1p1). This
|
||||
/// routine will assert if passed a built-in type that isn't an integer or enum,
|
||||
/// or if it is not canonicalized.
|
||||
unsigned ASTContext::getIntegerRank(Type *T) {
|
||||
unsigned ASTContext::getIntegerRank(Type *T) const {
|
||||
assert(T->isCanonicalUnqualified() && "T should be canonicalized");
|
||||
if (EnumType* ET = dyn_cast<EnumType>(T))
|
||||
T = ET->getDecl()->getPromotionType().getTypePtr();
|
||||
@ -3024,7 +3033,7 @@ unsigned ASTContext::getIntegerRank(Type *T) {
|
||||
///
|
||||
/// \returns the type this bit-field will promote to, or NULL if no
|
||||
/// promotion occurs.
|
||||
QualType ASTContext::isPromotableBitField(Expr *E) {
|
||||
QualType ASTContext::isPromotableBitField(Expr *E) const {
|
||||
if (E->isTypeDependent() || E->isValueDependent())
|
||||
return QualType();
|
||||
|
||||
@ -3056,7 +3065,7 @@ QualType ASTContext::isPromotableBitField(Expr *E) {
|
||||
/// getPromotedIntegerType - Returns the type that Promotable will
|
||||
/// promote to: C99 6.3.1.1p2, assuming that Promotable is a promotable
|
||||
/// integer type.
|
||||
QualType ASTContext::getPromotedIntegerType(QualType Promotable) {
|
||||
QualType ASTContext::getPromotedIntegerType(QualType Promotable) const {
|
||||
assert(!Promotable.isNull());
|
||||
assert(Promotable->isPromotableIntegerType());
|
||||
if (const EnumType *ET = Promotable->getAs<EnumType>())
|
||||
@ -3072,7 +3081,7 @@ QualType ASTContext::getPromotedIntegerType(QualType Promotable) {
|
||||
/// getIntegerTypeOrder - Returns the highest ranked integer type:
|
||||
/// C99 6.3.1.8p1. If LHS > RHS, return 1. If LHS == RHS, return 0. If
|
||||
/// LHS < RHS, return -1.
|
||||
int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) {
|
||||
int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) const {
|
||||
Type *LHSC = getCanonicalType(LHS).getTypePtr();
|
||||
Type *RHSC = getCanonicalType(RHS).getTypePtr();
|
||||
if (LHSC == RHSC) return 0;
|
||||
@ -3111,7 +3120,7 @@ int ASTContext::getIntegerTypeOrder(QualType LHS, QualType RHS) {
|
||||
}
|
||||
|
||||
static RecordDecl *
|
||||
CreateRecordDecl(ASTContext &Ctx, RecordDecl::TagKind TK, DeclContext *DC,
|
||||
CreateRecordDecl(const ASTContext &Ctx, RecordDecl::TagKind TK, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id) {
|
||||
if (Ctx.getLangOptions().CPlusPlus)
|
||||
return CXXRecordDecl::Create(Ctx, TK, DC, L, Id);
|
||||
@ -3120,7 +3129,7 @@ CreateRecordDecl(ASTContext &Ctx, RecordDecl::TagKind TK, DeclContext *DC,
|
||||
}
|
||||
|
||||
// getCFConstantStringType - Return the type used for constant CFStrings.
|
||||
QualType ASTContext::getCFConstantStringType() {
|
||||
QualType ASTContext::getCFConstantStringType() const {
|
||||
if (!CFConstantStringTypeDecl) {
|
||||
CFConstantStringTypeDecl =
|
||||
CreateRecordDecl(*this, TTK_Struct, TUDecl, SourceLocation(),
|
||||
@ -3162,7 +3171,7 @@ void ASTContext::setCFConstantStringType(QualType T) {
|
||||
}
|
||||
|
||||
// getNSConstantStringType - Return the type used for constant NSStrings.
|
||||
QualType ASTContext::getNSConstantStringType() {
|
||||
QualType ASTContext::getNSConstantStringType() const {
|
||||
if (!NSConstantStringTypeDecl) {
|
||||
NSConstantStringTypeDecl =
|
||||
CreateRecordDecl(*this, TTK_Struct, TUDecl, SourceLocation(),
|
||||
@ -3201,7 +3210,7 @@ void ASTContext::setNSConstantStringType(QualType T) {
|
||||
NSConstantStringTypeDecl = Rec->getDecl();
|
||||
}
|
||||
|
||||
QualType ASTContext::getObjCFastEnumerationStateType() {
|
||||
QualType ASTContext::getObjCFastEnumerationStateType() const {
|
||||
if (!ObjCFastEnumerationStateTypeDecl) {
|
||||
ObjCFastEnumerationStateTypeDecl =
|
||||
CreateRecordDecl(*this, TTK_Struct, TUDecl, SourceLocation(),
|
||||
@ -3233,7 +3242,7 @@ QualType ASTContext::getObjCFastEnumerationStateType() {
|
||||
return getTagDeclType(ObjCFastEnumerationStateTypeDecl);
|
||||
}
|
||||
|
||||
QualType ASTContext::getBlockDescriptorType() {
|
||||
QualType ASTContext::getBlockDescriptorType() const {
|
||||
if (BlockDescriptorType)
|
||||
return getTagDeclType(BlockDescriptorType);
|
||||
|
||||
@ -3278,7 +3287,7 @@ void ASTContext::setBlockDescriptorType(QualType T) {
|
||||
BlockDescriptorType = Rec->getDecl();
|
||||
}
|
||||
|
||||
QualType ASTContext::getBlockDescriptorExtendedType() {
|
||||
QualType ASTContext::getBlockDescriptorExtendedType() const {
|
||||
if (BlockDescriptorExtendedType)
|
||||
return getTagDeclType(BlockDescriptorExtendedType);
|
||||
|
||||
@ -3327,7 +3336,7 @@ void ASTContext::setBlockDescriptorExtendedType(QualType T) {
|
||||
BlockDescriptorExtendedType = Rec->getDecl();
|
||||
}
|
||||
|
||||
bool ASTContext::BlockRequiresCopying(QualType Ty) {
|
||||
bool ASTContext::BlockRequiresCopying(QualType Ty) const {
|
||||
if (Ty->isBlockPointerType())
|
||||
return true;
|
||||
if (isObjCNSObjectType(Ty))
|
||||
@ -3344,7 +3353,8 @@ bool ASTContext::BlockRequiresCopying(QualType Ty) {
|
||||
return false;
|
||||
}
|
||||
|
||||
QualType ASTContext::BuildByRefType(llvm::StringRef DeclName, QualType Ty) {
|
||||
QualType
|
||||
ASTContext::BuildByRefType(llvm::StringRef DeclName, QualType Ty) const {
|
||||
// type = struct __Block_byref_1_X {
|
||||
// void *__isa;
|
||||
// struct __Block_byref_1_X *__forwarding;
|
||||
@ -3406,7 +3416,7 @@ QualType ASTContext::BuildByRefType(llvm::StringRef DeclName, QualType Ty) {
|
||||
|
||||
QualType ASTContext::getBlockParmType(
|
||||
bool BlockHasCopyDispose,
|
||||
llvm::SmallVectorImpl<const Expr *> &Layout) {
|
||||
llvm::SmallVectorImpl<const Expr *> &Layout) const {
|
||||
|
||||
// FIXME: Move up
|
||||
llvm::SmallString<36> Name;
|
||||
@ -3493,7 +3503,7 @@ static bool isTypeTypedefedAsBOOL(QualType T) {
|
||||
|
||||
/// getObjCEncodingTypeSize returns size of type for objective-c encoding
|
||||
/// purpose.
|
||||
CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) {
|
||||
CharUnits ASTContext::getObjCEncodingTypeSize(QualType type) const {
|
||||
CharUnits sz = getTypeSizeInChars(type);
|
||||
|
||||
// Make all integer and enum types at least as large as an int
|
||||
@ -3513,7 +3523,7 @@ std::string charUnitsToString(const CharUnits &CU) {
|
||||
/// getObjCEncodingForBlockDecl - Return the encoded type for this block
|
||||
/// declaration.
|
||||
void ASTContext::getObjCEncodingForBlock(const BlockExpr *Expr,
|
||||
std::string& S) {
|
||||
std::string& S) const {
|
||||
const BlockDecl *Decl = Expr->getBlockDecl();
|
||||
QualType BlockTy =
|
||||
Expr->getType()->getAs<BlockPointerType>()->getPointeeType();
|
||||
@ -3597,7 +3607,7 @@ void ASTContext::getObjCEncodingForFunctionDecl(const FunctionDecl *Decl,
|
||||
/// getObjCEncodingForMethodDecl - Return the encoded type for this method
|
||||
/// declaration.
|
||||
void ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
|
||||
std::string& S) {
|
||||
std::string& S) const {
|
||||
// FIXME: This is not very efficient.
|
||||
// Encode type qualifer, 'in', 'inout', etc. for the return type.
|
||||
getObjCEncodingForTypeQualifier(Decl->getObjCDeclQualifier(), S);
|
||||
@ -3673,7 +3683,7 @@ void ASTContext::getObjCEncodingForMethodDecl(const ObjCMethodDecl *Decl,
|
||||
/// @endcode
|
||||
void ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
|
||||
const Decl *Container,
|
||||
std::string& S) {
|
||||
std::string& S) const {
|
||||
// Collect information from the property implementation decl(s).
|
||||
bool Dynamic = false;
|
||||
ObjCPropertyImplDecl *SynthesizePID = 0;
|
||||
@ -3766,19 +3776,17 @@ void ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
|
||||
void ASTContext::getLegacyIntegralTypeEncoding (QualType &PointeeTy) const {
|
||||
if (isa<TypedefType>(PointeeTy.getTypePtr())) {
|
||||
if (const BuiltinType *BT = PointeeTy->getAs<BuiltinType>()) {
|
||||
if (BT->getKind() == BuiltinType::ULong &&
|
||||
((const_cast<ASTContext *>(this))->getIntWidth(PointeeTy) == 32))
|
||||
if (BT->getKind() == BuiltinType::ULong && getIntWidth(PointeeTy) == 32)
|
||||
PointeeTy = UnsignedIntTy;
|
||||
else
|
||||
if (BT->getKind() == BuiltinType::Long &&
|
||||
((const_cast<ASTContext *>(this))->getIntWidth(PointeeTy) == 32))
|
||||
if (BT->getKind() == BuiltinType::Long && getIntWidth(PointeeTy) == 32)
|
||||
PointeeTy = IntTy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ASTContext::getObjCEncodingForType(QualType T, std::string& S,
|
||||
const FieldDecl *Field) {
|
||||
const FieldDecl *Field) const {
|
||||
// We follow the behavior of gcc, expanding structures which are
|
||||
// directly pointed to, and expanding embedded structures. Note that
|
||||
// these rules are sufficient to prevent recursive encoding of the
|
||||
@ -3797,8 +3805,7 @@ static char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) {
|
||||
case BuiltinType::UShort: return 'S';
|
||||
case BuiltinType::UInt: return 'I';
|
||||
case BuiltinType::ULong:
|
||||
return
|
||||
(const_cast<ASTContext *>(C))->getIntWidth(T) == 32 ? 'L' : 'Q';
|
||||
return C->getIntWidth(T) == 32 ? 'L' : 'Q';
|
||||
case BuiltinType::UInt128: return 'T';
|
||||
case BuiltinType::ULongLong: return 'Q';
|
||||
case BuiltinType::Char_S:
|
||||
@ -3808,8 +3815,7 @@ static char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) {
|
||||
case BuiltinType::WChar_U:
|
||||
case BuiltinType::Int: return 'i';
|
||||
case BuiltinType::Long:
|
||||
return
|
||||
(const_cast<ASTContext *>(C))->getIntWidth(T) == 32 ? 'l' : 'q';
|
||||
return C->getIntWidth(T) == 32 ? 'l' : 'q';
|
||||
case BuiltinType::LongLong: return 'q';
|
||||
case BuiltinType::Int128: return 't';
|
||||
case BuiltinType::Float: return 'f';
|
||||
@ -3818,11 +3824,10 @@ static char ObjCEncodingForPrimitiveKind(const ASTContext *C, QualType T) {
|
||||
}
|
||||
}
|
||||
|
||||
static void EncodeBitField(const ASTContext *Context, std::string& S,
|
||||
static void EncodeBitField(const ASTContext *Ctx, std::string& S,
|
||||
QualType T, const FieldDecl *FD) {
|
||||
const Expr *E = FD->getBitWidth();
|
||||
assert(E && "bitfield width not there - getObjCEncodingForTypeImpl");
|
||||
ASTContext *Ctx = const_cast<ASTContext*>(Context);
|
||||
S += 'b';
|
||||
// The NeXT runtime encodes bit fields as b followed by the number of bits.
|
||||
// The GNU runtime requires more information; bitfields are encoded as b,
|
||||
@ -3856,7 +3861,7 @@ static void EncodeBitField(const ASTContext *Context, std::string& S,
|
||||
if (T->isEnumeralType())
|
||||
S += 'i';
|
||||
else
|
||||
S += ObjCEncodingForPrimitiveKind(Context, T);
|
||||
S += ObjCEncodingForPrimitiveKind(Ctx, T);
|
||||
}
|
||||
unsigned N = E->EvaluateAsInt(*Ctx).getZExtValue();
|
||||
S += llvm::utostr(N);
|
||||
@ -3868,7 +3873,7 @@ void ASTContext::getObjCEncodingForTypeImpl(QualType T, std::string& S,
|
||||
bool ExpandStructures,
|
||||
const FieldDecl *FD,
|
||||
bool OutermostType,
|
||||
bool EncodingProperty) {
|
||||
bool EncodingProperty) const {
|
||||
if (T->getAs<BuiltinType>()) {
|
||||
if (FD && FD->isBitField())
|
||||
return EncodeBitField(this, S, T, FD);
|
||||
@ -4189,8 +4194,9 @@ void ASTContext::setObjCConstantStringInterface(ObjCInterfaceDecl *Decl) {
|
||||
|
||||
/// \brief Retrieve the template name that corresponds to a non-empty
|
||||
/// lookup.
|
||||
TemplateName ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
|
||||
UnresolvedSetIterator End) {
|
||||
TemplateName
|
||||
ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
|
||||
UnresolvedSetIterator End) const {
|
||||
unsigned size = End - Begin;
|
||||
assert(size > 1 && "set is not overloaded!");
|
||||
|
||||
@ -4212,9 +4218,10 @@ TemplateName ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin,
|
||||
|
||||
/// \brief Retrieve the template name that represents a qualified
|
||||
/// template name such as \c std::vector.
|
||||
TemplateName ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
|
||||
bool TemplateKeyword,
|
||||
TemplateDecl *Template) {
|
||||
TemplateName
|
||||
ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
|
||||
bool TemplateKeyword,
|
||||
TemplateDecl *Template) const {
|
||||
// FIXME: Canonicalization?
|
||||
llvm::FoldingSetNodeID ID;
|
||||
QualifiedTemplateName::Profile(ID, NNS, TemplateKeyword, Template);
|
||||
@ -4232,8 +4239,9 @@ TemplateName ASTContext::getQualifiedTemplateName(NestedNameSpecifier *NNS,
|
||||
|
||||
/// \brief Retrieve the template name that represents a dependent
|
||||
/// template name such as \c MetaFun::template apply.
|
||||
TemplateName ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name) {
|
||||
TemplateName
|
||||
ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
|
||||
const IdentifierInfo *Name) const {
|
||||
assert((!NNS || NNS->isDependent()) &&
|
||||
"Nested name specifier must be dependent");
|
||||
|
||||
@ -4267,7 +4275,7 @@ TemplateName ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
|
||||
/// template name such as \c MetaFun::template operator+.
|
||||
TemplateName
|
||||
ASTContext::getDependentTemplateName(NestedNameSpecifier *NNS,
|
||||
OverloadedOperatorKind Operator) {
|
||||
OverloadedOperatorKind Operator) const {
|
||||
assert((!NNS || NNS->isDependent()) &&
|
||||
"Nested name specifier must be dependent");
|
||||
|
||||
@ -4409,8 +4417,9 @@ bool ASTContext::areCompatibleVectorTypes(QualType FirstVec,
|
||||
|
||||
/// ProtocolCompatibleWithProtocol - return 'true' if 'lProto' is in the
|
||||
/// inheritance hierarchy of 'rProto'.
|
||||
bool ASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
|
||||
ObjCProtocolDecl *rProto) {
|
||||
bool
|
||||
ASTContext::ProtocolCompatibleWithProtocol(ObjCProtocolDecl *lProto,
|
||||
ObjCProtocolDecl *rProto) const {
|
||||
if (lProto == rProto)
|
||||
return true;
|
||||
for (ObjCProtocolDecl::protocol_iterator PI = rProto->protocol_begin(),
|
||||
@ -5334,7 +5343,7 @@ QualType ASTContext::mergeObjCGCQualifiers(QualType LHS, QualType RHS) {
|
||||
// Integer Predicates
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
unsigned ASTContext::getIntWidth(QualType T) {
|
||||
unsigned ASTContext::getIntWidth(QualType T) const {
|
||||
if (EnumType *ET = dyn_cast<EnumType>(T))
|
||||
T = ET->getDecl()->getIntegerType();
|
||||
if (T->isBooleanType())
|
||||
@ -5396,7 +5405,7 @@ ASTMutationListener::~ASTMutationListener() { }
|
||||
///
|
||||
/// RequiresICE is filled in on return to indicate whether the value is required
|
||||
/// to be an Integer Constant Expression.
|
||||
static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context,
|
||||
static QualType DecodeTypeFromStr(const char *&Str, const ASTContext &Context,
|
||||
ASTContext::GetBuiltinTypeError &Error,
|
||||
bool &RequiresICE,
|
||||
bool AllowTypeModifiers) {
|
||||
@ -5598,7 +5607,7 @@ static QualType DecodeTypeFromStr(const char *&Str, ASTContext &Context,
|
||||
/// GetBuiltinType - Return the type for the specified builtin.
|
||||
QualType ASTContext::GetBuiltinType(unsigned Id,
|
||||
GetBuiltinTypeError &Error,
|
||||
unsigned *IntegerConstantArgs) {
|
||||
unsigned *IntegerConstantArgs) const {
|
||||
const char *TypeStr = BuiltinInfo.GetTypeString(Id);
|
||||
|
||||
llvm::SmallVector<QualType, 8> ArgTypes;
|
||||
@ -5821,7 +5830,7 @@ CallingConv ASTContext::getDefaultMethodCallConv() {
|
||||
return ABI->getDefaultMethodCallConv();
|
||||
}
|
||||
|
||||
bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) {
|
||||
bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const {
|
||||
// Pass through to the C++ ABI object
|
||||
return ABI->isNearlyEmpty(RD);
|
||||
}
|
||||
|
@ -1855,8 +1855,8 @@ bool FunctionDecl::isOutOfLine() const {
|
||||
// FieldDecl Implementation
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
FieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
|
||||
IdentifierInfo *Id, QualType T,
|
||||
FieldDecl *FieldDecl::Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id, QualType T,
|
||||
TypeSourceInfo *TInfo, Expr *BW, bool Mutable) {
|
||||
return new (C) FieldDecl(Decl::Field, DC, L, Id, T, TInfo, BW, Mutable);
|
||||
}
|
||||
@ -2000,7 +2000,7 @@ RecordDecl::RecordDecl(Kind DK, TagKind TK, DeclContext *DC, SourceLocation L,
|
||||
assert(classof(static_cast<Decl*>(this)) && "Invalid Kind!");
|
||||
}
|
||||
|
||||
RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
RecordDecl *RecordDecl::Create(const ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation TKL, RecordDecl* PrevDecl) {
|
||||
|
||||
@ -2009,7 +2009,7 @@ RecordDecl *RecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
return R;
|
||||
}
|
||||
|
||||
RecordDecl *RecordDecl::Create(ASTContext &C, EmptyShell Empty) {
|
||||
RecordDecl *RecordDecl::Create(const ASTContext &C, EmptyShell Empty) {
|
||||
return new (C) RecordDecl(Record, TTK_Struct, 0, SourceLocation(), 0, 0,
|
||||
SourceLocation());
|
||||
}
|
||||
|
@ -48,9 +48,9 @@ CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, DeclContext *DC,
|
||||
DefinitionData(PrevDecl ? PrevDecl->DefinitionData : 0),
|
||||
TemplateOrInstantiation() { }
|
||||
|
||||
CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation TKL,
|
||||
CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK,
|
||||
DeclContext *DC, SourceLocation L,
|
||||
IdentifierInfo *Id, SourceLocation TKL,
|
||||
CXXRecordDecl* PrevDecl,
|
||||
bool DelayTypeCreation) {
|
||||
CXXRecordDecl* R = new (C) CXXRecordDecl(CXXRecord, TK, DC, L, Id,
|
||||
@ -62,7 +62,7 @@ CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, TagKind TK, DeclContext *DC,
|
||||
return R;
|
||||
}
|
||||
|
||||
CXXRecordDecl *CXXRecordDecl::Create(ASTContext &C, EmptyShell Empty) {
|
||||
CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, EmptyShell Empty) {
|
||||
return new (C) CXXRecordDecl(CXXRecord, TTK_Struct, 0, SourceLocation(), 0, 0,
|
||||
SourceLocation());
|
||||
}
|
||||
@ -214,7 +214,7 @@ bool CXXRecordDecl::hasAnyDependentBases() const {
|
||||
return !forallBases(SawBase, 0);
|
||||
}
|
||||
|
||||
bool CXXRecordDecl::hasConstCopyConstructor(ASTContext &Context) const {
|
||||
bool CXXRecordDecl::hasConstCopyConstructor(const ASTContext &Context) const {
|
||||
return getCopyConstructor(Context, Qualifiers::Const) != 0;
|
||||
}
|
||||
|
||||
@ -241,7 +241,7 @@ GetBestOverloadCandidateSimple(
|
||||
return Cands[Best].first;
|
||||
}
|
||||
|
||||
CXXConstructorDecl *CXXRecordDecl::getCopyConstructor(ASTContext &Context,
|
||||
CXXConstructorDecl *CXXRecordDecl::getCopyConstructor(const ASTContext &Context,
|
||||
unsigned TypeQuals) const{
|
||||
QualType ClassType
|
||||
= Context.getTypeDeclType(const_cast<CXXRecordDecl*>(this));
|
||||
|
@ -38,7 +38,7 @@ TemplateParameterList::TemplateParameterList(SourceLocation TemplateLoc,
|
||||
}
|
||||
|
||||
TemplateParameterList *
|
||||
TemplateParameterList::Create(ASTContext &C, SourceLocation TemplateLoc,
|
||||
TemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc,
|
||||
SourceLocation LAngleLoc, NamedDecl **Params,
|
||||
unsigned NumParams, SourceLocation RAngleLoc) {
|
||||
unsigned Size = sizeof(TemplateParameterList)
|
||||
@ -356,7 +356,7 @@ ClassTemplateDecl::getInjectedClassNameSpecialization() {
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TemplateTypeParmDecl *
|
||||
TemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
|
||||
TemplateTypeParmDecl::Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, unsigned D, unsigned P,
|
||||
IdentifierInfo *Id, bool Typename,
|
||||
bool ParameterPack) {
|
||||
@ -365,7 +365,7 @@ TemplateTypeParmDecl::Create(ASTContext &C, DeclContext *DC,
|
||||
}
|
||||
|
||||
TemplateTypeParmDecl *
|
||||
TemplateTypeParmDecl::Create(ASTContext &C, EmptyShell Empty) {
|
||||
TemplateTypeParmDecl::Create(const ASTContext &C, EmptyShell Empty) {
|
||||
return new (C) TemplateTypeParmDecl(0, SourceLocation(), 0, false,
|
||||
QualType(), false);
|
||||
}
|
||||
@ -387,7 +387,7 @@ unsigned TemplateTypeParmDecl::getIndex() const {
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
NonTypeTemplateParmDecl *
|
||||
NonTypeTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
|
||||
NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, unsigned D, unsigned P,
|
||||
IdentifierInfo *Id, QualType T,
|
||||
bool ParameterPack, TypeSourceInfo *TInfo) {
|
||||
@ -406,7 +406,7 @@ SourceLocation NonTypeTemplateParmDecl::getDefaultArgumentLoc() const {
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
TemplateTemplateParmDecl *
|
||||
TemplateTemplateParmDecl::Create(ASTContext &C, DeclContext *DC,
|
||||
TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
|
||||
SourceLocation L, unsigned D, unsigned P,
|
||||
bool ParameterPack, IdentifierInfo *Id,
|
||||
TemplateParameterList *Params) {
|
||||
|
@ -386,7 +386,7 @@ void DeclarationName::dump() const {
|
||||
llvm::errs() << '\n';
|
||||
}
|
||||
|
||||
DeclarationNameTable::DeclarationNameTable(ASTContext &C) : Ctx(C) {
|
||||
DeclarationNameTable::DeclarationNameTable(const ASTContext &C) : Ctx(C) {
|
||||
CXXSpecialNamesImpl = new llvm::FoldingSet<CXXSpecialName>;
|
||||
CXXLiteralOperatorNames = new llvm::FoldingSet<CXXLiteralOperatorIdName>;
|
||||
|
||||
|
@ -724,7 +724,7 @@ void CallExpr::setNumArgs(ASTContext& C, unsigned NumArgs) {
|
||||
|
||||
/// isBuiltinCall - If this is a call to a builtin, return the builtin ID. If
|
||||
/// not, return 0.
|
||||
unsigned CallExpr::isBuiltinCall(ASTContext &Context) const {
|
||||
unsigned CallExpr::isBuiltinCall(const ASTContext &Context) const {
|
||||
// All simple function calls (e.g. func()) are implicitly cast to pointer to
|
||||
// function. As a result, we try and obtain the DeclRefExpr from the
|
||||
// ImplicitCastExpr.
|
||||
@ -2453,7 +2453,7 @@ ObjCInterfaceDecl *ObjCMessageExpr::getReceiverInterface() const {
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool ChooseExpr::isConditionTrue(ASTContext &C) const {
|
||||
bool ChooseExpr::isConditionTrue(const ASTContext &C) const {
|
||||
return getCond()->EvaluateAsInt(C) != 0;
|
||||
}
|
||||
|
||||
|
@ -43,12 +43,12 @@ using llvm::APFloat;
|
||||
/// evaluate the expression regardless of what the RHS is, but C only allows
|
||||
/// certain things in certain situations.
|
||||
struct EvalInfo {
|
||||
ASTContext &Ctx;
|
||||
const ASTContext &Ctx;
|
||||
|
||||
/// EvalResult - Contains information about the evaluation.
|
||||
Expr::EvalResult &EvalResult;
|
||||
|
||||
EvalInfo(ASTContext &ctx, Expr::EvalResult& evalresult)
|
||||
EvalInfo(const ASTContext &ctx, Expr::EvalResult& evalresult)
|
||||
: Ctx(ctx), EvalResult(evalresult) {}
|
||||
};
|
||||
|
||||
@ -192,7 +192,7 @@ static bool HandleConversionToBool(const Expr* E, bool& Result,
|
||||
}
|
||||
|
||||
static APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
|
||||
APFloat &Value, ASTContext &Ctx) {
|
||||
APFloat &Value, const ASTContext &Ctx) {
|
||||
unsigned DestWidth = Ctx.getIntWidth(DestType);
|
||||
// Determine whether we are converting to unsigned or signed.
|
||||
bool DestSigned = DestType->isSignedIntegerType();
|
||||
@ -206,7 +206,7 @@ static APSInt HandleFloatToIntCast(QualType DestType, QualType SrcType,
|
||||
}
|
||||
|
||||
static APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
|
||||
APFloat &Value, ASTContext &Ctx) {
|
||||
APFloat &Value, const ASTContext &Ctx) {
|
||||
bool ignored;
|
||||
APFloat Result = Value;
|
||||
Result.convert(Ctx.getFloatTypeSemantics(DestType),
|
||||
@ -215,7 +215,7 @@ static APFloat HandleFloatToFloatCast(QualType DestType, QualType SrcType,
|
||||
}
|
||||
|
||||
static APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
|
||||
APSInt &Value, ASTContext &Ctx) {
|
||||
APSInt &Value, const ASTContext &Ctx) {
|
||||
unsigned DestWidth = Ctx.getIntWidth(DestType);
|
||||
APSInt Result = Value;
|
||||
// Figure out if this is a truncate, extend or noop cast.
|
||||
@ -226,7 +226,7 @@ static APSInt HandleIntToIntCast(QualType DestType, QualType SrcType,
|
||||
}
|
||||
|
||||
static APFloat HandleIntToFloatCast(QualType DestType, QualType SrcType,
|
||||
APSInt &Value, ASTContext &Ctx) {
|
||||
APSInt &Value, const ASTContext &Ctx) {
|
||||
|
||||
APFloat Result(Ctx.getFloatTypeSemantics(DestType), 1);
|
||||
Result.convertFromAPInt(Value, Value.isSigned(),
|
||||
@ -1818,7 +1818,7 @@ static bool EvaluateFloat(const Expr* E, APFloat& Result, EvalInfo &Info) {
|
||||
return FloatExprEvaluator(Info, Result).Visit(const_cast<Expr*>(E));
|
||||
}
|
||||
|
||||
static bool TryEvaluateBuiltinNaN(ASTContext &Context,
|
||||
static bool TryEvaluateBuiltinNaN(const ASTContext &Context,
|
||||
QualType ResultTy,
|
||||
const Expr *Arg,
|
||||
bool SNaN,
|
||||
@ -2440,7 +2440,7 @@ bool ComplexExprEvaluator::VisitConditionalOperator(const ConditionalOperator *E
|
||||
/// any crazy technique (that has nothing to do with language standards) that
|
||||
/// we want to. If this function returns true, it returns the folded constant
|
||||
/// in Result.
|
||||
bool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
|
||||
bool Expr::Evaluate(EvalResult &Result, const ASTContext &Ctx) const {
|
||||
const Expr *E = this;
|
||||
EvalInfo Info(Ctx, Result);
|
||||
if (E->getType()->isVectorType()) {
|
||||
@ -2475,14 +2475,15 @@ bool Expr::Evaluate(EvalResult &Result, ASTContext &Ctx) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Expr::EvaluateAsBooleanCondition(bool &Result, ASTContext &Ctx) const {
|
||||
bool Expr::EvaluateAsBooleanCondition(bool &Result,
|
||||
const ASTContext &Ctx) const {
|
||||
EvalResult Scratch;
|
||||
EvalInfo Info(Ctx, Scratch);
|
||||
|
||||
return HandleConversionToBool(this, Result, Info);
|
||||
}
|
||||
|
||||
bool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const {
|
||||
bool Expr::EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx) const {
|
||||
EvalInfo Info(Ctx, Result);
|
||||
|
||||
LValue LV;
|
||||
@ -2495,7 +2496,8 @@ bool Expr::EvaluateAsLValue(EvalResult &Result, ASTContext &Ctx) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const {
|
||||
bool Expr::EvaluateAsAnyLValue(EvalResult &Result,
|
||||
const ASTContext &Ctx) const {
|
||||
EvalInfo Info(Ctx, Result);
|
||||
|
||||
LValue LV;
|
||||
@ -2508,18 +2510,18 @@ bool Expr::EvaluateAsAnyLValue(EvalResult &Result, ASTContext &Ctx) const {
|
||||
|
||||
/// isEvaluatable - Call Evaluate to see if this expression can be constant
|
||||
/// folded, but discard the result.
|
||||
bool Expr::isEvaluatable(ASTContext &Ctx) const {
|
||||
bool Expr::isEvaluatable(const ASTContext &Ctx) const {
|
||||
EvalResult Result;
|
||||
return Evaluate(Result, Ctx) && !Result.HasSideEffects;
|
||||
}
|
||||
|
||||
bool Expr::HasSideEffects(ASTContext &Ctx) const {
|
||||
bool Expr::HasSideEffects(const ASTContext &Ctx) const {
|
||||
Expr::EvalResult Result;
|
||||
EvalInfo Info(Ctx, Result);
|
||||
return HasSideEffect(Info).Visit(const_cast<Expr*>(this));
|
||||
}
|
||||
|
||||
APSInt Expr::EvaluateAsInt(ASTContext &Ctx) const {
|
||||
APSInt Expr::EvaluateAsInt(const ASTContext &Ctx) const {
|
||||
EvalResult EvalResult;
|
||||
bool Result = Evaluate(EvalResult, Ctx);
|
||||
(void)Result;
|
||||
|
@ -22,7 +22,7 @@
|
||||
using namespace clang;
|
||||
|
||||
NestedNameSpecifier *
|
||||
NestedNameSpecifier::FindOrInsert(ASTContext &Context,
|
||||
NestedNameSpecifier::FindOrInsert(const ASTContext &Context,
|
||||
const NestedNameSpecifier &Mockup) {
|
||||
llvm::FoldingSetNodeID ID;
|
||||
Mockup.Profile(ID);
|
||||
@ -39,8 +39,8 @@ NestedNameSpecifier::FindOrInsert(ASTContext &Context,
|
||||
}
|
||||
|
||||
NestedNameSpecifier *
|
||||
NestedNameSpecifier::Create(ASTContext &Context, NestedNameSpecifier *Prefix,
|
||||
IdentifierInfo *II) {
|
||||
NestedNameSpecifier::Create(const ASTContext &Context,
|
||||
NestedNameSpecifier *Prefix, IdentifierInfo *II) {
|
||||
assert(II && "Identifier cannot be NULL");
|
||||
assert((!Prefix || Prefix->isDependent()) && "Prefix must be dependent");
|
||||
|
||||
@ -52,8 +52,8 @@ NestedNameSpecifier::Create(ASTContext &Context, NestedNameSpecifier *Prefix,
|
||||
}
|
||||
|
||||
NestedNameSpecifier *
|
||||
NestedNameSpecifier::Create(ASTContext &Context, NestedNameSpecifier *Prefix,
|
||||
NamespaceDecl *NS) {
|
||||
NestedNameSpecifier::Create(const ASTContext &Context,
|
||||
NestedNameSpecifier *Prefix, NamespaceDecl *NS) {
|
||||
assert(NS && "Namespace cannot be NULL");
|
||||
assert((!Prefix ||
|
||||
(Prefix->getAsType() == 0 && Prefix->getAsIdentifier() == 0)) &&
|
||||
@ -66,7 +66,8 @@ NestedNameSpecifier::Create(ASTContext &Context, NestedNameSpecifier *Prefix,
|
||||
}
|
||||
|
||||
NestedNameSpecifier *
|
||||
NestedNameSpecifier::Create(ASTContext &Context, NestedNameSpecifier *Prefix,
|
||||
NestedNameSpecifier::Create(const ASTContext &Context,
|
||||
NestedNameSpecifier *Prefix,
|
||||
bool Template, Type *T) {
|
||||
assert(T && "Type cannot be NULL");
|
||||
NestedNameSpecifier Mockup;
|
||||
@ -77,7 +78,7 @@ NestedNameSpecifier::Create(ASTContext &Context, NestedNameSpecifier *Prefix,
|
||||
}
|
||||
|
||||
NestedNameSpecifier *
|
||||
NestedNameSpecifier::Create(ASTContext &Context, IdentifierInfo *II) {
|
||||
NestedNameSpecifier::Create(const ASTContext &Context, IdentifierInfo *II) {
|
||||
assert(II && "Identifier cannot be NULL");
|
||||
NestedNameSpecifier Mockup;
|
||||
Mockup.Prefix.setPointer(0);
|
||||
@ -86,7 +87,8 @@ NestedNameSpecifier::Create(ASTContext &Context, IdentifierInfo *II) {
|
||||
return FindOrInsert(Context, Mockup);
|
||||
}
|
||||
|
||||
NestedNameSpecifier *NestedNameSpecifier::GlobalSpecifier(ASTContext &Context) {
|
||||
NestedNameSpecifier *
|
||||
NestedNameSpecifier::GlobalSpecifier(const ASTContext &Context) {
|
||||
if (!Context.GlobalNestedNameSpecifier)
|
||||
Context.GlobalNestedNameSpecifier = new (Context, 4) NestedNameSpecifier();
|
||||
return Context.GlobalNestedNameSpecifier;
|
||||
|
@ -27,9 +27,10 @@ void ASTRecordLayout::Destroy(ASTContext &Ctx) {
|
||||
Ctx.Deallocate(this);
|
||||
}
|
||||
|
||||
ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignment,
|
||||
unsigned datasize, const uint64_t *fieldoffsets,
|
||||
unsigned fieldcount)
|
||||
ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx, uint64_t size,
|
||||
unsigned alignment, unsigned datasize,
|
||||
const uint64_t *fieldoffsets,
|
||||
unsigned fieldcount)
|
||||
: Size(size), DataSize(datasize), FieldOffsets(0), Alignment(alignment),
|
||||
FieldCount(fieldcount), CXXInfo(0) {
|
||||
if (FieldCount > 0) {
|
||||
@ -39,7 +40,7 @@ ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx, uint64_t size, unsigned alignm
|
||||
}
|
||||
|
||||
// Constructor for C++ records.
|
||||
ASTRecordLayout::ASTRecordLayout(ASTContext &Ctx,
|
||||
ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
|
||||
uint64_t size, unsigned alignment,
|
||||
uint64_t datasize,
|
||||
const uint64_t *fieldoffsets,
|
||||
|
@ -57,7 +57,7 @@ struct BaseSubobjectInfo {
|
||||
/// EmptySubobjectMap - Keeps track of which empty subobjects exist at different
|
||||
/// offsets while laying out a C++ class.
|
||||
class EmptySubobjectMap {
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
uint64_t CharWidth;
|
||||
|
||||
/// Class - The class whose empty entries we're keeping track of.
|
||||
@ -125,7 +125,7 @@ public:
|
||||
/// any empty classes.
|
||||
CharUnits SizeOfLargestEmptySubobject;
|
||||
|
||||
EmptySubobjectMap(ASTContext &Context, const CXXRecordDecl *Class)
|
||||
EmptySubobjectMap(const ASTContext &Context, const CXXRecordDecl *Class)
|
||||
: Context(Context), CharWidth(Context.getCharWidth()), Class(Class) {
|
||||
ComputeEmptySubobjectSizes();
|
||||
}
|
||||
@ -548,7 +548,7 @@ protected:
|
||||
// FIXME: Remove this and make the appropriate fields public.
|
||||
friend class clang::ASTContext;
|
||||
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
|
||||
EmptySubobjectMap *EmptySubobjects;
|
||||
|
||||
@ -613,7 +613,8 @@ protected:
|
||||
/// avoid visiting virtual bases more than once.
|
||||
llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBases;
|
||||
|
||||
RecordLayoutBuilder(ASTContext &Context, EmptySubobjectMap *EmptySubobjects)
|
||||
RecordLayoutBuilder(const ASTContext &Context, EmptySubobjectMap
|
||||
*EmptySubobjects)
|
||||
: Context(Context), EmptySubobjects(EmptySubobjects), Size(0), Alignment(8),
|
||||
UnpackedAlignment(Alignment), Packed(false), IsUnion(false),
|
||||
IsMac68kAlign(false), UnfilledBitsInLastByte(0), MaxFieldAlignment(0),
|
||||
@ -1609,7 +1610,8 @@ namespace {
|
||||
// This class implements layout specific to the Microsoft ABI.
|
||||
class MSRecordLayoutBuilder : public RecordLayoutBuilder {
|
||||
public:
|
||||
MSRecordLayoutBuilder(ASTContext& Ctx, EmptySubobjectMap *EmptySubobjects) :
|
||||
MSRecordLayoutBuilder(const ASTContext& Ctx,
|
||||
EmptySubobjectMap *EmptySubobjects) :
|
||||
RecordLayoutBuilder(Ctx, EmptySubobjects) {}
|
||||
|
||||
virtual uint64_t GetVirtualPointersSize(const CXXRecordDecl *RD) const;
|
||||
@ -1628,7 +1630,8 @@ MSRecordLayoutBuilder::GetVirtualPointersSize(const CXXRecordDecl *RD) const {
|
||||
/// getASTRecordLayout - Get or compute information about the layout of the
|
||||
/// specified record (struct/union/class), which indicates its size and field
|
||||
/// position information.
|
||||
const ASTRecordLayout &ASTContext::getASTRecordLayout(const RecordDecl *D) {
|
||||
const ASTRecordLayout &
|
||||
ASTContext::getASTRecordLayout(const RecordDecl *D) const {
|
||||
D = D->getDefinition();
|
||||
assert(D && "Cannot get layout of forward declarations!");
|
||||
|
||||
@ -1714,7 +1717,7 @@ const CXXMethodDecl *ASTContext::getKeyFunction(const CXXRecordDecl *RD) {
|
||||
/// implementation. This may differ by including synthesized ivars.
|
||||
const ASTRecordLayout &
|
||||
ASTContext::getObjCLayout(const ObjCInterfaceDecl *D,
|
||||
const ObjCImplementationDecl *Impl) {
|
||||
const ObjCImplementationDecl *Impl) const {
|
||||
assert(!D->isForwardDecl() && "Invalid interface decl!");
|
||||
|
||||
// Look up this layout, if already laid out, return what we have.
|
||||
@ -1755,7 +1758,7 @@ static void PrintOffset(llvm::raw_ostream &OS,
|
||||
}
|
||||
|
||||
static void DumpCXXRecordLayout(llvm::raw_ostream &OS,
|
||||
const CXXRecordDecl *RD, ASTContext &C,
|
||||
const CXXRecordDecl *RD, const ASTContext &C,
|
||||
CharUnits Offset,
|
||||
unsigned IndentLevel,
|
||||
const char* Description,
|
||||
@ -1845,7 +1848,7 @@ static void DumpCXXRecordLayout(llvm::raw_ostream &OS,
|
||||
}
|
||||
|
||||
void ASTContext::DumpRecordLayout(const RecordDecl *RD,
|
||||
llvm::raw_ostream &OS) {
|
||||
llvm::raw_ostream &OS) const {
|
||||
const ASTRecordLayout &Info = getASTRecordLayout(RD);
|
||||
|
||||
if (const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD))
|
||||
|
@ -25,11 +25,11 @@ using namespace clang;
|
||||
namespace {
|
||||
class StmtProfiler : public StmtVisitor<StmtProfiler> {
|
||||
llvm::FoldingSetNodeID &ID;
|
||||
ASTContext &Context;
|
||||
const ASTContext &Context;
|
||||
bool Canonical;
|
||||
|
||||
public:
|
||||
StmtProfiler(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
StmtProfiler(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
bool Canonical)
|
||||
: ID(ID), Context(Context), Canonical(Canonical) { }
|
||||
|
||||
@ -997,7 +997,7 @@ void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) {
|
||||
}
|
||||
}
|
||||
|
||||
void Stmt::Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context,
|
||||
void Stmt::Profile(llvm::FoldingSetNodeID &ID, const ASTContext &Context,
|
||||
bool Canonical) {
|
||||
StmtProfiler Profiler(ID, Context, Canonical);
|
||||
Profiler.Visit(this);
|
||||
|
@ -136,7 +136,7 @@ bool TemplateArgument::containsUnexpandedParameterPack() const {
|
||||
}
|
||||
|
||||
void TemplateArgument::Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context) const {
|
||||
const ASTContext &Context) const {
|
||||
ID.AddInteger(Kind);
|
||||
switch (Kind) {
|
||||
case Null:
|
||||
|
@ -63,7 +63,7 @@ unsigned ConstantArrayType::getMaxSizeBits(ASTContext &Context) {
|
||||
return Bits;
|
||||
}
|
||||
|
||||
DependentSizedArrayType::DependentSizedArrayType(ASTContext &Context,
|
||||
DependentSizedArrayType::DependentSizedArrayType(const ASTContext &Context,
|
||||
QualType et, QualType can,
|
||||
Expr *e, ArraySizeModifier sm,
|
||||
unsigned tq,
|
||||
@ -76,7 +76,7 @@ DependentSizedArrayType::DependentSizedArrayType(ASTContext &Context,
|
||||
}
|
||||
|
||||
void DependentSizedArrayType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context,
|
||||
const ASTContext &Context,
|
||||
QualType ET,
|
||||
ArraySizeModifier SizeMod,
|
||||
unsigned TypeQuals,
|
||||
@ -87,7 +87,8 @@ void DependentSizedArrayType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
E->Profile(ID, Context, true);
|
||||
}
|
||||
|
||||
DependentSizedExtVectorType::DependentSizedExtVectorType(ASTContext &Context,
|
||||
DependentSizedExtVectorType::DependentSizedExtVectorType(const
|
||||
ASTContext &Context,
|
||||
QualType ElementType,
|
||||
QualType can,
|
||||
Expr *SizeExpr,
|
||||
@ -103,7 +104,7 @@ DependentSizedExtVectorType::DependentSizedExtVectorType(ASTContext &Context,
|
||||
|
||||
void
|
||||
DependentSizedExtVectorType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context,
|
||||
const ASTContext &Context,
|
||||
QualType ElementType, Expr *SizeExpr) {
|
||||
ID.AddPointer(ElementType.getAsOpaquePtr());
|
||||
SizeExpr->Profile(ID, Context, true);
|
||||
@ -193,7 +194,7 @@ QualType QualType::getUnqualifiedTypeSlow() const {
|
||||
/// to getting the canonical type, but it doesn't remove *all* typedefs. For
|
||||
/// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
|
||||
/// concrete.
|
||||
QualType QualType::getDesugaredType(QualType T, ASTContext &Context) {
|
||||
QualType QualType::getDesugaredType(QualType T, const ASTContext &Context) {
|
||||
SplitQualType split = getSplitDesugaredType(T);
|
||||
return Context.getQualifiedType(split.first, split.second);
|
||||
}
|
||||
@ -996,7 +997,7 @@ DependentTemplateSpecializationType::DependentTemplateSpecializationType(
|
||||
|
||||
void
|
||||
DependentTemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context,
|
||||
const ASTContext &Context,
|
||||
ElaboratedTypeKeyword Keyword,
|
||||
NestedNameSpecifier *Qualifier,
|
||||
const IdentifierInfo *Name,
|
||||
@ -1187,7 +1188,7 @@ QualType TypeOfExprType::desugar() const {
|
||||
}
|
||||
|
||||
void DependentTypeOfExprType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context, Expr *E) {
|
||||
const ASTContext &Context, Expr *E) {
|
||||
E->Profile(ID, Context, true);
|
||||
}
|
||||
|
||||
@ -1199,11 +1200,11 @@ DecltypeType::DecltypeType(Expr *E, QualType underlyingType, QualType can)
|
||||
UnderlyingType(underlyingType) {
|
||||
}
|
||||
|
||||
DependentDecltypeType::DependentDecltypeType(ASTContext &Context, Expr *E)
|
||||
DependentDecltypeType::DependentDecltypeType(const ASTContext &Context, Expr *E)
|
||||
: DecltypeType(E, Context.DependentTy), Context(Context) { }
|
||||
|
||||
void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
ASTContext &Context, Expr *E) {
|
||||
const ASTContext &Context, Expr *E) {
|
||||
E->Profile(ID, Context, true);
|
||||
}
|
||||
|
||||
@ -1299,20 +1300,22 @@ TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
|
||||
TemplateName T,
|
||||
const TemplateArgument *Args,
|
||||
unsigned NumArgs,
|
||||
ASTContext &Context) {
|
||||
const ASTContext &Context) {
|
||||
T.Profile(ID);
|
||||
for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
|
||||
Args[Idx].Profile(ID, Context);
|
||||
}
|
||||
|
||||
QualType QualifierCollector::apply(ASTContext &Context, QualType QT) const {
|
||||
QualType
|
||||
QualifierCollector::apply(const ASTContext &Context, QualType QT) const {
|
||||
if (!hasNonFastQualifiers())
|
||||
return QT.withFastQualifiers(getFastQualifiers());
|
||||
|
||||
return Context.getQualifiedType(QT, *this);
|
||||
}
|
||||
|
||||
QualType QualifierCollector::apply(ASTContext &Context, const Type *T) const {
|
||||
QualType
|
||||
QualifierCollector::apply(const ASTContext &Context, const Type *T) const {
|
||||
if (!hasNonFastQualifiers())
|
||||
return QualType(T, getFastQualifiers());
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user