Type.h revision e615803e1c4a70ba66b6687b2b95e1fdcd16cd3b
12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project//===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===// 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// The LLVM Compiler Infrastructure 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// This file is distributed under the University of Illinois Open Source 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// License. See LICENSE.TXT for details. 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project//===----------------------------------------------------------------------===// 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// This file defines the Type interface and subclasses. 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project//===----------------------------------------------------------------------===// 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef LLVM_CLANG_AST_TYPE_H 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define LLVM_CLANG_AST_TYPE_H 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "clang/Basic/Diagnostic.h" 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "clang/AST/NestedNameSpecifier.h" 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llvm/Support/Casting.h" 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llvm/ADT/APSInt.h" 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llvm/ADT/FoldingSet.h" 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llvm/ADT/PointerIntPair.h" 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "llvm/Bitcode/SerializationFwd.h" 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing llvm::isa; 2553f17a9db278d33517d9888dd77848f554522a38JP Abgrallusing llvm::cast; 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing llvm::cast_or_null; 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing llvm::dyn_cast; 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing llvm::dyn_cast_or_null; 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnamespace clang { 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class ASTContext; 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class Type; 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class TypedefDecl; 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class TemplateDecl; 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class TemplateTypeParmDecl; 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class NonTypeTemplateParmDecl; 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class TemplateTemplateParamDecl; 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class TagDecl; 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class RecordDecl; 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class CXXRecordDecl; 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class EnumDecl; 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class FieldDecl; 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class ObjCInterfaceDecl; 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class ObjCProtocolDecl; 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class ObjCMethodDecl; 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class Expr; 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class Stmt; 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class SourceLocation; 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class StmtIteratorBase; 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class TemplateArgument; 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project class QualifiedNameType; 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // Provide forward declarations for all of the *Type classes 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TYPE(Class, Base) class Class##Type; 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "clang/AST/TypeNodes.def" 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// QualType - For efficiency, we don't store CVR-qualified types as nodes on 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// their own: instead each reference to a type stores the qualifiers. This 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// greatly reduces the number of nodes we need to allocate for types (for 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// example we only need one for 'int', 'const int', 'volatile int', 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 'const volatile int', etc). 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// As an added efficiency bonus, instead of making this a pair, we just store 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// the three bits we care about in the low bits of the pointer. To handle the 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// packing/unpacking, we make QualType be a simple wrapper class that acts like 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// a smart pointer. 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass QualType { 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project llvm::PointerIntPair<Type*, 3> Value; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Const = 0x1, 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Restrict = 0x2, 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Volatile = 0x4, 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project CVRFlags = Const|Restrict|Volatile 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum GCAttrTypes { 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project GCNone = 0, 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Weak, 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Strong 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType() {} 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType(const Type *Ptr, unsigned Quals) 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : Value(const_cast<Type*>(Ptr), Quals) {} 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned getCVRQualifiers() const { return Value.getInt(); } 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void setCVRQualifiers(unsigned Quals) { Value.setInt(Quals); } 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type *getTypePtr() const { return Value.getPointer(); } 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static QualType getFromOpaquePtr(void *Ptr) { 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType T; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project T.Value.setFromOpaqueValue(Ptr); 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return T; 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall Type &operator*() const { 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return *getTypePtr(); 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type *operator->() const { 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return getTypePtr(); 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isNull - Return true if this QualType doesn't point to a type yet. 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isNull() const { 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return getTypePtr() == 0; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isConstQualified() const { 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (getCVRQualifiers() & Const) ? true : false; 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isVolatileQualified() const { 11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall return (getCVRQualifiers() & Volatile) ? true : false; 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isRestrictQualified() const { 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return (getCVRQualifiers() & Restrict) ? true : false; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isConstant(ASTContext& Ctx) const; 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// addConst/addVolatile/addRestrict - add the specified type qual to this 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// QualType. 12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall void addConst() { Value.setInt(Value.getInt() | Const); } 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void addVolatile() { Value.setInt(Value.getInt() | Volatile); } 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void addRestrict() { Value.setInt(Value.getInt() | Restrict); } 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void removeConst() { Value.setInt(Value.getInt() & ~Const); } 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void removeVolatile() { Value.setInt(Value.getInt() & ~Volatile); } 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void removeRestrict() { Value.setInt(Value.getInt() & ~Restrict); } 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getQualifiedType(unsigned TQs) const { 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return QualType(getTypePtr(), TQs); 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getWithAdditionalQualifiers(unsigned TQs) const { 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return QualType(getTypePtr(), TQs|getCVRQualifiers()); 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType withConst() const { return getWithAdditionalQualifiers(Const); } 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType withVolatile() const { return getWithAdditionalQualifiers(Volatile);} 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType withRestrict() const { return getWithAdditionalQualifiers(Restrict);} 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getUnqualifiedType() const; 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isMoreQualifiedThan(QualType Other) const; 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isAtLeastAsQualifiedAs(QualType Other) const; 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getNonReferenceType() const; 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// getDesugaredType - Return the specified type with any "sugar" removed from 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// the type. This takes off typedefs, typeof's etc. If the outer level of 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// the type is already concrete, it returns it unmodified. This is similar 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// to getting the canonical type, but it doesn't remove *all* typedefs. For 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// concrete. 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getDesugaredType() const; 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// operator==/!= - Indicate whether the specified types and qualifiers are 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// identical. 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool operator==(const QualType &RHS) const { 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return Value == RHS.Value; 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool operator!=(const QualType &RHS) const { 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return Value != RHS.Value; 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project std::string getAsString() const { 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project std::string S; 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getAsStringInternal(S); 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return S; 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void getAsStringInternal(std::string &Str) const; 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void dump(const char *s) const; 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void dump() const; 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) const { 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(getAsOpaquePtr()); 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// getAddressSpace - Return the address space of this type. 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inline unsigned getAddressSpace() const; 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// GCAttrTypesAttr - Returns gc attribute of this type. 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project inline QualType::GCAttrTypes getObjCGCAttr() const; 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isObjCGCWeak true when Type is objc's weak. 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isObjCGCWeak() const { 19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall return getObjCGCAttr() == Weak; 1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isObjCGCStrong true when Type is objc's strong. 1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isObjCGCStrong() const { 1952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return getObjCGCAttr() == Strong; 1962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Emit - Serialize a QualType to Bitcode. 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Emit(llvm::Serializer& S) const; 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Read - Deserialize a QualType from Bitcode. 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static QualType ReadVal(llvm::Deserializer& D); 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void ReadBackpatch(llvm::Deserializer& D); 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} // end clang. 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnamespace llvm { 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// Implement simplify_type for QualType, so that we can dyn_cast from QualType 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// to a specific Type class. 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttemplate<> struct simplify_type<const ::clang::QualType> { 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project typedef ::clang::Type* SimpleType; 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static SimpleType getSimplifiedValue(const ::clang::QualType &Val) { 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return Val.getTypePtr(); 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttemplate<> struct simplify_type< ::clang::QualType> 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : public simplify_type<const ::clang::QualType> {}; 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} // end namespace llvm 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnamespace clang { 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// Type - This is the base class of the type hierarchy. A central concept 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// with types is that each type always has a canonical type. A canonical type 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// is the type with any typedef names stripped out of it or the types it 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// references. For example, consider: 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// typedef int foo; 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// typedef foo* bar; 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 'int *' 'foo *' 'bar' 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// There will be a Type object created for 'int'. Since int is canonical, its 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// canonicaltype pointer points to itself. There is also a Type for 'foo' (a 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// TypedefType). Its CanonicalType pointer points to the 'int' Type. Next 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// there is a PointerType that represents 'int*', which, like 'int', is 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// type is 'int*', and there is a TypedefType for 'bar', whose canonical type 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// is also 'int*'. 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// Non-canonical types are useful for emitting diagnostics, without losing 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// information about typedefs being used. Canonical types are useful for type 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// comparisons (they allow by-pointer equality tests) and useful for reasoning 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// about whether something has a particular form (e.g. is a function type), 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// because they implicitly, recursively, strip all typedefs out of a type. 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// Types, once created, are immutable. 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass Type { 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum TypeClass { 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define TYPE(Class, Base) Class, 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define ABSTRACT_TYPE(Class, Base) 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "clang/AST/TypeNodes.def" 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TagFirst = Record, TagLast = Enum 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprivate: 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType CanonicalType; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Dependent - Whether this type is a dependent type (C++ [temp.dep.type]). 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool Dependent : 1; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Note that this should stay at the end of the ivars for Type so that 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// subclasses can pack their bitfields into the same word. 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned TC : 5; 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // silence VC++ warning C4355: 'this' : used in base member initializer list 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type *this_() { return this; } 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(TypeClass tc, QualType Canonical, bool dependent) 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical), 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Dependent(dependent), TC(tc) {} 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual ~Type() {} 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void Destroy(ASTContext& C); 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void EmitTypeInternal(llvm::Serializer& S) const; 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void ReadTypeInternal(llvm::Deserializer& D); 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); } 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isCanonical() const { return CanonicalType.getTypePtr() == this; } 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// object types, function types, and incomplete types. 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// \brief Determines whether the type describes an object in memory. 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Note that this definition of object type corresponds to the C++ 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// definition of object type, which includes incomplete types, as 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// opposed to the C definition (which does not include incomplete 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// types). 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isObjectType() const; 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isIncompleteType - Return true if this is an incomplete type. 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// A type that can describe objects, but which lacks information needed to 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// determine its size (e.g. void, or a fwd declared struct). Clients of this 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// routine will need to determine if the size is actually required. 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isIncompleteType() const; 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isIncompleteOrObjectType - Return true if this is an incomplete or object 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// type, in other words, not a function type. 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isIncompleteOrObjectType() const { 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return !isFunctionType(); 3092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 3102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 31153f17a9db278d33517d9888dd77848f554522a38JP Abgrall /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10). 3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isPODType() const; 3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array 3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// types that have a non-constant expression. This does not include "[]". 31653f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isVariablyModifiedType() const; 3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Helper methods to distinguish type categories. All type predicates 3192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// operate on the canonical type, ignoring typedefs and qualifiers. 3202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isSpecificBuiltinType - Test for a particular builtin type. 3222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isSpecificBuiltinType(unsigned K) const; 3232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 32453f17a9db278d33517d9888dd77848f554522a38JP Abgrall /// isIntegerType() does *not* include complex integers (a GCC extension). 3252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isComplexIntegerType() can be used to test for complex integers. 3262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isEnumeralType() const; 3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isBooleanType() const; 3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isCharType() const; 3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isWideCharType() const; 3312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isIntegralType() const; 3322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 33353f17a9db278d33517d9888dd77848f554522a38JP Abgrall /// Floating point categories. 3342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 3352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isComplexType() does *not* include complex integers (a GCC extension). 3362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isComplexIntegerType() can be used to test for complex integers. 3372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isComplexType() const; // C99 6.2.5p11 (complex) 3382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 3392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 3402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 3412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 3422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isVoidType() const; // C99 6.2.5p19 34353f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isDerivedType() const; // C99 6.2.5p20 3442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 3452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isAggregateType() const; 3462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // Type Predicates: Check to see if this type is structurally the specified 3482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // type, ignoring typedefs and qualifiers. 3492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isFunctionType() const; 3502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isFunctionNoProtoType() const { return getAsFunctionNoProtoType() != 0; } 3512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isFunctionProtoType() const { return getAsFunctionProtoType() != 0; } 3522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isPointerType() const; 3532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isBlockPointerType() const; 3542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isReferenceType() const; 35553f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isLValueReferenceType() const; 35653f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isRValueReferenceType() const; 35753f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isFunctionPointerType() const; 35853f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isMemberPointerType() const; 3592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isMemberFunctionPointerType() const; 36053f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isArrayType() const; 36153f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isConstantArrayType() const; 3622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isIncompleteArrayType() const; 3632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isVariableArrayType() const; 3642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isDependentSizedArrayType() const; 3652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isRecordType() const; 3662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isClassType() const; 3672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isStructureType() const; 3682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isUnionType() const; 3692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isComplexIntegerType() const; // GCC _Complex integer type. 3702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isVectorType() const; // GCC vector type. 3712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isExtVectorType() const; // Extended vector type. 3722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isObjCInterfaceType() const; // NSString or NSString<foo> 3732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isObjCQualifiedInterfaceType() const; // NSString<foo> 3742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isObjCQualifiedIdType() const; // id<foo> 3752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isTemplateTypeParmType() const; // C++ template type parameter 3762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isDependentType - Whether this type is a dependent type, meaning 3782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// that its definition somehow depends on a template parameter 3792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// (C++ [temp.dep.type]). 3802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isDependentType() const { return Dependent; } 3812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isOverloadableType() const; 3822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// hasPointerRepresentation - Whether this type is represented 3842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// natively as a pointer; this includes pointers, references, block 3852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// pointers, and Objective-C interface, qualified id, and qualified 3862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// interface types. 3872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool hasPointerRepresentation() const; 3882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// hasObjCPointerRepresentation - Whether this type can represent 3902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// an objective pointer type for the purpose of GC'ability 3912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool hasObjCPointerRepresentation() const; 3922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 3932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // Type Checking Functions: Check to see if this type is structurally the 3942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // specified type, ignoring typedefs and qualifiers, and return a pointer to 3952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // the best type we can. 3962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const BuiltinType *getAsBuiltinType() const; 3972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const FunctionType *getAsFunctionType() const; 3982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const FunctionNoProtoType *getAsFunctionNoProtoType() const; 3992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const FunctionProtoType *getAsFunctionProtoType() const; 4002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const PointerType *getAsPointerType() const; 4012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const BlockPointerType *getAsBlockPointerType() const; 4022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ReferenceType *getAsReferenceType() const; 4032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const LValueReferenceType *getAsLValueReferenceType() const; 4042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const RValueReferenceType *getAsRValueReferenceType() const; 4052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const MemberPointerType *getAsMemberPointerType() const; 4062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const TagType *getAsTagType() const; 4072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const RecordType *getAsRecordType() const; 4082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const RecordType *getAsStructureType() const; 4092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// NOTE: getAs*ArrayType are methods on ASTContext. 4102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const TypedefType *getAsTypedefType() const; 4112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const RecordType *getAsUnionType() const; 4122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const EnumType *getAsEnumType() const; 4132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const VectorType *getAsVectorType() const; // GCC vector type. 4142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ComplexType *getAsComplexType() const; 4152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 4162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ExtVectorType *getAsExtVectorType() const; // Extended vector type. 4172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ObjCInterfaceType *getAsObjCInterfaceType() const; 4182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const; 4192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const; 4202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const TemplateTypeParmType *getAsTemplateTypeParmType() const; 4212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ClassTemplateSpecializationType * 4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project getAsClassTemplateSpecializationType() const; 4242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// getAsPointerToObjCInterfaceType - If this is a pointer to an ObjC 4262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// interface, return the interface type, otherwise return null. 4272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ObjCInterfaceType *getAsPointerToObjCInterfaceType() const; 4282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// getArrayElementTypeNoTypeQual - If this is an array type, return the 4302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// element type of the array, potentially with type qualifiers missing. 4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// This method should never be used when type qualifiers are meaningful. 4322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const Type *getArrayElementTypeNoTypeQual() const; 4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// getDesugaredType - Return the specified type with any "sugar" removed from 4352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// the type. This takes off typedefs, typeof's etc. If the outer level of 4362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// the type is already concrete, it returns it unmodified. This is similar 4372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// to getting the canonical type, but it doesn't remove *all* typedefs. For 4382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 4392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// concrete. 4402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getDesugaredType() const; 4412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// More type predicates useful for type checking/promotion 4432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isPromotableIntegerType() const; // C99 6.3.1.1p2 4442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isSignedIntegerType - Return true if this is an integer type that is 4462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 4472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// an enum decl which has a signed representation, or a vector of signed 4482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// integer element type. 4492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isSignedIntegerType() const; 4502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isUnsignedIntegerType - Return true if this is an integer type that is 4522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 4532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// decl which has an unsigned representation, or a vector of unsigned integer 4542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// element type. 4552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isUnsignedIntegerType() const; 4562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// isConstantSizeType - Return true if this is not a variable sized type, 4582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// according to the rules of C99 6.7.5p3. It is not legal to call this on 4592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// incomplete types. 4602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isConstantSizeType() const; 4612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getCanonicalTypeInternal() const { return CanonicalType; } 4632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void dump() const; 4642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const = 0; 4652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *) { return true; } 4662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Emit - Emit a Type to bitcode. Used by ASTContext. 4692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Emit(llvm::Serializer& S) const; 4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Create - Construct a Type from bitcode. Used by ASTContext. 4722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Create(ASTContext& Context, unsigned i, llvm::Deserializer& S); 4732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// EmitImpl - Subclasses must implement this method in order to 4752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// be serialized. 4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // FIXME: Make this abstract once implemented. 4772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const { 4782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project assert(false && "Serialization for type not supported."); 4792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 4802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 4812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// ExtQualType - TR18037 (C embedded extensions) 6.2.5p26 4832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// This supports all kinds of type attributes; including, 4842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// address space qualified types, objective-c's __weak and 4852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// __strong attributes. 4862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 4872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass ExtQualType : public Type, public llvm::FoldingSetNode { 4882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// BaseType - This is the underlying type that this qualifies. All CVR 4892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// qualifiers are stored on the QualType that references this type, so we 4902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// can't have any here. 4912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type *BaseType; 4922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// Address Space ID - The address space ID this type is qualified with. 4942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned AddressSpace; 4952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// GC __weak/__strong attributes 4962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType::GCAttrTypes GCAttrType; 4972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 4982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ExtQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace, 4992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType::GCAttrTypes gcAttr) : 5002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(ExtQual, CanonicalPtr, Base->isDependentType()), BaseType(Base), 5012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AddressSpace(AddrSpace), GCAttrType(gcAttr) { 5022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project assert(!isa<ExtQualType>(BaseType) && 5032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project "Cannot have ExtQualType of ExtQualType"); 5042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these. 5062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 5072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type *getBaseType() const { return BaseType; } 5082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType::GCAttrTypes getObjCGCAttr() const { return GCAttrType; } 5092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned getAddressSpace() const { return AddressSpace; } 5102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 5122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 5142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Profile(ID, getBaseType(), AddressSpace, GCAttrType); 5152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 5172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned AddrSpace, QualType::GCAttrTypes gcAttr) { 5182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Base); 5192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddInteger(AddrSpace); 5202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddInteger(gcAttr); 5212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 5222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == ExtQual; } 5242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const ExtQualType *) { return true; } 5252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 5272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 5282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 5292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 5302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// BuiltinType - This class is used for builtin types like 'int'. Builtin 5342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// types are always canonical and have a literal name field. 5352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass BuiltinType : public Type { 5362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 5372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum Kind { 5382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Void, 5392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Bool, // This is bool and/or _Bool. 5412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Char_U, // This is 'char' for targets where char is unsigned. 5422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UChar, // This is explicitly qualified unsigned char. 5432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UShort, 5442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project UInt, 5452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ULong, 5462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ULongLong, 5472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Char_S, // This is 'char' for targets where char is signed. 5492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project SChar, // This is explicitly qualified signed char. 5502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project WChar, // This is 'wchar_t' for C++. 5512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Short, 5522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Int, 5532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Long, 5542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LongLong, 5552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Float, Double, LongDouble, 5572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Overload, // This represents the type of an overloaded function declaration. 5592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Dependent // This represents the type of a type-dependent expression. 5602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 5612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprivate: 5622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Kind TypeKind; 5632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 5642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project BuiltinType(Kind K) 5652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent)), 5662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TypeKind(K) {} 5672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Kind getKind() const { return TypeKind; } 5692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *getName() const; 5702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 5722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 5742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const BuiltinType *) { return true; } 5752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// FixedWidthIntType - Used for arbitrary width types that we either don't 5782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// want to or can't map to named integer types. These always have a lower 5792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// integer rank than builtin types of the same width. 5802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass FixedWidthIntType : public Type { 5812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprivate: 5822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned Width; 5832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool Signed; 5842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 5852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project FixedWidthIntType(unsigned W, bool S) : Type(FixedWidthInt, QualType(), false), 5862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Width(W), Signed(S) {} 5872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned getWidth() const { return Width; } 5892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool isSigned() const { return Signed; } 5902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const char *getName() const; 5912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 5932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == FixedWidthInt; } 5952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const FixedWidthIntType *) { return true; } 5962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 5972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 5992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// types (_Complex float etc) as well as the GCC integer complex extensions. 6002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 6012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass ComplexType : public Type, public llvm::FoldingSetNode { 6022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType ElementType; 6032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ComplexType(QualType Element, QualType CanonicalPtr) : 6042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(Complex, CanonicalPtr, Element->isDependentType()), 6052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ElementType(Element) { 6062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these. 6082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 6092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getElementType() const { return ElementType; } 6102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 6122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 6142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Profile(ID, getElementType()); 6152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 6172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Element.getAsOpaquePtr()); 6182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 6212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const ComplexType *) { return true; } 6222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 6242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 6252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 6272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 6282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// PointerType - C99 6.7.5.1 - Pointer Declarators. 6302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 6312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass PointerType : public Type, public llvm::FoldingSetNode { 6322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType PointeeType; 6332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PointerType(QualType Pointee, QualType CanonicalPtr) : 6352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(Pointer, CanonicalPtr, Pointee->isDependentType()), PointeeType(Pointee) { 6362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these. 6382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 6392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 6412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 6432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 6452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Profile(ID, getPointeeType()); 6462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Pointee.getAsOpaquePtr()); 6492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 6522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const PointerType *) { return true; } 6532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 6552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 6562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 6582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 6592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// BlockPointerType - pointer to a block type. 6612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// This type is to represent types syntactically represented as 6622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// "void (^)(int)", etc. Pointee is required to always be a function type. 6632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 6642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass BlockPointerType : public Type, public llvm::FoldingSetNode { 6652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType PointeeType; // Block is some kind of pointer type 6662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project BlockPointerType(QualType Pointee, QualType CanonicalCls) : 6672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(BlockPointer, CanonicalCls, Pointee->isDependentType()), 6682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PointeeType(Pointee) { 6692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these. 6712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 6722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // Get the pointee type. Pointee is required to always be a function type. 6742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 6752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 6772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 6792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Profile(ID, getPointeeType()); 6802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Pointee.getAsOpaquePtr()); 6832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 6842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { 6862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return T->getTypeClass() == BlockPointer; 68753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 68853f17a9db278d33517d9888dd77848f554522a38JP Abgrall static bool classof(const BlockPointerType *) { return true; } 68953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 69053f17a9db278d33517d9888dd77848f554522a38JP Abgrall protected: 69153f17a9db278d33517d9888dd77848f554522a38JP Abgrall virtual void EmitImpl(llvm::Serializer& S) const; 6922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 6942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 6952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// ReferenceType - Base for LValueReferenceType and RValueReferenceType 6972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 6982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass ReferenceType : public Type, public llvm::FoldingSetNode { 6992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType PointeeType; 7002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 7022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ReferenceType(TypeClass tc, QualType Referencee, QualType CanonicalRef) : 7032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(tc, CanonicalRef, Referencee->isDependentType()), 7042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PointeeType(Referencee) { 7052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 7072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 7082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 7102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Profile(ID, getPointeeType()); 7112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 7132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Referencee.getAsOpaquePtr()); 7142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { 7172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return T->getTypeClass() == LValueReference || 7182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project T->getTypeClass() == RValueReference; 7192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const ReferenceType *) { return true; } 7212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 7232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 7242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 7252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// LValueReferenceType - C++ [dcl.ref] - Lvalue reference 7272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 7282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass LValueReferenceType : public ReferenceType { 7292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project LValueReferenceType(QualType Referencee, QualType CanonicalRef) : 7302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ReferenceType(LValueReference, Referencee, CanonicalRef) { 7312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these 7332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 7342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 7352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { 7372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return T->getTypeClass() == LValueReference; 7382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const LValueReferenceType *) { return true; } 7402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 7422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 7442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 7452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// RValueReferenceType - C++0x [dcl.ref] - Rvalue reference 7472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 7482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass RValueReferenceType : public ReferenceType { 7492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project RValueReferenceType(QualType Referencee, QualType CanonicalRef) : 7502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ReferenceType(RValueReference, Referencee, CanonicalRef) { 7512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these 7532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 7542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 7552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { 7572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return T->getTypeClass() == RValueReference; 7582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const RValueReferenceType *) { return true; } 7602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 7622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 7642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 7652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// MemberPointerType - C++ 8.3.3 - Pointers to members 7672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 7682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass MemberPointerType : public Type, public llvm::FoldingSetNode { 7692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType PointeeType; 7702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// The class of which the pointee is a member. Must ultimately be a 7712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// RecordType, but could be a typedef or a template parameter too. 7722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const Type *Class; 7732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) : 7752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Type(MemberPointer, CanonicalPtr, 7762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Cls->isDependentType() || Pointee->isDependentType()), 7772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project PointeeType(Pointee), Class(Cls) { 7782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class ASTContext; // ASTContext creates these. 7802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 7812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 7832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const Type *getClass() const { return Class; } 7852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 7872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 7892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Profile(ID, getPointeeType(), getClass()); 7902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 7922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const Type *Class) { 7932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Pointee.getAsOpaquePtr()); 7942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ID.AddPointer(Class); 7952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 7962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const Type *T) { 7982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return T->getTypeClass() == MemberPointer; 7992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 8002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static bool classof(const MemberPointerType *) { return true; } 8012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprotected: 8032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 8042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 8052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project friend class Type; 8062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 8072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// ArrayType - C99 6.7.5.2 - Array Declarators. 8092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/// 8102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectclass ArrayType : public Type, public llvm::FoldingSetNode { 8112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectpublic: 8122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 8132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// an array with a static size (e.g. int X[static 4]), or an array 8142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// with a star size (e.g. int X[*]). 8152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// 'static' is only allowed on function parameters. 8162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project enum ArraySizeModifier { 8172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project Normal, Static, Star 8182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project }; 8192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectprivate: 8202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// ElementType - The element type of the array. 8212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project QualType ElementType; 8222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 8232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 8242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /// NOTE: These fields are packed into the bitfields space in the Type class. 8252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project unsigned SizeModifier : 2; 826 827 /// IndexTypeQuals - Capture qualifiers in declarations like: 828 /// 'int X[static restrict 4]'. For function parameters only. 829 unsigned IndexTypeQuals : 3; 830 831protected: 832 // C++ [temp.dep.type]p1: 833 // A type is dependent if it is... 834 // - an array type constructed from any dependent type or whose 835 // size is specified by a constant expression that is 836 // value-dependent, 837 ArrayType(TypeClass tc, QualType et, QualType can, 838 ArraySizeModifier sm, unsigned tq) 839 : Type(tc, can, et->isDependentType() || tc == DependentSizedArray), 840 ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 841 842 friend class ASTContext; // ASTContext creates these. 843public: 844 QualType getElementType() const { return ElementType; } 845 ArraySizeModifier getSizeModifier() const { 846 return ArraySizeModifier(SizeModifier); 847 } 848 unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 849 850 static bool classof(const Type *T) { 851 return T->getTypeClass() == ConstantArray || 852 T->getTypeClass() == VariableArray || 853 T->getTypeClass() == IncompleteArray || 854 T->getTypeClass() == DependentSizedArray; 855 } 856 static bool classof(const ArrayType *) { return true; } 857}; 858 859/// ConstantArrayType - This class represents C arrays with a specified constant 860/// size. For example 'int A[100]' has ConstantArrayType where the element type 861/// is 'int' and the size is 100. 862class ConstantArrayType : public ArrayType { 863 llvm::APInt Size; // Allows us to unique the type. 864 865 ConstantArrayType(QualType et, QualType can, const llvm::APInt &size, 866 ArraySizeModifier sm, unsigned tq) 867 : ArrayType(ConstantArray, et, can, sm, tq), Size(size) {} 868 friend class ASTContext; // ASTContext creates these. 869public: 870 const llvm::APInt &getSize() const { return Size; } 871 virtual void getAsStringInternal(std::string &InnerString) const; 872 873 void Profile(llvm::FoldingSetNodeID &ID) { 874 Profile(ID, getElementType(), getSize(), 875 getSizeModifier(), getIndexTypeQualifier()); 876 } 877 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 878 const llvm::APInt &ArraySize, ArraySizeModifier SizeMod, 879 unsigned TypeQuals) { 880 ID.AddPointer(ET.getAsOpaquePtr()); 881 ID.AddInteger(ArraySize.getZExtValue()); 882 ID.AddInteger(SizeMod); 883 ID.AddInteger(TypeQuals); 884 } 885 static bool classof(const Type *T) { 886 return T->getTypeClass() == ConstantArray; 887 } 888 static bool classof(const ConstantArrayType *) { return true; } 889 890protected: 891 virtual void EmitImpl(llvm::Serializer& S) const; 892 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 893 friend class Type; 894}; 895 896/// IncompleteArrayType - This class represents C arrays with an unspecified 897/// size. For example 'int A[]' has an IncompleteArrayType where the element 898/// type is 'int' and the size is unspecified. 899class IncompleteArrayType : public ArrayType { 900 IncompleteArrayType(QualType et, QualType can, 901 ArraySizeModifier sm, unsigned tq) 902 : ArrayType(IncompleteArray, et, can, sm, tq) {} 903 friend class ASTContext; // ASTContext creates these. 904public: 905 906 virtual void getAsStringInternal(std::string &InnerString) const; 907 908 static bool classof(const Type *T) { 909 return T->getTypeClass() == IncompleteArray; 910 } 911 static bool classof(const IncompleteArrayType *) { return true; } 912 913 friend class StmtIteratorBase; 914 915 void Profile(llvm::FoldingSetNodeID &ID) { 916 Profile(ID, getElementType(), getSizeModifier(), getIndexTypeQualifier()); 917 } 918 919 static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 920 ArraySizeModifier SizeMod, unsigned TypeQuals) { 921 ID.AddPointer(ET.getAsOpaquePtr()); 922 ID.AddInteger(SizeMod); 923 ID.AddInteger(TypeQuals); 924 } 925 926protected: 927 virtual void EmitImpl(llvm::Serializer& S) const; 928 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 929 friend class Type; 930}; 931 932/// VariableArrayType - This class represents C arrays with a specified size 933/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 934/// Since the size expression is an arbitrary expression, we store it as such. 935/// 936/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 937/// should not be: two lexically equivalent variable array types could mean 938/// different things, for example, these variables do not have the same type 939/// dynamically: 940/// 941/// void foo(int x) { 942/// int Y[x]; 943/// ++x; 944/// int Z[x]; 945/// } 946/// 947class VariableArrayType : public ArrayType { 948 /// SizeExpr - An assignment expression. VLA's are only permitted within 949 /// a function block. 950 Stmt *SizeExpr; 951 952 VariableArrayType(QualType et, QualType can, Expr *e, 953 ArraySizeModifier sm, unsigned tq) 954 : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 955 friend class ASTContext; // ASTContext creates these. 956 virtual void Destroy(ASTContext& C); 957 958public: 959 Expr *getSizeExpr() const { 960 // We use C-style casts instead of cast<> here because we do not wish 961 // to have a dependency of Type.h on Stmt.h/Expr.h. 962 return (Expr*) SizeExpr; 963 } 964 965 virtual void getAsStringInternal(std::string &InnerString) const; 966 967 static bool classof(const Type *T) { 968 return T->getTypeClass() == VariableArray; 969 } 970 static bool classof(const VariableArrayType *) { return true; } 971 972 friend class StmtIteratorBase; 973 974 void Profile(llvm::FoldingSetNodeID &ID) { 975 assert(0 && "Cannnot unique VariableArrayTypes."); 976 } 977 978protected: 979 virtual void EmitImpl(llvm::Serializer& S) const; 980 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 981 friend class Type; 982}; 983 984/// DependentSizedArrayType - This type represents an array type in 985/// C++ whose size is a value-dependent expression. For example: 986/// @code 987/// template<typename T, int Size> 988/// class array { 989/// T data[Size]; 990/// }; 991/// @endcode 992/// For these types, we won't actually know what the array bound is 993/// until template instantiation occurs, at which point this will 994/// become either a ConstantArrayType or a VariableArrayType. 995class DependentSizedArrayType : public ArrayType { 996 /// SizeExpr - An assignment expression that will instantiate to the 997 /// size of the array. 998 Stmt *SizeExpr; 999 1000 DependentSizedArrayType(QualType et, QualType can, Expr *e, 1001 ArraySizeModifier sm, unsigned tq) 1002 : ArrayType(DependentSizedArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 1003 friend class ASTContext; // ASTContext creates these. 1004 virtual void Destroy(ASTContext& C); 1005 1006public: 1007 Expr *getSizeExpr() const { 1008 // We use C-style casts instead of cast<> here because we do not wish 1009 // to have a dependency of Type.h on Stmt.h/Expr.h. 1010 return (Expr*) SizeExpr; 1011 } 1012 1013 virtual void getAsStringInternal(std::string &InnerString) const; 1014 1015 static bool classof(const Type *T) { 1016 return T->getTypeClass() == DependentSizedArray; 1017 } 1018 static bool classof(const DependentSizedArrayType *) { return true; } 1019 1020 friend class StmtIteratorBase; 1021 1022 void Profile(llvm::FoldingSetNodeID &ID) { 1023 assert(0 && "Cannnot unique DependentSizedArrayTypes."); 1024 } 1025 1026protected: 1027 virtual void EmitImpl(llvm::Serializer& S) const; 1028 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1029 friend class Type; 1030}; 1031 1032/// VectorType - GCC generic vector type. This type is created using 1033/// __attribute__((vector_size(n)), where "n" specifies the vector size in 1034/// bytes. Since the constructor takes the number of vector elements, the 1035/// client is responsible for converting the size into the number of elements. 1036class VectorType : public Type, public llvm::FoldingSetNode { 1037protected: 1038 /// ElementType - The element type of the vector. 1039 QualType ElementType; 1040 1041 /// NumElements - The number of elements in the vector. 1042 unsigned NumElements; 1043 1044 VectorType(QualType vecType, unsigned nElements, QualType canonType) : 1045 Type(Vector, canonType, vecType->isDependentType()), 1046 ElementType(vecType), NumElements(nElements) {} 1047 VectorType(TypeClass tc, QualType vecType, unsigned nElements, 1048 QualType canonType) 1049 : Type(tc, canonType, vecType->isDependentType()), ElementType(vecType), 1050 NumElements(nElements) {} 1051 friend class ASTContext; // ASTContext creates these. 1052public: 1053 1054 QualType getElementType() const { return ElementType; } 1055 unsigned getNumElements() const { return NumElements; } 1056 1057 virtual void getAsStringInternal(std::string &InnerString) const; 1058 1059 void Profile(llvm::FoldingSetNodeID &ID) { 1060 Profile(ID, getElementType(), getNumElements(), getTypeClass()); 1061 } 1062 static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 1063 unsigned NumElements, TypeClass TypeClass) { 1064 ID.AddPointer(ElementType.getAsOpaquePtr()); 1065 ID.AddInteger(NumElements); 1066 ID.AddInteger(TypeClass); 1067 } 1068 static bool classof(const Type *T) { 1069 return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 1070 } 1071 static bool classof(const VectorType *) { return true; } 1072}; 1073 1074/// ExtVectorType - Extended vector type. This type is created using 1075/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 1076/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 1077/// class enables syntactic extensions, like Vector Components for accessing 1078/// points, colors, and textures (modeled after OpenGL Shading Language). 1079class ExtVectorType : public VectorType { 1080 ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 1081 VectorType(ExtVector, vecType, nElements, canonType) {} 1082 friend class ASTContext; // ASTContext creates these. 1083public: 1084 static int getPointAccessorIdx(char c) { 1085 switch (c) { 1086 default: return -1; 1087 case 'x': return 0; 1088 case 'y': return 1; 1089 case 'z': return 2; 1090 case 'w': return 3; 1091 } 1092 } 1093 static int getNumericAccessorIdx(char c) { 1094 switch (c) { 1095 default: return -1; 1096 case '0': return 0; 1097 case '1': return 1; 1098 case '2': return 2; 1099 case '3': return 3; 1100 case '4': return 4; 1101 case '5': return 5; 1102 case '6': return 6; 1103 case '7': return 7; 1104 case '8': return 8; 1105 case '9': return 9; 1106 case 'a': return 10; 1107 case 'b': return 11; 1108 case 'c': return 12; 1109 case 'd': return 13; 1110 case 'e': return 14; 1111 case 'f': return 15; 1112 } 1113 } 1114 1115 static int getAccessorIdx(char c) { 1116 if (int idx = getPointAccessorIdx(c)+1) return idx-1; 1117 return getNumericAccessorIdx(c); 1118 } 1119 1120 bool isAccessorWithinNumElements(char c) const { 1121 if (int idx = getAccessorIdx(c)+1) 1122 return unsigned(idx-1) < NumElements; 1123 return false; 1124 } 1125 virtual void getAsStringInternal(std::string &InnerString) const; 1126 1127 static bool classof(const Type *T) { 1128 return T->getTypeClass() == ExtVector; 1129 } 1130 static bool classof(const ExtVectorType *) { return true; } 1131}; 1132 1133/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 1134/// class of FunctionNoProtoType and FunctionProtoType. 1135/// 1136class FunctionType : public Type { 1137 /// SubClassData - This field is owned by the subclass, put here to pack 1138 /// tightly with the ivars in Type. 1139 bool SubClassData : 1; 1140 1141 /// TypeQuals - Used only by FunctionProtoType, put here to pack with the 1142 /// other bitfields. 1143 /// The qualifiers are part of FunctionProtoType because... 1144 /// 1145 /// C++ 8.3.5p4: The return type, the parameter type list and the 1146 /// cv-qualifier-seq, [...], are part of the function type. 1147 /// 1148 unsigned TypeQuals : 3; 1149 1150 // The type returned by the function. 1151 QualType ResultType; 1152protected: 1153 FunctionType(TypeClass tc, QualType res, bool SubclassInfo, 1154 unsigned typeQuals, QualType Canonical, bool Dependent) 1155 : Type(tc, Canonical, Dependent), 1156 SubClassData(SubclassInfo), TypeQuals(typeQuals), ResultType(res) {} 1157 bool getSubClassData() const { return SubClassData; } 1158 unsigned getTypeQuals() const { return TypeQuals; } 1159public: 1160 1161 QualType getResultType() const { return ResultType; } 1162 1163 1164 static bool classof(const Type *T) { 1165 return T->getTypeClass() == FunctionNoProto || 1166 T->getTypeClass() == FunctionProto; 1167 } 1168 static bool classof(const FunctionType *) { return true; } 1169}; 1170 1171/// FunctionNoProtoType - Represents a K&R-style 'int foo()' function, which has 1172/// no information available about its arguments. 1173class FunctionNoProtoType : public FunctionType, public llvm::FoldingSetNode { 1174 FunctionNoProtoType(QualType Result, QualType Canonical) 1175 : FunctionType(FunctionNoProto, Result, false, 0, Canonical, 1176 /*Dependent=*/false) {} 1177 friend class ASTContext; // ASTContext creates these. 1178public: 1179 // No additional state past what FunctionType provides. 1180 1181 virtual void getAsStringInternal(std::string &InnerString) const; 1182 1183 void Profile(llvm::FoldingSetNodeID &ID) { 1184 Profile(ID, getResultType()); 1185 } 1186 static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 1187 ID.AddPointer(ResultType.getAsOpaquePtr()); 1188 } 1189 1190 static bool classof(const Type *T) { 1191 return T->getTypeClass() == FunctionNoProto; 1192 } 1193 static bool classof(const FunctionNoProtoType *) { return true; } 1194 1195protected: 1196 virtual void EmitImpl(llvm::Serializer& S) const; 1197 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1198 friend class Type; 1199}; 1200 1201/// FunctionProtoType - Represents a prototype with argument type info, e.g. 1202/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 1203/// arguments, not as having a single void argument. 1204class FunctionProtoType : public FunctionType, public llvm::FoldingSetNode { 1205 /// hasAnyDependentType - Determine whether there are any dependent 1206 /// types within the arguments passed in. 1207 static bool hasAnyDependentType(const QualType *ArgArray, unsigned numArgs) { 1208 for (unsigned Idx = 0; Idx < numArgs; ++Idx) 1209 if (ArgArray[Idx]->isDependentType()) 1210 return true; 1211 1212 return false; 1213 } 1214 1215 FunctionProtoType(QualType Result, const QualType *ArgArray, unsigned numArgs, 1216 bool isVariadic, unsigned typeQuals, QualType Canonical) 1217 : FunctionType(FunctionProto, Result, isVariadic, typeQuals, Canonical, 1218 (Result->isDependentType() || 1219 hasAnyDependentType(ArgArray, numArgs))), 1220 NumArgs(numArgs) { 1221 // Fill in the trailing argument array. 1222 QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 1223 for (unsigned i = 0; i != numArgs; ++i) 1224 ArgInfo[i] = ArgArray[i]; 1225 } 1226 1227 /// NumArgs - The number of arguments this function has, not counting '...'. 1228 unsigned NumArgs; 1229 1230 /// ArgInfo - There is an variable size array after the class in memory that 1231 /// holds the argument types. 1232 1233 friend class ASTContext; // ASTContext creates these. 1234 1235public: 1236 unsigned getNumArgs() const { return NumArgs; } 1237 QualType getArgType(unsigned i) const { 1238 assert(i < NumArgs && "Invalid argument number!"); 1239 return arg_type_begin()[i]; 1240 } 1241 1242 bool isVariadic() const { return getSubClassData(); } 1243 unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); } 1244 1245 typedef const QualType *arg_type_iterator; 1246 arg_type_iterator arg_type_begin() const { 1247 return reinterpret_cast<const QualType *>(this+1); 1248 } 1249 arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 1250 1251 virtual void getAsStringInternal(std::string &InnerString) const; 1252 1253 static bool classof(const Type *T) { 1254 return T->getTypeClass() == FunctionProto; 1255 } 1256 static bool classof(const FunctionProtoType *) { return true; } 1257 1258 void Profile(llvm::FoldingSetNodeID &ID); 1259 static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 1260 arg_type_iterator ArgTys, unsigned NumArgs, 1261 bool isVariadic, unsigned TypeQuals); 1262 1263protected: 1264 virtual void EmitImpl(llvm::Serializer& S) const; 1265 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1266 friend class Type; 1267}; 1268 1269 1270class TypedefType : public Type { 1271 TypedefDecl *Decl; 1272protected: 1273 TypedefType(TypeClass tc, TypedefDecl *D, QualType can) 1274 : Type(tc, can, can->isDependentType()), Decl(D) { 1275 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 1276 } 1277 friend class ASTContext; // ASTContext creates these. 1278public: 1279 1280 TypedefDecl *getDecl() const { return Decl; } 1281 1282 /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 1283 /// potentially looking through *all* consecutive typedefs. This returns the 1284 /// sum of the type qualifiers, so if you have: 1285 /// typedef const int A; 1286 /// typedef volatile A B; 1287 /// looking through the typedefs for B will give you "const volatile A". 1288 QualType LookThroughTypedefs() const; 1289 1290 virtual void getAsStringInternal(std::string &InnerString) const; 1291 1292 static bool classof(const Type *T) { return T->getTypeClass() == Typedef; } 1293 static bool classof(const TypedefType *) { return true; } 1294 1295protected: 1296 virtual void EmitImpl(llvm::Serializer& S) const; 1297 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1298 friend class Type; 1299}; 1300 1301/// TypeOfExprType (GCC extension). 1302class TypeOfExprType : public Type { 1303 Expr *TOExpr; 1304 TypeOfExprType(Expr *E, QualType can); 1305 friend class ASTContext; // ASTContext creates these. 1306public: 1307 Expr *getUnderlyingExpr() const { return TOExpr; } 1308 1309 virtual void getAsStringInternal(std::string &InnerString) const; 1310 1311 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExpr; } 1312 static bool classof(const TypeOfExprType *) { return true; } 1313 1314protected: 1315 virtual void EmitImpl(llvm::Serializer& S) const; 1316 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1317 friend class Type; 1318}; 1319 1320/// TypeOfType (GCC extension). 1321class TypeOfType : public Type { 1322 QualType TOType; 1323 TypeOfType(QualType T, QualType can) 1324 : Type(TypeOf, can, T->isDependentType()), TOType(T) { 1325 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 1326 } 1327 friend class ASTContext; // ASTContext creates these. 1328public: 1329 QualType getUnderlyingType() const { return TOType; } 1330 1331 virtual void getAsStringInternal(std::string &InnerString) const; 1332 1333 static bool classof(const Type *T) { return T->getTypeClass() == TypeOf; } 1334 static bool classof(const TypeOfType *) { return true; } 1335 1336protected: 1337 virtual void EmitImpl(llvm::Serializer& S) const; 1338 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1339 friend class Type; 1340}; 1341 1342class TagType : public Type { 1343 /// Stores the TagDecl associated with this type. The decl will 1344 /// point to the TagDecl that actually defines the entity (or is a 1345 /// definition in progress), if there is such a definition. The 1346 /// single-bit value will be non-zero when this tag is in the 1347 /// process of being defined. 1348 mutable llvm::PointerIntPair<TagDecl *, 1> decl; 1349 friend class ASTContext; 1350 friend class TagDecl; 1351 1352protected: 1353 // FIXME: We'll need the user to pass in information about whether 1354 // this type is dependent or not, because we don't have enough 1355 // information to compute it here. 1356 TagType(TypeClass TC, TagDecl *D, QualType can) 1357 : Type(TC, can, /*Dependent=*/false), decl(D, 0) {} 1358 1359public: 1360 TagDecl *getDecl() const { return decl.getPointer(); } 1361 1362 /// @brief Determines whether this type is in the process of being 1363 /// defined. 1364 bool isBeingDefined() const { return decl.getInt(); } 1365 void setBeingDefined(bool Def) { decl.setInt(Def? 1 : 0); } 1366 1367 virtual void getAsStringInternal(std::string &InnerString) const; 1368 void getAsStringInternal(std::string &InnerString, 1369 bool SuppressTagKind) const; 1370 1371 static bool classof(const Type *T) { 1372 return T->getTypeClass() >= TagFirst && T->getTypeClass() <= TagLast; 1373 } 1374 static bool classof(const TagType *) { return true; } 1375 static bool classof(const RecordType *) { return true; } 1376 static bool classof(const EnumType *) { return true; } 1377 1378protected: 1379 virtual void EmitImpl(llvm::Serializer& S) const; 1380 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1381 friend class Type; 1382}; 1383 1384/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 1385/// to detect TagType objects of structs/unions/classes. 1386class RecordType : public TagType { 1387protected: 1388 explicit RecordType(RecordDecl *D) 1389 : TagType(Record, reinterpret_cast<TagDecl*>(D), QualType()) { } 1390 explicit RecordType(TypeClass TC, RecordDecl *D) 1391 : TagType(TC, reinterpret_cast<TagDecl*>(D), QualType()) { } 1392 friend class ASTContext; // ASTContext creates these. 1393public: 1394 1395 RecordDecl *getDecl() const { 1396 return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 1397 } 1398 1399 // FIXME: This predicate is a helper to QualType/Type. It needs to 1400 // recursively check all fields for const-ness. If any field is declared 1401 // const, it needs to return false. 1402 bool hasConstFields() const { return false; } 1403 1404 // FIXME: RecordType needs to check when it is created that all fields are in 1405 // the same address space, and return that. 1406 unsigned getAddressSpace() const { return 0; } 1407 1408 static bool classof(const TagType *T); 1409 static bool classof(const Type *T) { 1410 return isa<TagType>(T) && classof(cast<TagType>(T)); 1411 } 1412 static bool classof(const RecordType *) { return true; } 1413}; 1414 1415/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 1416/// to detect TagType objects of enums. 1417class EnumType : public TagType { 1418 explicit EnumType(EnumDecl *D) 1419 : TagType(Enum, reinterpret_cast<TagDecl*>(D), QualType()) { } 1420 friend class ASTContext; // ASTContext creates these. 1421public: 1422 1423 EnumDecl *getDecl() const { 1424 return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 1425 } 1426 1427 static bool classof(const TagType *T); 1428 static bool classof(const Type *T) { 1429 return isa<TagType>(T) && classof(cast<TagType>(T)); 1430 } 1431 static bool classof(const EnumType *) { return true; } 1432}; 1433 1434class TemplateTypeParmType : public Type, public llvm::FoldingSetNode { 1435 unsigned Depth : 16; 1436 unsigned Index : 16; 1437 IdentifierInfo *Name; 1438 1439 TemplateTypeParmType(unsigned D, unsigned I, IdentifierInfo *N, 1440 QualType Canon) 1441 : Type(TemplateTypeParm, Canon, /*Dependent=*/true), 1442 Depth(D), Index(I), Name(N) { } 1443 1444 TemplateTypeParmType(unsigned D, unsigned I) 1445 : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true), 1446 Depth(D), Index(I), Name(0) { } 1447 1448 friend class ASTContext; // ASTContext creates these 1449 1450public: 1451 unsigned getDepth() const { return Depth; } 1452 unsigned getIndex() const { return Index; } 1453 IdentifierInfo *getName() const { return Name; } 1454 1455 virtual void getAsStringInternal(std::string &InnerString) const; 1456 1457 void Profile(llvm::FoldingSetNodeID &ID) { 1458 Profile(ID, Depth, Index, Name); 1459 } 1460 1461 static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, 1462 unsigned Index, IdentifierInfo *Name) { 1463 ID.AddInteger(Depth); 1464 ID.AddInteger(Index); 1465 ID.AddPointer(Name); 1466 } 1467 1468 static bool classof(const Type *T) { 1469 return T->getTypeClass() == TemplateTypeParm; 1470 } 1471 static bool classof(const TemplateTypeParmType *T) { return true; } 1472 1473protected: 1474 virtual void EmitImpl(llvm::Serializer& S) const; 1475 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1476 friend class Type; 1477}; 1478 1479/// \brief Represents the type of a class template specialization as 1480/// written in the source code. 1481/// 1482/// Class template specialization types represent the syntactic form 1483/// of a template-id that refers to a type, e.g., @c vector<int>. All 1484/// class template specialization types are syntactic sugar, whose 1485/// canonical type will point to some other type node that represents 1486/// the instantiation or class template specialization. For example, a 1487/// class template specialization type of @c vector<int> will refer to 1488/// a tag type for the instantiation 1489/// @c std::vector<int, std::allocator<int>>. 1490class ClassTemplateSpecializationType 1491 : public Type, public llvm::FoldingSetNode { 1492 1493 // FIXME: Do we want templates to have a representation in the type 1494 // system? It will probably help with dependent templates and 1495 // possibly with template-names preceded by a nested-name-specifier. 1496 TemplateDecl *Template; 1497 1498 /// \brief - The number of template arguments named in this class 1499 /// template specialization. 1500 unsigned NumArgs; 1501 1502 ClassTemplateSpecializationType(TemplateDecl *T, 1503 const TemplateArgument *Args, 1504 unsigned NumArgs, QualType Canon); 1505 1506 virtual void Destroy(ASTContext& C); 1507 1508 friend class ASTContext; // ASTContext creates these 1509 1510public: 1511 /// \brief Determine whether any of the given template arguments are 1512 /// dependent. 1513 static bool anyDependentTemplateArguments(const TemplateArgument *Args, 1514 unsigned NumArgs); 1515 1516 /// \brief Print a template argument list, including the '<' and '>' 1517 /// enclosing the template arguments. 1518 static std::string PrintTemplateArgumentList(const TemplateArgument *Args, 1519 unsigned NumArgs); 1520 1521 typedef const TemplateArgument * iterator; 1522 1523 iterator begin() const { return getArgs(); } 1524 iterator end() const; 1525 1526 /// \brief Retrieve the template that we are specializing. 1527 TemplateDecl *getTemplate() const { return Template; } 1528 1529 /// \brief Retrieve the template arguments. 1530 const TemplateArgument *getArgs() const { 1531 return reinterpret_cast<const TemplateArgument *>(this + 1); 1532 } 1533 1534 /// \brief Retrieve the number of template arguments. 1535 unsigned getNumArgs() const { return NumArgs; } 1536 1537 /// \brief Retrieve a specific template argument as a type. 1538 /// \precondition @c isArgType(Arg) 1539 const TemplateArgument &getArg(unsigned Idx) const; 1540 1541 virtual void getAsStringInternal(std::string &InnerString) const; 1542 1543 void Profile(llvm::FoldingSetNodeID &ID) { 1544 Profile(ID, Template, getArgs(), NumArgs); 1545 } 1546 1547 static void Profile(llvm::FoldingSetNodeID &ID, TemplateDecl *T, 1548 const TemplateArgument *Args, unsigned NumArgs); 1549 1550 static bool classof(const Type *T) { 1551 return T->getTypeClass() == ClassTemplateSpecialization; 1552 } 1553 static bool classof(const ClassTemplateSpecializationType *T) { return true; } 1554 1555protected: 1556 virtual void EmitImpl(llvm::Serializer& S) const; 1557 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1558 friend class Type; 1559}; 1560 1561/// \brief Represents a type that was referred to via a qualified 1562/// name, e.g., N::M::type. 1563/// 1564/// This type is used to keep track of a type name as written in the 1565/// source code, including any nested-name-specifiers. The type itself 1566/// is always "sugar", used to express what was written in the source 1567/// code but containing no additional semantic information. 1568class QualifiedNameType : public Type, public llvm::FoldingSetNode { 1569 /// \brief The nested name specifier containing the qualifier. 1570 NestedNameSpecifier *NNS; 1571 1572 /// \brief The type that this qualified name refers to. 1573 QualType NamedType; 1574 1575 QualifiedNameType(NestedNameSpecifier *NNS, QualType NamedType, 1576 QualType CanonType) 1577 : Type(QualifiedName, CanonType, NamedType->isDependentType()), 1578 NNS(NNS), NamedType(NamedType) { } 1579 1580 friend class ASTContext; // ASTContext creates these 1581 1582public: 1583 /// \brief Retrieve the qualification on this type. 1584 NestedNameSpecifier *getQualifier() const { return NNS; } 1585 1586 /// \brief Retrieve the type named by the qualified-id. 1587 QualType getNamedType() const { return NamedType; } 1588 1589 virtual void getAsStringInternal(std::string &InnerString) const; 1590 1591 void Profile(llvm::FoldingSetNodeID &ID) { 1592 Profile(ID, NNS, NamedType); 1593 } 1594 1595 static void Profile(llvm::FoldingSetNodeID &ID, NestedNameSpecifier *NNS, 1596 QualType NamedType) { 1597 ID.AddPointer(NNS); 1598 NamedType.Profile(ID); 1599 } 1600 1601 static bool classof(const Type *T) { 1602 return T->getTypeClass() == QualifiedName; 1603 } 1604 static bool classof(const QualifiedNameType *T) { return true; } 1605 1606protected: 1607 virtual void EmitImpl(llvm::Serializer& S) const; 1608 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1609 friend class Type; 1610}; 1611 1612/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 1613/// object oriented design. They basically correspond to C++ classes. There 1614/// are two kinds of interface types, normal interfaces like "NSString" and 1615/// qualified interfaces, which are qualified with a protocol list like 1616/// "NSString<NSCopyable, NSAmazing>". Qualified interface types are instances 1617/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType. 1618class ObjCInterfaceType : public Type { 1619 ObjCInterfaceDecl *Decl; 1620protected: 1621 ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) : 1622 Type(tc, QualType(), /*Dependent=*/false), Decl(D) { } 1623 friend class ASTContext; // ASTContext creates these. 1624public: 1625 1626 ObjCInterfaceDecl *getDecl() const { return Decl; } 1627 1628 /// qual_iterator and friends: this provides access to the (potentially empty) 1629 /// list of protocols qualifying this interface. If this is an instance of 1630 /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an 1631 /// empty list if there are no qualifying protocols. 1632 typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1633 inline qual_iterator qual_begin() const; 1634 inline qual_iterator qual_end() const; 1635 bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; } 1636 1637 /// getNumProtocols - Return the number of qualifying protocols in this 1638 /// interface type, or 0 if there are none. 1639 inline unsigned getNumProtocols() const; 1640 1641 /// getProtocol - Return the specified qualifying protocol. 1642 inline ObjCProtocolDecl *getProtocol(unsigned i) const; 1643 1644 1645 virtual void getAsStringInternal(std::string &InnerString) const; 1646 static bool classof(const Type *T) { 1647 return T->getTypeClass() == ObjCInterface || 1648 T->getTypeClass() == ObjCQualifiedInterface; 1649 } 1650 static bool classof(const ObjCInterfaceType *) { return true; } 1651}; 1652 1653/// ObjCQualifiedInterfaceType - This class represents interface types 1654/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>. 1655/// 1656/// Duplicate protocols are removed and protocol list is canonicalized to be in 1657/// alphabetical order. 1658class ObjCQualifiedInterfaceType : public ObjCInterfaceType, 1659 public llvm::FoldingSetNode { 1660 1661 // List of protocols for this protocol conforming object type 1662 // List is sorted on protocol name. No protocol is enterred more than once. 1663 llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols; 1664 1665 ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D, 1666 ObjCProtocolDecl **Protos, unsigned NumP) : 1667 ObjCInterfaceType(ObjCQualifiedInterface, D), 1668 Protocols(Protos, Protos+NumP) { } 1669 friend class ASTContext; // ASTContext creates these. 1670public: 1671 1672 ObjCProtocolDecl *getProtocol(unsigned i) const { 1673 return Protocols[i]; 1674 } 1675 unsigned getNumProtocols() const { 1676 return Protocols.size(); 1677 } 1678 1679 qual_iterator qual_begin() const { return Protocols.begin(); } 1680 qual_iterator qual_end() const { return Protocols.end(); } 1681 1682 virtual void getAsStringInternal(std::string &InnerString) const; 1683 1684 void Profile(llvm::FoldingSetNodeID &ID); 1685 static void Profile(llvm::FoldingSetNodeID &ID, 1686 const ObjCInterfaceDecl *Decl, 1687 ObjCProtocolDecl **protocols, unsigned NumProtocols); 1688 1689 static bool classof(const Type *T) { 1690 return T->getTypeClass() == ObjCQualifiedInterface; 1691 } 1692 static bool classof(const ObjCQualifiedInterfaceType *) { return true; } 1693}; 1694 1695inline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const { 1696 if (const ObjCQualifiedInterfaceType *QIT = 1697 dyn_cast<ObjCQualifiedInterfaceType>(this)) 1698 return QIT->qual_begin(); 1699 return 0; 1700} 1701inline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const { 1702 if (const ObjCQualifiedInterfaceType *QIT = 1703 dyn_cast<ObjCQualifiedInterfaceType>(this)) 1704 return QIT->qual_end(); 1705 return 0; 1706} 1707 1708/// getNumProtocols - Return the number of qualifying protocols in this 1709/// interface type, or 0 if there are none. 1710inline unsigned ObjCInterfaceType::getNumProtocols() const { 1711 if (const ObjCQualifiedInterfaceType *QIT = 1712 dyn_cast<ObjCQualifiedInterfaceType>(this)) 1713 return QIT->getNumProtocols(); 1714 return 0; 1715} 1716 1717/// getProtocol - Return the specified qualifying protocol. 1718inline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { 1719 return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i); 1720} 1721 1722 1723 1724/// ObjCQualifiedIdType - to represent id<protocol-list>. 1725/// 1726/// Duplicate protocols are removed and protocol list is canonicalized to be in 1727/// alphabetical order. 1728class ObjCQualifiedIdType : public Type, 1729 public llvm::FoldingSetNode { 1730 // List of protocols for this protocol conforming 'id' type 1731 // List is sorted on protocol name. No protocol is enterred more than once. 1732 llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1733 1734 ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP) 1735 : Type(ObjCQualifiedId, QualType()/*these are always canonical*/, 1736 /*Dependent=*/false), 1737 Protocols(Protos, Protos+NumP) { } 1738 friend class ASTContext; // ASTContext creates these. 1739public: 1740 1741 ObjCProtocolDecl *getProtocols(unsigned i) const { 1742 return Protocols[i]; 1743 } 1744 unsigned getNumProtocols() const { 1745 return Protocols.size(); 1746 } 1747 ObjCProtocolDecl **getReferencedProtocols() { 1748 return &Protocols[0]; 1749 } 1750 1751 typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1752 qual_iterator qual_begin() const { return Protocols.begin(); } 1753 qual_iterator qual_end() const { return Protocols.end(); } 1754 1755 virtual void getAsStringInternal(std::string &InnerString) const; 1756 1757 void Profile(llvm::FoldingSetNodeID &ID); 1758 static void Profile(llvm::FoldingSetNodeID &ID, 1759 ObjCProtocolDecl **protocols, unsigned NumProtocols); 1760 1761 static bool classof(const Type *T) { 1762 return T->getTypeClass() == ObjCQualifiedId; 1763 } 1764 static bool classof(const ObjCQualifiedIdType *) { return true; } 1765 1766}; 1767 1768/// ObjCQualifiedClassType - to represent Class<protocol-list>. 1769/// 1770/// Duplicate protocols are removed and protocol list is canonicalized to be in 1771/// alphabetical order. 1772class ObjCQualifiedClassType : public Type, 1773 public llvm::FoldingSetNode { 1774 // List of protocols for this protocol conforming 'id' type 1775 // List is sorted on protocol name. No protocol is enterred more than once. 1776 llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1777 1778 ObjCQualifiedClassType(ObjCProtocolDecl **Protos, unsigned NumP) 1779 : Type(ObjCQualifiedClass, QualType()/*these are always canonical*/, 1780 /*Dependent=*/false), 1781 Protocols(Protos, Protos+NumP) { } 1782 friend class ASTContext; // ASTContext creates these. 1783public: 1784 1785 ObjCProtocolDecl *getProtocols(unsigned i) const { 1786 return Protocols[i]; 1787 } 1788 unsigned getNumProtocols() const { 1789 return Protocols.size(); 1790 } 1791 ObjCProtocolDecl **getReferencedProtocols() { 1792 return &Protocols[0]; 1793 } 1794 1795 typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1796 qual_iterator qual_begin() const { return Protocols.begin(); } 1797 qual_iterator qual_end() const { return Protocols.end(); } 1798 1799 virtual void getAsStringInternal(std::string &InnerString) const; 1800 1801 void Profile(llvm::FoldingSetNodeID &ID); 1802 static void Profile(llvm::FoldingSetNodeID &ID, 1803 ObjCProtocolDecl **protocols, unsigned NumProtocols); 1804 1805 static bool classof(const Type *T) { 1806 return T->getTypeClass() == ObjCQualifiedClass; 1807 } 1808 static bool classof(const ObjCQualifiedClassType *) { return true; } 1809 1810}; 1811 1812// Inline function definitions. 1813 1814/// getUnqualifiedType - Return the type without any qualifiers. 1815inline QualType QualType::getUnqualifiedType() const { 1816 Type *TP = getTypePtr(); 1817 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(TP)) 1818 TP = EXTQT->getBaseType(); 1819 return QualType(TP, 0); 1820} 1821 1822/// getAddressSpace - Return the address space of this type. 1823inline unsigned QualType::getAddressSpace() const { 1824 QualType CT = getTypePtr()->getCanonicalTypeInternal(); 1825 if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 1826 return AT->getElementType().getAddressSpace(); 1827 if (const RecordType *RT = dyn_cast<RecordType>(CT)) 1828 return RT->getAddressSpace(); 1829 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CT)) 1830 return EXTQT->getAddressSpace(); 1831 return 0; 1832} 1833 1834/// getObjCGCAttr - Return the gc attribute of this type. 1835inline QualType::GCAttrTypes QualType::getObjCGCAttr() const { 1836 QualType CT = getTypePtr()->getCanonicalTypeInternal(); 1837 if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 1838 return AT->getElementType().getObjCGCAttr(); 1839 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CT)) 1840 return EXTQT->getObjCGCAttr(); 1841 if (const PointerType *PT = CT->getAsPointerType()) 1842 return PT->getPointeeType().getObjCGCAttr(); 1843 return GCNone; 1844} 1845 1846/// isMoreQualifiedThan - Determine whether this type is more 1847/// qualified than the Other type. For example, "const volatile int" 1848/// is more qualified than "const int", "volatile int", and 1849/// "int". However, it is not more qualified than "const volatile 1850/// int". 1851inline bool QualType::isMoreQualifiedThan(QualType Other) const { 1852 // FIXME: Handle address spaces 1853 unsigned MyQuals = this->getCVRQualifiers(); 1854 unsigned OtherQuals = Other.getCVRQualifiers(); 1855 assert(this->getAddressSpace() == 0 && "Address space not checked"); 1856 assert(Other.getAddressSpace() == 0 && "Address space not checked"); 1857 return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals; 1858} 1859 1860/// isAtLeastAsQualifiedAs - Determine whether this type is at last 1861/// as qualified as the Other type. For example, "const volatile 1862/// int" is at least as qualified as "const int", "volatile int", 1863/// "int", and "const volatile int". 1864inline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const { 1865 // FIXME: Handle address spaces 1866 unsigned MyQuals = this->getCVRQualifiers(); 1867 unsigned OtherQuals = Other.getCVRQualifiers(); 1868 assert(this->getAddressSpace() == 0 && "Address space not checked"); 1869 assert(Other.getAddressSpace() == 0 && "Address space not checked"); 1870 return (MyQuals | OtherQuals) == MyQuals; 1871} 1872 1873/// getNonReferenceType - If Type is a reference type (e.g., const 1874/// int&), returns the type that the reference refers to ("const 1875/// int"). Otherwise, returns the type itself. This routine is used 1876/// throughout Sema to implement C++ 5p6: 1877/// 1878/// If an expression initially has the type "reference to T" (8.3.2, 1879/// 8.5.3), the type is adjusted to "T" prior to any further 1880/// analysis, the expression designates the object or function 1881/// denoted by the reference, and the expression is an lvalue. 1882inline QualType QualType::getNonReferenceType() const { 1883 if (const ReferenceType *RefType = (*this)->getAsReferenceType()) 1884 return RefType->getPointeeType(); 1885 else 1886 return *this; 1887} 1888 1889inline const TypedefType* Type::getAsTypedefType() const { 1890 return dyn_cast<TypedefType>(this); 1891} 1892inline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const { 1893 if (const PointerType *PT = getAsPointerType()) 1894 return PT->getPointeeType()->getAsObjCInterfaceType(); 1895 return 0; 1896} 1897 1898// NOTE: All of these methods use "getUnqualifiedType" to strip off address 1899// space qualifiers if present. 1900inline bool Type::isFunctionType() const { 1901 return isa<FunctionType>(CanonicalType.getUnqualifiedType()); 1902} 1903inline bool Type::isPointerType() const { 1904 return isa<PointerType>(CanonicalType.getUnqualifiedType()); 1905} 1906inline bool Type::isBlockPointerType() const { 1907 return isa<BlockPointerType>(CanonicalType); 1908} 1909inline bool Type::isReferenceType() const { 1910 return isa<ReferenceType>(CanonicalType.getUnqualifiedType()); 1911} 1912inline bool Type::isLValueReferenceType() const { 1913 return isa<LValueReferenceType>(CanonicalType.getUnqualifiedType()); 1914} 1915inline bool Type::isRValueReferenceType() const { 1916 return isa<RValueReferenceType>(CanonicalType.getUnqualifiedType()); 1917} 1918inline bool Type::isFunctionPointerType() const { 1919 if (const PointerType* T = getAsPointerType()) 1920 return T->getPointeeType()->isFunctionType(); 1921 else 1922 return false; 1923} 1924inline bool Type::isMemberPointerType() const { 1925 return isa<MemberPointerType>(CanonicalType.getUnqualifiedType()); 1926} 1927inline bool Type::isMemberFunctionPointerType() const { 1928 if (const MemberPointerType* T = getAsMemberPointerType()) 1929 return T->getPointeeType()->isFunctionType(); 1930 else 1931 return false; 1932} 1933inline bool Type::isArrayType() const { 1934 return isa<ArrayType>(CanonicalType.getUnqualifiedType()); 1935} 1936inline bool Type::isConstantArrayType() const { 1937 return isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()); 1938} 1939inline bool Type::isIncompleteArrayType() const { 1940 return isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()); 1941} 1942inline bool Type::isVariableArrayType() const { 1943 return isa<VariableArrayType>(CanonicalType.getUnqualifiedType()); 1944} 1945inline bool Type::isDependentSizedArrayType() const { 1946 return isa<DependentSizedArrayType>(CanonicalType.getUnqualifiedType()); 1947} 1948inline bool Type::isRecordType() const { 1949 return isa<RecordType>(CanonicalType.getUnqualifiedType()); 1950} 1951inline bool Type::isAnyComplexType() const { 1952 return isa<ComplexType>(CanonicalType.getUnqualifiedType()); 1953} 1954inline bool Type::isVectorType() const { 1955 return isa<VectorType>(CanonicalType.getUnqualifiedType()); 1956} 1957inline bool Type::isExtVectorType() const { 1958 return isa<ExtVectorType>(CanonicalType.getUnqualifiedType()); 1959} 1960inline bool Type::isObjCInterfaceType() const { 1961 return isa<ObjCInterfaceType>(CanonicalType.getUnqualifiedType()); 1962} 1963inline bool Type::isObjCQualifiedInterfaceType() const { 1964 return isa<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType()); 1965} 1966inline bool Type::isObjCQualifiedIdType() const { 1967 return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType()); 1968} 1969inline bool Type::isTemplateTypeParmType() const { 1970 return isa<TemplateTypeParmType>(CanonicalType.getUnqualifiedType()); 1971} 1972 1973inline bool Type::isSpecificBuiltinType(unsigned K) const { 1974 if (const BuiltinType *BT = getAsBuiltinType()) 1975 if (BT->getKind() == (BuiltinType::Kind) K) 1976 return true; 1977 return false; 1978} 1979 1980/// \brief Determines whether this is a type for which one can define 1981/// an overloaded operator. 1982inline bool Type::isOverloadableType() const { 1983 return isDependentType() || isRecordType() || isEnumeralType(); 1984} 1985 1986inline bool Type::hasPointerRepresentation() const { 1987 return (isPointerType() || isReferenceType() || isBlockPointerType() || 1988 isObjCInterfaceType() || isObjCQualifiedIdType() || 1989 isObjCQualifiedInterfaceType()); 1990} 1991 1992inline bool Type::hasObjCPointerRepresentation() const { 1993 return (isObjCInterfaceType() || isObjCQualifiedIdType() || 1994 isObjCQualifiedInterfaceType()); 1995} 1996 1997/// Insertion operator for diagnostics. This allows sending QualType's into a 1998/// diagnostic with <<. 1999inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 2000 QualType T) { 2001 DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 2002 Diagnostic::ak_qualtype); 2003 return DB; 2004} 2005 2006} // end namespace clang 2007 2008#endif 2009