Type.h revision ea285162342df160e7860e26528bc7110bc6c0cd
1ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao//===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===// 2ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// 3ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// The LLVM Compiler Infrastructure 4ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// 5ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// This file is distributed under the University of Illinois Open Source 6ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// License. See LICENSE.TXT for details. 7ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// 8ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao//===----------------------------------------------------------------------===// 9ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// 10ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// This file defines the Type interface and subclasses. 11ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// 12ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao//===----------------------------------------------------------------------===// 13ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 14ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#ifndef LLVM_CLANG_AST_TYPE_H 15ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define LLVM_CLANG_AST_TYPE_H 16ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 17ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/Basic/Diagnostic.h" 18ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/Basic/IdentifierTable.h" 19ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/Basic/Linkage.h" 20ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/Basic/PartialDiagnostic.h" 21ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/AST/NestedNameSpecifier.h" 22ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/AST/TemplateName.h" 23ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "llvm/Support/Casting.h" 24ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "llvm/Support/type_traits.h" 25ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "llvm/ADT/APSInt.h" 26ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "llvm/ADT/FoldingSet.h" 27ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "llvm/ADT/PointerIntPair.h" 28ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "llvm/ADT/PointerUnion.h" 29ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 30ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaousing llvm::isa; 31ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaousing llvm::cast; 32ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaousing llvm::cast_or_null; 33ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaousing llvm::dyn_cast; 34ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaousing llvm::dyn_cast_or_null; 35ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace clang { 36ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum { 37ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypeAlignmentInBits = 3, 38ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypeAlignment = 1 << TypeAlignmentInBits 39ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 40ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class Type; 41ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class ExtQuals; 42ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class QualType; 43ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 44ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 45ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace llvm { 46ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template <typename T> 47ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class PointerLikeTypeTraits; 48ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<> 49ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class PointerLikeTypeTraits< ::clang::Type*> { 50ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao public: 51ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static inline void *getAsVoidPointer(::clang::Type *P) { return P; } 52ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static inline ::clang::Type *getFromVoidPointer(void *P) { 53ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return static_cast< ::clang::Type*>(P); 54ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 55ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; 56ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 57ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template<> 58ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class PointerLikeTypeTraits< ::clang::ExtQuals*> { 59ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao public: 60ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static inline void *getAsVoidPointer(::clang::ExtQuals *P) { return P; } 61ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static inline ::clang::ExtQuals *getFromVoidPointer(void *P) { 62ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return static_cast< ::clang::ExtQuals*>(P); 63ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 64ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum { NumLowBitsAvailable = clang::TypeAlignmentInBits }; 65ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 66ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 67ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template <> 68ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao struct isPodLike<clang::QualType> { static const bool value = true; }; 69ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 70ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 71ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace clang { 72ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class ASTContext; 73ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TypedefDecl; 74ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TemplateDecl; 75ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TemplateTypeParmDecl; 76ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class NonTypeTemplateParmDecl; 77ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TemplateTemplateParmDecl; 78ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TagDecl; 79ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class RecordDecl; 80ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class CXXRecordDecl; 81ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class EnumDecl; 82ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class FieldDecl; 83ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class ObjCInterfaceDecl; 84ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class ObjCProtocolDecl; 85ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class ObjCMethodDecl; 86ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class UnresolvedUsingTypenameDecl; 87ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class Expr; 88ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class Stmt; 89ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class SourceLocation; 90ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class StmtIteratorBase; 91ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TemplateArgument; 92ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TemplateArgumentLoc; 93ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class TemplateArgumentListInfo; 94ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class Type; 95ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class QualifiedNameType; 96ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao struct PrintingPolicy; 97ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 98ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template <typename> class CanQual; 99ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef CanQual<Type> CanQualType; 100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Provide forward declarations for all of the *Type classes 102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define TYPE(Class, Base) class Class##Type; 103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/AST/TypeNodes.def" 104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Qualifiers - The collection of all-type qualifiers we support. 106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Clang supports five independent qualifiers: 107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// * C99: const, volatile, and restrict 108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// * Embedded C (TR18037): address spaces 109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// * Objective C: the GC attributes (none, weak, or strong) 110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass Qualifiers { 111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Const = 0x1, 114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Restrict = 0x2, 115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Volatile = 0x4, 116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CVRMask = Const | Volatile | Restrict 117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum GC { 120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao GCNone = 0, 121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Weak, 122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Strong 123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum { 126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The maximum supported address space number. 127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 24 bits should be enough for anyone. 128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao MaxAddressSpace = 0xffffffu, 129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The width of the "fast" qualifier mask. 131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao FastWidth = 2, 132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The fast qualifier mask. 134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao FastMask = (1 << FastWidth) - 1 135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers() : Mask(0) {} 138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static Qualifiers fromFastMask(unsigned Mask) { 140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Qs; 141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qs.addFastQualifiers(Mask); 142ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Qs; 143ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 144ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 145ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static Qualifiers fromCVRMask(unsigned CVR) { 146ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Qs; 147ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qs.addCVRQualifiers(CVR); 148ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Qs; 149ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 150ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 151ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Deserialize qualifiers from an opaque representation. 152ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static Qualifiers fromOpaqueValue(unsigned opaque) { 153ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Qs; 154ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qs.Mask = opaque; 155ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Qs; 156ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 157ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 158ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Serialize these qualifiers into an opaque representation. 159ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getAsOpaqueValue() const { 160ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Mask; 161ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 162ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 163ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasConst() const { return Mask & Const; } 164ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setConst(bool flag) { 165ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~Const) | (flag ? Const : 0); 166ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 167ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeConst() { Mask &= ~Const; } 168ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addConst() { Mask |= Const; } 169ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 170ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasVolatile() const { return Mask & Volatile; } 171ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setVolatile(bool flag) { 172ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~Volatile) | (flag ? Volatile : 0); 173ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 174ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeVolatile() { Mask &= ~Volatile; } 175ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addVolatile() { Mask |= Volatile; } 176ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 177ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasRestrict() const { return Mask & Restrict; } 178ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setRestrict(bool flag) { 179ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~Restrict) | (flag ? Restrict : 0); 180ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 181ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeRestrict() { Mask &= ~Restrict; } 182ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addRestrict() { Mask |= Restrict; } 183ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 184ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasCVRQualifiers() const { return getCVRQualifiers(); } 185ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getCVRQualifiers() const { return Mask & CVRMask; } 186ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setCVRQualifiers(unsigned mask) { 187ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 188ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~CVRMask) | mask; 189ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 190ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeCVRQualifiers(unsigned mask) { 191ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 192ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask &= ~mask; 193ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 194ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeCVRQualifiers() { 195ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao removeCVRQualifiers(CVRMask); 196ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 197ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addCVRQualifiers(unsigned mask) { 198ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(mask & ~CVRMask) && "bitmask contains non-CVR bits"); 199ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask |= mask; 200ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 201ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 202ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasObjCGCAttr() const { return Mask & GCAttrMask; } 203ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao GC getObjCGCAttr() const { return GC((Mask & GCAttrMask) >> GCAttrShift); } 204ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setObjCGCAttr(GC type) { 205ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~GCAttrMask) | (type << GCAttrShift); 206ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 207ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeObjCGCAttr() { setObjCGCAttr(GCNone); } 208ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addObjCGCAttr(GC type) { 209ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(type); 210ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao setObjCGCAttr(type); 211ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 212ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 213ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasAddressSpace() const { return Mask & AddressSpaceMask; } 214ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getAddressSpace() const { return Mask >> AddressSpaceShift; } 215ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setAddressSpace(unsigned space) { 216ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(space <= MaxAddressSpace); 217ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~AddressSpaceMask) 218ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao | (((uint32_t) space) << AddressSpaceShift); 219ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 220ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeAddressSpace() { setAddressSpace(0); } 221ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addAddressSpace(unsigned space) { 222ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(space); 223ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao setAddressSpace(space); 224ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 225ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 226ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Fast qualifiers are those that can be allocated directly 227ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // on a QualType object. 228ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasFastQualifiers() const { return getFastQualifiers(); } 229ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getFastQualifiers() const { return Mask & FastMask; } 230ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setFastQualifiers(unsigned mask) { 231ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 232ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask = (Mask & ~FastMask) | mask; 233ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 234ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeFastQualifiers(unsigned mask) { 235ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 236ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask &= ~mask; 237ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 238ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeFastQualifiers() { 239ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao removeFastQualifiers(FastMask); 240ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 241ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addFastQualifiers(unsigned mask) { 242ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(mask & ~FastMask) && "bitmask contains non-fast qualifier bits"); 243ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask |= mask; 244ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 245ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 246ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// hasNonFastQualifiers - Return true if the set contains any 247ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// qualifiers which require an ExtQuals node to be allocated. 248ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasNonFastQualifiers() const { return Mask & ~FastMask; } 249ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers getNonFastQualifiers() const { 250ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Quals = *this; 251ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Quals.setFastQualifiers(0); 252ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Quals; 253ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 254ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 255ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// hasQualifiers - Return true if the set contains any qualifiers. 256ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasQualifiers() const { return Mask; } 257ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool empty() const { return !Mask; } 258ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 259ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Add the qualifiers from the given set to this set. 260ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addQualifiers(Qualifiers Q) { 261ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // If the other set doesn't have any non-boolean qualifiers, just 262ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // bit-or it in. 263ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (!(Q.Mask & ~CVRMask)) 264ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask |= Q.Mask; 265ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao else { 266ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Mask |= (Q.Mask & CVRMask); 267ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (Q.hasAddressSpace()) 268ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao addAddressSpace(Q.getAddressSpace()); 269ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (Q.hasObjCGCAttr()) 270ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao addObjCGCAttr(Q.getObjCGCAttr()); 271ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 272ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 273ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 274ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool operator==(Qualifiers Other) const { return Mask == Other.Mask; } 275ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool operator!=(Qualifiers Other) const { return Mask != Other.Mask; } 276ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 277ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao operator bool() const { return hasQualifiers(); } 278ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 279ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers &operator+=(Qualifiers R) { 280ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao addQualifiers(R); 281ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return *this; 282ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 283ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 284ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Union two qualifier sets. If an enumerated qualifier appears 285ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // in both sets, use the one from the right. 286ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend Qualifiers operator+(Qualifiers L, Qualifiers R) { 287ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao L += R; 288ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return L; 289ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 290ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 291ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao std::string getAsString() const; 292ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao std::string getAsString(const PrintingPolicy &Policy) const { 293ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao std::string Buffer; 294ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getAsStringInternal(Buffer, Policy); 295ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Buffer; 296ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 297ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const; 298ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 299ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) const { 300ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Mask); 301ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 302ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 303ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprivate: 304ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 305ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // bits: |0 1 2|3 .. 4|5 .. 31| 306ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // |C R V|GCAttr|AddrSpace| 307ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao uint32_t Mask; 308ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 309ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static const uint32_t GCAttrMask = 0x18; 310ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static const uint32_t GCAttrShift = 3; 311ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static const uint32_t AddressSpaceMask = ~(CVRMask | GCAttrMask); 312ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static const uint32_t AddressSpaceShift = 5; 313ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 314ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 315ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 316ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ExtQuals - We can encode up to three bits in the low bits of a 317ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type pointer, but there are many more type qualifiers that we want 318ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// to be able to apply to an arbitrary type. Therefore we have this 319ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// struct, intended to be heap-allocated and used by QualType to 320ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// store qualifiers. 321ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 322ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// The current design tags the 'const' and 'restrict' qualifiers in 323ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// two low bits on the QualType pointer; a third bit records whether 324ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// the pointer is an ExtQuals node. 'const' was chosen because it is 325ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// orders of magnitude more common than the other two qualifiers, in 326ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// both library and user code. It's relatively rare to see 327ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 'restrict' in user code, but many standard C headers are saturated 328ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// with 'restrict' declarations, so that representing them efficiently 329ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// is a critical goal of this representation. 330ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ExtQuals : public llvm::FoldingSetNode { 331ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // NOTE: changing the fast qualifiers should be straightforward as 332ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // long as you don't make 'const' non-fast. 333ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // 1. Qualifiers: 334ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // a) Modify the bitmasks (Qualifiers::TQ and DeclSpec::TQ). 335ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Fast qualifiers must occupy the low-order bits. 336ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // b) Update Qualifiers::FastWidth and FastMask. 337ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // 2. QualType: 338ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // a) Update is{Volatile,Restrict}Qualified(), defined inline. 339ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // b) Update remove{Volatile,Restrict}, defined near the end of 340ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // this header. 341ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // 3. ASTContext: 342ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // a) Update get{Volatile,Restrict}Type. 343ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 344ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Context - the context to which this set belongs. We save this 345ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// here so that QualifierCollector can use it to reapply extended 346ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// qualifiers to an arbitrary type without requiring a context to 347ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// be pushed through every single API dealing with qualifiers. 348ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext& Context; 349ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 350ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// BaseType - the underlying type that this qualifies 351ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *BaseType; 352ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 353ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Quals - the immutable set of qualifiers applied by this 354ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// node; always contains extended qualifiers. 355ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Quals; 356ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 357ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 358ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtQuals(ASTContext& Context, const Type *Base, Qualifiers Quals) 359ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Context(Context), BaseType(Base), Quals(Quals) 360ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao { 361ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(Quals.hasNonFastQualifiers() 362ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao && "ExtQuals created with no fast qualifiers"); 363ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!Quals.hasFastQualifiers() 364ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao && "ExtQuals created with fast qualifiers"); 365ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 366ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 367ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers getQualifiers() const { return Quals; } 368ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 369ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasVolatile() const { return Quals.hasVolatile(); } 370ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 371ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasObjCGCAttr() const { return Quals.hasObjCGCAttr(); } 372ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers::GC getObjCGCAttr() const { return Quals.getObjCGCAttr(); } 373ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 374ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasAddressSpace() const { return Quals.hasAddressSpace(); } 375ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getAddressSpace() const { return Quals.getAddressSpace(); } 376ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 377ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *getBaseType() const { return BaseType; } 378ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 379ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext &getContext() const { return Context; } 380ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 381ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 382ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) const { 383ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getBaseType(), Quals); 384ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 385ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, 386ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *BaseType, 387ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Quals) { 388ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!Quals.hasFastQualifiers() && "fast qualifiers in ExtQuals hash!"); 389ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(BaseType); 390ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Quals.Profile(ID); 391ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 392ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 393ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 394ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// CallingConv - Specifies the calling convention that a function uses. 395ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoenum CallingConv { 396ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CC_Default, 397ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CC_C, // __attribute__((cdecl)) 398ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CC_X86StdCall, // __attribute__((stdcall)) 399ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CC_X86FastCall // __attribute__((fastcall)) 400ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 401ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 402ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 403ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// QualType - For efficiency, we don't store CV-qualified types as nodes on 404ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// their own: instead each reference to a type stores the qualifiers. This 405ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// greatly reduces the number of nodes we need to allocate for types (for 406ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// example we only need one for 'int', 'const int', 'volatile int', 407ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 'const volatile int', etc). 408ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 409ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// As an added efficiency bonus, instead of making this a pair, we 410ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// just store the two bits we care about in the low bits of the 411ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// pointer. To handle the packing/unpacking, we make QualType be a 412ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// simple wrapper class that acts like a smart pointer. A third bit 413ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// indicates whether there are extended qualifiers present, in which 414ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// case the pointer points to a special structure. 415ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass QualType { 416ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Thankfully, these are efficiently composable. 417ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao llvm::PointerIntPair<llvm::PointerUnion<const Type*,const ExtQuals*>, 418ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers::FastWidth> Value; 419ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 420ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtQuals *getExtQualsUnsafe() const { 421ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Value.getPointer().get<const ExtQuals*>(); 422ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 423ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 424ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *getTypePtrUnsafe() const { 425ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Value.getPointer().get<const Type*>(); 426ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 427ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 428ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getUnqualifiedTypeSlow() const; 429ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 430ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class QualifierCollector; 431ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 432ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType() {} 433ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 434ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType(const Type *Ptr, unsigned Quals) 435ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Value(Ptr, Quals) {} 436ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType(const ExtQuals *Ptr, unsigned Quals) 437ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Value(Ptr, Quals) {} 438ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 439ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getLocalFastQualifiers() const { return Value.getInt(); } 440ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setLocalFastQualifiers(unsigned Quals) { Value.setInt(Quals); } 441ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 442ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Retrieves a pointer to the underlying (unqualified) type. 443ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// This should really return a const Type, but it's not worth 444ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// changing all the users right now. 445ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type *getTypePtr() const { 446ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (hasLocalNonFastQualifiers()) 447ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return const_cast<Type*>(getExtQualsUnsafe()->getBaseType()); 448ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return const_cast<Type*>(getTypePtrUnsafe()); 449ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 450ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 451ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } 452ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static QualType getFromOpaquePtr(void *Ptr) { 453ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType T; 454ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T.Value.setFromOpaqueValue(Ptr); 455ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T; 456ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 457ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 458ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type &operator*() const { 459ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return *getTypePtr(); 460ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 461ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 462ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type *operator->() const { 463ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getTypePtr(); 464ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 465ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 466ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isCanonical() const; 467ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isCanonicalAsParam() const; 468ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 469ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isNull - Return true if this QualType doesn't point to a type yet. 470ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isNull() const { 471ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Value.getPointer().isNull(); 472ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 473ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 474ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this particular QualType instance has the 475ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// "const" qualifier set, without looking through typedefs that may have 476ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// added "const" at a different level. 477ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isLocalConstQualified() const { 478ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (getLocalFastQualifiers() & Qualifiers::Const); 479ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 480ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 481ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this type is const-qualified. 482ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isConstQualified() const; 483ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 484ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this particular QualType instance has the 485ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// "restrict" qualifier set, without looking through typedefs that may have 486ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// added "restrict" at a different level. 487ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isLocalRestrictQualified() const { 488ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (getLocalFastQualifiers() & Qualifiers::Restrict); 489ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 490ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 491ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this type is restrict-qualified. 492ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isRestrictQualified() const; 493ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 494ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this particular QualType instance has the 495ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// "volatile" qualifier set, without looking through typedefs that may have 496ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// added "volatile" at a different level. 497ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isLocalVolatileQualified() const { 498ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (hasLocalNonFastQualifiers() && getExtQualsUnsafe()->hasVolatile()); 499ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 500ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 501ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this type is volatile-qualified. 502ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVolatileQualified() const; 503ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 504ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this particular QualType instance has any 505ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// qualifiers, without looking through any typedefs that might add 506ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// qualifiers at a different level. 507ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasLocalQualifiers() const { 508ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getLocalFastQualifiers() || hasLocalNonFastQualifiers(); 509ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 510ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 511ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this type has any qualifiers. 512ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasQualifiers() const; 513ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 514ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether this particular QualType instance has any 515ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// "non-fast" qualifiers, e.g., those that are stored in an ExtQualType 516ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// instance. 517ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasLocalNonFastQualifiers() const { 518ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Value.getPointer().is<const ExtQuals*>(); 519ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 520ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 521ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the set of qualifiers local to this particular QualType 522ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// instance, not including any qualifiers acquired through typedefs or 523ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// other sugar. 524ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers getLocalQualifiers() const { 525ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Quals; 526ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (hasLocalNonFastQualifiers()) 527ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Quals = getExtQualsUnsafe()->getQualifiers(); 528ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Quals.addFastQualifiers(getLocalFastQualifiers()); 529ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Quals; 530ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 531ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 532ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the set of qualifiers applied to this type. 533ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers getQualifiers() const; 534ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 535ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the set of CVR (const-volatile-restrict) qualifiers 536ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// local to this particular QualType instance, not including any qualifiers 537ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// acquired through typedefs or other sugar. 538ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getLocalCVRQualifiers() const { 539ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned CVR = getLocalFastQualifiers(); 540ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (isLocalVolatileQualified()) 541ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CVR |= Qualifiers::Volatile; 542ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return CVR; 543ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 544ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 545ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the set of CVR (const-volatile-restrict) qualifiers 546ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// applied to this type. 547ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getCVRQualifiers() const; 548ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 549ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the set of CVR (const-volatile-restrict) qualifiers 550ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// applied to this type, looking through any number of unqualified array 551ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// types to their element types' qualifiers. 552ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getCVRQualifiersThroughArrayTypes() const; 553ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 554ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isConstant(ASTContext& Ctx) const { 555ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return QualType::isConstant(*this, Ctx); 556ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 557ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 558ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Don't promise in the API that anything besides 'const' can be 559ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // easily added. 560ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 561ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// addConst - add the specified type qualifier to this QualType. 562ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addConst() { 563ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao addFastQualifiers(Qualifiers::Const); 564ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 565ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType withConst() const { 566ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return withFastQualifiers(Qualifiers::Const); 567ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 568ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 569ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void addFastQualifiers(unsigned TQs) { 570ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(TQs & ~Qualifiers::FastMask) 571ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao && "non-fast qualifier bits set in mask!"); 572ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Value.setInt(Value.getInt() | TQs); 573ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 574ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 575ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: The remove* functions are semantically broken, because they might 576ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // not remove a qualifier stored on a typedef. Most of the with* functions 577ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // have the same problem. 578ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeConst(); 579ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeVolatile(); 580ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeRestrict(); 581ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeCVRQualifiers(unsigned Mask); 582ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 583ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeFastQualifiers() { Value.setInt(0); } 584ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void removeFastQualifiers(unsigned Mask) { 585ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(Mask & ~Qualifiers::FastMask) && "mask has non-fast qualifiers"); 586ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Value.setInt(Value.getInt() & ~Mask); 587ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 588ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 589ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Creates a type with the given qualifiers in addition to any 590ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // qualifiers already on this type. 591ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType withFastQualifiers(unsigned TQs) const { 592ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType T = *this; 593ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T.addFastQualifiers(TQs); 594ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T; 595ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 596ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 597ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Creates a type with exactly the given fast qualifiers, removing 598ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // any existing fast qualifiers. 599ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType withExactFastQualifiers(unsigned TQs) const { 600ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return withoutFastQualifiers().withFastQualifiers(TQs); 601ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 602ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 603ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Removes fast qualifiers, but leaves any extended qualifiers in place. 604ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType withoutFastQualifiers() const { 605ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType T = *this; 606ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T.removeFastQualifiers(); 607ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T; 608ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 609ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 610ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Return this type with all of the instance-specific qualifiers 611ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// removed, but without removing any qualifiers that may have been applied 612ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// through typedefs. 613ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getLocalUnqualifiedType() const { return QualType(getTypePtr(), 0); } 614ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 615ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Return the unqualified form of the given type, which might be 616ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// desugared to eliminate qualifiers introduced via typedefs. 617ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getUnqualifiedType() const { 618ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType T = getLocalUnqualifiedType(); 619ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (!T.hasQualifiers()) 620ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T; 621ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 622ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getUnqualifiedTypeSlow(); 623ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 624ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 625ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isMoreQualifiedThan(QualType Other) const; 626ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAtLeastAsQualifiedAs(QualType Other) const; 627ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getNonReferenceType() const; 628ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 629ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getDesugaredType - Return the specified type with any "sugar" removed from 630ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// the type. This takes off typedefs, typeof's etc. If the outer level of 631ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// the type is already concrete, it returns it unmodified. This is similar 632ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// to getting the canonical type, but it doesn't remove *all* typedefs. For 633ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 634ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// concrete. 635ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 636ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Qualifiers are left in place. 637ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getDesugaredType() const { 638ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return QualType::getDesugaredType(*this); 639ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 640ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 641ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// operator==/!= - Indicate whether the specified types and qualifiers are 642ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// identical. 643ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend bool operator==(const QualType &LHS, const QualType &RHS) { 644ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return LHS.Value == RHS.Value; 645ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 646ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend bool operator!=(const QualType &LHS, const QualType &RHS) { 647ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return LHS.Value != RHS.Value; 648ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 649ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao std::string getAsString() const; 650ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 651ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao std::string getAsString(const PrintingPolicy &Policy) const { 652ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao std::string S; 653ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getAsStringInternal(S, Policy); 654ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return S; 655ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 656ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void getAsStringInternal(std::string &Str, 657ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const PrintingPolicy &Policy) const; 658ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 659ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void dump(const char *s) const; 660ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void dump() const; 661ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 662ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) const { 663ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(getAsOpaquePtr()); 664ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 665ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 666ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getAddressSpace - Return the address space of this type. 667ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao inline unsigned getAddressSpace() const; 668ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 669ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// GCAttrTypesAttr - Returns gc attribute of this type. 670ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao inline Qualifiers::GC getObjCGCAttr() const; 671ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 672ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isObjCGCWeak true when Type is objc's weak. 673ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCGCWeak() const { 674ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getObjCGCAttr() == Qualifiers::Weak; 675ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 676ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 677ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isObjCGCStrong true when Type is objc's strong. 678ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCGCStrong() const { 679ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getObjCGCAttr() == Qualifiers::Strong; 680ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 681ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 682ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprivate: 683ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // These methods are implemented in a separate translation unit; 684ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // "static"-ize them to avoid creating temporary QualTypes in the 685ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // caller. 686ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool isConstant(QualType T, ASTContext& Ctx); 687ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static QualType getDesugaredType(QualType T); 688ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 689ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 690ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} // end clang. 691ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 692ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace llvm { 693ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Implement simplify_type for QualType, so that we can dyn_cast from QualType 694ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// to a specific Type class. 695ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> struct simplify_type<const ::clang::QualType> { 696ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef ::clang::Type* SimpleType; 697ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static SimpleType getSimplifiedValue(const ::clang::QualType &Val) { 698ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Val.getTypePtr(); 699ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 700ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 701ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> struct simplify_type< ::clang::QualType> 702ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : public simplify_type<const ::clang::QualType> {}; 703ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 704ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Teach SmallPtrSet that QualType is "basically a pointer". 705ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<> 706ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass PointerLikeTypeTraits<clang::QualType> { 707ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 708ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static inline void *getAsVoidPointer(clang::QualType P) { 709ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return P.getAsOpaquePtr(); 710ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 711ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static inline clang::QualType getFromVoidPointer(void *P) { 712ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return clang::QualType::getFromOpaquePtr(P); 713ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 714ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Various qualifiers go in low bits. 715ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum { NumLowBitsAvailable = 0 }; 716ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 717ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 718ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} // end namespace llvm 719ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 720ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaonamespace clang { 721ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 722ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Type - This is the base class of the type hierarchy. A central concept 723ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// with types is that each type always has a canonical type. A canonical type 724ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// is the type with any typedef names stripped out of it or the types it 725ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// references. For example, consider: 726ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 727ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// typedef int foo; 728ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// typedef foo* bar; 729ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 'int *' 'foo *' 'bar' 730ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 731ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// There will be a Type object created for 'int'. Since int is canonical, its 732ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// canonicaltype pointer points to itself. There is also a Type for 'foo' (a 733ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next 734ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// there is a PointerType that represents 'int*', which, like 'int', is 735ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 736ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type is 'int*', and there is a TypedefType for 'bar', whose canonical type 737ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// is also 'int*'. 738ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 739ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Non-canonical types are useful for emitting diagnostics, without losing 740ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// information about typedefs being used. Canonical types are useful for type 741ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// comparisons (they allow by-pointer equality tests) and useful for reasoning 742ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// about whether something has a particular form (e.g. is a function type), 743ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// because they implicitly, recursively, strip all typedefs out of a type. 744ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 745ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Types, once created, are immutable. 746ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 747ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass Type { 748ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 749ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum TypeClass { 750ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define TYPE(Class, Base) Class, 751ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define LAST_TYPE(Class) TypeLast = Class, 752ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define ABSTRACT_TYPE(Class, Base) 753ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/AST/TypeNodes.def" 754ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TagFirst = Record, TagLast = Enum 755ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 756ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 757ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprivate: 758ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType CanonicalType; 759ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 760ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 761ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned TC : 8; 762ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 763ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Dependent - Whether this type is a dependent type (C++ [temp.dep.type]). 764ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Note that this should stay at the end of the ivars for Type so that 765ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// subclasses can pack their bitfields into the same word. 766ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool Dependent : 1; 767ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 768ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(const Type&); // DO NOT IMPLEMENT. 769ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void operator=(const Type&); // DO NOT IMPLEMENT. 770ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 771ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // silence VC++ warning C4355: 'this' : used in base member initializer list 772ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type *this_() { return this; } 773ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(TypeClass tc, QualType Canonical, bool dependent) 774ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical), 775ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TC(tc), Dependent(dependent) {} 776ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual ~Type() {} 777ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual void Destroy(ASTContext& C); 778ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; 779ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 780ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 781ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); } 782ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 783ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isCanonicalUnqualified() const { 784ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return CanonicalType.getTypePtr() == this; 785ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 786ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 787ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 788ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// object types, function types, and incomplete types. 789ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 790ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determines whether the type describes an object in memory. 791ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 792ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Note that this definition of object type corresponds to the C++ 793ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// definition of object type, which includes incomplete types, as 794ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// opposed to the C definition (which does not include incomplete 795ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// types). 796ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjectType() const; 797ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 798ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isIncompleteType - Return true if this is an incomplete type. 799ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// A type that can describe objects, but which lacks information needed to 800ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// determine its size (e.g. void, or a fwd declared struct). Clients of this 801ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// routine will need to determine if the size is actually required. 802ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isIncompleteType() const; 803ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 804ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isIncompleteOrObjectType - Return true if this is an incomplete or object 805ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// type, in other words, not a function type. 806ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isIncompleteOrObjectType() const { 807ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return !isFunctionType(); 808ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 809ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 810ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10). 811ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isPODType() const; 812ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 813ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isLiteralType - Return true if this is a literal type 814ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// (C++0x [basic.types]p10) 815ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isLiteralType() const; 816ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 817ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array 818ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// types that have a non-constant expression. This does not include "[]". 819ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVariablyModifiedType() const; 820ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 821ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Helper methods to distinguish type categories. All type predicates 822ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// operate on the canonical type, ignoring typedefs and qualifiers. 823ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 824ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isSpecificBuiltinType - Test for a particular builtin type. 825ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSpecificBuiltinType(unsigned K) const; 826ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 827ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isIntegerType() does *not* include complex integers (a GCC extension). 828ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isComplexIntegerType() can be used to test for complex integers. 829ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 830ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isEnumeralType() const; 831ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isBooleanType() const; 832ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isCharType() const; 833ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isWideCharType() const; 834ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAnyCharacterType() const; 835ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isIntegralType() const; 836ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 837ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Floating point categories. 838ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 839ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isComplexType() does *not* include complex integers (a GCC extension). 840ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isComplexIntegerType() can be used to test for complex integers. 841ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isComplexType() const; // C99 6.2.5p11 (complex) 842ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 843ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 844ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 845ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 846ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVoidType() const; // C99 6.2.5p19 847ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isDerivedType() const; // C99 6.2.5p20 848ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 849ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAggregateType() const; 850ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 851ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Type Predicates: Check to see if this type is structurally the specified 852ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // type, ignoring typedefs and qualifiers. 853ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isFunctionType() const; 854ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isFunctionNoProtoType() const { return getAs<FunctionNoProtoType>(); } 855ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isFunctionProtoType() const { return getAs<FunctionProtoType>(); } 856ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isPointerType() const; 857ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAnyPointerType() const; // Any C pointer or ObjC object pointer 858ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isBlockPointerType() const; 859ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVoidPointerType() const; 860ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isReferenceType() const; 861ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isLValueReferenceType() const; 862ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isRValueReferenceType() const; 863ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isFunctionPointerType() const; 864ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isMemberPointerType() const; 865ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isMemberFunctionPointerType() const; 866ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isArrayType() const; 867ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isConstantArrayType() const; 868ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isIncompleteArrayType() const; 869ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVariableArrayType() const; 870ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isDependentSizedArrayType() const; 871ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isRecordType() const; 872ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isClassType() const; 873ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isStructureType() const; 874ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isStructureOrClassType() const; 875ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isUnionType() const; 876ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isComplexIntegerType() const; // GCC _Complex integer type. 877ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVectorType() const; // GCC vector type. 878ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isExtVectorType() const; // Extended vector type. 879ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCObjectPointerType() const; // Pointer to *any* ObjC object. 880ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: change this to 'raw' interface type, so we can used 'interface' type 881ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // for the common case. 882ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCInterfaceType() const; // NSString or NSString<foo> 883ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCQualifiedInterfaceType() const; // NSString<foo> 884ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCQualifiedIdType() const; // id<foo> 885ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCQualifiedClassType() const; // Class<foo> 886ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCIdType() const; // id 887ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCClassType() const; // Class 888ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCSelType() const; // Class 889ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCBuiltinType() const; // 'id' or 'Class' 890ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isTemplateTypeParmType() const; // C++ template type parameter 891ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isNullPtrType() const; // C++0x nullptr_t 892ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 893ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isDependentType - Whether this type is a dependent type, meaning 894ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// that its definition somehow depends on a template parameter 895ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// (C++ [temp.dep.type]). 896ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isDependentType() const { return Dependent; } 897ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isOverloadableType() const; 898ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 899ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine wither this type is a C++ elaborated-type-specifier. 900ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isElaboratedTypeSpecifier() const; 901ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 902ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// hasPointerRepresentation - Whether this type is represented 903ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// natively as a pointer; this includes pointers, references, block 904ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// pointers, and Objective-C interface, qualified id, and qualified 905ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// interface types, as well as nullptr_t. 906ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasPointerRepresentation() const; 907ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 908ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// hasObjCPointerRepresentation - Whether this type can represent 909ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// an objective pointer type for the purpose of GC'ability 910ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasObjCPointerRepresentation() const; 911ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 912ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Type Checking Functions: Check to see if this type is structurally the 913ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // specified type, ignoring typedefs and qualifiers, and return a pointer to 914ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // the best type we can. 915ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const RecordType *getAsStructureType() const; 916ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// NOTE: getAs*ArrayType are methods on ASTContext. 917ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const RecordType *getAsUnionType() const; 918ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 919ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The following is a convenience method that returns an ObjCObjectPointerType 920ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // for object declared using an interface. 921ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ObjCObjectPointerType *getAsObjCInterfacePointerType() const; 922ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ObjCObjectPointerType *getAsObjCQualifiedIdType() const; 923ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ObjCInterfaceType *getAsObjCQualifiedInterfaceType() const; 924ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const CXXRecordDecl *getCXXRecordDeclForPointerType() const; 925ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 926ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Member-template getAs<specific type>'. This scheme will eventually 927ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // replace the specific getAsXXXX methods above. 928ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // 929ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // There are some specializations of this member template listed 930ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // immediately following this class. 931ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao template <typename T> const T *getAs() const; 932ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 933ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getAsPointerToObjCInterfaceType - If this is a pointer to an ObjC 934ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// interface, return the interface type, otherwise return null. 935ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ObjCInterfaceType *getAsPointerToObjCInterfaceType() const; 936ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 937ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getArrayElementTypeNoTypeQual - If this is an array type, return the 938ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// element type of the array, potentially with type qualifiers missing. 939ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// This method should never be used when type qualifiers are meaningful. 940ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *getArrayElementTypeNoTypeQual() const; 941ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 942ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getPointeeType - If this is a pointer, ObjC object pointer, or block 943ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// pointer, this returns the respective pointee. 944ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeType() const; 945ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 946ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getUnqualifiedDesugaredType() - Return the specified type with 947ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// any "sugar" removed from the type, removing any typedefs, 948ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// typeofs, etc., as well as any qualifiers. 949ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *getUnqualifiedDesugaredType() const; 950ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 951ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// More type predicates useful for type checking/promotion 952ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isPromotableIntegerType() const; // C99 6.3.1.1p2 953ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 954ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isSignedIntegerType - Return true if this is an integer type that is 955ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 956ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// an enum decl which has a signed representation, or a vector of signed 957ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// integer element type. 958ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSignedIntegerType() const; 959ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 960ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isUnsignedIntegerType - Return true if this is an integer type that is 961ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 962ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// decl which has an unsigned representation, or a vector of unsigned integer 963ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// element type. 964ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isUnsignedIntegerType() const; 965ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 966ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isConstantSizeType - Return true if this is not a variable sized type, 967ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// according to the rules of C99 6.7.5p3. It is not legal to call this on 968ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// incomplete types. 969ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isConstantSizeType() const; 970ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 971ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isSpecifierType - Returns true if this type can be represented by some 972ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// set of type specifiers. 973ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSpecifierType() const; 974ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 975ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const char *getTypeClassName() const; 976ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 977ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine the linkage of this type. 978ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 979ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 980ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getCanonicalTypeInternal() const { 981ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return CanonicalType; 982ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 983ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h 984ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void dump() const; 985ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *) { return true; } 986ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 987ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 988ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <> inline const TypedefType *Type::getAs() const { 989ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return dyn_cast<TypedefType>(this); 990ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 991ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 992ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// We can do canonical leaf types faster, because we don't have to 993ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// worry about preserving child type decoration. 994ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define TYPE(Class, Base) 995ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#define LEAF_TYPE(Class) \ 996ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <> inline const Class##Type *Type::getAs() const { \ 997ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return dyn_cast<Class##Type>(CanonicalType); \ 998ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 999ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#include "clang/AST/TypeNodes.def" 1000ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1001ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1002ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// BuiltinType - This class is used for builtin types like 'int'. Builtin 1003ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// types are always canonical and have a literal name field. 1004ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass BuiltinType : public Type { 1005ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1006ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum Kind { 1007ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Void, 1008ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1009ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Bool, // This is bool and/or _Bool. 1010ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Char_U, // This is 'char' for targets where char is unsigned. 1011ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UChar, // This is explicitly qualified unsigned char. 1012ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Char16, // This is 'char16_t' for C++. 1013ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Char32, // This is 'char32_t' for C++. 1014ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UShort, 1015ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UInt, 1016ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ULong, 1017ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ULongLong, 1018ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UInt128, // __uint128_t 1019ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1020ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Char_S, // This is 'char' for targets where char is signed. 1021ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SChar, // This is explicitly qualified signed char. 1022ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao WChar, // This is 'wchar_t' for C++. 1023ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Short, 1024ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Int, 1025ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Long, 1026ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao LongLong, 1027ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Int128, // __int128_t 1028ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1029ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Float, Double, LongDouble, 1030ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1031ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NullPtr, // This is the type of C++0x 'nullptr'. 1032ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1033ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Overload, // This represents the type of an overloaded function declaration. 1034ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Dependent, // This represents the type of a type-dependent expression. 1035ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1036ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UndeducedAuto, // In C++0x, this represents the type of an auto variable 1037ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // that has not been deduced yet. 1038ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCId, // This represents the ObjC 'id' type. 1039ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCClass, // This represents the ObjC 'Class' type. 1040ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCSel // This represents the ObjC 'SEL' type. 1041ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 1042ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprivate: 1043ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Kind TypeKind; 1044ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1045ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao BuiltinType(Kind K) 1046ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent)), 1047ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypeKind(K) {} 1048ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1049ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Kind getKind() const { return TypeKind; } 1050ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const char *getName(const LangOptions &LO) const; 1051ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1052ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1053ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1054ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1055ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isInteger() const { 1056ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return TypeKind >= Bool && TypeKind <= Int128; 1057ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1058ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1059ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSignedInteger() const { 1060ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return TypeKind >= Char_S && TypeKind <= Int128; 1061ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1062ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1063ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isUnsignedInteger() const { 1064ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return TypeKind >= Bool && TypeKind <= UInt128; 1065ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1066ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1067ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isFloatingPoint() const { 1068ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return TypeKind >= Float && TypeKind <= LongDouble; 1069ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1070ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1071ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1072ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1073ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 1074ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const BuiltinType *) { return true; } 1075ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1076ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1077ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 1078ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// types (_Complex float etc) as well as the GCC integer complex extensions. 1079ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1080ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ComplexType : public Type, public llvm::FoldingSetNode { 1081ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ElementType; 1082ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ComplexType(QualType Element, QualType CanonicalPtr) : 1083ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(Complex, CanonicalPtr, Element->isDependentType()), 1084ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ElementType(Element) { 1085ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1086ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1087ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1088ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getElementType() const { return ElementType; } 1089ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1090ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1091ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1092ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1093ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1094ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getElementType()); 1095ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1096ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 1097ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Element.getAsOpaquePtr()); 1098ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1099ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 1103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ComplexType *) { return true; } 1104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// PointerType - C99 6.7.5.1 - Pointer Declarators. 1107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass PointerType : public Type, public llvm::FoldingSetNode { 1109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType PointeeType; 1110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao PointerType(QualType Pointee, QualType CanonicalPtr) : 1112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(Pointer, CanonicalPtr, Pointee->isDependentType()), PointeeType(Pointee) { 1113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeType() const { return PointeeType; } 1118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getPointeeType()); 1124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 1126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Pointee.getAsOpaquePtr()); 1127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 1132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const PointerType *) { return true; } 1133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// BlockPointerType - pointer to a block type. 1136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// This type is to represent types syntactically represented as 1137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// "void (^)(int)", etc. Pointee is required to always be a function type. 1138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass BlockPointerType : public Type, public llvm::FoldingSetNode { 1140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType PointeeType; // Block is some kind of pointer type 1141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao BlockPointerType(QualType Pointee, QualType CanonicalCls) : 1142ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(BlockPointer, CanonicalCls, Pointee->isDependentType()), 1143ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao PointeeType(Pointee) { 1144ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1145ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1146ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1147ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1148ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Get the pointee type. Pointee is required to always be a function type. 1149ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeType() const { return PointeeType; } 1150ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1151ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1152ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1153ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1154ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1155ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getPointeeType()); 1156ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1157ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 1158ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Pointee.getAsOpaquePtr()); 1159ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1160ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1161ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1162ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1163ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1164ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == BlockPointer; 1165ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1166ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const BlockPointerType *) { return true; } 1167ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1168ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1169ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ReferenceType - Base for LValueReferenceType and RValueReferenceType 1170ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1171ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ReferenceType : public Type, public llvm::FoldingSetNode { 1172ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType PointeeType; 1173ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1174ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// True if the type was originally spelled with an lvalue sigil. 1175ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// This is never true of rvalue references but can also be false 1176ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// on lvalue references because of C++0x [dcl.typedef]p9, 1177ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// as follows: 1178ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 1179ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// typedef int &ref; // lvalue, spelled lvalue 1180ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// typedef int &&rvref; // rvalue 1181ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ref &a; // lvalue, inner ref, spelled lvalue 1182ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ref &&a; // lvalue, inner ref 1183ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// rvref &a; // lvalue, inner ref, spelled lvalue 1184ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// rvref &&a; // rvalue, inner ref 1185ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool SpelledAsLValue; 1186ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1187ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// True if the inner type is a reference type. This only happens 1188ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// in non-canonical forms. 1189ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool InnerRef; 1190ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1191ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 1192ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef, 1193ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool SpelledAsLValue) : 1194ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(tc, CanonicalRef, Referencee->isDependentType()), 1195ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao PointeeType(Referencee), SpelledAsLValue(SpelledAsLValue), 1196ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao InnerRef(Referencee->isReferenceType()) { 1197ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1198ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1199ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSpelledAsLValue() const { return SpelledAsLValue; } 1200ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isInnerRef() const { return InnerRef; } 1201ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1202ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeTypeAsWritten() const { return PointeeType; } 1203ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeType() const { 1204ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: this might strip inner qualifiers; okay? 1205ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ReferenceType *T = this; 1206ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao while (T->InnerRef) 1207ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T = T->PointeeType->getAs<ReferenceType>(); 1208ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->PointeeType; 1209ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1210ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1211ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1212ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, PointeeType, SpelledAsLValue); 1213ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1214ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, 1215ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType Referencee, 1216ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool SpelledAsLValue) { 1217ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Referencee.getAsOpaquePtr()); 1218ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddBoolean(SpelledAsLValue); 1219ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1220ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1221ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1222ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1223ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1224ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == LValueReference || 1225ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T->getTypeClass() == RValueReference; 1226ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1227ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ReferenceType *) { return true; } 1228ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1229ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1230ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// LValueReferenceType - C++ [dcl.ref] - Lvalue reference 1231ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1232ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass LValueReferenceType : public ReferenceType { 1233ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao LValueReferenceType(QualType Referencee, QualType CanonicalRef, 1234ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool SpelledAsLValue) : 1235ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ReferenceType(LValueReference, Referencee, CanonicalRef, SpelledAsLValue) 1236ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao {} 1237ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these 1238ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1239ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1240ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1241ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1242ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1243ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == LValueReference; 1244ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1245ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const LValueReferenceType *) { return true; } 1246ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1247ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1248ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// RValueReferenceType - C++0x [dcl.ref] - Rvalue reference 1249ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1250ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass RValueReferenceType : public ReferenceType { 1251ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao RValueReferenceType(QualType Referencee, QualType CanonicalRef) : 1252ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ReferenceType(RValueReference, Referencee, CanonicalRef, false) { 1253ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1254ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these 1255ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1256ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1257ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1258ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1259ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1260ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == RValueReference; 1261ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1262ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const RValueReferenceType *) { return true; } 1263ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1264ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1265ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// MemberPointerType - C++ 8.3.3 - Pointers to members 1266ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1267ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass MemberPointerType : public Type, public llvm::FoldingSetNode { 1268ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType PointeeType; 1269ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The class of which the pointee is a member. Must ultimately be a 1270ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// RecordType, but could be a typedef or a template parameter too. 1271ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *Class; 1272ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1273ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) : 1274ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(MemberPointer, CanonicalPtr, 1275ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Cls->isDependentType() || Pointee->isDependentType()), 1276ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao PointeeType(Pointee), Class(Cls) { 1277ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1278ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1279ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1280ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1281ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeType() const { return PointeeType; } 1282ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1283ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *getClass() const { return Class; } 1284ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1285ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1286ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1287ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1288ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1289ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getPointeeType(), getClass()); 1290ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1291ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 1292ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *Class) { 1293ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Pointee.getAsOpaquePtr()); 1294ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Class); 1295ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1296ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1297ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1298ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1299ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1300ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == MemberPointer; 1301ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1302ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const MemberPointerType *) { return true; } 1303ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1304ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1305ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ArrayType - C99 6.7.5.2 - Array Declarators. 1306ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1307ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ArrayType : public Type, public llvm::FoldingSetNode { 1308ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1309ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 1310ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// an array with a static size (e.g. int X[static 4]), or an array 1311ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// with a star size (e.g. int X[*]). 1312ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 'static' is only allowed on function parameters. 1313ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum ArraySizeModifier { 1314ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Normal, Static, Star 1315ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 1316ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprivate: 1317ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ElementType - The element type of the array. 1318ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ElementType; 1319ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1320ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 1321ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// NOTE: These fields are packed into the bitfields space in the Type class. 1322ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned SizeModifier : 2; 1323ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1324ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// IndexTypeQuals - Capture qualifiers in declarations like: 1325ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 'int X[static restrict 4]'. For function parameters only. 1326ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned IndexTypeQuals : 3; 1327ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1328ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 1329ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // C++ [temp.dep.type]p1: 1330ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // A type is dependent if it is... 1331ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // - an array type constructed from any dependent type or whose 1332ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // size is specified by a constant expression that is 1333ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // value-dependent, 1334ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArrayType(TypeClass tc, QualType et, QualType can, 1335ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArraySizeModifier sm, unsigned tq) 1336ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(tc, can, et->isDependentType() || tc == DependentSizedArray), 1337ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 1338ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1339ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1340ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1341ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getElementType() const { return ElementType; } 1342ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArraySizeModifier getSizeModifier() const { 1343ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return ArraySizeModifier(SizeModifier); 1344ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1345ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers getIndexTypeQualifiers() const { 1346ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Qualifiers::fromCVRMask(IndexTypeQuals); 1347ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1348ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getIndexTypeCVRQualifiers() const { return IndexTypeQuals; } 1349ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1350ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1351ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1352ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1353ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == ConstantArray || 1354ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T->getTypeClass() == VariableArray || 1355ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T->getTypeClass() == IncompleteArray || 1356ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T->getTypeClass() == DependentSizedArray; 1357ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1358ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ArrayType *) { return true; } 1359ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1360ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1361ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ConstantArrayType - This class represents the canonical version of 1362ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// C arrays with a specified constant size. For example, the canonical 1363ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type for 'int A[4 + 4*100]' is a ConstantArrayType where the element 1364ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type is 'int' and the size is 404. 1365ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ConstantArrayType : public ArrayType { 1366ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao llvm::APInt Size; // Allows us to unique the type. 1367ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1368ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ConstantArrayType(QualType et, QualType can, const llvm::APInt &size, 1369ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArraySizeModifier sm, unsigned tq) 1370ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : ArrayType(ConstantArray, et, can, sm, tq), 1371ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Size(size) {} 1372ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 1373ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ConstantArrayType(TypeClass tc, QualType et, QualType can, 1374ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const llvm::APInt &size, ArraySizeModifier sm, unsigned tq) 1375ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : ArrayType(tc, et, can, sm, tq), Size(size) {} 1376ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1377ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1378ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const llvm::APInt &getSize() const { return Size; } 1379ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1380ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1381ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1382ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1383ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getElementType(), getSize(), 1384ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getSizeModifier(), getIndexTypeCVRQualifiers()); 1385ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1386ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 1387ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const llvm::APInt &ArraySize, ArraySizeModifier SizeMod, 1388ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned TypeQuals) { 1389ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(ET.getAsOpaquePtr()); 1390ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(ArraySize.getZExtValue()); 1391ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(SizeMod); 1392ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(TypeQuals); 1393ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1394ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1395ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == ConstantArray; 1396ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1397ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ConstantArrayType *) { return true; } 1398ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1399ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1400ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// IncompleteArrayType - This class represents C arrays with an unspecified 1401ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// size. For example 'int A[]' has an IncompleteArrayType where the element 1402ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type is 'int' and the size is unspecified. 1403ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass IncompleteArrayType : public ArrayType { 1404ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1405ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao IncompleteArrayType(QualType et, QualType can, 1406ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArraySizeModifier sm, unsigned tq) 1407ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : ArrayType(IncompleteArray, et, can, sm, tq) {} 1408ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1409ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1410ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1411ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1412ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1413ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1414ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == IncompleteArray; 1415ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1416ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const IncompleteArrayType *) { return true; } 1417ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1418ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class StmtIteratorBase; 1419ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1420ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1421ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getElementType(), getSizeModifier(), 1422ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getIndexTypeCVRQualifiers()); 1423ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1424ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1425ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 1426ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArraySizeModifier SizeMod, unsigned TypeQuals) { 1427ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(ET.getAsOpaquePtr()); 1428ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(SizeMod); 1429ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(TypeQuals); 1430ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1431ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1432ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1433ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// VariableArrayType - This class represents C arrays with a specified size 1434ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 1435ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Since the size expression is an arbitrary expression, we store it as such. 1436ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1437ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 1438ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// should not be: two lexically equivalent variable array types could mean 1439ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// different things, for example, these variables do not have the same type 1440ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// dynamically: 1441ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1442ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// void foo(int x) { 1443ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// int Y[x]; 1444ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ++x; 1445ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// int Z[x]; 1446ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// } 1447ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1448ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass VariableArrayType : public ArrayType { 1449ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// SizeExpr - An assignment expression. VLA's are only permitted within 1450ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// a function block. 1451ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Stmt *SizeExpr; 1452ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Brackets - The left and right array brackets. 1453ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceRange Brackets; 1454ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1455ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao VariableArrayType(QualType et, QualType can, Expr *e, 1456ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArraySizeModifier sm, unsigned tq, 1457ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceRange brackets) 1458ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : ArrayType(VariableArray, et, can, sm, tq), 1459ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SizeExpr((Stmt*) e), Brackets(brackets) {} 1460ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1461ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual void Destroy(ASTContext& C); 1462ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1463ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1464ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *getSizeExpr() const { 1465ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // We use C-style casts instead of cast<> here because we do not wish 1466ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // to have a dependency of Type.h on Stmt.h/Expr.h. 1467ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (Expr*) SizeExpr; 1468ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1469ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceRange getBracketsRange() const { return Brackets; } 1470ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } 1471ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } 1472ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1473ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1474ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1475ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1476ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1477ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == VariableArray; 1478ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1479ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const VariableArrayType *) { return true; } 1480ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1481ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class StmtIteratorBase; 1482ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1483ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1484ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(0 && "Cannnot unique VariableArrayTypes."); 1485ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1486ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1487ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1488ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// DependentSizedArrayType - This type represents an array type in 1489ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// C++ whose size is a value-dependent expression. For example: 1490ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1491ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \code 1492ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// template<typename T, int Size> 1493ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// class array { 1494ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// T data[Size]; 1495ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// }; 1496ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \endcode 1497ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1498ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// For these types, we won't actually know what the array bound is 1499ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// until template instantiation occurs, at which point this will 1500ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// become either a ConstantArrayType or a VariableArrayType. 1501ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass DependentSizedArrayType : public ArrayType { 1502ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext &Context; 1503ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1504ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief An assignment expression that will instantiate to the 1505ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// size of the array. 1506ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 1507ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The expression itself might be NULL, in which case the array 1508ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// type will have its size deduced from an initializer. 1509ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Stmt *SizeExpr; 1510ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1511ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Brackets - The left and right array brackets. 1512ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceRange Brackets; 1513ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1514ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DependentSizedArrayType(ASTContext &Context, QualType et, QualType can, 1515ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *e, ArraySizeModifier sm, unsigned tq, 1516ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceRange brackets) 1517ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : ArrayType(DependentSizedArray, et, can, sm, tq), 1518ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Context(Context), SizeExpr((Stmt*) e), Brackets(brackets) {} 1519ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1520ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual void Destroy(ASTContext& C); 1521ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1522ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1523ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *getSizeExpr() const { 1524ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // We use C-style casts instead of cast<> here because we do not wish 1525ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // to have a dependency of Type.h on Stmt.h/Expr.h. 1526ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (Expr*) SizeExpr; 1527ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1528ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceRange getBracketsRange() const { return Brackets; } 1529ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceLocation getLBracketLoc() const { return Brackets.getBegin(); } 1530ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceLocation getRBracketLoc() const { return Brackets.getEnd(); } 1531ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1532ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1533ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1534ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1535ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1536ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == DependentSizedArray; 1537ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1538ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const DependentSizedArrayType *) { return true; } 1539ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1540ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class StmtIteratorBase; 1541ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1542ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1543ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1544ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Context, getElementType(), 1545ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getSizeModifier(), getIndexTypeCVRQualifiers(), getSizeExpr()); 1546ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1547ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1548ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context, 1549ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ET, ArraySizeModifier SizeMod, 1550ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned TypeQuals, Expr *E); 1551ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1552ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1553ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// DependentSizedExtVectorType - This type represent an extended vector type 1554ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// where either the type or size is dependent. For example: 1555ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// @code 1556ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// template<typename T, int Size> 1557ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// class vector { 1558ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// typedef T __attribute__((ext_vector_type(Size))) type; 1559ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// } 1560ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// @endcode 1561ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass DependentSizedExtVectorType : public Type, public llvm::FoldingSetNode { 1562ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext &Context; 1563ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *SizeExpr; 1564ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ElementType - The element type of the array. 1565ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ElementType; 1566ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceLocation loc; 1567ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1568ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DependentSizedExtVectorType(ASTContext &Context, QualType ElementType, 1569ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType can, Expr *SizeExpr, SourceLocation loc) 1570ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type (DependentSizedExtVector, can, true), 1571ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Context(Context), SizeExpr(SizeExpr), ElementType(ElementType), 1572ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao loc(loc) {} 1573ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; 1574ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual void Destroy(ASTContext& C); 1575ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1576ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1577ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *getSizeExpr() const { return SizeExpr; } 1578ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getElementType() const { return ElementType; } 1579ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SourceLocation getAttributeLoc() const { return loc; } 1580ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1581ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1582ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1583ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1584ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1585ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == DependentSizedExtVector; 1586ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1587ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const DependentSizedExtVectorType *) { return true; } 1588ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1589ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1590ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Context, getElementType(), getSizeExpr()); 1591ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1592ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1593ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context, 1594ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ElementType, Expr *SizeExpr); 1595ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1596ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1597ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1598ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// VectorType - GCC generic vector type. This type is created using 1599ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// __attribute__((vector_size(n)), where "n" specifies the vector size in 1600ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// bytes; or from an Altivec __vector or vector declaration. 1601ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Since the constructor takes the number of vector elements, the 1602ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// client is responsible for converting the size into the number of elements. 1603ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass VectorType : public Type, public llvm::FoldingSetNode { 1604ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 1605ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ElementType - The element type of the vector. 1606ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ElementType; 1607ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1608ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// NumElements - The number of elements in the vector. 1609ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumElements; 1610ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1611ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// AltiVec - True if this is for an Altivec vector. 1612ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool AltiVec; 1613ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1614ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Pixel - True if this is for an Altivec vector pixel. 1615ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool Pixel; 1616ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1617ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao VectorType(QualType vecType, unsigned nElements, QualType canonType, 1618ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAltiVec, bool isPixel) : 1619ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Type(Vector, canonType, vecType->isDependentType()), 1620ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ElementType(vecType), NumElements(nElements), 1621ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao AltiVec(isAltiVec), Pixel(isPixel) {} 1622ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao VectorType(TypeClass tc, QualType vecType, unsigned nElements, 1623ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType canonType, bool isAltiVec, bool isPixel) 1624ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(tc, canonType, vecType->isDependentType()), ElementType(vecType), 1625ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NumElements(nElements), AltiVec(isAltiVec), Pixel(isPixel) {} 1626ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1627ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1628ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1629ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getElementType() const { return ElementType; } 1630ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getNumElements() const { return NumElements; } 1631ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1632ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1633ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1634ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1635ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAltiVec() const { return AltiVec; } 1636ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1637ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isPixel() const { return Pixel; } 1638ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1639ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1640ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getElementType(), getNumElements(), getTypeClass(), 1641ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao AltiVec, Pixel); 1642ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1643ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 1644ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumElements, TypeClass TypeClass, 1645ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAltiVec, bool isPixel) { 1646ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(ElementType.getAsOpaquePtr()); 1647ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(NumElements); 1648ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(TypeClass); 1649ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddBoolean(isAltiVec); 1650ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddBoolean(isPixel); 1651ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1652ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1653ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1654ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1655ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1656ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 1657ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1658ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const VectorType *) { return true; } 1659ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1660ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1661ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ExtVectorType - Extended vector type. This type is created using 1662ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 1663ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 1664ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// class enables syntactic extensions, like Vector Components for accessing 1665ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// points, colors, and textures (modeled after OpenGL Shading Language). 1666ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ExtVectorType : public VectorType { 1667ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 1668ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao VectorType(ExtVector, vecType, nElements, canonType, false, false) {} 1669ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1670ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1671ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static int getPointAccessorIdx(char c) { 1672ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao switch (c) { 1673ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao default: return -1; 1674ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'x': return 0; 1675ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'y': return 1; 1676ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'z': return 2; 1677ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'w': return 3; 1678ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1679ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1680ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static int getNumericAccessorIdx(char c) { 1681ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao switch (c) { 1682ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao default: return -1; 1683ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '0': return 0; 1684ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '1': return 1; 1685ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '2': return 2; 1686ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '3': return 3; 1687ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '4': return 4; 1688ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '5': return 5; 1689ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '6': return 6; 1690ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '7': return 7; 1691ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '8': return 8; 1692ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case '9': return 9; 1693ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'A': 1694ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'a': return 10; 1695ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'B': 1696ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'b': return 11; 1697ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'C': 1698ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'c': return 12; 1699ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'D': 1700ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'd': return 13; 1701ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'E': 1702ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'e': return 14; 1703ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'F': 1704ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case 'f': return 15; 1705ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1706ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1707ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1708ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static int getAccessorIdx(char c) { 1709ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (int idx = getPointAccessorIdx(c)+1) return idx-1; 1710ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getNumericAccessorIdx(c); 1711ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1712ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1713ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isAccessorWithinNumElements(char c) const { 1714ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (int idx = getAccessorIdx(c)+1) 1715ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return unsigned(idx-1) < NumElements; 1716ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 1717ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1718ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1719ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1720ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1721ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1722ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == ExtVector; 1723ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1724ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ExtVectorType *) { return true; } 1725ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1726ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1727ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 1728ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// class of FunctionNoProtoType and FunctionProtoType. 1729ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 1730ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass FunctionType : public Type { 1731ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// SubClassData - This field is owned by the subclass, put here to pack 1732ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// tightly with the ivars in Type. 1733ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool SubClassData : 1; 1734ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1735ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// TypeQuals - Used only by FunctionProtoType, put here to pack with the 1736ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// other bitfields. 1737ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The qualifiers are part of FunctionProtoType because... 1738ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 1739ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// C++ 8.3.5p4: The return type, the parameter type list and the 1740ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// cv-qualifier-seq, [...], are part of the function type. 1741ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 1742ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned TypeQuals : 3; 1743ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1744ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// NoReturn - Indicates if the function type is attribute noreturn. 1745ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NoReturn : 1; 1746ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1747ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// RegParm - How many arguments to pass inreg. 1748ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned RegParm : 3; 1749ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1750ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// CallConv - The calling convention used by the function. 1751ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned CallConv : 2; 1752ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1753ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The type returned by the function. 1754ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType ResultType; 1755ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1756ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao public: 1757ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // This class is used for passing arround the information needed to 1758ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // construct a call. It is not actually used for storage, just for 1759ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // factoring together common arguments. 1760ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // If you add a field (say Foo), other than the obvious places (both, constructors, 1761ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // compile failures), what you need to update is 1762ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * Operetor== 1763ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * getFoo 1764ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * withFoo 1765ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * functionType. Add Foo, getFoo. 1766ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * ASTContext::getFooType 1767ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * ASTContext::mergeFunctionTypes 1768ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * FunctionNoProtoType::Profile 1769ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * FunctionProtoType::Profile 1770ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * TypePrinter::PrintFunctionProto 1771ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * PCH read and write 1772ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // * Codegen 1773ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1774ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao class ExtInfo { 1775ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao public: 1776ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Constructor with no defaults. Use this when you know that you 1777ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // have all the elements (when reading a PCH file for example). 1778ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtInfo(bool noReturn, unsigned regParm, CallingConv cc) : 1779ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NoReturn(noReturn), RegParm(regParm), CC(cc) {} 1780ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1781ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Constructor with all defaults. Use when for example creating a 1782ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // function know to use defaults. 1783ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtInfo() : NoReturn(false), RegParm(0), CC(CC_Default) {} 1784ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1785ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool getNoReturn() const { return NoReturn; } 1786ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getRegParm() const { return RegParm; } 1787ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CallingConv getCC() const { return CC; } 1788ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1789ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool operator==(const ExtInfo &Other) const { 1790ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getNoReturn() == Other.getNoReturn() && 1791ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getRegParm() == Other.getRegParm() && 1792ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getCC() == Other.getCC(); 1793ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1794ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool operator!=(const ExtInfo &Other) const { 1795ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return !(*this == Other); 1796ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1797ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1798ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Note that we don't have setters. That is by design, use 1799ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // the following with methods instead of mutating these objects. 1800ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1801ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtInfo withNoReturn(bool noReturn) const { 1802ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return ExtInfo(noReturn, getRegParm(), getCC()); 1803ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1804ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1805ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtInfo withRegParm(unsigned RegParm) const { 1806ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return ExtInfo(getNoReturn(), RegParm, getCC()); 1807ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1808ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1809ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtInfo withCallingConv(CallingConv cc) const { 1810ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return ExtInfo(getNoReturn(), getRegParm(), cc); 1811ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1812ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1813ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao private: 1814ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // True if we have __attribute__((noreturn)) 1815ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool NoReturn; 1816ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The value passed to __attribute__((regparm(x))) 1817ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned RegParm; 1818ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The calling convention as specified via 1819ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // __attribute__((cdecl|stdcall||fastcall)) 1820ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CallingConv CC; 1821ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 1822ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1823ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 1824ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao FunctionType(TypeClass tc, QualType res, bool SubclassInfo, 1825ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned typeQuals, QualType Canonical, bool Dependent, 1826ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtInfo &Info) 1827ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(tc, Canonical, Dependent), 1828ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SubClassData(SubclassInfo), TypeQuals(typeQuals), 1829ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NoReturn(Info.getNoReturn()), 1830ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao RegParm(Info.getRegParm()), CallConv(Info.getCC()), ResultType(res) {} 1831ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool getSubClassData() const { return SubClassData; } 1832ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getTypeQuals() const { return TypeQuals; } 1833ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1834ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1835ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getResultType() const { return ResultType; } 1836ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getRegParmType() const { return RegParm; } 1837ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool getNoReturnAttr() const { return NoReturn; } 1838ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CallingConv getCallConv() const { return (CallingConv)CallConv; } 1839ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ExtInfo getExtInfo() const { 1840ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return ExtInfo(NoReturn, RegParm, (CallingConv)CallConv); 1841ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1842ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1843ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static llvm::StringRef getNameForCallConv(CallingConv CC); 1844ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1845ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1846ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == FunctionNoProto || 1847ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao T->getTypeClass() == FunctionProto; 1848ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1849ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const FunctionType *) { return true; } 1850ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1851ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1852ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// FunctionNoProtoType - Represents a K&R-style 'int foo()' function, which has 1853ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// no information available about its arguments. 1854ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode { 1855ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao FunctionNoProtoType(QualType Result, QualType Canonical, 1856ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtInfo &Info) 1857ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : FunctionType(FunctionNoProto, Result, false, 0, Canonical, 1858ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /*Dependent=*/false, Info) {} 1859ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1860ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1861ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // No additional state past what FunctionType provides. 1862ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1863ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1864ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1865ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1866ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 1867ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getResultType(), getExtInfo()); 1868ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1869ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType, 1870ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtInfo &Info) { 1871ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Info.getCC()); 1872ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Info.getRegParm()); 1873ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Info.getNoReturn()); 1874ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(ResultType.getAsOpaquePtr()); 1875ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1876ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1877ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1878ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1879ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1880ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == FunctionNoProto; 1881ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1882ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const FunctionNoProtoType *) { return true; } 1883ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1884ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1885ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// FunctionProtoType - Represents a prototype with argument type info, e.g. 1886ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 1887ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// arguments, not as having a single void argument. Such a type can have an 1888ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// exception specification, but this specification is not part of the canonical 1889ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type. 1890ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass FunctionProtoType : public FunctionType, public llvm::FoldingSetNode { 1891ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// hasAnyDependentType - Determine whether there are any dependent 1892ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// types within the arguments passed in. 1893ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool hasAnyDependentType(const QualType *ArgArray, unsigned numArgs) { 1894ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao for (unsigned Idx = 0; Idx < numArgs; ++Idx) 1895ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (ArgArray[Idx]->isDependentType()) 1896ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return true; 1897ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1898ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 1899ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1900ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1901ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao FunctionProtoType(QualType Result, const QualType *ArgArray, unsigned numArgs, 1902ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVariadic, unsigned typeQuals, bool hasExs, 1903ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasAnyExs, const QualType *ExArray, 1904ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned numExs, QualType Canonical, 1905ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtInfo &Info) 1906ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : FunctionType(FunctionProto, Result, isVariadic, typeQuals, Canonical, 1907ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (Result->isDependentType() || 1908ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao hasAnyDependentType(ArgArray, numArgs)), 1909ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Info), 1910ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NumArgs(numArgs), NumExceptions(numExs), HasExceptionSpec(hasExs), 1911ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao AnyExceptionSpec(hasAnyExs) { 1912ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Fill in the trailing argument array. 1913ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType *ArgInfo = reinterpret_cast<QualType*>(this+1); 1914ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao for (unsigned i = 0; i != numArgs; ++i) 1915ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArgInfo[i] = ArgArray[i]; 1916ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Fill in the exception array. 1917ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType *Ex = ArgInfo + numArgs; 1918ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao for (unsigned i = 0; i != numExs; ++i) 1919ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Ex[i] = ExArray[i]; 1920ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1921ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1922ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// NumArgs - The number of arguments this function has, not counting '...'. 1923ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs : 20; 1924ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1925ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// NumExceptions - The number of types in the exception spec, if any. 1926ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumExceptions : 10; 1927ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1928ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// HasExceptionSpec - Whether this function has an exception spec at all. 1929ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool HasExceptionSpec : 1; 1930ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1931ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// AnyExceptionSpec - Whether this function has a throw(...) spec. 1932ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool AnyExceptionSpec : 1; 1933ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1934ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// ArgInfo - There is an variable size array after the class in memory that 1935ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// holds the argument types. 1936ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1937ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Exceptions - There is another variable size array after ArgInfo that 1938ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// holds the exception types. 1939ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1940ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 1941ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1942ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 1943ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getNumArgs() const { return NumArgs; } 1944ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getArgType(unsigned i) const { 1945ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(i < NumArgs && "Invalid argument number!"); 1946ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return arg_type_begin()[i]; 1947ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1948ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1949ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasExceptionSpec() const { return HasExceptionSpec; } 1950ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasAnyExceptionSpec() const { return AnyExceptionSpec; } 1951ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getNumExceptions() const { return NumExceptions; } 1952ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getExceptionType(unsigned i) const { 1953ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(i < NumExceptions && "Invalid exception number!"); 1954ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return exception_begin()[i]; 1955ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1956ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasEmptyExceptionSpec() const { 1957ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return hasExceptionSpec() && !hasAnyExceptionSpec() && 1958ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getNumExceptions() == 0; 1959ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1960ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1961ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVariadic() const { return getSubClassData(); } 1962ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); } 1963ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1964ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef const QualType *arg_type_iterator; 1965ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao arg_type_iterator arg_type_begin() const { 1966ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return reinterpret_cast<const QualType *>(this+1); 1967ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1968ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 1969ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1970ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef const QualType *exception_iterator; 1971ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao exception_iterator exception_begin() const { 1972ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // exceptions begin where arguments end 1973ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return arg_type_end(); 1974ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1975ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao exception_iterator exception_end() const { 1976ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return exception_begin() + NumExceptions; 1977ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1978ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1979ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 1980ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 1981ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1982ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 1983ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1984ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 1985ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == FunctionProto; 1986ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 1987ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const FunctionProtoType *) { return true; } 1988ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1989ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID); 1990ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 1991ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao arg_type_iterator ArgTys, unsigned NumArgs, 1992ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isVariadic, unsigned TypeQuals, 1993ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasExceptionSpec, bool anyExceptionSpec, 1994ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumExceptions, exception_iterator Exs, 1995ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtInfo &ExtInfo); 1996ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 1997ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1998ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 1999ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Represents the dependent type named by a dependently-scoped 2000ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// typename using declaration, e.g. 2001ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// using typename Base<T>::foo; 2002ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Template instantiation turns these into the underlying type. 2003ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass UnresolvedUsingType : public Type { 2004ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UnresolvedUsingTypenameDecl *Decl; 2005ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2006ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UnresolvedUsingType(const UnresolvedUsingTypenameDecl *D) 2007ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(UnresolvedUsing, QualType(), true), 2008ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Decl(const_cast<UnresolvedUsingTypenameDecl*>(D)) {} 2009ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2010ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2011ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2012ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UnresolvedUsingTypenameDecl *getDecl() const { return Decl; } 2013ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2014ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2015ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2016ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2017ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2018ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == UnresolvedUsing; 2019ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2020ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const UnresolvedUsingType *) { return true; } 2021ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2022ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2023ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Profile(ID, Decl); 2024ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2025ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, 2026ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao UnresolvedUsingTypenameDecl *D) { 2027ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(D); 2028ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2029ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2030ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2031ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2032ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass TypedefType : public Type { 2033ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypedefDecl *Decl; 2034ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 2035ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypedefType(TypeClass tc, const TypedefDecl *D, QualType can) 2036ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(tc, can, can->isDependentType()), 2037ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Decl(const_cast<TypedefDecl*>(D)) { 2038ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!isa<TypedefType>(can) && "Invalid canonical type"); 2039ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2040ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2041ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2042ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2043ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypedefDecl *getDecl() const { return Decl; } 2044ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2045ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 2046ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// potentially looking through *all* consecutive typedefs. This returns the 2047ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// sum of the type qualifiers, so if you have: 2048ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// typedef const int A; 2049ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// typedef volatile A B; 2050ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// looking through the typedefs for B will give you "const volatile A". 2051ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType LookThroughTypedefs() const; 2052ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2053ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return true; } 2054ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const; 2055ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2056ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == Typedef; } 2057ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TypedefType *) { return true; } 2058ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2059ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2060ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// TypeOfExprType (GCC extension). 2061ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass TypeOfExprType : public Type { 2062ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *TOExpr; 2063ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2064ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 2065ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypeOfExprType(Expr *E, QualType can = QualType()); 2066ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2067ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2068ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *getUnderlyingExpr() const { return TOExpr; } 2069ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2070ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Remove a single level of sugar. 2071ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const; 2072ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2073ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Returns whether this type directly provides sugar. 2074ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return true; } 2075ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2076ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; } 2077ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TypeOfExprType *) { return true; } 2078ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2079ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2080ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Internal representation of canonical, dependent 2081ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// typeof(expr) types. 2082ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2083ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// This class is used internally by the ASTContext to manage 2084ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// canonical, dependent types, only. Clients will only see instances 2085ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// of this class via TypeOfExprType nodes. 2086ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass DependentTypeOfExprType 2087ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : public TypeOfExprType, public llvm::FoldingSetNode { 2088ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext &Context; 2089ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2090ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2091ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DependentTypeOfExprType(ASTContext &Context, Expr *E) 2092ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : TypeOfExprType(E), Context(Context) { } 2093ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2094ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2095ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2096ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2097ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2098ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Context, getUnderlyingExpr()); 2099ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context, 2102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *E); 2103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// TypeOfType (GCC extension). 2106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass TypeOfType : public Type { 2107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType TOType; 2108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TypeOfType(QualType T, QualType can) 2109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(TypeOf, can, T->isDependentType()), TOType(T) { 2110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!isa<TypedefType>(can) && "Invalid canonical type"); 2111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getUnderlyingType() const { return TOType; } 2115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Remove a single level of sugar. 2117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return getUnderlyingType(); } 2118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Returns whether this type directly provides sugar. 2120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return true; } 2121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; } 2123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TypeOfType *) { return true; } 2124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// DecltypeType (C++0x) 2127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass DecltypeType : public Type { 2128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *E; 2129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: We could get rid of UnderlyingType if we wanted to: We would have to 2131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Move getDesugaredType to ASTContext so that it can call getDecltypeForExpr 2132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // from it. 2133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType UnderlyingType; 2134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 2136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DecltypeType(Expr *E, QualType underlyingType, QualType can = QualType()); 2137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *getUnderlyingExpr() const { return E; } 2140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getUnderlyingType() const { return UnderlyingType; } 2141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2142ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Remove a single level of sugar. 2143ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return getUnderlyingType(); } 2144ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2145ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Returns whether this type directly provides sugar. 2146ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return !isDependentType(); } 2147ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2148ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == Decltype; } 2149ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const DecltypeType *) { return true; } 2150ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2151ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2152ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Internal representation of canonical, dependent 2153ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// decltype(expr) types. 2154ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2155ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// This class is used internally by the ASTContext to manage 2156ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// canonical, dependent types, only. Clients will only see instances 2157ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// of this class via DecltypeType nodes. 2158ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass DependentDecltypeType : public DecltypeType, public llvm::FoldingSetNode { 2159ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext &Context; 2160ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2161ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2162ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DependentDecltypeType(ASTContext &Context, Expr *E); 2163ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2164ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2165ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2166ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2167ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2168ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Context, getUnderlyingExpr()); 2169ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2170ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2171ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, ASTContext &Context, 2172ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Expr *E); 2173ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2174ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2175ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass TagType : public Type { 2176ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Stores the TagDecl associated with this type. The decl will 2177ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// point to the TagDecl that actually defines the entity (or is a 2178ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// definition in progress), if there is such a definition. The 2179ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// single-bit value will be non-zero when this tag is in the 2180ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// process of being defined. 2181ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao mutable llvm::PointerIntPair<TagDecl *, 1> decl; 2182ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; 2183ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class TagDecl; 2184ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2185ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 2186ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TagType(TypeClass TC, const TagDecl *D, QualType can); 2187ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2188ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2189ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TagDecl *getDecl() const { return decl.getPointer(); } 2190ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2191ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// @brief Determines whether this type is in the process of being 2192ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// defined. 2193ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isBeingDefined() const { return decl.getInt(); } 2194ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setBeingDefined(bool Def) const { decl.setInt(Def? 1 : 0); } 2195ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2196ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 2197ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2198ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2199ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() >= TagFirst && T->getTypeClass() <= TagLast; 2200ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2201ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TagType *) { return true; } 2202ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const RecordType *) { return true; } 2203ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const EnumType *) { return true; } 2204ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2205ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2206ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 2207ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// to detect TagType objects of structs/unions/classes. 2208ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass RecordType : public TagType { 2209ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprotected: 2210ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao explicit RecordType(const RecordDecl *D) 2211ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : TagType(Record, reinterpret_cast<const TagDecl*>(D), QualType()) { } 2212ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao explicit RecordType(TypeClass TC, RecordDecl *D) 2213ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : TagType(TC, reinterpret_cast<const TagDecl*>(D), QualType()) { } 2214ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2215ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2216ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2217ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao RecordDecl *getDecl() const { 2218ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 2219ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2220ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2221ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: This predicate is a helper to QualType/Type. It needs to 2222ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // recursively check all fields for const-ness. If any field is declared 2223ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // const, it needs to return false. 2224ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool hasConstFields() const { return false; } 2225ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2226ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: RecordType needs to check when it is created that all fields are in 2227ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // the same address space, and return that. 2228ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getAddressSpace() const { return 0; } 2229ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2230ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2231ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2232ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2233ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TagType *T); 2234ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2235ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<TagType>(T) && classof(cast<TagType>(T)); 2236ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2237ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const RecordType *) { return true; } 2238ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2239ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2240ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 2241ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// to detect TagType objects of enums. 2242ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass EnumType : public TagType { 2243ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao explicit EnumType(const EnumDecl *D) 2244ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : TagType(Enum, reinterpret_cast<const TagDecl*>(D), QualType()) { } 2245ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2246ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2247ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2248ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao EnumDecl *getDecl() const { 2249ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 2250ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2251ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2252ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2253ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2254ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2255ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TagType *T); 2256ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2257ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<TagType>(T) && classof(cast<TagType>(T)); 2258ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2259ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const EnumType *) { return true; } 2260ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2261ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2262ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ElaboratedType - A non-canonical type used to represents uses of 2263ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// elaborated type specifiers in C++. For example: 2264ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2265ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// void foo(union MyUnion); 2266ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ^^^^^^^^^^^^^ 2267ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2268ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// At the moment, for efficiency we do not create elaborated types in 2269ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// C, since outside of typedefs all references to structs would 2270ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// necessarily be elaborated. 2271ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ElaboratedType : public Type, public llvm::FoldingSetNode { 2272ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2273ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao enum TagKind { 2274ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TK_struct, 2275ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TK_union, 2276ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TK_class, 2277ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TK_enum 2278ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao }; 2279ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2280ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoprivate: 2281ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The tag that was used in this elaborated type specifier. 2282ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TagKind Tag; 2283ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2284ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The underlying type. 2285ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType UnderlyingType; 2286ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2287ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao explicit ElaboratedType(QualType Ty, TagKind Tag, QualType Canon) 2288ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(Elaborated, Canon, Canon->isDependentType()), 2289ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Tag(Tag), UnderlyingType(Ty) { } 2290ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2291ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2292ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2293ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TagKind getTagKind() const { return Tag; } 2294ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getUnderlyingType() const { return UnderlyingType; } 2295ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2296ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Remove a single level of sugar. 2297ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return getUnderlyingType(); } 2298ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2299ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Returns whether this type directly provides sugar. 2300ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return true; } 2301ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2302ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static const char *getNameForTagKind(TagKind Kind) { 2303ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao switch (Kind) { 2304ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao default: assert(0 && "Unknown TagKind!"); 2305ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case TK_struct: return "struct"; 2306ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case TK_union: return "union"; 2307ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case TK_class: return "class"; 2308ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao case TK_enum: return "enum"; 2309ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2310ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2311ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2312ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2313ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getUnderlyingType(), getTagKind()); 2314ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2315ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType T, TagKind Tag) { 2316ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(T.getAsOpaquePtr()); 2317ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Tag); 2318ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2319ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2320ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ElaboratedType*) { return true; } 2321ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { return T->getTypeClass() == Elaborated; } 2322ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2323ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2324ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass TemplateTypeParmType : public Type, public llvm::FoldingSetNode { 2325ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned Depth : 15; 2326ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned Index : 16; 2327ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned ParameterPack : 1; 2328ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao IdentifierInfo *Name; 2329ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2330ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TemplateTypeParmType(unsigned D, unsigned I, bool PP, IdentifierInfo *N, 2331ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType Canon) 2332ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(TemplateTypeParm, Canon, /*Dependent=*/true), 2333ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Depth(D), Index(I), ParameterPack(PP), Name(N) { } 2334ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2335ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TemplateTypeParmType(unsigned D, unsigned I, bool PP) 2336ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true), 2337ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Depth(D), Index(I), ParameterPack(PP), Name(0) { } 2338ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2339ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these 2340ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2341ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2342ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getDepth() const { return Depth; } 2343ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getIndex() const { return Index; } 2344ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isParameterPack() const { return ParameterPack; } 2345ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao IdentifierInfo *getName() const { return Name; } 2346ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2347ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2348ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2349ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2350ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2351ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Depth, Index, ParameterPack, Name); 2352ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2353ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2354ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, 2355ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned Index, bool ParameterPack, 2356ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao IdentifierInfo *Name) { 2357ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Depth); 2358ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Index); 2359ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddBoolean(ParameterPack); 2360ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Name); 2361ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2362ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2363ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2364ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == TemplateTypeParm; 2365ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2366ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TemplateTypeParmType *T) { return true; } 2367ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2368ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2369ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Represents the result of substituting a type for a template 2370ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type parameter. 2371ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2372ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Within an instantiated template, all template type parameters have 2373ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// been replaced with these. They are used solely to record that a 2374ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type was originally written as a template type parameter; 2375ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// therefore they are never canonical. 2376ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass SubstTemplateTypeParmType : public Type, public llvm::FoldingSetNode { 2377ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The original type parameter. 2378ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateTypeParmType *Replaced; 2379ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2380ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao SubstTemplateTypeParmType(const TemplateTypeParmType *Param, QualType Canon) 2381ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(SubstTemplateTypeParm, Canon, Canon->isDependentType()), 2382ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Replaced(Param) { } 2383ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2384ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; 2385ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2386ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2387ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao IdentifierInfo *getName() const { return Replaced->getName(); } 2388ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2389ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Gets the template parameter that was substituted for. 2390ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateTypeParmType *getReplacedParameter() const { 2391ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Replaced; 2392ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2393ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2394ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Gets the type that was substituted for the template 2395ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// parameter. 2396ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getReplacementType() const { 2397ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getCanonicalTypeInternal(); 2398ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2399ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2400ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return true; } 2401ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return getReplacementType(); } 2402ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2403ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2404ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, getReplacedParameter(), getReplacementType()); 2405ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2406ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, 2407ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateTypeParmType *Replaced, 2408ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType Replacement) { 2409ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Replaced); 2410ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Replacement.getAsOpaquePtr()); 2411ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2412ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2413ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2414ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == SubstTemplateTypeParm; 2415ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2416ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const SubstTemplateTypeParmType *T) { return true; } 2417ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2418ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2419ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Represents the type of a template specialization as written 2420ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// in the source code. 2421ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2422ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Template specialization types represent the syntactic form of a 2423ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// template-id that refers to a type, e.g., @c vector<int>. Some 2424ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// template specialization types are syntactic sugar, whose canonical 2425ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type will point to some other type node that represents the 2426ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// instantiation or class template specialization. For example, a 2427ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// class template specialization type of @c vector<int> will refer to 2428ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// a tag type for the instantiation 2429ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// @c std::vector<int, std::allocator<int>>. 2430ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2431ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Other template specialization types, for which the template name 2432ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// is dependent, may be canonical types. These types are always 2433ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// dependent. 2434ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass TemplateSpecializationType 2435ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : public Type, public llvm::FoldingSetNode { 2436ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2437ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The ASTContext is currently needed in order to profile expressions. 2438ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: avoid this. 2439ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // 2440ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // The bool is whether this is a current instantiation. 2441ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao llvm::PointerIntPair<ASTContext*, 1, bool> ContextAndCurrentInstantiation; 2442ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2443ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The name of the template being specialized. 2444ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TemplateName Template; 2445ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2446ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief - The number of template arguments named in this class 2447ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// template specialization. 2448ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs; 2449ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2450ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TemplateSpecializationType(ASTContext &Context, 2451ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TemplateName T, 2452ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool IsCurrentInstantiation, 2453ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateArgument *Args, 2454ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs, QualType Canon); 2455ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2456ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual void Destroy(ASTContext& C); 2457ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2458ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these 2459ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2460ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2461ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Determine whether any of the given template arguments are 2462ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// dependent. 2463ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool anyDependentTemplateArguments(const TemplateArgument *Args, 2464ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs); 2465ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2466ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool anyDependentTemplateArguments(const TemplateArgumentLoc *Args, 2467ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs); 2468ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2469ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool anyDependentTemplateArguments(const TemplateArgumentListInfo &); 2470ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2471ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Print a template argument list, including the '<' and '>' 2472ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// enclosing the template arguments. 2473ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static std::string PrintTemplateArgumentList(const TemplateArgument *Args, 2474ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs, 2475ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const PrintingPolicy &Policy); 2476ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2477ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static std::string PrintTemplateArgumentList(const TemplateArgumentLoc *Args, 2478ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs, 2479ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const PrintingPolicy &Policy); 2480ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2481ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static std::string PrintTemplateArgumentList(const TemplateArgumentListInfo &, 2482ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const PrintingPolicy &Policy); 2483ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2484ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// True if this template specialization type matches a current 2485ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// instantiation in the context in which it is found. 2486ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isCurrentInstantiation() const { 2487ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return ContextAndCurrentInstantiation.getInt(); 2488ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2489ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2490ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef const TemplateArgument * iterator; 2491ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2492ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao iterator begin() const { return getArgs(); } 2493ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao iterator end() const; 2494ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2495ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the name of the template that we are specializing. 2496ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao TemplateName getTemplateName() const { return Template; } 2497ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2498ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the template arguments. 2499ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateArgument *getArgs() const { 2500ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return reinterpret_cast<const TemplateArgument *>(this + 1); 2501ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2502ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2503ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the number of template arguments. 2504ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getNumArgs() const { return NumArgs; } 2505ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2506ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve a specific template argument as a type. 2507ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \precondition @c isArgType(Arg) 2508ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateArgument &getArg(unsigned Idx) const; 2509ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2510ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { 2511ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return !isDependentType() || isCurrentInstantiation(); 2512ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2513ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return getCanonicalTypeInternal(); } 2514ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2515ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2516ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Template, isCurrentInstantiation(), getArgs(), NumArgs, 2517ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao *ContextAndCurrentInstantiation.getPointer()); 2518ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2519ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2520ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, TemplateName T, 2521ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool IsCurrentInstantiation, 2522ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateArgument *Args, 2523ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumArgs, 2524ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext &Context); 2525ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2526ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2527ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == TemplateSpecialization; 2528ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2529ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const TemplateSpecializationType *T) { return true; } 2530ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2531ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2532ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief The injected class name of a C++ class template or class 2533ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// template partial specialization. Used to record that a type was 2534ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// spelled with a bare identifier rather than as a template-id; the 2535ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// equivalent for non-templated classes is just RecordType. 2536ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2537ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Injected class name types are always dependent. Template 2538ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// instantiation turns these into RecordTypes. 2539ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2540ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Injected class name types are always canonical. This works 2541ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// because it is impossible to compare an injected class name type 2542ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// with the corresponding non-injected template type, for the same 2543ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// reason that it is impossible to directly compare template 2544ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// parameters from different dependent contexts: injected class name 2545ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// types can only occur within the scope of a particular templated 2546ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// declaration, and within that scope every template specialization 2547ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// will canonicalize to the injected class name (when appropriate 2548ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// according to the rules of the language). 2549ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass InjectedClassNameType : public Type { 2550ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CXXRecordDecl *Decl; 2551ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2552ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The template specialization which this type represents. 2553ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// For example, in 2554ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// template <class T> class A { ... }; 2555ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// this is A<T>, whereas in 2556ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// template <class X, class Y> class A<B<X,Y> > { ... }; 2557ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// this is A<B<X,Y> >. 2558ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 2559ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// It is always unqualified, always a template specialization type, 2560ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// and always dependent. 2561ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType InjectedType; 2562ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2563ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2564ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao InjectedClassNameType(CXXRecordDecl *D, QualType TST) 2565ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(InjectedClassName, QualType(), true), 2566ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Decl(D), InjectedType(TST) { 2567ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(isa<TemplateSpecializationType>(TST)); 2568ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!TST.hasQualifiers()); 2569ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(TST->isDependentType()); 2570ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2571ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2572ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2573ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getInjectedSpecializationType() const { return InjectedType; } 2574ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateSpecializationType *getInjectedTST() const { 2575ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return cast<TemplateSpecializationType>(InjectedType.getTypePtr()); 2576ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2577ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2578ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao CXXRecordDecl *getDecl() const { return Decl; } 2579ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2580ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2581ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2582ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2583ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2584ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == InjectedClassName; 2585ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2586ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const InjectedClassNameType *T) { return true; } 2587ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2588ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2589ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief The elaboration keyword that precedes a qualified type name or 2590ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// introduces an elaborated-type-specifier. 2591ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoenum ElaboratedTypeKeyword { 2592ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief No keyword precedes the qualified type name. 2593ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ETK_None, 2594ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The "typename" keyword precedes the qualified type name, e.g., 2595ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \c typename T::type. 2596ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ETK_Typename, 2597ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The "class" keyword introduces the elaborated-type-specifier. 2598ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ETK_Class, 2599ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The "struct" keyword introduces the elaborated-type-specifier. 2600ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ETK_Struct, 2601ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The "union" keyword introduces the elaborated-type-specifier. 2602ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ETK_Union, 2603ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The "enum" keyword introduces the elaborated-type-specifier. 2604ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ETK_Enum 2605ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2606ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2607ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Represents a type that was referred to via a qualified 2608ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// name, e.g., N::M::type. 2609ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2610ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// This type is used to keep track of a type name as written in the 2611ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// source code, including any nested-name-specifiers. The type itself 2612ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// is always "sugar", used to express what was written in the source 2613ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// code but containing no additional semantic information. 2614ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass QualifiedNameType : public Type, public llvm::FoldingSetNode { 2615ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The nested name specifier containing the qualifier. 2616ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NestedNameSpecifier *NNS; 2617ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2618ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The type that this qualified name refers to. 2619ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType NamedType; 2620ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2621ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualifiedNameType(NestedNameSpecifier *NNS, QualType NamedType, 2622ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType CanonType) 2623ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(QualifiedName, CanonType, NamedType->isDependentType()), 2624ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NNS(NNS), NamedType(NamedType) { } 2625ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2626ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these 2627ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2628ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2629ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the qualification on this type. 2630ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NestedNameSpecifier *getQualifier() const { return NNS; } 2631ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2632ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the type named by the qualified-id. 2633ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getNamedType() const { return NamedType; } 2634ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2635ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Remove a single level of sugar. 2636ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return getNamedType(); } 2637ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2638ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Returns whether this type directly provides sugar. 2639ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return true; } 2640ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2641ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2642ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, NNS, NamedType); 2643ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2644ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2645ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS, 2646ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType NamedType) { 2647ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(NNS); 2648ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NamedType.Profile(ID); 2649ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2650ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2651ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2652ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == QualifiedName; 2653ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2654ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const QualifiedNameType *T) { return true; } 2655ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2656ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2657ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Represents a qualified type name for which the type name is 2658ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// dependent. 2659ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2660ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// DependentNameType represents a class of dependent types that involve a 2661ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// dependent nested-name-specifier (e.g., "T::") followed by a (dependent) 2662ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// name of a type. The DependentNameType may start with a "typename" (for a 2663ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// typename-specifier), "class", "struct", "union", or "enum" (for a 2664ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// dependent elaborated-type-specifier), or nothing (in contexts where we 2665ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// know that we must be referring to a type, e.g., in a base class specifier). 2666ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass DependentNameType : public Type, public llvm::FoldingSetNode { 2667ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The keyword used to elaborate this type. 2668ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ElaboratedTypeKeyword Keyword; 2669ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2670ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The nested name specifier containing the qualifier. 2671ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NestedNameSpecifier *NNS; 2672ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2673ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef llvm::PointerUnion<const IdentifierInfo *, 2674ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateSpecializationType *> NameType; 2675ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2676ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The type that this typename specifier refers to. 2677ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NameType Name; 2678ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2679ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 2680ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const IdentifierInfo *Name, QualType CanonType) 2681ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(DependentName, CanonType, true), 2682ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Keyword(Keyword), NNS(NNS), Name(Name) { 2683ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(NNS->isDependent() && 2684ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao "DependentNameType requires a dependent nested-name-specifier"); 2685ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2686ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2687ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, 2688ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateSpecializationType *Ty, QualType CanonType) 2689ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Type(DependentName, CanonType, true), 2690ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Keyword(Keyword), NNS(NNS), Name(Ty) { 2691ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(NNS->isDependent() && 2692ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao "DependentNameType requires a dependent nested-name-specifier"); 2693ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2694ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2695ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these 2696ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2697ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2698ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the keyword used to elaborate this type. 2699ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ElaboratedTypeKeyword getKeyword() const { return Keyword; } 2700ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2701ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the qualification on this type. 2702ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NestedNameSpecifier *getQualifier() const { return NNS; } 2703ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2704ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the type named by the typename specifier as an 2705ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// identifier. 2706ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 2707ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// This routine will return a non-NULL identifier pointer when the 2708ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// form of the original typename was terminated by an identifier, 2709ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// e.g., "typename T::type". 2710ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const IdentifierInfo *getIdentifier() const { 2711ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Name.dyn_cast<const IdentifierInfo *>(); 2712ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2713ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2714ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the type named by the typename specifier as a 2715ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// type specialization. 2716ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const TemplateSpecializationType *getTemplateId() const { 2717ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Name.dyn_cast<const TemplateSpecializationType *>(); 2718ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2719ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2720ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2721ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2722ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2723ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID) { 2724ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Profile(ID, Keyword, NNS, Name); 2725ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2726ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2727ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, ElaboratedTypeKeyword Keyword, 2728ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NestedNameSpecifier *NNS, NameType Name) { 2729ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddInteger(Keyword); 2730ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(NNS); 2731ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ID.AddPointer(Name.getOpaqueValue()); 2732ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2733ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2734ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2735ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == DependentName; 2736ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2737ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const DependentNameType *T) { return true; } 2738ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2739ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2740ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 2741ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// object oriented design. They basically correspond to C++ classes. There 2742ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// are two kinds of interface types, normal interfaces like "NSString" and 2743ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// qualified interfaces, which are qualified with a protocol list like 2744ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// "NSString<NSCopyable, NSAmazing>". 2745ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ObjCInterfaceType : public Type, public llvm::FoldingSetNode { 2746ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCInterfaceDecl *Decl; 2747ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2748ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The number of protocols stored after the ObjCInterfaceType node. 2749ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The list of protocols is sorted on protocol name. No protocol is enterred 2750ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// more than once. 2751ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumProtocols; 2752ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2753ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCInterfaceType(QualType Canonical, ObjCInterfaceDecl *D, 2754ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCProtocolDecl **Protos, unsigned NumP); 2755ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2756ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2757ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Destroy(ASTContext& C); 2758ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2759ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCInterfaceDecl *getDecl() const { return Decl; } 2760ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2761ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getNumProtocols - Return the number of qualifying protocols in this 2762ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// interface type, or 0 if there are none. 2763ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getNumProtocols() const { return NumProtocols; } 2764ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2765ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the Ith protocol. 2766ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCProtocolDecl *getProtocol(unsigned I) const { 2767ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(I < getNumProtocols() && "Out-of-range protocol access"); 2768ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return qual_begin()[I]; 2769ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2770ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2771ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// qual_iterator and friends: this provides access to the (potentially empty) 2772ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// list of protocols qualifying this interface. 2773ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef ObjCProtocolDecl* const * qual_iterator; 2774ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao qual_iterator qual_begin() const { 2775ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return reinterpret_cast<qual_iterator>(this + 1); 2776ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2777ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao qual_iterator qual_end() const { 2778ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return qual_begin() + NumProtocols; 2779ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2780ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool qual_empty() const { return NumProtocols == 0; } 2781ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2782ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2783ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2784ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2785ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID); 2786ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, 2787ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ObjCInterfaceDecl *Decl, 2788ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCProtocolDecl * const *protocols, 2789ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumProtocols); 2790ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2791ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 2792ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2793ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2794ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == ObjCInterface; 2795ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2796ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ObjCInterfaceType *) { return true; } 2797ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2798ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2799ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// ObjCObjectPointerType - Used to represent 'id', 'Interface *', 'id <p>', 2800ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// and 'Interface <p> *'. 2801ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 2802ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Duplicate protocols are removed and protocol list is canonicalized to be in 2803ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// alphabetical order. 2804ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass ObjCObjectPointerType : public Type, public llvm::FoldingSetNode { 2805ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType PointeeType; // A builtin or interface type. 2806ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2807ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief The number of protocols stored after the ObjCObjectPointerType 2808ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// node. 2809ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// 2810ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// The list of protocols is sorted on protocol name. No protocol is enterred 2811ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// more than once. 2812ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumProtocols; 2813ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2814ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCObjectPointerType(QualType Canonical, QualType T, 2815ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCProtocolDecl **Protos, unsigned NumP); 2816ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao friend class ASTContext; // ASTContext creates these. 2817ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2818ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2819ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Destroy(ASTContext& C); 2820ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2821ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Get the pointee type. Pointee will either be: 2822ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // - a built-in type (for 'id' and 'Class'). 2823ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // - an interface type (for user-defined types). 2824ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // - a TypedefType whose canonical type is an interface (as in 'T' below). 2825ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // For example: typedef NSObject T; T *var; 2826ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType getPointeeType() const { return PointeeType; } 2827ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2828ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ObjCInterfaceType *getInterfaceType() const { 2829ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return PointeeType->getAs<ObjCInterfaceType>(); 2830ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2831ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getInterfaceDecl - returns an interface decl for user-defined types. 2832ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCInterfaceDecl *getInterfaceDecl() const { 2833ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getInterfaceType() ? getInterfaceType()->getDecl() : 0; 2834ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2835ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isObjCIdType - true for "id". 2836ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCIdType() const { 2837ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCId) && 2838ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao !NumProtocols; 2839ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2840ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isObjCClassType - true for "Class". 2841ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCClassType() const { 2842ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCClass) && 2843ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao !NumProtocols; 2844ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2845ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2846ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isObjCQualifiedIdType - true for "id <p>". 2847ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCQualifiedIdType() const { 2848ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCId) && 2849ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NumProtocols; 2850ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2851ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// isObjCQualifiedClassType - true for "Class <p>". 2852ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isObjCQualifiedClassType() const { 2853ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCClass) && 2854ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao NumProtocols; 2855ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2856ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// qual_iterator and friends: this provides access to the (potentially empty) 2857ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// list of protocols qualifying this interface. 2858ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao typedef ObjCProtocolDecl* const * qual_iterator; 2859ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2860ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao qual_iterator qual_begin() const { 2861ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return reinterpret_cast<qual_iterator> (this + 1); 2862ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2863ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao qual_iterator qual_end() const { 2864ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return qual_begin() + NumProtocols; 2865ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2866ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool qual_empty() const { return NumProtocols == 0; } 2867ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2868ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// getNumProtocols - Return the number of qualifying protocols in this 2869ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// interface type, or 0 if there are none. 2870ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned getNumProtocols() const { return NumProtocols; } 2871ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2872ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// \brief Retrieve the Ith protocol. 2873ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCProtocolDecl *getProtocol(unsigned I) const { 2874ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(I < getNumProtocols() && "Out-of-range protocol access"); 2875ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return qual_begin()[I]; 2876ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2877ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2878ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isSugared() const { return false; } 2879ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType desugar() const { return QualType(this, 0); } 2880ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2881ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao virtual Linkage getLinkage() const; 2882ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2883ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void Profile(llvm::FoldingSetNodeID &ID); 2884ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static void Profile(llvm::FoldingSetNodeID &ID, QualType T, 2885ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ObjCProtocolDecl *const *protocols, 2886ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned NumProtocols); 2887ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const Type *T) { 2888ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getTypeClass() == ObjCObjectPointer; 2889ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2890ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao static bool classof(const ObjCObjectPointerType *) { return true; } 2891ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2892ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2893ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// A qualifier set is used to build a set of qualifiers. 2894ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoclass QualifierCollector : public Qualifiers { 2895ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ASTContext *Context; 2896ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2897ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaopublic: 2898ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualifierCollector(Qualifiers Qs = Qualifiers()) 2899ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Qualifiers(Qs), Context(0) {} 2900ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualifierCollector(ASTContext &Context, Qualifiers Qs = Qualifiers()) 2901ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao : Qualifiers(Qs), Context(&Context) {} 2902ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2903ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao void setContext(ASTContext &C) { Context = &C; } 2904ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2905ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Collect any qualifiers on the given type and return an 2906ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// unqualified type. 2907ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *strip(QualType QT) { 2908ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao addFastQualifiers(QT.getLocalFastQualifiers()); 2909ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (QT.hasLocalNonFastQualifiers()) { 2910ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtQuals *EQ = QT.getExtQualsUnsafe(); 2911ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Context = &EQ->getContext(); 2912ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao addQualifiers(EQ->getQualifiers()); 2913ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return EQ->getBaseType(); 2914ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2915ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return QT.getTypePtrUnsafe(); 2916ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 2917ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2918ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Apply the collected qualifiers to the given type. 2919ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType apply(QualType QT) const; 2920ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2921ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao /// Apply the collected qualifiers to the given type. 2922ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType apply(const Type* T) const; 2923ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2924ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao}; 2925ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2926ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2927ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Inline function definitions. 2928ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2929ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isCanonical() const { 2930ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *T = getTypePtr(); 2931ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (hasLocalQualifiers()) 2932ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->isCanonicalUnqualified() && !isa<ArrayType>(T); 2933ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->isCanonicalUnqualified(); 2934ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2935ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2936ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isCanonicalAsParam() const { 2937ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (hasLocalQualifiers()) return false; 2938ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *T = getTypePtr(); 2939ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->isCanonicalUnqualified() && 2940ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao !isa<FunctionType>(T) && !isa<ArrayType>(T); 2941ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2942ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2943ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isConstQualified() const { 2944ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isLocalConstQualified() || 2945ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getTypePtr()->getCanonicalTypeInternal().isLocalConstQualified(); 2946ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2947ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2948ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isRestrictQualified() const { 2949ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isLocalRestrictQualified() || 2950ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getTypePtr()->getCanonicalTypeInternal().isLocalRestrictQualified(); 2951ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2952ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2953ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2954ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isVolatileQualified() const { 2955ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isLocalVolatileQualified() || 2956ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getTypePtr()->getCanonicalTypeInternal().isLocalVolatileQualified(); 2957ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2958ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2959ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::hasQualifiers() const { 2960ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return hasLocalQualifiers() || 2961ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getTypePtr()->getCanonicalTypeInternal().hasLocalQualifiers(); 2962ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2963ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2964ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline Qualifiers QualType::getQualifiers() const { 2965ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qualifiers Quals = getLocalQualifiers(); 2966ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Quals.addQualifiers( 2967ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getTypePtr()->getCanonicalTypeInternal().getLocalQualifiers()); 2968ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Quals; 2969ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2970ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2971ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline unsigned QualType::getCVRQualifiers() const { 2972ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getLocalCVRQualifiers() | 2973ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao getTypePtr()->getCanonicalTypeInternal().getLocalCVRQualifiers(); 2974ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2975ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2976ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// getCVRQualifiersThroughArrayTypes - If there are CVR qualifiers for this 2977ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type, returns them. Otherwise, if this is an array type, recurses 2978ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// on the element type until some qualifiers have been found or a non-array 2979ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// type reached. 2980ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline unsigned QualType::getCVRQualifiersThroughArrayTypes() const { 2981ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (unsigned Quals = getCVRQualifiers()) 2982ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Quals; 2983ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType CT = getTypePtr()->getCanonicalTypeInternal(); 2984ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 2985ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return AT->getElementType().getCVRQualifiersThroughArrayTypes(); 2986ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return 0; 2987ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2988ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2989ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline void QualType::removeConst() { 2990ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao removeFastQualifiers(Qualifiers::Const); 2991ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2992ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2993ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline void QualType::removeRestrict() { 2994ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao removeFastQualifiers(Qualifiers::Restrict); 2995ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 2996ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 2997ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline void QualType::removeVolatile() { 2998ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualifierCollector Qc; 2999ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *Ty = Qc.strip(*this); 3000ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (Qc.hasVolatile()) { 3001ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qc.removeVolatile(); 3002ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao *this = Qc.apply(Ty); 3003ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 3004ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3005ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3006ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline void QualType::removeCVRQualifiers(unsigned Mask) { 3007ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao assert(!(Mask & ~Qualifiers::CVRMask) && "mask has non-CVR bits"); 3008ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3009ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // Fast path: we don't need to touch the slow qualifiers. 3010ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (!(Mask & ~Qualifiers::FastMask)) { 3011ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao removeFastQualifiers(Mask); 3012ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return; 3013ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 3014ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3015ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualifierCollector Qc; 3016ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const Type *Ty = Qc.strip(*this); 3017ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Qc.removeCVRQualifiers(Mask); 3018ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao *this = Qc.apply(Ty); 3019ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3020ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3021ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// getAddressSpace - Return the address space of this type. 3022ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline unsigned QualType::getAddressSpace() const { 3023ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (hasLocalNonFastQualifiers()) { 3024ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtQuals *EQ = getExtQualsUnsafe(); 3025ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (EQ->hasAddressSpace()) 3026ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return EQ->getAddressSpace(); 3027ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 3028ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3029ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType CT = getTypePtr()->getCanonicalTypeInternal(); 3030ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (CT.hasLocalNonFastQualifiers()) { 3031ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtQuals *EQ = CT.getExtQualsUnsafe(); 3032ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (EQ->hasAddressSpace()) 3033ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return EQ->getAddressSpace(); 3034ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 3035ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3036ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 3037ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return AT->getElementType().getAddressSpace(); 3038ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const RecordType *RT = dyn_cast<RecordType>(CT)) 3039ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return RT->getAddressSpace(); 3040ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return 0; 3041ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3042ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3043ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// getObjCGCAttr - Return the gc attribute of this type. 3044ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline Qualifiers::GC QualType::getObjCGCAttr() const { 3045ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (hasLocalNonFastQualifiers()) { 3046ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtQuals *EQ = getExtQualsUnsafe(); 3047ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (EQ->hasObjCGCAttr()) 3048ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return EQ->getObjCGCAttr(); 3049ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 3050ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3051ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType CT = getTypePtr()->getCanonicalTypeInternal(); 3052ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (CT.hasLocalNonFastQualifiers()) { 3053ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao const ExtQuals *EQ = CT.getExtQualsUnsafe(); 3054ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (EQ->hasObjCGCAttr()) 3055ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return EQ->getObjCGCAttr(); 3056ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } 3057ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3058ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 3059ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return AT->getElementType().getObjCGCAttr(); 3060ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ObjCObjectPointerType *PT = CT->getAs<ObjCObjectPointerType>()) 3061ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return PT->getPointeeType().getObjCGCAttr(); 3062ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // We most look at all pointer types, not just pointer to interface types. 3063ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const PointerType *PT = CT->getAs<PointerType>()) 3064ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return PT->getPointeeType().getObjCGCAttr(); 3065ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Qualifiers::GCNone; 3066ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3067ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3068ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline FunctionType::ExtInfo getFunctionExtInfo(const Type &t) { 3069ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const PointerType *PT = t.getAs<PointerType>()) { 3070ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const FunctionType *FT = PT->getPointeeType()->getAs<FunctionType>()) 3071ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return FT->getExtInfo(); 3072ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao } else if (const FunctionType *FT = t.getAs<FunctionType>()) 3073ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return FT->getExtInfo(); 3074ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3075ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return FunctionType::ExtInfo(); 3076ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3077ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3078ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline FunctionType::ExtInfo getFunctionExtInfo(QualType t) { 3079ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return getFunctionExtInfo(*t); 3080ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3081ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3082ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// isMoreQualifiedThan - Determine whether this type is more 3083ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// qualified than the Other type. For example, "const volatile int" 3084ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// is more qualified than "const int", "volatile int", and 3085ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// "int". However, it is not more qualified than "const volatile 3086ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// int". 3087ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isMoreQualifiedThan(QualType Other) const { 3088ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: work on arbitrary qualifiers 3089ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned MyQuals = this->getCVRQualifiersThroughArrayTypes(); 3090ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned OtherQuals = Other.getCVRQualifiersThroughArrayTypes(); 3091ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (getAddressSpace() != Other.getAddressSpace()) 3092ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3093ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals; 3094ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3095ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3096ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// isAtLeastAsQualifiedAs - Determine whether this type is at last 3097ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// as qualified as the Other type. For example, "const volatile 3098ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// int" is at least as qualified as "const int", "volatile int", 3099ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// "int", and "const volatile int". 3100ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const { 3101ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // FIXME: work on arbitrary qualifiers 3102ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned MyQuals = this->getCVRQualifiersThroughArrayTypes(); 3103ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao unsigned OtherQuals = Other.getCVRQualifiersThroughArrayTypes(); 3104ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (getAddressSpace() != Other.getAddressSpace()) 3105ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3106ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (MyQuals | OtherQuals) == MyQuals; 3107ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3108ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3109ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// getNonReferenceType - If Type is a reference type (e.g., const 3110ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// int&), returns the type that the reference refers to ("const 3111ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// int"). Otherwise, returns the type itself. This routine is used 3112ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// throughout Sema to implement C++ 5p6: 3113ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 3114ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// If an expression initially has the type "reference to T" (8.3.2, 3115ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// 8.5.3), the type is adjusted to "T" prior to any further 3116ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// analysis, the expression designates the object or function 3117ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// denoted by the reference, and the expression is an lvalue. 3118ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline QualType QualType::getNonReferenceType() const { 3119ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ReferenceType *RefType = (*this)->getAs<ReferenceType>()) 3120ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return RefType->getPointeeType(); 3121ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao else 3122ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return *this; 3123ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3124ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3125ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const { 3126ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const PointerType *PT = getAs<PointerType>()) 3127ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return PT->getPointeeType()->getAs<ObjCInterfaceType>(); 3128ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return 0; 3129ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3130ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3131ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isFunctionType() const { 3132ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<FunctionType>(CanonicalType); 3133ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3134ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isPointerType() const { 3135ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<PointerType>(CanonicalType); 3136ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3137ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isAnyPointerType() const { 3138ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isPointerType() || isObjCObjectPointerType(); 3139ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3140ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isBlockPointerType() const { 3141ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<BlockPointerType>(CanonicalType); 3142ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3143ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isReferenceType() const { 3144ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ReferenceType>(CanonicalType); 3145ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3146ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isLValueReferenceType() const { 3147ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<LValueReferenceType>(CanonicalType); 3148ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3149ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isRValueReferenceType() const { 3150ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<RValueReferenceType>(CanonicalType); 3151ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3152ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isFunctionPointerType() const { 3153ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const PointerType* T = getAs<PointerType>()) 3154ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getPointeeType()->isFunctionType(); 3155ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao else 3156ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3157ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3158ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isMemberPointerType() const { 3159ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<MemberPointerType>(CanonicalType); 3160ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3161ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isMemberFunctionPointerType() const { 3162ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const MemberPointerType* T = getAs<MemberPointerType>()) 3163ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return T->getPointeeType()->isFunctionType(); 3164ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao else 3165ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3166ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3167ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isArrayType() const { 3168ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ArrayType>(CanonicalType); 3169ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3170ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isConstantArrayType() const { 3171ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ConstantArrayType>(CanonicalType); 3172ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3173ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isIncompleteArrayType() const { 3174ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<IncompleteArrayType>(CanonicalType); 3175ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3176ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isVariableArrayType() const { 3177ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<VariableArrayType>(CanonicalType); 3178ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3179ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isDependentSizedArrayType() const { 3180ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<DependentSizedArrayType>(CanonicalType); 3181ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3182ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isRecordType() const { 3183ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<RecordType>(CanonicalType); 3184ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3185ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isAnyComplexType() const { 3186ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ComplexType>(CanonicalType); 3187ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3188ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isVectorType() const { 3189ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<VectorType>(CanonicalType); 3190ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3191ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isExtVectorType() const { 3192ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ExtVectorType>(CanonicalType); 3193ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3194ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCObjectPointerType() const { 3195ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ObjCObjectPointerType>(CanonicalType); 3196ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3197ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCInterfaceType() const { 3198ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<ObjCInterfaceType>(CanonicalType); 3199ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3200ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCQualifiedIdType() const { 3201ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 3202ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return OPT->isObjCQualifiedIdType(); 3203ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3204ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3205ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCQualifiedClassType() const { 3206ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 3207ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return OPT->isObjCQualifiedClassType(); 3208ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3209ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3210ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCIdType() const { 3211ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 3212ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return OPT->isObjCIdType(); 3213ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3214ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3215ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCClassType() const { 3216ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 3217ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return OPT->isObjCClassType(); 3218ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3219ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3220ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCSelType() const { 3221ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const PointerType *OPT = getAs<PointerType>()) 3222ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return OPT->getPointeeType()->isSpecificBuiltinType(BuiltinType::ObjCSel); 3223ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3224ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3225ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isObjCBuiltinType() const { 3226ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isObjCIdType() || isObjCClassType() || isObjCSelType(); 3227ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3228ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isTemplateTypeParmType() const { 3229ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isa<TemplateTypeParmType>(CanonicalType); 3230ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3231ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3232ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isSpecificBuiltinType(unsigned K) const { 3233ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const BuiltinType *BT = getAs<BuiltinType>()) 3234ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (BT->getKind() == (BuiltinType::Kind) K) 3235ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return true; 3236ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return false; 3237ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3238ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3239ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// \brief Determines whether this is a type for which one can define 3240ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// an overloaded operator. 3241ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::isOverloadableType() const { 3242ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return isDependentType() || isRecordType() || isEnumeralType(); 3243ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3244ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3245ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::hasPointerRepresentation() const { 3246ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (isPointerType() || isReferenceType() || isBlockPointerType() || 3247ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao isObjCInterfaceType() || isObjCObjectPointerType() || 3248ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao isObjCQualifiedInterfaceType() || isNullPtrType()); 3249ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3250ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3251ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline bool Type::hasObjCPointerRepresentation() const { 3252ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return (isObjCInterfaceType() || isObjCObjectPointerType() || 3253ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao isObjCQualifiedInterfaceType()); 3254ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3255ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3256ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Insertion operator for diagnostics. This allows sending QualType's into a 3257ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// diagnostic with <<. 3258ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 3259ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType T) { 3260ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 3261ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Diagnostic::ak_qualtype); 3262ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return DB; 3263ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3264ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3265ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Insertion operator for partial diagnostics. This allows sending QualType's 3266ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// into a diagnostic with <<. 3267ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaoinline const PartialDiagnostic &operator<<(const PartialDiagnostic &PD, 3268ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao QualType T) { 3269ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao PD.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 3270ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao Diagnostic::ak_qualtype); 3271ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return PD; 3272ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3273ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3274ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// Helper class template that is used by Type::getAs to ensure that one does 3275ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao// not try to look through a qualified type to get to an array type. 3276ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T, 3277ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao bool isArrayType = (llvm::is_same<T, ArrayType>::value || 3278ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao llvm::is_base_of<ArrayType, T>::value)> 3279ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct ArrayType_cannot_be_used_with_getAs { }; 3280ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3281ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate<typename T> 3282ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaostruct ArrayType_cannot_be_used_with_getAs<T, true>; 3283ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3284ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao/// Member-template getAs<specific type>'. 3285ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liaotemplate <typename T> const T *Type::getAs() const { 3286ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao ArrayType_cannot_be_used_with_getAs<T> at; 3287ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao (void)at; 3288ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3289ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // If this is directly a T type, return it. 3290ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (const T *Ty = dyn_cast<T>(this)) 3291ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return Ty; 3292ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3293ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // If the canonical form of this type isn't the right kind, reject it. 3294ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao if (!isa<T>(CanonicalType)) 3295ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return 0; 3296ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3297ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // If this is a typedef for the type, strip the typedef off without 3298ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao // losing all typedef information. 3299ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao return cast<T>(getUnqualifiedDesugaredType()); 3300ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} 3301ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3302ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao} // end namespace clang 3303ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao 3304ea285162342df160e7860e26528bc7110bc6c0cdShih-wei Liao#endif 3305