Type.h revision f30208ad5b334e93582e846a2a0c92f38a607b8a
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===// 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// The LLVM Compiler Infrastructure 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file is distributed under the University of Illinois Open Source 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// License. See LICENSE.TXT for details. 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file defines the Type interface and subclasses. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef LLVM_CLANG_AST_TYPE_H 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define LLVM_CLANG_AST_TYPE_H 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/Basic/Diagnostic.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Support/Casting.h" 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/ADT/APSInt.h" 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/ADT/FoldingSet.h" 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/ADT/PointerIntPair.h" 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Bitcode/SerializationFwd.h" 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::isa; 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::cast; 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::cast_or_null; 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::dyn_cast; 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::dyn_cast_or_null; 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace clang { 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ASTContext; 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class Type; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class TypedefDecl; 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class TemplateTypeParmDecl; 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class TagDecl; 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class RecordDecl; 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class CXXRecordDecl; 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class EnumDecl; 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class FieldDecl; 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ObjCInterfaceDecl; 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ObjCProtocolDecl; 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ObjCMethodDecl; 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class Expr; 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class Stmt; 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class SourceLocation; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class PointerLikeType; 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class PointerType; 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class BlockPointerType; 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ReferenceType; 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class MemberPointerType; 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class VectorType; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ArrayType; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ConstantArrayType; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class VariableArrayType; 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class IncompleteArrayType; 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class DependentSizedArrayType; 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class RecordType; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class EnumType; 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ComplexType; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class TagType; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class TypedefType; 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class TemplateTypeParmType; 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class FunctionType; 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class FunctionTypeProto; 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ExtVectorType; 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class BuiltinType; 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ObjCInterfaceType; 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ObjCQualifiedIdType; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class ObjCQualifiedInterfaceType; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class StmtIteratorBase; 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// QualType - For efficiency, we don't store CVR-qualified types as nodes on 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// their own: instead each reference to a type stores the qualifiers. This 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// greatly reduces the number of nodes we need to allocate for types (for 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// example we only need one for 'int', 'const int', 'volatile int', 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 'const volatile int', etc). 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// As an added efficiency bonus, instead of making this a pair, we just store 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// the three bits we care about in the low bits of the pointer. To handle the 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// packing/unpacking, we make QualType be a simple wrapper class that acts like 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// a smart pointer. 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass QualType { 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::PointerIntPair<Type*, 3> Value; 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Const = 0x1, 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Restrict = 0x2, 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Volatile = 0x4, 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project CVRFlags = Const|Restrict|Volatile 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType() {} 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType(const Type *Ptr, unsigned Quals) 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Value(const_cast<Type*>(Ptr), Quals) {} 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getCVRQualifiers() const { return Value.getInt(); } 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void setCVRQualifiers(unsigned Quals) { Value.setInt(Quals); } 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type *getTypePtr() const { return Value.getPointer(); } 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static QualType getFromOpaquePtr(void *Ptr) { 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType T; 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project T.Value.setFromOpaqueValue(Ptr); 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type &operator*() const { 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return *getTypePtr(); 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type *operator->() const { 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getTypePtr(); 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isNull - Return true if this QualType doesn't point to a type yet. 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isNull() const { 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getTypePtr() == 0; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isConstQualified() const { 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (getCVRQualifiers() & Const) ? true : false; 1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner bool isVolatileQualified() const { 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (getCVRQualifiers() & Volatile) ? true : false; 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isRestrictQualified() const { 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (getCVRQualifiers() & Restrict) ? true : false; 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isConstant(ASTContext& Ctx) const; 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// addConst/addVolatile/addRestrict - add the specified type qual to this 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// QualType. 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void addConst() { Value.setInt(Value.getInt() | Const); } 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void addVolatile() { Value.setInt(Value.getInt() | Volatile); } 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void addRestrict() { Value.setInt(Value.getInt() | Restrict); } 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void removeConst() { Value.setInt(Value.getInt() & ~Const); } 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void removeVolatile() { Value.setInt(Value.getInt() & ~Volatile); } 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void removeRestrict() { Value.setInt(Value.getInt() & ~Restrict); } 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getQualifiedType(unsigned TQs) const { 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return QualType(getTypePtr(), TQs); 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getWithAdditionalQualifiers(unsigned TQs) const { 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return QualType(getTypePtr(), TQs|getCVRQualifiers()); 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType withConst() const { return getWithAdditionalQualifiers(Const); } 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType withVolatile() const { return getWithAdditionalQualifiers(Volatile);} 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType withRestrict() const { return getWithAdditionalQualifiers(Restrict);} 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getUnqualifiedType() const; 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isMoreQualifiedThan(QualType Other) const; 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isAtLeastAsQualifiedAs(QualType Other) const; 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getNonReferenceType() const; 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// operator==/!= - Indicate whether the specified types and qualifiers are 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// identical. 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool operator==(const QualType &RHS) const { 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return Value == RHS.Value; 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool operator!=(const QualType &RHS) const { 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return Value != RHS.Value; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string getAsString() const { 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string S; 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getAsStringInternal(S); 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return S; 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void getAsStringInternal(std::string &Str) const; 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void dump(const char *s) const; 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void dump() const; 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) const { 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(getAsOpaquePtr()); 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// getAddressSpace - Return the address space of this type. 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project inline unsigned getAddressSpace() const; 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Emit - Serialize a QualType to Bitcode. 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Emit(llvm::Serializer& S) const; 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Read - Deserialize a QualType from Bitcode. 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static QualType ReadVal(llvm::Deserializer& D); 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void ReadBackpatch(llvm::Deserializer& D); 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} // end clang. 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace llvm { 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Implement simplify_type for QualType, so that we can dyn_cast from QualType 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// to a specific Type class. 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttemplate<> struct simplify_type<const ::clang::QualType> { 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project typedef ::clang::Type* SimpleType; 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static SimpleType getSimplifiedValue(const ::clang::QualType &Val) { 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return Val.getTypePtr(); 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttemplate<> struct simplify_type< ::clang::QualType> 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : public simplify_type<const ::clang::QualType> {}; 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} // end namespace llvm 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace clang { 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Type - This is the base class of the type hierarchy. A central concept 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// with types is that each type always has a canonical type. A canonical type 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// is the type with any typedef names stripped out of it or the types it 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// references. For example, consider: 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// typedef int foo; 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// typedef foo* bar; 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 'int *' 'foo *' 'bar' 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// There will be a Type object created for 'int'. Since int is canonical, its 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// canonicaltype pointer points to itself. There is also a Type for 'foo' (a 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// TypeNameType). Its CanonicalType pointer points to the 'int' Type. Next 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// there is a PointerType that represents 'int*', which, like 'int', is 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// type is 'int*', and there is a TypeNameType for 'bar', whose canonical type 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// is also 'int*'. 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Non-canonical types are useful for emitting diagnostics, without losing 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// information about typedefs being used. Canonical types are useful for type 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// comparisons (they allow by-pointer equality tests) and useful for reasoning 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// about whether something has a particular form (e.g. is a function type), 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// because they implicitly, recursively, strip all typedefs out of a type. 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Types, once created, are immutable. 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass Type { 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project enum TypeClass { 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Builtin, Complex, Pointer, Reference, MemberPointer, 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ConstantArray, VariableArray, IncompleteArray, DependentSizedArray, 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Vector, ExtVector, 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FunctionNoProto, FunctionProto, 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypeName, Tagged, ASQual, 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TemplateTypeParm, 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ObjCInterface, ObjCQualifiedInterface, 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ObjCQualifiedId, 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypeOfExp, TypeOfTyp, // GNU typeof extension. 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockPointer // C extension 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprivate: 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType CanonicalType; 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Dependent - Whether this type is a dependent type (C++ [temp.dep.type]). 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool Dependent : 1; 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Note that this should stay at the end of the ivars for Type so that 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// subclasses can pack their bitfields into the same word. 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned TC : 5; 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // silence VC++ warning C4355: 'this' : used in base member initializer list 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type *this_() { return this; } 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(TypeClass tc, QualType Canonical, bool dependent) 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical), 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Dependent(dependent), TC(tc) {} 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual ~Type() {} 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void Destroy(ASTContext& C); 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void EmitTypeInternal(llvm::Serializer& S) const; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void ReadTypeInternal(llvm::Deserializer& D); 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); } 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isCanonical() const { return CanonicalType.getTypePtr() == this; } 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// object types, function types, and incomplete types. 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isObjectType - types that fully describe objects. An object is a region 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// of memory that can be examined and stored into (H&S). 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isObjectType() const; 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isIncompleteType - Return true if this is an incomplete type. 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// A type that can describe objects, but which lacks information needed to 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// determine its size (e.g. void, or a fwd declared struct). Clients of this 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// routine will need to determine if the size is actually required. 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isIncompleteType() const; 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isIncompleteOrObjectType - Return true if this is an incomplete or object 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// type, in other words, not a function type. 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isIncompleteOrObjectType() const { 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return !isFunctionType(); 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10). 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isPODType() const; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// types that have a non-constant expression. This does not include "[]". 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVariablyModifiedType() const; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Helper methods to distinguish type categories. All type predicates 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// operate on the canonical type, ignoring typedefs and qualifiers. 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isIntegerType() does *not* include complex integers (a GCC extension). 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isComplexIntegerType() can be used to test for complex integers. 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isEnumeralType() const; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isBooleanType() const; 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isCharType() const; 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isWideCharType() const; 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isIntegralType() const; 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Floating point categories. 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isComplexType() does *not* include complex integers (a GCC extension). 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isComplexIntegerType() can be used to test for complex integers. 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isComplexType() const; // C99 6.2.5p11 (complex) 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVoidType() const; // C99 6.2.5p19 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isDerivedType() const; // C99 6.2.5p20 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isAggregateType() const; // C99 6.2.5p21 (arrays, structures) 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Type Predicates: Check to see if this type is structurally the specified 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // type, ignoring typedefs and qualifiers. 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isFunctionType() const; 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isPointerLikeType() const; // Pointer or Reference. 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isPointerType() const; 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isBlockPointerType() const; 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isReferenceType() const; 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isFunctionPointerType() const; 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isMemberPointerType() const; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isMemberFunctionPointerType() const; 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isArrayType() const; 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isConstantArrayType() const; 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isIncompleteArrayType() const; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVariableArrayType() const; 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isDependentSizedArrayType() const; 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isRecordType() const; 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isClassType() const; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isStructureType() const; 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isUnionType() const; 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isComplexIntegerType() const; // GCC _Complex integer type. 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVectorType() const; // GCC vector type. 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isExtVectorType() const; // Extended vector type. 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isObjCInterfaceType() const; // NSString or NSString<foo> 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isObjCQualifiedInterfaceType() const; // NSString<foo> 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isObjCQualifiedIdType() const; // id<foo> 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isTemplateTypeParmType() const; // C++ template type parameter 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isDependentType - Whether this type is a dependent type, meaning 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// that its definition somehow depends on a template parameter 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// (C++ [temp.dep.type]). 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isDependentType() const { return Dependent; } 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isOverloadType() const; // C++ overloaded function 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Type Checking Functions: Check to see if this type is structurally the 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // specified type, ignoring typedefs and qualifiers, and return a pointer to 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // the best type we can. 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const BuiltinType *getAsBuiltinType() const; 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const FunctionType *getAsFunctionType() const; 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const FunctionTypeProto *getAsFunctionTypeProto() const; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const PointerLikeType *getAsPointerLikeType() const; // Pointer or Reference. 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const PointerType *getAsPointerType() const; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const BlockPointerType *getAsBlockPointerType() const; 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ReferenceType *getAsReferenceType() const; 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const MemberPointerType *getAsMemberPointerType() const; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const RecordType *getAsRecordType() const; 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const RecordType *getAsStructureType() const; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// NOTE: getAs*ArrayType are methods on ASTContext. 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const TypedefType *getAsTypedefType() const; 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const RecordType *getAsUnionType() const; 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const EnumType *getAsEnumType() const; 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const VectorType *getAsVectorType() const; // GCC vector type. 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ComplexType *getAsComplexType() const; 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ExtVectorType *getAsExtVectorType() const; // Extended vector type. 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ObjCInterfaceType *getAsObjCInterfaceType() const; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const; 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const TemplateTypeParmType *getAsTemplateTypeParmType() const; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// getAsPointerToObjCInterfaceType - If this is a pointer to an ObjC 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// interface, return the interface type, otherwise return null. 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ObjCInterfaceType *getAsPointerToObjCInterfaceType() const; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// getArrayElementTypeNoTypeQual - If this is an array type, return the 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// element type of the array, potentially with type qualifiers missing. 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// This method should never be used when type qualifiers are meaningful. 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Type *getArrayElementTypeNoTypeQual() const; 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// getDesugaredType - Return the specified type with any "sugar" removed from 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// the type. This takes off typedefs, typeof's etc. If the outer level of 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// the type is already concrete, it returns it unmodified. This is similar 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// to getting the canonical type, but it doesn't remove *all* typedefs. For 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// concrete. 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getDesugaredType() const; 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// More type predicates useful for type checking/promotion 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isPromotableIntegerType() const; // C99 6.3.1.1p2 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isSignedIntegerType - Return true if this is an integer type that is 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// an enum decl which has a signed representation, or a vector of signed 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// integer element type. 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isSignedIntegerType() const; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isUnsignedIntegerType - Return true if this is an integer type that is 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// decl which has an unsigned representation, or a vector of unsigned integer 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// element type. 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isUnsignedIntegerType() const; 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// isConstantSizeType - Return true if this is not a variable sized type, 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// according to the rules of C99 6.7.5p3. It is not legal to call this on 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// incomplete types. 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isConstantSizeType() const; 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getCanonicalTypeInternal() const { return CanonicalType; } 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void dump() const; 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const = 0; 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *) { return true; } 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Emit - Emit a Type to bitcode. Used by ASTContext. 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Emit(llvm::Serializer& S) const; 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// Create - Construct a Type from bitcode. Used by ASTContext. 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Create(ASTContext& Context, unsigned i, llvm::Deserializer& S); 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// EmitImpl - Subclasses must implement this method in order to 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// be serialized. 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: Make this abstract once implemented. 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const { 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert (false && "Serializization for type not supported."); 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ASQualType - TR18037 (C embedded extensions) 6.2.5p26 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// This supports address space qualified types. 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ASQualType : public Type, public llvm::FoldingSetNode { 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// BaseType - This is the underlying type that this qualifies. All CVR 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// qualifiers are stored on the QualType that references this type, so we 4572910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner /// can't have any here. 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type *BaseType; 4592910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner /// Address Space ID - The address space ID this type is qualified with. 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned AddressSpace; 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ASQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) : 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(ASQual, CanonicalPtr, Base->isDependentType()), BaseType(Base), 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AddressSpace(AddrSpace) { 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type *getBaseType() const { return BaseType; } 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getAddressSpace() const { return AddressSpace; } 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getBaseType(), AddressSpace); 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned AddrSpace) { 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Base); 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddInteger(AddrSpace); 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == ASQual; } 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const ASQualType *) { return true; } 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// BuiltinType - This class is used for builtin types like 'int'. Builtin 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// types are always canonical and have a literal name field. 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass BuiltinType : public Type { 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project enum Kind { 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Void, 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Bool, // This is bool and/or _Bool. 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Char_U, // This is 'char' for targets where char is unsigned. 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project UChar, // This is explicitly qualified unsigned char. 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project UShort, 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project UInt, 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ULong, 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ULongLong, 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Char_S, // This is 'char' for targets where char is signed. 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SChar, // This is explicitly qualified signed char. 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project WChar, // This is 'wchar_t' for C++. 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Short, 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Int, 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Long, 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project LongLong, 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Float, Double, LongDouble, 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Overload, // This represents the type of an overloaded function declaration. 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Dependent // This represents the type of a type-dependent expression. 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprivate: 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Kind TypeKind; 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BuiltinType(Kind K) 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent)), 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypeKind(K) {} 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Kind getKind() const { return TypeKind; } 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char *getName() const; 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const BuiltinType *) { return true; } 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// types (_Complex float etc) as well as the GCC integer complex extensions. 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ComplexType : public Type, public llvm::FoldingSetNode { 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType ElementType; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ComplexType(QualType Element, QualType CanonicalPtr) : 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(Complex, CanonicalPtr, Element->isDependentType()), 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ElementType(Element) { 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getElementType() const { return ElementType; } 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getElementType()); 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Element.getAsOpaquePtr()); 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const ComplexType *) { return true; } 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// PointerLikeType - Common base class for pointers and references. 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FIXME: Add more documentation on this classes design point. For example, 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// should BlockPointerType inherit from it? Is the concept of a PointerLikeType 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// in the C++ standard? 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass PointerLikeType : public Type { 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType PointeeType; 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointerLikeType(TypeClass K, QualType Pointee, QualType CanonicalPtr) : 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(K, CanonicalPtr, Pointee->isDependentType()), PointeeType(Pointee) { 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == Pointer || T->getTypeClass() == Reference; 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const PointerLikeType *) { return true; } 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// PointerType - C99 6.7.5.1 - Pointer Declarators. 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass PointerType : public PointerLikeType, public llvm::FoldingSetNode { 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointerType(QualType Pointee, QualType CanonicalPtr) : 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointerLikeType(Pointer, Pointee, CanonicalPtr) { 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getPointeeType()); 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Pointee.getAsOpaquePtr()); 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const PointerType *) { return true; } 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// BlockPointerType - pointer to a block type. 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// This type is to represent types syntactically represented as 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// "void (^)(int)", etc. Pointee is required to always be a function type. 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FIXME: Should BlockPointerType inherit from PointerLikeType? It could 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// simplfy some type checking code, however PointerLikeType doesn't appear 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// to be used by the type checker. 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass BlockPointerType : public Type, public llvm::FoldingSetNode { 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType PointeeType; // Block is some kind of pointer type 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BlockPointerType(QualType Pointee, QualType CanonicalCls) : 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(BlockPointer, CanonicalCls, Pointee->isDependentType()), 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointeeType(Pointee) { 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Get the pointee type. Pointee is required to always be a function type. 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getPointeeType()); 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Pointee.getAsOpaquePtr()); 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == BlockPointer; 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const BlockPointerType *) { return true; } 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project protected: 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ReferenceType - C++ 8.3.2 - Reference Declarators. 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ReferenceType : public PointerLikeType, public llvm::FoldingSetNode { 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ReferenceType(QualType Referencee, QualType CanonicalRef) : 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointerLikeType(Reference, Referencee, CanonicalRef) { 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getPointeeType()); 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Referencee.getAsOpaquePtr()); 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { return T->getTypeClass() == Reference; } 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const ReferenceType *) { return true; } 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// MemberPointerType - C++ 8.3.3 - Pointers to members 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass MemberPointerType : public Type, public llvm::FoldingSetNode { 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType PointeeType; 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// The class of which the pointee is a member. Must ultimately be a 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// RecordType, but could be a typedef or a template parameter too. 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Type *Class; 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) : 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(MemberPointer, CanonicalPtr, 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Cls->isDependentType() || Pointee->isDependentType()), 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointeeType(Pointee), Class(Cls) { 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getPointeeType() const { return PointeeType; } 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Type *getClass() const { return Class; } 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getPointeeType(), getClass()); 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const Type *Class) { 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Pointee.getAsOpaquePtr()); 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Class); 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == MemberPointer; 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const MemberPointerType *) { return true; } 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ArrayType - C99 6.7.5.2 - Array Declarators. 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ArrayType : public Type, public llvm::FoldingSetNode { 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// an array with a static size (e.g. int X[static 4]), or an array 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// with a star size (e.g. int X[*]). 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// 'static' is only allowed on function parameters. 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project enum ArraySizeModifier { 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Normal, Static, Star 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprivate: 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// ElementType - The element type of the array. 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType ElementType; 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// NOTE: These fields are packed into the bitfields space in the Type class. 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned SizeModifier : 2; 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// IndexTypeQuals - Capture qualifiers in declarations like: 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// 'int X[static restrict 4]'. For function parameters only. 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned IndexTypeQuals : 3; 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // C++ [temp.dep.type]p1: 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // A type is dependent if it is... 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // - an array type constructed from any dependent type or whose 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // size is specified by a constant expression that is 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // value-dependent, 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArrayType(TypeClass tc, QualType et, QualType can, 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArraySizeModifier sm, unsigned tq) 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(tc, can, et->isDependentType() || tc == DependentSizedArray), 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getElementType() const { return ElementType; } 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArraySizeModifier getSizeModifier() const { 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ArraySizeModifier(SizeModifier); 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == ConstantArray || 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project T->getTypeClass() == VariableArray || 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project T->getTypeClass() == IncompleteArray || 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project T->getTypeClass() == DependentSizedArray; 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const ArrayType *) { return true; } 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ConstantArrayType - This class represents C arrays with a specified constant 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// size. For example 'int A[100]' has ConstantArrayType where the element type 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// is 'int' and the size is 100. 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ConstantArrayType : public ArrayType { 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::APInt Size; // Allows us to unique the type. 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ConstantArrayType(QualType et, QualType can, llvm::APInt sz, 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArraySizeModifier sm, unsigned tq) 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {} 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const llvm::APInt &getSize() const { return Size; } 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getElementType(), getSize()); 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::APInt ArraySize) { 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(ET.getAsOpaquePtr()); 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddInteger(ArraySize.getZExtValue()); 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == ConstantArray; 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const ConstantArrayType *) { return true; } 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// IncompleteArrayType - This class represents C arrays with an unspecified 8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// size. For example 'int A[]' has an IncompleteArrayType where the element 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// type is 'int' and the size is unspecified. 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass IncompleteArrayType : public ArrayType { 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project IncompleteArrayType(QualType et, QualType can, 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArraySizeModifier sm, unsigned tq) 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : ArrayType(IncompleteArray, et, can, sm, tq) {} 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == IncompleteArray; 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const IncompleteArrayType *) { return true; } 8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class StmtIteratorBase; 8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getElementType()); 8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) { 8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(ET.getAsOpaquePtr()); 8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// VariableArrayType - This class represents C arrays with a specified size 8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Since the size expression is an arbitrary expression, we store it as such. 8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// should not be: two lexically equivalent variable array types could mean 8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// different things, for example, these variables do not have the same type 8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// dynamically: 8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// void foo(int x) { 8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// int Y[x]; 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ++x; 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// int Z[x]; 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// } 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VariableArrayType : public ArrayType { 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// SizeExpr - An assignment expression. VLA's are only permitted within 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// a function block. 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Stmt *SizeExpr; 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VariableArrayType(QualType et, QualType can, Expr *e, 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArraySizeModifier sm, unsigned tq) 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void Destroy(ASTContext& C); 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Expr *getSizeExpr() const { 8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // We use C-style casts instead of cast<> here because we do not wish 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // to have a dependency of Type.h on Stmt.h/Expr.h. 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (Expr*) SizeExpr; 8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == VariableArray; 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const VariableArrayType *) { return true; } 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class StmtIteratorBase; 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert (0 && "Cannnot unique VariableArrayTypes."); 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// DependentSizedArrayType - This type represents an array type in 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// C++ whose size is a value-dependent expression. For example: 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// @code 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// template<typename T, int Size> 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class array { 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// T data[Size]; 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// }; 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// @endcode 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// For these types, we won't actually know what the array bound is 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// until template instantiation occurs, at which point this will 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// become either a ConstantArrayType or a VariableArrayType. 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass DependentSizedArrayType : public ArrayType { 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// SizeExpr - An assignment expression that will instantiate to the 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// size of the array. 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Stmt *SizeExpr; 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project DependentSizedArrayType(QualType et, QualType can, Expr *e, 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArraySizeModifier sm, unsigned tq) 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : ArrayType(DependentSizedArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void Destroy(ASTContext& C); 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Expr *getSizeExpr() const { 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // We use C-style casts instead of cast<> here because we do not wish 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // to have a dependency of Type.h on Stmt.h/Expr.h. 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return (Expr*) SizeExpr; 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == DependentSizedArray; 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const DependentSizedArrayType *) { return true; } 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class StmtIteratorBase; 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert (0 && "Cannnot unique DependentSizedArrayTypes."); 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// VectorType - GCC generic vector type. This type is created using 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// __attribute__((vector_size(n)), where "n" specifies the vector size in 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// bytes. Since the constructor takes the number of vector elements, the 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// client is responsible for converting the size into the number of elements. 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VectorType : public Type, public llvm::FoldingSetNode { 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// ElementType - The element type of the vector. 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType ElementType; 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// NumElements - The number of elements in the vector. 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumElements; 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VectorType(QualType vecType, unsigned nElements, QualType canonType) : 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Type(Vector, canonType, vecType->isDependentType()), 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ElementType(vecType), NumElements(nElements) {} 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VectorType(TypeClass tc, QualType vecType, unsigned nElements, 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType canonType) 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(tc, canonType, vecType->isDependentType()), ElementType(vecType), 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NumElements(nElements) {} 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getElementType() const { return ElementType; } 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getNumElements() const { return NumElements; } 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID) { 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getElementType(), getNumElements(), getTypeClass()); 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumElements, TypeClass TypeClass) { 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(ElementType.getAsOpaquePtr()); 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddInteger(NumElements); 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddInteger(TypeClass); 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const VectorType *) { return true; } 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ExtVectorType - Extended vector type. This type is created using 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class enables syntactic extensions, like Vector Components for accessing 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// points, colors, and textures (modeled after OpenGL Shading Language). 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ExtVectorType : public VectorType { 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project VectorType(ExtVector, vecType, nElements, canonType) {} 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int getPointAccessorIdx(char c) { 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (c) { 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return -1; 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'x': return 0; 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'y': return 1; 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'z': return 2; 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'w': return 3; 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int getNumericAccessorIdx(char c) { 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (c) { 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return -1; 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '0': return 0; 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '1': return 1; 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '2': return 2; 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '3': return 3; 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '4': return 4; 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '5': return 5; 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '6': return 6; 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '7': return 7; 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '8': return 8; 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case '9': return 9; 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'a': return 10; 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'b': return 11; 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'c': return 12; 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'd': return 13; 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'e': return 14; 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 'f': return 15; 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static int getAccessorIdx(char c) { 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (int idx = getPointAccessorIdx(c)+1) return idx-1; 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getNumericAccessorIdx(c); 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isAccessorWithinNumElements(char c) const { 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (int idx = getAccessorIdx(c)+1) 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return unsigned(idx-1) < NumElements; 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == ExtVector; 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const ExtVectorType *) { return true; } 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class of FunctionTypeNoProto and FunctionTypeProto. 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FunctionType : public Type { 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// SubClassData - This field is owned by the subclass, put here to pack 10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// tightly with the ivars in Type. 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool SubClassData : 1; 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// TypeQuals - Used only by FunctionTypeProto, put here to pack with the 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// other bitfields. 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// The qualifiers are part of FunctionTypeProto because... 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// C++ 8.3.5p4: The return type, the parameter type list and the 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// cv-qualifier-seq, [...], are part of the function type. 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned TypeQuals : 3; 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // The type returned by the function. 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType ResultType; 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FunctionType(TypeClass tc, QualType res, bool SubclassInfo, 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned typeQuals, QualType Canonical, bool Dependent) 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(tc, Canonical, Dependent), 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SubClassData(SubclassInfo), TypeQuals(typeQuals), ResultType(res) {} 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool getSubClassData() const { return SubClassData; } 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getTypeQuals() const { return TypeQuals; } 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getResultType() const { return ResultType; } 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == FunctionNoProto || 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project T->getTypeClass() == FunctionProto; 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const FunctionType *) { return true; } 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// no information available about its arguments. 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode { 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FunctionTypeNoProto(QualType Result, QualType Canonical) 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : FunctionType(FunctionNoProto, Result, false, 0, Canonical, 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /*Dependent=*/false) {} 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // No additional state past what FunctionType provides. 10865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtual void getAsStringInternal(std::string &InnerString) const; 10885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void Profile(llvm::FoldingSetNodeID &ID) { 10905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner Profile(ID, getResultType()); 10915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 10925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 10935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner ID.AddPointer(ResultType.getAsOpaquePtr()); 10945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 10955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 10965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner static bool classof(const Type *T) { 10975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return T->getTypeClass() == FunctionNoProto; 10985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner } 10995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner static bool classof(const FunctionTypeNoProto *) { return true; } 11005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 11015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerprotected: 11025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner virtual void EmitImpl(llvm::Serializer& S) const; 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FunctionTypeProto - Represents a prototype with argument type info, e.g. 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// arguments, not as having a single void argument. 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// hasAnyDependentType - Determine whether there are any dependent 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// types within the arguments passed in. 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool hasAnyDependentType(const QualType *ArgArray, unsigned numArgs) { 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned Idx = 0; Idx < numArgs; ++Idx) 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ArgArray[Idx]->isDependentType()) 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project FunctionTypeProto(QualType Result, const QualType *ArgArray, unsigned numArgs, 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVariadic, unsigned typeQuals, QualType Canonical) 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : FunctionType(FunctionProto, Result, isVariadic, typeQuals, Canonical, 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project (Result->isDependentType() || 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project hasAnyDependentType(ArgArray, numArgs))), 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NumArgs(numArgs) { 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Fill in the trailing argument array. 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 11295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner for (unsigned i = 0; i != numArgs; ++i) 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ArgInfo[i] = ArgArray[i]; 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// NumArgs - The number of arguments this function has, not counting '...'. 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumArgs; 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// ArgInfo - There is an variable size array after the class in memory that 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// holds the argument types. 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getNumArgs() const { return NumArgs; } 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType getArgType(unsigned i) const { 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert(i < NumArgs && "Invalid argument number!"); 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return arg_type_begin()[i]; 11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVariadic() const { return getSubClassData(); } 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); } 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project typedef const QualType *arg_type_iterator; 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project arg_type_iterator arg_type_begin() const { 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return reinterpret_cast<const QualType *>(this+1); 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void getAsStringInternal(std::string &InnerString) const; 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const Type *T) { 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->getTypeClass() == FunctionProto; 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static bool classof(const FunctionTypeProto *) { return true; } 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void Profile(llvm::FoldingSetNodeID &ID); 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project arg_type_iterator ArgTys, unsigned NumArgs, 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool isVariadic, unsigned TypeQuals); 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void EmitImpl(llvm::Serializer& S) const; 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class Type; 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass TypedefType : public Type { 11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypedefDecl *Decl; 11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected: 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypedefType(TypeClass tc, TypedefDecl *D, QualType can) 11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(tc, can, can->isDependentType()), Decl(D) { 11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert(!isa<TypedefType>(can) && "Invalid canonical type"); 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project friend class ASTContext; // ASTContext creates these. 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic: 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypedefDecl *getDecl() const { return Decl; } 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// potentially looking through *all* consequtive typedefs. This returns the 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// sum of the type qualifiers, so if you have: 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// typedef const int A; 11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// typedef volatile A B; 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// looking through the typedefs for B will give you "const volatile A". 1194 QualType LookThroughTypedefs() const; 1195 1196 virtual void getAsStringInternal(std::string &InnerString) const; 1197 1198 static bool classof(const Type *T) { return T->getTypeClass() == TypeName; } 1199 static bool classof(const TypedefType *) { return true; } 1200 1201protected: 1202 virtual void EmitImpl(llvm::Serializer& S) const; 1203 static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1204 friend class Type; 1205}; 1206 1207/// TypeOfExpr (GCC extension). 1208class TypeOfExpr : public Type { 1209 Expr *TOExpr; 1210 TypeOfExpr(Expr *E, QualType can); 1211 friend class ASTContext; // ASTContext creates these. 1212public: 1213 Expr *getUnderlyingExpr() const { return TOExpr; } 1214 1215 virtual void getAsStringInternal(std::string &InnerString) const; 1216 1217 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExp; } 1218 static bool classof(const TypeOfExpr *) { return true; } 1219 1220protected: 1221 virtual void EmitImpl(llvm::Serializer& S) const; 1222 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1223 friend class Type; 1224}; 1225 1226/// TypeOfType (GCC extension). 1227class TypeOfType : public Type { 1228 QualType TOType; 1229 TypeOfType(QualType T, QualType can) 1230 : Type(TypeOfTyp, can, T->isDependentType()), TOType(T) { 1231 assert(!isa<TypedefType>(can) && "Invalid canonical type"); 1232 } 1233 friend class ASTContext; // ASTContext creates these. 1234public: 1235 QualType getUnderlyingType() const { return TOType; } 1236 1237 virtual void getAsStringInternal(std::string &InnerString) const; 1238 1239 static bool classof(const Type *T) { return T->getTypeClass() == TypeOfTyp; } 1240 static bool classof(const TypeOfType *) { return true; } 1241 1242protected: 1243 virtual void EmitImpl(llvm::Serializer& S) const; 1244 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1245 friend class Type; 1246}; 1247 1248class TagType : public Type { 1249 /// Stores the TagDecl associated with this type. The decl will 1250 /// point to the TagDecl that actually defines the entity (or is a 1251 /// definition in progress), if there is such a definition. The 1252 /// single-bit value will be non-zero when this tag is in the 1253 /// process of being defined. 1254 llvm::PointerIntPair<TagDecl *, 1> decl; 1255 friend class ASTContext; 1256 friend class TagDecl; 1257 1258protected: 1259 // FIXME: We'll need the user to pass in information about whether 1260 // this type is dependent or not, because we don't have enough 1261 // information to compute it here. 1262 TagType(TagDecl *D, QualType can) 1263 : Type(Tagged, can, /*Dependent=*/false), decl(D, 0) {} 1264 1265public: 1266 TagDecl *getDecl() const { return decl.getPointer(); } 1267 1268 /// @brief Determines whether this type is in the process of being 1269 /// defined. 1270 bool isBeingDefined() const { return decl.getInt(); } 1271 void setBeingDefined(bool Def) { decl.setInt(Def? 1 : 0); } 1272 1273 virtual void getAsStringInternal(std::string &InnerString) const; 1274 1275 static bool classof(const Type *T) { return T->getTypeClass() == Tagged; } 1276 static bool classof(const TagType *) { return true; } 1277 1278protected: 1279 virtual void EmitImpl(llvm::Serializer& S) const; 1280 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1281 friend class Type; 1282}; 1283 1284/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 1285/// to detect TagType objects of structs/unions/classes. 1286class RecordType : public TagType { 1287protected: 1288 explicit RecordType(RecordDecl *D) 1289 : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { } 1290 friend class ASTContext; // ASTContext creates these. 1291public: 1292 1293 RecordDecl *getDecl() const { 1294 return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 1295 } 1296 1297 // FIXME: This predicate is a helper to QualType/Type. It needs to 1298 // recursively check all fields for const-ness. If any field is declared 1299 // const, it needs to return false. 1300 bool hasConstFields() const { return false; } 1301 1302 // FIXME: RecordType needs to check when it is created that all fields are in 1303 // the same address space, and return that. 1304 unsigned getAddressSpace() const { return 0; } 1305 1306 static bool classof(const TagType *T); 1307 static bool classof(const Type *T) { 1308 return isa<TagType>(T) && classof(cast<TagType>(T)); 1309 } 1310 static bool classof(const RecordType *) { return true; } 1311}; 1312 1313/// CXXRecordType - This is a helper class that allows the use of 1314/// isa/cast/dyncast to detect TagType objects of C++ structs/unions/classes. 1315class CXXRecordType : public RecordType { 1316 explicit CXXRecordType(CXXRecordDecl *D) 1317 : RecordType(reinterpret_cast<RecordDecl*>(D)) { } 1318 friend class ASTContext; // ASTContext creates these. 1319public: 1320 1321 CXXRecordDecl *getDecl() const { 1322 return reinterpret_cast<CXXRecordDecl*>(RecordType::getDecl()); 1323 } 1324 1325 static bool classof(const TagType *T); 1326 static bool classof(const Type *T) { 1327 return isa<TagType>(T) && classof(cast<TagType>(T)); 1328 } 1329 static bool classof(const CXXRecordType *) { return true; } 1330}; 1331 1332/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 1333/// to detect TagType objects of enums. 1334class EnumType : public TagType { 1335 explicit EnumType(EnumDecl *D) 1336 : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { } 1337 friend class ASTContext; // ASTContext creates these. 1338public: 1339 1340 EnumDecl *getDecl() const { 1341 return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 1342 } 1343 1344 static bool classof(const TagType *T); 1345 static bool classof(const Type *T) { 1346 return isa<TagType>(T) && classof(cast<TagType>(T)); 1347 } 1348 static bool classof(const EnumType *) { return true; } 1349}; 1350 1351class TemplateTypeParmType : public Type { 1352 TemplateTypeParmDecl *Decl; 1353 1354protected: 1355 TemplateTypeParmType(TemplateTypeParmDecl *D) 1356 : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true), Decl(D) { } 1357 1358 friend class ASTContext; // ASTContext creates these 1359 1360public: 1361 TemplateTypeParmDecl *getDecl() const { return Decl; } 1362 1363 virtual void getAsStringInternal(std::string &InnerString) const; 1364 1365 static bool classof(const Type *T) { 1366 return T->getTypeClass() == TemplateTypeParm; 1367 } 1368 static bool classof(const TemplateTypeParmType *T) { return true; } 1369 1370protected: 1371 virtual void EmitImpl(llvm::Serializer& S) const; 1372 static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1373 friend class Type; 1374}; 1375 1376/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 1377/// object oriented design. They basically correspond to C++ classes. There 1378/// are two kinds of interface types, normal interfaces like "NSString" and 1379/// qualified interfaces, which are qualified with a protocol list like 1380/// "NSString<NSCopyable, NSAmazing>". Qualified interface types are instances 1381/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType. 1382class ObjCInterfaceType : public Type { 1383 ObjCInterfaceDecl *Decl; 1384protected: 1385 ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) : 1386 Type(tc, QualType(), /*Dependent=*/false), Decl(D) { } 1387 friend class ASTContext; // ASTContext creates these. 1388public: 1389 1390 ObjCInterfaceDecl *getDecl() const { return Decl; } 1391 1392 /// qual_iterator and friends: this provides access to the (potentially empty) 1393 /// list of protocols qualifying this interface. If this is an instance of 1394 /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an 1395 /// empty list if there are no qualifying protocols. 1396 typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1397 inline qual_iterator qual_begin() const; 1398 inline qual_iterator qual_end() const; 1399 bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; } 1400 1401 /// getNumProtocols - Return the number of qualifying protocols in this 1402 /// interface type, or 0 if there are none. 1403 inline unsigned getNumProtocols() const; 1404 1405 /// getProtocol - Return the specified qualifying protocol. 1406 inline ObjCProtocolDecl *getProtocol(unsigned i) const; 1407 1408 1409 virtual void getAsStringInternal(std::string &InnerString) const; 1410 static bool classof(const Type *T) { 1411 return T->getTypeClass() == ObjCInterface || 1412 T->getTypeClass() == ObjCQualifiedInterface; 1413 } 1414 static bool classof(const ObjCInterfaceType *) { return true; } 1415}; 1416 1417/// ObjCQualifiedInterfaceType - This class represents interface types 1418/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>. 1419/// 1420/// Duplicate protocols are removed and protocol list is canonicalized to be in 1421/// alphabetical order. 1422class ObjCQualifiedInterfaceType : public ObjCInterfaceType, 1423 public llvm::FoldingSetNode { 1424 1425 // List of protocols for this protocol conforming object type 1426 // List is sorted on protocol name. No protocol is enterred more than once. 1427 llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols; 1428 1429 ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D, 1430 ObjCProtocolDecl **Protos, unsigned NumP) : 1431 ObjCInterfaceType(ObjCQualifiedInterface, D), 1432 Protocols(Protos, Protos+NumP) { } 1433 friend class ASTContext; // ASTContext creates these. 1434public: 1435 1436 ObjCProtocolDecl *getProtocol(unsigned i) const { 1437 return Protocols[i]; 1438 } 1439 unsigned getNumProtocols() const { 1440 return Protocols.size(); 1441 } 1442 1443 qual_iterator qual_begin() const { return Protocols.begin(); } 1444 qual_iterator qual_end() const { return Protocols.end(); } 1445 1446 virtual void getAsStringInternal(std::string &InnerString) const; 1447 1448 void Profile(llvm::FoldingSetNodeID &ID); 1449 static void Profile(llvm::FoldingSetNodeID &ID, 1450 const ObjCInterfaceDecl *Decl, 1451 ObjCProtocolDecl **protocols, unsigned NumProtocols); 1452 1453 static bool classof(const Type *T) { 1454 return T->getTypeClass() == ObjCQualifiedInterface; 1455 } 1456 static bool classof(const ObjCQualifiedInterfaceType *) { return true; } 1457}; 1458 1459inline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const { 1460 if (const ObjCQualifiedInterfaceType *QIT = 1461 dyn_cast<ObjCQualifiedInterfaceType>(this)) 1462 return QIT->qual_begin(); 1463 return 0; 1464} 1465inline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const { 1466 if (const ObjCQualifiedInterfaceType *QIT = 1467 dyn_cast<ObjCQualifiedInterfaceType>(this)) 1468 return QIT->qual_end(); 1469 return 0; 1470} 1471 1472/// getNumProtocols - Return the number of qualifying protocols in this 1473/// interface type, or 0 if there are none. 1474inline unsigned ObjCInterfaceType::getNumProtocols() const { 1475 if (const ObjCQualifiedInterfaceType *QIT = 1476 dyn_cast<ObjCQualifiedInterfaceType>(this)) 1477 return QIT->getNumProtocols(); 1478 return 0; 1479} 1480 1481/// getProtocol - Return the specified qualifying protocol. 1482inline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { 1483 return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i); 1484} 1485 1486 1487 1488/// ObjCQualifiedIdType - to represent id<protocol-list>. 1489/// 1490/// Duplicate protocols are removed and protocol list is canonicalized to be in 1491/// alphabetical order. 1492class ObjCQualifiedIdType : public Type, 1493 public llvm::FoldingSetNode { 1494 // List of protocols for this protocol conforming 'id' type 1495 // List is sorted on protocol name. No protocol is enterred more than once. 1496 llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1497 1498 ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP) 1499 : Type(ObjCQualifiedId, QualType()/*these are always canonical*/, 1500 /*Dependent=*/false), 1501 Protocols(Protos, Protos+NumP) { } 1502 friend class ASTContext; // ASTContext creates these. 1503public: 1504 1505 ObjCProtocolDecl *getProtocols(unsigned i) const { 1506 return Protocols[i]; 1507 } 1508 unsigned getNumProtocols() const { 1509 return Protocols.size(); 1510 } 1511 ObjCProtocolDecl **getReferencedProtocols() { 1512 return &Protocols[0]; 1513 } 1514 1515 typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1516 qual_iterator qual_begin() const { return Protocols.begin(); } 1517 qual_iterator qual_end() const { return Protocols.end(); } 1518 1519 virtual void getAsStringInternal(std::string &InnerString) const; 1520 1521 void Profile(llvm::FoldingSetNodeID &ID); 1522 static void Profile(llvm::FoldingSetNodeID &ID, 1523 ObjCProtocolDecl **protocols, unsigned NumProtocols); 1524 1525 static bool classof(const Type *T) { 1526 return T->getTypeClass() == ObjCQualifiedId; 1527 } 1528 static bool classof(const ObjCQualifiedIdType *) { return true; } 1529 1530}; 1531 1532 1533// Inline function definitions. 1534 1535/// getUnqualifiedType - Return the type without any qualifiers. 1536inline QualType QualType::getUnqualifiedType() const { 1537 Type *TP = getTypePtr(); 1538 if (const ASQualType *ASQT = dyn_cast<ASQualType>(TP)) 1539 TP = ASQT->getBaseType(); 1540 return QualType(TP, 0); 1541} 1542 1543/// getAddressSpace - Return the address space of this type. 1544inline unsigned QualType::getAddressSpace() const { 1545 QualType CT = getTypePtr()->getCanonicalTypeInternal(); 1546 if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 1547 return AT->getElementType().getAddressSpace(); 1548 if (const RecordType *RT = dyn_cast<RecordType>(CT)) 1549 return RT->getAddressSpace(); 1550 if (const ASQualType *ASQT = dyn_cast<ASQualType>(CT)) 1551 return ASQT->getAddressSpace(); 1552 return 0; 1553} 1554 1555/// isMoreQualifiedThan - Determine whether this type is more 1556/// qualified than the Other type. For example, "const volatile int" 1557/// is more qualified than "const int", "volatile int", and 1558/// "int". However, it is not more qualified than "const volatile 1559/// int". 1560inline bool QualType::isMoreQualifiedThan(QualType Other) const { 1561 // FIXME: Handle address spaces 1562 unsigned MyQuals = this->getCVRQualifiers(); 1563 unsigned OtherQuals = Other.getCVRQualifiers(); 1564 assert(this->getAddressSpace() == 0 && "Address space not checked"); 1565 assert(Other.getAddressSpace() == 0 && "Address space not checked"); 1566 return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals; 1567} 1568 1569/// isAtLeastAsQualifiedAs - Determine whether this type is at last 1570/// as qualified as the Other type. For example, "const volatile 1571/// int" is at least as qualified as "const int", "volatile int", 1572/// "int", and "const volatile int". 1573inline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const { 1574 // FIXME: Handle address spaces 1575 unsigned MyQuals = this->getCVRQualifiers(); 1576 unsigned OtherQuals = Other.getCVRQualifiers(); 1577 assert(this->getAddressSpace() == 0 && "Address space not checked"); 1578 assert(Other.getAddressSpace() == 0 && "Address space not checked"); 1579 return (MyQuals | OtherQuals) == MyQuals; 1580} 1581 1582/// getNonReferenceType - If Type is a reference type (e.g., const 1583/// int&), returns the type that the reference refers to ("const 1584/// int"). Otherwise, returns the type itself. This routine is used 1585/// throughout Sema to implement C++ 5p6: 1586/// 1587/// If an expression initially has the type "reference to T" (8.3.2, 1588/// 8.5.3), the type is adjusted to "T" prior to any further 1589/// analysis, the expression designates the object or function 1590/// denoted by the reference, and the expression is an lvalue. 1591inline QualType QualType::getNonReferenceType() const { 1592 if (const ReferenceType *RefType = (*this)->getAsReferenceType()) 1593 return RefType->getPointeeType(); 1594 else 1595 return *this; 1596} 1597 1598inline const TypedefType* Type::getAsTypedefType() const { 1599 return dyn_cast<TypedefType>(this); 1600} 1601inline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const { 1602 if (const PointerType *PT = getAsPointerType()) 1603 return PT->getPointeeType()->getAsObjCInterfaceType(); 1604 return 0; 1605} 1606 1607// NOTE: All of these methods use "getUnqualifiedType" to strip off address 1608// space qualifiers if present. 1609inline bool Type::isFunctionType() const { 1610 return isa<FunctionType>(CanonicalType.getUnqualifiedType()); 1611} 1612inline bool Type::isPointerType() const { 1613 return isa<PointerType>(CanonicalType.getUnqualifiedType()); 1614} 1615inline bool Type::isBlockPointerType() const { 1616 return isa<BlockPointerType>(CanonicalType); 1617} 1618inline bool Type::isReferenceType() const { 1619 return isa<ReferenceType>(CanonicalType.getUnqualifiedType()); 1620} 1621inline bool Type::isPointerLikeType() const { 1622 return isa<PointerLikeType>(CanonicalType.getUnqualifiedType()); 1623} 1624inline bool Type::isFunctionPointerType() const { 1625 if (const PointerType* T = getAsPointerType()) 1626 return T->getPointeeType()->isFunctionType(); 1627 else 1628 return false; 1629} 1630inline bool Type::isMemberPointerType() const { 1631 return isa<MemberPointerType>(CanonicalType.getUnqualifiedType()); 1632} 1633inline bool Type::isMemberFunctionPointerType() const { 1634 if (const MemberPointerType* T = getAsMemberPointerType()) 1635 return T->getPointeeType()->isFunctionType(); 1636 else 1637 return false; 1638} 1639inline bool Type::isArrayType() const { 1640 return isa<ArrayType>(CanonicalType.getUnqualifiedType()); 1641} 1642inline bool Type::isConstantArrayType() const { 1643 return isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()); 1644} 1645inline bool Type::isIncompleteArrayType() const { 1646 return isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()); 1647} 1648inline bool Type::isVariableArrayType() const { 1649 return isa<VariableArrayType>(CanonicalType.getUnqualifiedType()); 1650} 1651inline bool Type::isDependentSizedArrayType() const { 1652 return isa<DependentSizedArrayType>(CanonicalType.getUnqualifiedType()); 1653} 1654inline bool Type::isRecordType() const { 1655 return isa<RecordType>(CanonicalType.getUnqualifiedType()); 1656} 1657inline bool Type::isAnyComplexType() const { 1658 return isa<ComplexType>(CanonicalType.getUnqualifiedType()); 1659} 1660inline bool Type::isVectorType() const { 1661 return isa<VectorType>(CanonicalType.getUnqualifiedType()); 1662} 1663inline bool Type::isExtVectorType() const { 1664 return isa<ExtVectorType>(CanonicalType.getUnqualifiedType()); 1665} 1666inline bool Type::isObjCInterfaceType() const { 1667 return isa<ObjCInterfaceType>(CanonicalType.getUnqualifiedType()); 1668} 1669inline bool Type::isObjCQualifiedInterfaceType() const { 1670 return isa<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType()); 1671} 1672inline bool Type::isObjCQualifiedIdType() const { 1673 return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType()); 1674} 1675inline bool Type::isTemplateTypeParmType() const { 1676 return isa<TemplateTypeParmType>(CanonicalType.getUnqualifiedType()); 1677} 1678 1679inline bool Type::isOverloadType() const { 1680 if (const BuiltinType *BT = getAsBuiltinType()) 1681 return BT->getKind() == BuiltinType::Overload; 1682 else 1683 return false; 1684} 1685 1686/// Insertion operator for diagnostics. This allows sending QualType's into a 1687/// diagnostic with <<. 1688inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 1689 QualType T) { 1690 DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 1691 Diagnostic::ak_qualtype); 1692 return DB; 1693} 1694 1695} // end namespace clang 1696 1697#endif 1698