Type.h revision ff3fcdf47370a4577d971a2adefd259807152078
14b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner//===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===// 24b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 34b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// The LLVM Compiler Infrastructure 44b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 5959e5be188a505881058777f35abaaa3fe2de40bChris Lattner// This file is distributed under the University of Illinois Open Source 6959e5be188a505881058777f35abaaa3fe2de40bChris Lattner// License. See LICENSE.TXT for details. 74b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 84b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner//===----------------------------------------------------------------------===// 94b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// This file defines the Type interface and subclasses. 114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner//===----------------------------------------------------------------------===// 134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#ifndef LLVM_CLANG_AST_TYPE_H 154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#define LLVM_CLANG_AST_TYPE_H 164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 17da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner#include "clang/Basic/Diagnostic.h" 184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#include "llvm/Support/Casting.h" 1983c13010359c33354c581acee65d0c986a75247eSteve Naroff#include "llvm/ADT/APSInt.h" 2048a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner#include "llvm/ADT/FoldingSet.h" 2148a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner#include "llvm/ADT/PointerIntPair.h" 2278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek#include "llvm/Bitcode/SerializationFwd.h" 234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::isa; 244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::cast; 254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::cast_or_null; 264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::dyn_cast; 274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::dyn_cast_or_null; 284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace clang { 304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ASTContext; 314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Type; 324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class TypedefDecl; 338e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor class TemplateDecl; 34dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor class TemplateTypeParmDecl; 35279272e63b321f89c8fa0bb198acd3a834459aebDouglas Gregor class NonTypeTemplateParmDecl; 36279272e63b321f89c8fa0bb198acd3a834459aebDouglas Gregor class TemplateTemplateParamDecl; 374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class TagDecl; 384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class RecordDecl; 39ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis class CXXRecordDecl; 404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class EnumDecl; 4164be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek class FieldDecl; 4242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCInterfaceDecl; 4342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCProtocolDecl; 4442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCMethodDecl; 454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Expr; 46718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek class Stmt; 474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class SourceLocation; 48cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner class PointerLikeType; 494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class PointerType; 507aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff class BlockPointerType; 514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ReferenceType; 527555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl class MemberPointerType; 534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class VectorType; 544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ArrayType; 555eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff class ConstantArrayType; 565eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff class VariableArrayType; 578ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman class IncompleteArrayType; 581b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor class DependentSizedArrayType; 592cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff class RecordType; 600832dbca0e11ee020bbed181c515b3835158436eEli Friedman class EnumType; 617a85fa1ba94c9f4cf960463dd3eb444ef6f89446Chris Lattner class ComplexType; 62806b319509d01bffe47317f11140c930da800dbbSteve Naroff class TagType; 635c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek class TypedefType; 64dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor class TemplateTypeParmType; 65806b319509d01bffe47317f11140c930da800dbbSteve Naroff class FunctionType; 66d5a56aae166344e13f1f8c845530beee0868db49Chris Lattner class FunctionTypeProto; 67af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman class ExtVectorType; 68c33c060e2f4e7c7e89e3b809f52cfc6d55ea9838Steve Naroff class BuiltinType; 69b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner class ObjCInterfaceType; 70b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner class ObjCQualifiedIdType; 7142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCQualifiedInterfaceType; 72fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek class StmtIteratorBase; 738e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor class ClassTemplateSpecializationType; 747555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// QualType - For efficiency, we don't store CVR-qualified types as nodes on 764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// their own: instead each reference to a type stores the qualifiers. This 774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// greatly reduces the number of nodes we need to allocate for types (for 784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// example we only need one for 'int', 'const int', 'volatile int', 794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'const volatile int', etc). 804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// As an added efficiency bonus, instead of making this a pair, we just store 824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// the three bits we care about in the low bits of the pointer. To handle the 834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// packing/unpacking, we make QualType be a simple wrapper class that acts like 844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// a smart pointer. 854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass QualType { 8648a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner llvm::PointerIntPair<Type*, 3> Value; 874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Const = 0x1, 904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Restrict = 0x2, 914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Volatile = 0x4, 924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner CVRFlags = Const|Restrict|Volatile 934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9548a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner QualType() {} 964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9748a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner QualType(const Type *Ptr, unsigned Quals) 9848a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner : Value(const_cast<Type*>(Ptr), Quals) {} 994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10048a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner unsigned getCVRQualifiers() const { return Value.getInt(); } 101b9b218e566459808be9f1c52b03afad3e0d39ed3Chris Lattner void setCVRQualifiers(unsigned Quals) { Value.setInt(Quals); } 10248a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner Type *getTypePtr() const { return Value.getPointer(); } 10348a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner 10448a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void *getAsOpaquePtr() const { return Value.getOpaqueValue(); } 1054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static QualType getFromOpaquePtr(void *Ptr) { 1064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType T; 10748a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner T.Value.setFromOpaqueValue(Ptr); 1084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T; 1094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type &operator*() const { 1124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return *getTypePtr(); 1134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type *operator->() const { 1164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return getTypePtr(); 1174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isNull - Return true if this QualType doesn't point to a type yet. 1204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isNull() const { 12148a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner return getTypePtr() == 0; 1224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isConstQualified() const { 12548a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner return (getCVRQualifiers() & Const) ? true : false; 1264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVolatileQualified() const { 12848a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner return (getCVRQualifiers() & Volatile) ? true : false; 1294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRestrictQualified() const { 13148a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner return (getCVRQualifiers() & Restrict) ? true : false; 1324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 133a7bbf567dac9dfd58f12c9ff14584d64104694f3Nuno Lopes 134a7bbf567dac9dfd58f12c9ff14584d64104694f3Nuno Lopes bool isConstant(ASTContext& Ctx) const; 1352e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner 1362e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner /// addConst/addVolatile/addRestrict - add the specified type qual to this 1372e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner /// QualType. 13848a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void addConst() { Value.setInt(Value.getInt() | Const); } 13948a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void addVolatile() { Value.setInt(Value.getInt() | Volatile); } 14048a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void addRestrict() { Value.setInt(Value.getInt() | Restrict); } 1414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 14248a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void removeConst() { Value.setInt(Value.getInt() & ~Const); } 14348a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void removeVolatile() { Value.setInt(Value.getInt() & ~Volatile); } 14448a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner void removeRestrict() { Value.setInt(Value.getInt() & ~Restrict); } 14593eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta 1464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getQualifiedType(unsigned TQs) const { 1474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return QualType(getTypePtr(), TQs); 1484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 149a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner QualType getWithAdditionalQualifiers(unsigned TQs) const { 150a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return QualType(getTypePtr(), TQs|getCVRQualifiers()); 151a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner } 1524b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis 1534b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis QualType withConst() const { return getWithAdditionalQualifiers(Const); } 1544b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis QualType withVolatile() const { return getWithAdditionalQualifiers(Volatile);} 1554b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis QualType withRestrict() const { return getWithAdditionalQualifiers(Restrict);} 1564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1573fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor QualType getUnqualifiedType() const; 1583fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor bool isMoreQualifiedThan(QualType Other) const; 1593fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor bool isAtLeastAsQualifiedAs(QualType Other) const; 1603fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor QualType getNonReferenceType() const; 1614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1626573cfd6fc32eab0b696cfc318bb21f4e3933f35Douglas Gregor 1634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// operator==/!= - Indicate whether the specified types and qualifiers are 1644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// identical. 1654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator==(const QualType &RHS) const { 16648a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner return Value == RHS.Value; 1674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator!=(const QualType &RHS) const { 16948a3432a72fd17868c0bf4d864ddb60420c63d68Chris Lattner return Value != RHS.Value; 1704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string getAsString() const { 1724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string S; 1734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getAsStringInternal(S); 1744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return S; 1754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void getAsStringInternal(std::string &Str) const; 1774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 178a55e321bd645398b514e246981c04a4889ee2472Chris Lattner void dump(const char *s) const; 179a55e321bd645398b514e246981c04a4889ee2472Chris Lattner void dump() const; 1809d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek 1819d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const { 1829d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek ID.AddPointer(getAsOpaquePtr()); 1839d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek } 1844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 185b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerpublic: 1864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1872a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// getAddressSpace - Return the address space of this type. 1882a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb inline unsigned getAddressSpace() const; 1892a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 190034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Emit - Serialize a QualType to Bitcode. 19178f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void Emit(llvm::Serializer& S) const; 19278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 193034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Read - Deserialize a QualType from Bitcode. 194034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static QualType ReadVal(llvm::Deserializer& D); 19564be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek 19664be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek void ReadBackpatch(llvm::Deserializer& D); 1974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 1984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end clang. 2004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace llvm { 2024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Implement simplify_type for QualType, so that we can dyn_cast from QualType 2034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// to a specific Type class. 2044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnertemplate<> struct simplify_type<const ::clang::QualType> { 2054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef ::clang::Type* SimpleType; 2064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static SimpleType getSimplifiedValue(const ::clang::QualType &Val) { 2074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return Val.getTypePtr(); 2084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 2094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 2104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnertemplate<> struct simplify_type< ::clang::QualType> 2114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : public simplify_type<const ::clang::QualType> {}; 21278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 21378f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek} // end namespace llvm 2144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace clang { 2164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Type - This is the base class of the type hierarchy. A central concept 2184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// with types is that each type always has a canonical type. A canonical type 2194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// is the type with any typedef names stripped out of it or the types it 2204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// references. For example, consider: 2214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// typedef int foo; 2234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// typedef foo* bar; 2244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int *' 'foo *' 'bar' 2254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// There will be a Type object created for 'int'. Since int is canonical, its 2274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// canonicaltype pointer points to itself. There is also a Type for 'foo' (a 2284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// TypeNameType). Its CanonicalType pointer points to the 'int' Type. Next 2294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// there is a PointerType that represents 'int*', which, like 'int', is 2304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 2314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// type is 'int*', and there is a TypeNameType for 'bar', whose canonical type 2324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// is also 'int*'. 2334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Non-canonical types are useful for emitting diagnostics, without losing 2354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// information about typedefs being used. Canonical types are useful for type 2364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// comparisons (they allow by-pointer equality tests) and useful for reasoning 2374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// about whether something has a particular form (e.g. is a function type), 2384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// because they implicitly, recursively, strip all typedefs out of a type. 2394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Types, once created, are immutable. 2414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass Type { 2434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 2444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TypeClass { 2457555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Builtin, Complex, Pointer, Reference, MemberPointer, 2461b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ConstantArray, VariableArray, IncompleteArray, DependentSizedArray, 247af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman Vector, ExtVector, 2484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionNoProto, FunctionProto, 2492a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb TypeName, Tagged, ASQual, 2508e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor TemplateTypeParm, ClassTemplateSpecialization, 25142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterface, ObjCQualifiedInterface, 25242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedId, 2537aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff TypeOfExp, TypeOfTyp, // GNU typeof extension. 254ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman BlockPointer, // C extension 255ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman FixedWidthInt 2564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 2574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 2584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType CanonicalType; 2594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2601b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// Dependent - Whether this type is a dependent type (C++ [temp.dep.type]). 2611b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor bool Dependent : 1; 2621b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 2634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 2644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Note that this should stay at the end of the ivars for Type so that 2654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// subclasses can pack their bitfields into the same word. 2662a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned TC : 5; 2671b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 2684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 2697c6f0c755e48a2782bc0a0a4cfc63dc84e0f11d5Hartmut Kaiser // silence VC++ warning C4355: 'this' : used in base member initializer list 2707c6f0c755e48a2782bc0a0a4cfc63dc84e0f11d5Hartmut Kaiser Type *this_() { return this; } 2711b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(TypeClass tc, QualType Canonical, bool dependent) 27235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical), 2731b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Dependent(dependent), TC(tc) {} 2741b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual ~Type() {} 275db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 2764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; 27778f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 27878f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void EmitTypeInternal(llvm::Serializer& S) const; 27978f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void ReadTypeInternal(llvm::Deserializer& D); 28078f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 2814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 28292803daaa6a40a3899c2e599bddc42732c2ce593Hartmut Kaiser TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); } 2834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isCanonical() const { return CanonicalType.getTypePtr() == this; } 2854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 2874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// object types, function types, and incomplete types. 2884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isObjectType - types that fully describe objects. An object is a region 2904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// of memory that can be examined and stored into (H&S). 2914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isObjectType() const; 2924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isIncompleteType - Return true if this is an incomplete type. 2944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// A type that can describe objects, but which lacks information needed to 2954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// determine its size (e.g. void, or a fwd declared struct). Clients of this 2964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// routine will need to determine if the size is actually required. 2974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIncompleteType() const; 2989db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner 2999db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner /// isIncompleteOrObjectType - Return true if this is an incomplete or object 3009db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner /// type, in other words, not a function type. 3019db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner bool isIncompleteOrObjectType() const { 3029db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner return !isFunctionType(); 3039db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner } 30439c0f6f69727c07a1b87605c54f14b86f8189194Sebastian Redl 30539c0f6f69727c07a1b87605c54f14b86f8189194Sebastian Redl /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10). 30639c0f6f69727c07a1b87605c54f14b86f8189194Sebastian Redl bool isPODType() const; 30739c0f6f69727c07a1b87605c54f14b86f8189194Sebastian Redl 3085eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff /// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array 3095eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff /// types that have a non-constant expression. This does not include "[]". 3105eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff bool isVariablyModifiedType() const; 3115eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff 3124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Helper methods to distinguish type categories. All type predicates 3132a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// operate on the canonical type, ignoring typedefs and qualifiers. 3148888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff 3158888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff /// isIntegerType() does *not* include complex integers (a GCC extension). 3168888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff /// isComplexIntegerType() can be used to test for complex integers. 3174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 3188d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isEnumeralType() const; 3198d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isBooleanType() const; 3208d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isCharType() const; 3211815b3bfc1382c88bee771bd158755b2426f0780Douglas Gregor bool isWideCharType() const; 322c81f316d260b8b8b9da21a0f9a22baa334e063fbFariborz Jahanian bool isIntegralType() const; 3234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Floating point categories. 3254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 3264300121ffff80d4b23d17689930e2aa2a83086b9Steve Naroff /// isComplexType() does *not* include complex integers (a GCC extension). 3274300121ffff80d4b23d17689930e2aa2a83086b9Steve Naroff /// isComplexIntegerType() can be used to test for complex integers. 3284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isComplexType() const; // C99 6.2.5p11 (complex) 3293277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 3304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 3314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 3324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 333e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isVoidType() const; // C99 6.2.5p19 334e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isDerivedType() const; // C99 6.2.5p20 335e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 336e7ef500151147ba851db502fc4d36319f863db80Douglas Gregor bool isAggregateType() const; 3374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 338e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner // Type Predicates: Check to see if this type is structurally the specified 3392a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb // type, ignoring typedefs and qualifiers. 340e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isFunctionType() const; 341cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner bool isPointerLikeType() const; // Pointer or Reference. 3427931f4a186bc76b21dd4629ee74d64264a7fb8a2Chris Lattner bool isPointerType() const; 3437aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff bool isBlockPointerType() const; 344f0c4a0a830c9154b1ae72e497c2ce586c10e9b71Chris Lattner bool isReferenceType() const; 345cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner bool isFunctionPointerType() const; 3467555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl bool isMemberPointerType() const; 3477555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl bool isMemberFunctionPointerType() const; 348e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isArrayType() const; 349a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner bool isConstantArrayType() const; 350a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner bool isIncompleteArrayType() const; 351a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner bool isVariableArrayType() const; 3521b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor bool isDependentSizedArrayType() const; 353e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isRecordType() const; 3542e78db3510b136b3f961af202e6a1a3df4839172Chris Lattner bool isClassType() const; 355e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isStructureType() const; 35636e35e652e28cbdffbeda8cc3362888357ec7173Steve Naroff bool isUnionType() const; 357b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isComplexIntegerType() const; // GCC _Complex integer type. 358b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isVectorType() const; // GCC vector type. 359af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman bool isExtVectorType() const; // Extended vector type. 360b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCInterfaceType() const; // NSString or NSString<foo> 361b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCQualifiedInterfaceType() const; // NSString<foo> 362b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCQualifiedIdType() const; // id<foo> 363dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor bool isTemplateTypeParmType() const; // C++ template type parameter 3641b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 3651b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// isDependentType - Whether this type is a dependent type, meaning 3661b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// that its definition somehow depends on a template parameter 3671b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// (C++ [temp.dep.type]). 3681b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor bool isDependentType() const { return Dependent; } 36945014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor bool isOverloadType() const; // C++ overloaded function 370dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 371e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner // Type Checking Functions: Check to see if this type is structurally the 37235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner // specified type, ignoring typedefs and qualifiers, and return a pointer to 37335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner // the best type we can. 3747555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const BuiltinType *getAsBuiltinType() const; 3757555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const FunctionType *getAsFunctionType() const; 3767555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const FunctionTypeProto *getAsFunctionTypeProto() const; 377cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner const PointerLikeType *getAsPointerLikeType() const; // Pointer or Reference. 3787931f4a186bc76b21dd4629ee74d64264a7fb8a2Chris Lattner const PointerType *getAsPointerType() const; 3797aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff const BlockPointerType *getAsBlockPointerType() const; 380f0c4a0a830c9154b1ae72e497c2ce586c10e9b71Chris Lattner const ReferenceType *getAsReferenceType() const; 3817555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const MemberPointerType *getAsMemberPointerType() const; 382e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const RecordType *getAsRecordType() const; 3835c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek const RecordType *getAsStructureType() const; 3841b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// NOTE: getAs*ArrayType are methods on ASTContext. 3855c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek const TypedefType *getAsTypedefType() const; 386e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const RecordType *getAsUnionType() const; 3870832dbca0e11ee020bbed181c515b3835158436eEli Friedman const EnumType *getAsEnumType() const; 388e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const VectorType *getAsVectorType() const; // GCC vector type. 3897a85fa1ba94c9f4cf960463dd3eb444ef6f89446Chris Lattner const ComplexType *getAsComplexType() const; 39036e35e652e28cbdffbeda8cc3362888357ec7173Steve Naroff const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 391af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman const ExtVectorType *getAsExtVectorType() const; // Extended vector type. 392b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCInterfaceType *getAsObjCInterfaceType() const; 393b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const; 394b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const; 395dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor const TemplateTypeParmType *getAsTemplateTypeParmType() const; 396dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 3978e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor const ClassTemplateSpecializationType * 3988e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor getClassTemplateSpecializationType() const; 3998e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 400f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner /// getAsPointerToObjCInterfaceType - If this is a pointer to an ObjC 401f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner /// interface, return the interface type, otherwise return null. 402f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner const ObjCInterfaceType *getAsPointerToObjCInterfaceType() const; 403f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner 404a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// getArrayElementTypeNoTypeQual - If this is an array type, return the 405a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// element type of the array, potentially with type qualifiers missing. 406a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// This method should never be used when type qualifiers are meaningful. 407a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner const Type *getArrayElementTypeNoTypeQual() const; 408a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner 4092afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// getDesugaredType - Return the specified type with any "sugar" removed from 4105c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek /// the type. This takes off typedefs, typeof's etc. If the outer level of 4112afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// the type is already concrete, it returns it unmodified. This is similar 4122afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// to getting the canonical type, but it doesn't remove *all* typedefs. For 4132ea769b494649b5ca4864acf154f2fedc7718029Chris Lattner /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 4142afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// concrete. 415a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner QualType getDesugaredType() const; 4162afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner 4174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// More type predicates useful for type checking/promotion 4184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isPromotableIntegerType() const; // C99 6.3.1.1p2 4194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isSignedIntegerType - Return true if this is an integer type that is 421bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 422bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// an enum decl which has a signed representation, or a vector of signed 423bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// integer element type. 4244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isSignedIntegerType() const; 4254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isUnsignedIntegerType - Return true if this is an integer type that is 427bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 428bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// decl which has an unsigned representation, or a vector of unsigned integer 429bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// element type. 4304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isUnsignedIntegerType() const; 431bbe686be29157b575e53fbed328613117b525f26Chris Lattner 4324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isConstantSizeType - Return true if this is not a variable sized type, 4330448b4f2fecceebc0bddd67fe0f2c89afe604fdfChris Lattner /// according to the rules of C99 6.7.5p3. It is not legal to call this on 4340448b4f2fecceebc0bddd67fe0f2c89afe604fdfChris Lattner /// incomplete types. 43562f67fd7f670f1a8b222c6565b257c05e8e80faeEli Friedman bool isConstantSizeType() const; 436a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner 4374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getCanonicalTypeInternal() const { return CanonicalType; } 438a55e321bd645398b514e246981c04a4889ee2472Chris Lattner void dump() const; 4394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const = 0; 4404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *) { return true; } 441034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 442034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 443034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Emit - Emit a Type to bitcode. Used by ASTContext. 444034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek void Emit(llvm::Serializer& S) const; 445034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 446034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Create - Construct a Type from bitcode. Used by ASTContext. 447034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static void Create(ASTContext& Context, unsigned i, llvm::Deserializer& S); 448034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 449034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// EmitImpl - Subclasses must implement this method in order to 450034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// be serialized. 4519c7fd1e1ad0ec0c483560c9a9daeda23c3772055Daniel Dunbar // FIXME: Make this abstract once implemented. 4529c7fd1e1ad0ec0c483560c9a9daeda23c3772055Daniel Dunbar virtual void EmitImpl(llvm::Serializer& S) const { 4539c7fd1e1ad0ec0c483560c9a9daeda23c3772055Daniel Dunbar assert (false && "Serializization for type not supported."); 4549c7fd1e1ad0ec0c483560c9a9daeda23c3772055Daniel Dunbar } 4554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4572a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// ASQualType - TR18037 (C embedded extensions) 6.2.5p26 4582a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// This supports address space qualified types. 4592a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// 4602a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambclass ASQualType : public Type, public llvm::FoldingSetNode { 46135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// BaseType - This is the underlying type that this qualifies. All CVR 46235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// qualifiers are stored on the QualType that references this type, so we 46335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// can't have any here. 46435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *BaseType; 4652a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// Address Space ID - The address space ID this type is qualified with. 4662a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddressSpace; 46735fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ASQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) : 4681b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(ASQual, CanonicalPtr, Base->isDependentType()), BaseType(Base), 4691b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor AddressSpace(AddrSpace) { 4702a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4712a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class ASTContext; // ASTContext creates these. 4722a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambpublic: 47335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *getBaseType() const { return BaseType; } 4742a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned getAddressSpace() const { return AddressSpace; } 4752a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4762a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void getAsStringInternal(std::string &InnerString) const; 4772a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4782a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb void Profile(llvm::FoldingSetNodeID &ID) { 4792a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb Profile(ID, getBaseType(), AddressSpace); 4802a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 48135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 4822a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddrSpace) { 48335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ID.AddPointer(Base); 4842a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb ID.AddInteger(AddrSpace); 4852a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4862a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4872a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static bool classof(const Type *T) { return T->getTypeClass() == ASQual; } 4882a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static bool classof(const ASQualType *) { return true; } 4892a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4902a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambprotected: 4912a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void EmitImpl(llvm::Serializer& S) const; 4922a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 4932a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class Type; 4942a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb}; 4952a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4962a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// BuiltinType - This class is used for builtin types like 'int'. Builtin 4984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types are always canonical and have a literal name field. 4994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass BuiltinType : public Type { 5004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum Kind { 5024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Void, 5034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Bool, // This is bool and/or _Bool. 5054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_U, // This is 'char' for targets where char is unsigned. 5064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UChar, // This is explicitly qualified unsigned char. 5074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UShort, 5084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UInt, 5094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULong, 5104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULongLong, 5114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_S, // This is 'char' for targets where char is signed. 5134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner SChar, // This is explicitly qualified signed char. 51485bd81edce4057156d7f49408147f07daa675096Argiris Kirtzidis WChar, // This is 'wchar_t' for C++. 5154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Short, 5164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Int, 5174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Long, 5184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner LongLong, 5194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 520d2baafd07bc5c7679a6f1f10e5587a95842ffa15Douglas Gregor Float, Double, LongDouble, 521d2baafd07bc5c7679a6f1f10e5587a95842ffa15Douglas Gregor 5221b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Overload, // This represents the type of an overloaded function declaration. 5231b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Dependent // This represents the type of a type-dependent expression. 5244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 5254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 5264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind TypeKind; 5274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5281b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor BuiltinType(Kind K) 5291b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent)), 5301b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TypeKind(K) {} 5314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind getKind() const { return TypeKind; } 5334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const char *getName() const; 5344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 5384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const BuiltinType *) { return true; } 5394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 541ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman/// FixedWidthIntType - Used for arbitrary width types that we either don't 542ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman/// want to or can't map to named integer types. These always have a lower 543ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman/// integer rank than builtin types of the same width. 544ff3fcdf47370a4577d971a2adefd259807152078Eli Friedmanclass FixedWidthIntType : public Type { 545ff3fcdf47370a4577d971a2adefd259807152078Eli Friedmanprivate: 546ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman unsigned Width; 547ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman bool Signed; 548ff3fcdf47370a4577d971a2adefd259807152078Eli Friedmanpublic: 549ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman FixedWidthIntType(unsigned W, bool S) : Type(FixedWidthInt, QualType(), false), 550ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman Width(W), Signed(S) {} 551ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 552ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman unsigned getWidth() const { return Width; } 553ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman bool isSigned() const { return Signed; } 554ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman const char *getName() const; 555ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 556ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman virtual void getAsStringInternal(std::string &InnerString) const; 557ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 558ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman static bool classof(const Type *T) { return T->getTypeClass() == FixedWidthInt; } 559ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman static bool classof(const FixedWidthIntType *) { return true; } 560ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman}; 561ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 5624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 5634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types (_Complex float etc) as well as the GCC integer complex extensions. 5644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 5654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ComplexType : public Type, public llvm::FoldingSetNode { 5664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 5674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ComplexType(QualType Element, QualType CanonicalPtr) : 5681b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(Complex, CanonicalPtr, Element->isDependentType()), 5691b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ElementType(Element) { 5704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 5744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 576034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 5774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType()); 5794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 5814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Element.getAsOpaquePtr()); 5824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 5854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ComplexType *) { return true; } 58678f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 587034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 588034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 589034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 590034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 5914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 593cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// PointerLikeType - Common base class for pointers and references. 5944fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// FIXME: Add more documentation on this classes design point. For example, 5954fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// should BlockPointerType inherit from it? Is the concept of a PointerLikeType 5964fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// in the C++ standard? 597cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// 598cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerLikeType : public Type { 599cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType PointeeType; 600cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerprotected: 601cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(TypeClass K, QualType Pointee, QualType CanonicalPtr) : 6021b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(K, CanonicalPtr, Pointee->isDependentType()), PointeeType(Pointee) { 603cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 604cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerpublic: 605cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 606cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType getPointeeType() const { return PointeeType; } 607cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 608cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const Type *T) { 609cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return T->getTypeClass() == Pointer || T->getTypeClass() == Reference; 610cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 611cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const PointerLikeType *) { return true; } 612cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner}; 6134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// PointerType - C99 6.7.5.1 - Pointer Declarators. 6154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 616cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerType : public PointerLikeType, public llvm::FoldingSetNode { 6174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner PointerType(QualType Pointee, QualType CanonicalPtr) : 618cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Pointer, Pointee, CanonicalPtr) { 6194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 6214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 6244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 6264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getPointeeType()); 6274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Pointee.getAsOpaquePtr()); 6304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 6334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const PointerType *) { return true; } 634034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 635034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 636034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 637034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 638034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 6394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 6404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6417aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// BlockPointerType - pointer to a block type. 6427aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// This type is to represent types syntactically represented as 6437aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// "void (^)(int)", etc. Pointee is required to always be a function type. 6444fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// FIXME: Should BlockPointerType inherit from PointerLikeType? It could 6454fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// simplfy some type checking code, however PointerLikeType doesn't appear 6464fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// to be used by the type checker. 6477aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// 6487aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroffclass BlockPointerType : public Type, public llvm::FoldingSetNode { 6497aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff QualType PointeeType; // Block is some kind of pointer type 6507aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff BlockPointerType(QualType Pointee, QualType CanonicalCls) : 6511b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(BlockPointer, CanonicalCls, Pointee->isDependentType()), 6521b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor PointeeType(Pointee) { 6537aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6547aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff friend class ASTContext; // ASTContext creates these. 6557aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroffpublic: 6567aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6577aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff // Get the pointee type. Pointee is required to always be a function type. 6587aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff QualType getPointeeType() const { return PointeeType; } 6597aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6607aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 6617aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6627aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff void Profile(llvm::FoldingSetNodeID &ID) { 6637aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff Profile(ID, getPointeeType()); 6647aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6657aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6667aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff ID.AddPointer(Pointee.getAsOpaquePtr()); 6677aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6687aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6697aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static bool classof(const Type *T) { 6707aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff return T->getTypeClass() == BlockPointer; 6717aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6727aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static bool classof(const BlockPointerType *) { return true; } 6737aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6747aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff protected: 6757aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff virtual void EmitImpl(llvm::Serializer& S) const; 6767aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6777aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff friend class Type; 6787aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff}; 6797aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ReferenceType - C++ 8.3.2 - Reference Declarators. 6814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 682cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass ReferenceType : public PointerLikeType, public llvm::FoldingSetNode { 6834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ReferenceType(QualType Referencee, QualType CanonicalRef) : 684cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Reference, Referencee, CanonicalRef) { 6854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 6874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 6894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 691cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner Profile(ID, getPointeeType()); 6924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 6944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Referencee.getAsOpaquePtr()); 6954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Reference; } 6984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ReferenceType *) { return true; } 6997555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7007555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlprotected: 7017555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl virtual void EmitImpl(llvm::Serializer& S) const; 7027555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7037555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl friend class Type; 7047555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl}; 7057555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7067555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl/// MemberPointerType - C++ 8.3.3 - Pointers to members 7077555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl/// 7087555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlclass MemberPointerType : public Type, public llvm::FoldingSetNode { 7097555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl QualType PointeeType; 7107555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl /// The class of which the pointee is a member. Must ultimately be a 7117555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl /// RecordType, but could be a typedef or a template parameter too. 7127555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const Type *Class; 7137555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7147555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) : 7157555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Type(MemberPointer, CanonicalPtr, 7167555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Cls->isDependentType() || Pointee->isDependentType()), 7177555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl PointeeType(Pointee), Class(Cls) { 7187555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7197555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl friend class ASTContext; // ASTContext creates these. 7207555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlpublic: 7217555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7227555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl QualType getPointeeType() const { return PointeeType; } 7237555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7247555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const Type *getClass() const { return Class; } 7257555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7267555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl virtual void getAsStringInternal(std::string &InnerString) const; 7277555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7287555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl void Profile(llvm::FoldingSetNodeID &ID) { 7297555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Profile(ID, getPointeeType(), getClass()); 7307555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7317555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 7327555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const Type *Class) { 7337555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl ID.AddPointer(Pointee.getAsOpaquePtr()); 7347555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl ID.AddPointer(Class); 7357555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7367555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7377555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static bool classof(const Type *T) { 7387555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return T->getTypeClass() == MemberPointer; 7397555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7407555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static bool classof(const MemberPointerType *) { return true; } 7417555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7427555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlprotected: 7437555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl virtual void EmitImpl(llvm::Serializer& S) const; 7447555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7457555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl friend class Type; 7464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 7474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ArrayType - C99 6.7.5.2 - Array Declarators. 7494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 750c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ArrayType : public Type, public llvm::FoldingSetNode { 7514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 7524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 7531b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// an array with a static size (e.g. int X[static 4]), or an array 7541b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// with a star size (e.g. int X[*]). 7551b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// 'static' is only allowed on function parameters. 7564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum ArraySizeModifier { 7574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Normal, Static, Star 7584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 7594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 76083c13010359c33354c581acee65d0c986a75247eSteve Naroff /// ElementType - The element type of the array. 76183c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType ElementType; 76224c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 763dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 76424c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// NOTE: These fields are packed into the bitfields space in the Type class. 765dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek unsigned SizeModifier : 2; 76624c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 76724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// IndexTypeQuals - Capture qualifiers in declarations like: 76824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// 'int X[static restrict 4]'. For function parameters only. 76924c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned IndexTypeQuals : 3; 77024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 77183c13010359c33354c581acee65d0c986a75247eSteve Naroffprotected: 7721b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // C++ [temp.dep.type]p1: 7731b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // A type is dependent if it is... 7741b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // - an array type constructed from any dependent type or whose 7751b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // size is specified by a constant expression that is 7761b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // value-dependent, 77724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArrayType(TypeClass tc, QualType et, QualType can, 77824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 7791b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, can, et->isDependentType() || tc == DependentSizedArray), 7801b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 7811b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 78283c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 78383c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 78483c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType getElementType() const { return ElementType; } 785dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek ArraySizeModifier getSizeModifier() const { 786dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek return ArraySizeModifier(SizeModifier); 787dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek } 78824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 78983c13010359c33354c581acee65d0c986a75247eSteve Naroff 79083c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 79183c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray || 7928ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman T->getTypeClass() == VariableArray || 7931b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor T->getTypeClass() == IncompleteArray || 7941b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor T->getTypeClass() == DependentSizedArray; 79583c13010359c33354c581acee65d0c986a75247eSteve Naroff } 79683c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ArrayType *) { return true; } 79783c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 79883c13010359c33354c581acee65d0c986a75247eSteve Naroff 79956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ConstantArrayType - This class represents C arrays with a specified constant 80056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[100]' has ConstantArrayType where the element type 80156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// is 'int' and the size is 100. 802c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ConstantArrayType : public ArrayType { 80383c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt Size; // Allows us to unique the type. 80483c13010359c33354c581acee65d0c986a75247eSteve Naroff 80524c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ConstantArrayType(QualType et, QualType can, llvm::APInt sz, 80624c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 80724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {} 80883c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 80983c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 810a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner const llvm::APInt &getSize() const { return Size; } 81183c13010359c33354c581acee65d0c986a75247eSteve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 81283c13010359c33354c581acee65d0c986a75247eSteve Naroff 81383c13010359c33354c581acee65d0c986a75247eSteve Naroff void Profile(llvm::FoldingSetNodeID &ID) { 81483c13010359c33354c581acee65d0c986a75247eSteve Naroff Profile(ID, getElementType(), getSize()); 81583c13010359c33354c581acee65d0c986a75247eSteve Naroff } 81683c13010359c33354c581acee65d0c986a75247eSteve Naroff static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 81783c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt ArraySize) { 81883c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddPointer(ET.getAsOpaquePtr()); 81983c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddInteger(ArraySize.getZExtValue()); 82083c13010359c33354c581acee65d0c986a75247eSteve Naroff } 82183c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 82283c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray; 82383c13010359c33354c581acee65d0c986a75247eSteve Naroff } 82483c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ConstantArrayType *) { return true; } 8254234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek 8264234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenekprotected: 8274234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 8284234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 8294234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek friend class Type; 83083c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 83183c13010359c33354c581acee65d0c986a75247eSteve Naroff 83256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// IncompleteArrayType - This class represents C arrays with an unspecified 83356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[]' has an IncompleteArrayType where the element 83456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// type is 'int' and the size is unspecified. 8358ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanclass IncompleteArrayType : public ArrayType { 8368ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman IncompleteArrayType(QualType et, QualType can, 8378ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ArraySizeModifier sm, unsigned tq) 8388ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman : ArrayType(IncompleteArray, et, can, sm, tq) {} 8398ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class ASTContext; // ASTContext creates these. 8408ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanpublic: 8418ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8428ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void getAsStringInternal(std::string &InnerString) const; 8438ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8448ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const Type *T) { 8458ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman return T->getTypeClass() == IncompleteArray; 8468ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 8478ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const IncompleteArrayType *) { return true; } 8488ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8498ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class StmtIteratorBase; 8508ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8518ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman void Profile(llvm::FoldingSetNodeID &ID) { 8528ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman Profile(ID, getElementType()); 8538ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 8548ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8558ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) { 8568ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ID.AddPointer(ET.getAsOpaquePtr()); 8578ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 8588ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8598ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanprotected: 8608ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void EmitImpl(llvm::Serializer& S) const; 8618ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 8628ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class Type; 8638ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman}; 8648ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 86556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// VariableArrayType - This class represents C arrays with a specified size 86656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 86756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Since the size expression is an arbitrary expression, we store it as such. 86856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 86956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 87056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// should not be: two lexically equivalent variable array types could mean 87156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// different things, for example, these variables do not have the same type 87256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// dynamically: 87356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 87456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// void foo(int x) { 87556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Y[x]; 87656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ++x; 87756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Z[x]; 87856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// } 87956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 880c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass VariableArrayType : public ArrayType { 88183c13010359c33354c581acee65d0c986a75247eSteve Naroff /// SizeExpr - An assignment expression. VLA's are only permitted within 88283c13010359c33354c581acee65d0c986a75247eSteve Naroff /// a function block. 883718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek Stmt *SizeExpr; 8844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 88524c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff VariableArrayType(QualType et, QualType can, Expr *e, 88624c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 887718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 8884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 889db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 890db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 8914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 892a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner Expr *getSizeExpr() const { 893718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // We use C-style casts instead of cast<> here because we do not wish 894718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // to have a dependency of Type.h on Stmt.h/Expr.h. 895718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek return (Expr*) SizeExpr; 896718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek } 8974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 8994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 90083c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 90183c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == VariableArray; 9024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 90383c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const VariableArrayType *) { return true; } 90427a32d6f18844a97446d6e2002bf181da591332aTed Kremenek 905fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek friend class StmtIteratorBase; 9063793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek 9073793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) { 9088ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman assert (0 && "Cannnot unique VariableArrayTypes."); 9093793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek } 9105cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek 9115cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenekprotected: 9125cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 9135cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 9145cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek friend class Type; 9154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9171b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// DependentSizedArrayType - This type represents an array type in 9181b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// C++ whose size is a value-dependent expression. For example: 9191b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// @code 9201b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// template<typename T, int Size> 9211b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// class array { 9221b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// T data[Size]; 9231b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// }; 9241b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// @endcode 9251b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// For these types, we won't actually know what the array bound is 9261b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// until template instantiation occurs, at which point this will 9271b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// become either a ConstantArrayType or a VariableArrayType. 9281b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorclass DependentSizedArrayType : public ArrayType { 9291b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// SizeExpr - An assignment expression that will instantiate to the 9301b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// size of the array. 9311b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Stmt *SizeExpr; 9321b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9331b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor DependentSizedArrayType(QualType et, QualType can, Expr *e, 9341b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ArraySizeModifier sm, unsigned tq) 9351b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : ArrayType(DependentSizedArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 9361b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor friend class ASTContext; // ASTContext creates these. 9371b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual void Destroy(ASTContext& C); 9381b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9391b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorpublic: 9401b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Expr *getSizeExpr() const { 9411b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // We use C-style casts instead of cast<> here because we do not wish 9421b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // to have a dependency of Type.h on Stmt.h/Expr.h. 9431b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return (Expr*) SizeExpr; 9441b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 9451b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9461b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual void getAsStringInternal(std::string &InnerString) const; 9471b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9481b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static bool classof(const Type *T) { 9491b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return T->getTypeClass() == DependentSizedArray; 9501b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 9511b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static bool classof(const DependentSizedArrayType *) { return true; } 9521b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9531b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor friend class StmtIteratorBase; 9541b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9551b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 9561b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor assert (0 && "Cannnot unique DependentSizedArrayTypes."); 9571b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 9581b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9591b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorprotected: 9601b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 9611b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 9621b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor friend class Type; 9631b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor}; 9641b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// VectorType - GCC generic vector type. This type is created using 9664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// __attribute__((vector_size(n)), where "n" specifies the vector size in 9674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// bytes. Since the constructor takes the number of vector elements, the 9684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// client is responsible for converting the size into the number of elements. 9694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass VectorType : public Type, public llvm::FoldingSetNode { 9704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 9714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ElementType - The element type of the vector. 9724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 9734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumElements - The number of elements in the vector. 9754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements; 9764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(QualType vecType, unsigned nElements, QualType canonType) : 9781b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(Vector, canonType, vecType->isDependentType()), 9791b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ElementType(vecType), NumElements(nElements) {} 9804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(TypeClass tc, QualType vecType, unsigned nElements, 9811486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman QualType canonType) 9821b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, canonType, vecType->isDependentType()), ElementType(vecType), 9831b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor NumElements(nElements) {} 9844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 9854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 9864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 9884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumElements() const { return NumElements; } 9894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 9934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType(), getNumElements(), getTypeClass()); 9944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 9964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements, TypeClass TypeClass) { 9974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ElementType.getAsOpaquePtr()); 9984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(NumElements); 9994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(TypeClass); 10004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 10014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 1002af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 10034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 10044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const VectorType *) { return true; } 10054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1007af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// ExtVectorType - Extended vector type. This type is created using 1008af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 1009af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 10106154214e20225a883a8a00226499534e9b514315Steve Naroff/// class enables syntactic extensions, like Vector Components for accessing 10116154214e20225a883a8a00226499534e9b514315Steve Naroff/// points, colors, and textures (modeled after OpenGL Shading Language). 1012af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemanclass ExtVectorType : public VectorType { 1013af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 1014af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman VectorType(ExtVector, vecType, nElements, canonType) {} 10154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 10164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 10179096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getPointAccessorIdx(char c) { 10189096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 10199096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 10209096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'x': return 0; 10219096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'y': return 1; 10229096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'z': return 2; 10239096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'w': return 3; 10249096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 10251b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 10261486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman static int getNumericAccessorIdx(char c) { 10279096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 10281486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman default: return -1; 10291486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '0': return 0; 10301486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '1': return 1; 10311486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '2': return 2; 10321486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '3': return 3; 10331486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '4': return 4; 10341486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '5': return 5; 10351486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '6': return 6; 10361486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '7': return 7; 10371486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '8': return 8; 10381486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '9': return 9; 10391486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'a': return 10; 10401486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'b': return 11; 10411486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'c': return 12; 10421486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'd': return 13; 10431486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'e': return 14; 10441486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'f': return 15; 10459096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 10461b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 104742158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 104842158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner static int getAccessorIdx(char c) { 104942158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getPointAccessorIdx(c)+1) return idx-1; 10501486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman return getNumericAccessorIdx(c); 105142158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner } 105242158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 10539096b795541c783297fb19684a58c54d0fe823b8Chris Lattner bool isAccessorWithinNumElements(char c) const { 105442158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getAccessorIdx(c)+1) 10559096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return unsigned(idx-1) < NumElements; 10569096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return false; 10571b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 1058c11705f9b742b542724dd56796bf90e07191e342Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 1059c11705f9b742b542724dd56796bf90e07191e342Steve Naroff 1060806b319509d01bffe47317f11140c930da800dbbSteve Naroff static bool classof(const Type *T) { 1061af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == ExtVector; 10624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1063af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman static bool classof(const ExtVectorType *) { return true; } 10644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 10674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// class of FunctionTypeNoProto and FunctionTypeProto. 10684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 10694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionType : public Type { 10704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// SubClassData - This field is owned by the subclass, put here to pack 10714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// tightly with the ivars in Type. 10724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool SubClassData : 1; 10734b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis 10744b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// TypeQuals - Used only by FunctionTypeProto, put here to pack with the 10754b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// other bitfields. 10764b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// The qualifiers are part of FunctionTypeProto because... 10774b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// 10784b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// C++ 8.3.5p4: The return type, the parameter type list and the 10794b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// cv-qualifier-seq, [...], are part of the function type. 10804b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// 10814b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis unsigned TypeQuals : 3; 10824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // The type returned by the function. 10844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ResultType; 10854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 10864b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis FunctionType(TypeClass tc, QualType res, bool SubclassInfo, 10871b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor unsigned typeQuals, QualType Canonical, bool Dependent) 10881b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, Canonical, Dependent), 10894b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis SubClassData(SubclassInfo), TypeQuals(typeQuals), ResultType(res) {} 10904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool getSubClassData() const { return SubClassData; } 10914b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis unsigned getTypeQuals() const { return TypeQuals; } 10924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 10934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getResultType() const { return ResultType; } 10954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 10984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto || 10994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T->getTypeClass() == FunctionProto; 11004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionType *) { return true; } 11024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 11034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has 11054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// no information available about its arguments. 11064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode { 11074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeNoProto(QualType Result, QualType Canonical) 11081b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : FunctionType(FunctionNoProto, Result, false, 0, Canonical, 1109f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman /*Dependent=*/false) {} 11104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 11114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 11124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // No additional state past what FunctionType provides. 11134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 11154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 11174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getResultType()); 11184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 11204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ResultType.getAsOpaquePtr()); 11214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 11244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto; 11254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeNoProto *) { return true; } 112787f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek 112887f0429f888ee5d332304641611b88f7b54b5065Ted Kremenekprotected: 112987f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 113087f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 113187f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek friend class Type; 11324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 11334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeProto - Represents a prototype with argument type info, e.g. 11354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 11364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// arguments, not as having a single void argument. 11374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { 11381b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// hasAnyDependentType - Determine whether there are any dependent 11391b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// types within the arguments passed in. 11401b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static bool hasAnyDependentType(const QualType *ArgArray, unsigned numArgs) { 11411b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor for (unsigned Idx = 0; Idx < numArgs; ++Idx) 11421b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor if (ArgArray[Idx]->isDependentType()) 1143f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman return true; 11441b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 11451b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return false; 11461b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 11471b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 114836104c1a2a18f1f78eba031e3a7a76d40416c4a7Eli Friedman FunctionTypeProto(QualType Result, const QualType *ArgArray, unsigned numArgs, 11494b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis bool isVariadic, unsigned typeQuals, QualType Canonical) 11501b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : FunctionType(FunctionProto, Result, isVariadic, typeQuals, Canonical, 1151f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman (Result->isDependentType() || 1152f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman hasAnyDependentType(ArgArray, numArgs))), 11534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumArgs(numArgs) { 11544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // Fill in the trailing argument array. 11554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 11564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner for (unsigned i = 0; i != numArgs; ++i) 11574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArgInfo[i] = ArgArray[i]; 11584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumArgs - The number of arguments this function has, not counting '...'. 11614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumArgs; 11624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArgInfo - There is an variable size array after the class in memory that 11644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// holds the argument types. 1165db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 11664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 1167db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 11684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 11694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumArgs() const { return NumArgs; } 11704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getArgType(unsigned i) const { 11714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(i < NumArgs && "Invalid argument number!"); 11724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return arg_type_begin()[i]; 11734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic() const { return getSubClassData(); } 11764b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); } 11774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef const QualType *arg_type_iterator; 11794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_begin() const { 11804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<const QualType *>(this+1); 11814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 11834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 11854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 11874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionProto; 11884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeProto *) { return true; } 11904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID); 11924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 11934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator ArgTys, unsigned NumArgs, 11944b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis bool isVariadic, unsigned TypeQuals); 1195034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 1196034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 1197034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 1198034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1199034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 12004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 12014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TypedefType : public Type { 12044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *Decl; 1205e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianprotected: 1206e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian TypedefType(TypeClass tc, TypedefDecl *D, QualType can) 12071b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, can, can->isDependentType()), Decl(D) { 12084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(!isa<TypedefType>(can) && "Invalid canonical type"); 12094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 12104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 12114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 12124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *getDecl() const { return Decl; } 12144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 1216a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor /// potentially looking through *all* consecutive typedefs. This returns the 12174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// sum of the type qualifiers, so if you have: 12184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef const int A; 12194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef volatile A B; 12204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// looking through the typedefs for B will give you "const volatile A". 12214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType LookThroughTypedefs() const; 12224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 12244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == TypeName; } 12264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TypedefType *) { return true; } 12272f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek 12282f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenekprotected: 12292f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 12302f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 12312f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek friend class Type; 12324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 12334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12347cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfExpr (GCC extension). 12357cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfExpr : public Type { 12367cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *TOExpr; 12371b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TypeOfExpr(Expr *E, QualType can); 12387cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 12397cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 12407cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *getUnderlyingExpr() const { return TOExpr; } 12417cbb14653934a298c09002b87704dc6531261771Steve Naroff 12427cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 12437cbb14653934a298c09002b87704dc6531261771Steve Naroff 12447cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExp; } 12457cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfExpr *) { return true; } 124671af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu 124771af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xuprotected: 124871af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu virtual void EmitImpl(llvm::Serializer& S) const; 124971af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 125071af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu friend class Type; 12517cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 12527cbb14653934a298c09002b87704dc6531261771Steve Naroff 12537cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfType (GCC extension). 12547cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfType : public Type { 12557cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType TOType; 12561b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TypeOfType(QualType T, QualType can) 12571b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(TypeOfTyp, can, T->isDependentType()), TOType(T) { 12587cbb14653934a298c09002b87704dc6531261771Steve Naroff assert(!isa<TypedefType>(can) && "Invalid canonical type"); 12597cbb14653934a298c09002b87704dc6531261771Steve Naroff } 12607cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 12617cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 12627cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType getUnderlyingType() const { return TOType; } 12637cbb14653934a298c09002b87704dc6531261771Steve Naroff 12647cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 12657cbb14653934a298c09002b87704dc6531261771Steve Naroff 12667cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfTyp; } 12677cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfType *) { return true; } 12680da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu 12690da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xuprotected: 12700da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu virtual void EmitImpl(llvm::Serializer& S) const; 12710da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 12720da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu friend class Type; 12737cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 12744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TagType : public Type { 127698b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// Stores the TagDecl associated with this type. The decl will 127798b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// point to the TagDecl that actually defines the entity (or is a 127898b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// definition in progress), if there is such a definition. The 127998b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// single-bit value will be non-zero when this tag is in the 128098b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// process of being defined. 128198b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor llvm::PointerIntPair<TagDecl *, 1> decl; 128246a837c7ced306c55d1686cea5f77cb7a2f3b908Ted Kremenek friend class ASTContext; 128398b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor friend class TagDecl; 12841d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 12851d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorprotected: 12861b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // FIXME: We'll need the user to pass in information about whether 12871b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // this type is dependent or not, because we don't have enough 12881b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // information to compute it here. 12891b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TagType(TagDecl *D, QualType can) 129098b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor : Type(Tagged, can, /*Dependent=*/false), decl(D, 0) {} 12911d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 12921d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorpublic: 129398b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor TagDecl *getDecl() const { return decl.getPointer(); } 12944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 129598b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// @brief Determines whether this type is in the process of being 129698b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// defined. 129798b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor bool isBeingDefined() const { return decl.getInt(); } 129898b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor void setBeingDefined(bool Def) { decl.setInt(Def? 1 : 0); } 129998b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor 13004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 13014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Tagged; } 13034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TagType *) { return true; } 13048db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek 13058db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenekprotected: 13068db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 130764be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 13088db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek friend class Type; 13094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 13104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13111baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 13121baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of structs/unions/classes. 13131baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass RecordType : public TagType { 1314ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidisprotected: 13153cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis explicit RecordType(RecordDecl *D) 13163cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { } 13171d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 13181baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 13191baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13201baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner RecordDecl *getDecl() const { 13211baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 13221baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 13231baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13241baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: This predicate is a helper to QualType/Type. It needs to 13251baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // recursively check all fields for const-ness. If any field is declared 13261baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // const, it needs to return false. 13271baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner bool hasConstFields() const { return false; } 13281baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13291baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: RecordType needs to check when it is created that all fields are in 13301baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // the same address space, and return that. 13311baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner unsigned getAddressSpace() const { return 0; } 13321baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1333eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1334eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1335eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1336eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 13371baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const RecordType *) { return true; } 13381baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 13391baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1340ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis/// CXXRecordType - This is a helper class that allows the use of 1341ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis/// isa/cast/dyncast to detect TagType objects of C++ structs/unions/classes. 1342ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidisclass CXXRecordType : public RecordType { 1343ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis explicit CXXRecordType(CXXRecordDecl *D) 1344ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis : RecordType(reinterpret_cast<RecordDecl*>(D)) { } 1345ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis friend class ASTContext; // ASTContext creates these. 1346ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidispublic: 1347ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 1348ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis CXXRecordDecl *getDecl() const { 1349ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis return reinterpret_cast<CXXRecordDecl*>(RecordType::getDecl()); 1350ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis } 1351ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 1352ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const TagType *T); 1353ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const Type *T) { 1354ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis return isa<TagType>(T) && classof(cast<TagType>(T)); 1355ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis } 1356ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const CXXRecordType *) { return true; } 1357ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis}; 1358ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 13591baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 13601baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of enums. 13611baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass EnumType : public TagType { 13623cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis explicit EnumType(EnumDecl *D) 13633cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { } 13641d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 13651baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 13661baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13671baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner EnumDecl *getDecl() const { 13681baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 13691baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 13701baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1371eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1372eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1373eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1374eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 13751baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const EnumType *) { return true; } 13761baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 13771baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1378a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregorclass TemplateTypeParmType : public Type, public llvm::FoldingSetNode { 1379a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned Depth : 16; 1380a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned Index : 16; 1381a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor IdentifierInfo *Name; 1382dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1383a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor TemplateTypeParmType(unsigned D, unsigned I, IdentifierInfo *N, 1384a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor QualType Canon) 1385a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor : Type(TemplateTypeParm, Canon, /*Dependent=*/true), 1386a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor Depth(D), Index(I), Name(N) { } 1387dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1388a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor TemplateTypeParmType(unsigned D, unsigned I) 1389a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true), 1390a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor Depth(D), Index(I), Name(0) { } 1391dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1392a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor friend class ASTContext; // ASTContext creates these 1393dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1394a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregorpublic: 1395a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned getDepth() const { return Depth; } 1396a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned getIndex() const { return Index; } 1397a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor IdentifierInfo *getName() const { return Name; } 1398a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 1399dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor virtual void getAsStringInternal(std::string &InnerString) const; 14001baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1401a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 1402a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor Profile(ID, Depth, Index, Name); 1403a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor } 1404a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 1405a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, 1406a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned Index, IdentifierInfo *Name) { 1407a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor ID.AddInteger(Depth); 1408a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor ID.AddInteger(Index); 1409a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor ID.AddPointer(Name); 1410a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor } 1411a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 1412dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor static bool classof(const Type *T) { 1413dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor return T->getTypeClass() == TemplateTypeParm; 1414dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor } 1415dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor static bool classof(const TemplateTypeParmType *T) { return true; } 1416dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1417dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregorprotected: 1418dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 1419dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1420dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor friend class Type; 1421dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor}; 1422a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 14238e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// \brief Represents the type of a class template specialization as 14248e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// written in the source code. 14258e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// 14268e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// Class template specialization types represent the syntactic form 14278e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// of a template-id that refers to a type, e.g., @c vector<int>. All 14288e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// class template specialization types are syntactic sugar, whose 14298e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// canonical type will point to some other type node that represents 14308e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// the instantiation or class template specialization. For example, a 14318e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// class template specialization type of @c vector<int> will refer to 14328e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// a tag type for the instantiation 14338e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// @c std::vector<int, std::allocator<int>>. 14348e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregorclass ClassTemplateSpecializationType 14358e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor : public Type, public llvm::FoldingSetNode { 14368e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14378e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // FIXME: Do we want templates to have a representation in the type 14388e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // system? It will probably help with dependent templates and 14398e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // possibly with template-names preceded by a nested-name-specifier. 14408e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor TemplateDecl *Template; 14418e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14428e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumArgs; 14438e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14448e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ClassTemplateSpecializationType(TemplateDecl *T, unsigned NumArgs, 14458e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t *Args, bool *ArgIsType, 14468e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor QualType Canon); 14478e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14488e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve the number of packed words that precede the 14498e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// actual arguments. 14508e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// 14518e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// The flags that specify whether each argument is a type or an 14528e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// expression are packed into the 14538e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// ClassTemplateSpecializationType. This routine computes the 14548e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// number of pointer-sized words we need to store this information, 14558e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// based on the number of template arguments 14568e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static unsigned getNumPackedWords(unsigned NumArgs) { 1457e3c19c3cce2d8bdbbb174eff1f887e80b964a18eDouglas Gregor const unsigned BitsPerWord = sizeof(uintptr_t) * 8; 14588e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return NumArgs / BitsPerWord + (NumArgs % BitsPerWord > 0); 14598e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 14608e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14618e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Pack the given boolean values into words. 14628e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static void 14638e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor packBooleanValues(unsigned NumArgs, bool *Values, uintptr_t *Words); 14648e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14656f37b58716e89420c13ac067fe605c3b6d5821d0Douglas Gregor virtual void Destroy(ASTContext& C); 14666f37b58716e89420c13ac067fe605c3b6d5821d0Douglas Gregor 14678e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor friend class ASTContext; // ASTContext creates these 14688e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14698e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregorpublic: 14708e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve the template that we are specializing. 14718e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor TemplateDecl *getTemplate() const { return Template; } 14728e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14738e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \briefe Retrieve the number of template arguments. 14748e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned getNumArgs() const { return NumArgs; } 14758e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14768e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve a specific template argument as a type. 14778e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \precondition @c isArgType(Arg) 14788e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor QualType getArgAsType(unsigned Arg) const { 14798e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor assert(isArgType(Arg) && "Argument is not a type"); 14808e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return QualType::getFromOpaquePtr( 14818e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor reinterpret_cast<void *>(getArgAsOpaqueValue(Arg))); 14828e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 14838e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14848e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve a specific template argument as an expression. 14858e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \precondition @c !isArgType(Arg) 14868e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor Expr *getArgAsExpr(unsigned Arg) const { 14878e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor assert(!isArgType(Arg) && "Argument is not an expression"); 14888e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return reinterpret_cast<Expr *>(getArgAsOpaqueValue(Arg)); 14898e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 14908e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14918e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve the specified template argument as an opaque value. 14928e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t getArgAsOpaqueValue(unsigned Arg) const; 14938e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14948e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Determine whether the given template argument is a type. 14958e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor bool isArgType(unsigned Arg) const; 14968e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14978e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor virtual void getAsStringInternal(std::string &InnerString) const; 14988e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14998e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 15008e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template 15018e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddPointer(Template); 15028e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15038e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the packed words describing what kind of template arguments 15048e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // we have. 15058e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t *Data = reinterpret_cast<uintptr_t *>(this + 1); 15068e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Packed = 0, NumPacked = getNumPackedWords(NumArgs); 15078e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor Packed != NumPacked; ++Packed) 15088e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(Data[Packed]); 15098e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15108e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template arguments themselves. 15118e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 15128e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(getArgAsOpaqueValue(Arg)); 15138e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 15148e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15158e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static void Profile(llvm::FoldingSetNodeID &ID, TemplateDecl *T, 15168e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumArgs, uintptr_t *Args, bool *ArgIsType) { 15178e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template 15188e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddPointer(T); 15198e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15208e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the packed words describing what kind of template arguments 15218e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // we have. 15228e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumPackedWords = getNumPackedWords(NumArgs); 15238e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumPackedBytes = NumPackedWords * sizeof(uintptr_t); 15248e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t *PackedWords 15258e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor = reinterpret_cast<uintptr_t *>(alloca(NumPackedBytes)); 15268e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor packBooleanValues(NumArgs, ArgIsType, PackedWords); 15278e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Packed = 0; Packed != NumPackedWords; ++Packed) 15288e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(PackedWords[Packed]); 15298e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15308e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template arguments themselves. 15318e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 15328e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(Args[Arg]); 15338e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 15348e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15358e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static bool classof(const Type *T) { 15368e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return T->getTypeClass() == ClassTemplateSpecialization; 15378e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 15388e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static bool classof(const ClassTemplateSpecializationType *T) { return true; } 15398e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15408e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregorprotected: 15418e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 15428e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 15438e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor friend class Type; 15448e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor}; 15458e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 1546f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 1547f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// object oriented design. They basically correspond to C++ classes. There 1548f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// are two kinds of interface types, normal interfaces like "NSString" and 1549f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// qualified interfaces, which are qualified with a protocol list like 1550f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// "NSString<NSCopyable, NSAmazing>". Qualified interface types are instances 1551f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType. 155242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCInterfaceType : public Type { 155342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *Decl; 15540c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanianprotected: 155542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) : 15561b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(tc, QualType(), /*Dependent=*/false), Decl(D) { } 155781f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff friend class ASTContext; // ASTContext creates these. 155881f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroffpublic: 155981f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 156042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *getDecl() const { return Decl; } 156181f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 1562f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// qual_iterator and friends: this provides access to the (potentially empty) 1563f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// list of protocols qualifying this interface. If this is an instance of 1564f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an 1565f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// empty list if there are no qualifying protocols. 1566f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1567f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_begin() const; 1568f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_end() const; 1569f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; } 1570f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1571f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// getNumProtocols - Return the number of qualifying protocols in this 1572f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// interface type, or 0 if there are none. 1573f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline unsigned getNumProtocols() const; 1574f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1575d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner /// getProtocol - Return the specified qualifying protocol. 1576d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner inline ObjCProtocolDecl *getProtocol(unsigned i) const; 157791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1578f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1579f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 158081f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff static bool classof(const Type *T) { 1581b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner return T->getTypeClass() == ObjCInterface || 1582b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner T->getTypeClass() == ObjCQualifiedInterface; 158381f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff } 158442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCInterfaceType *) { return true; } 158581f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff}; 158681f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 158742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek/// ObjCQualifiedInterfaceType - This class represents interface types 1588e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>. 1589e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1590c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// Duplicate protocols are removed and protocol list is canonicalized to be in 1591c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// alphabetical order. 159242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedInterfaceType : public ObjCInterfaceType, 15930c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian public llvm::FoldingSetNode { 15940c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian 1595c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List of protocols for this protocol conforming object type 1596c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 1597f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols; 1598c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 159942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D, 1600b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner ObjCProtocolDecl **Protos, unsigned NumP) : 160142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(ObjCQualifiedInterface, D), 1602d855a6ead44e3a875179400c472ac0b37df35f70Chris Lattner Protocols(Protos, Protos+NumP) { } 160391193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian friend class ASTContext; // ASTContext creates these. 1604c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanianpublic: 1605c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 1606d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner ObjCProtocolDecl *getProtocol(unsigned i) const { 160791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols[i]; 160891193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 160991193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian unsigned getNumProtocols() const { 161091193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols.size(); 161191193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 1612b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1613b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1614b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1615b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 161691193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 161791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 161891193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 161991193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian static void Profile(llvm::FoldingSetNodeID &ID, 1620fd5690fe6b5ea1c553dfe20f99d3fef269a50bd1Chris Lattner const ObjCInterfaceDecl *Decl, 162142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 162291193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1623c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian static bool classof(const Type *T) { 162442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedInterface; 1625c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian } 162642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedInterfaceType *) { return true; } 1627c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian}; 1628f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1629f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const { 1630f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1631f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1632f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_begin(); 1633f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1634f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1635f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const { 1636f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1637f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1638f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_end(); 1639f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1640f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1641f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1642f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// getNumProtocols - Return the number of qualifying protocols in this 1643f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// interface type, or 0 if there are none. 1644f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline unsigned ObjCInterfaceType::getNumProtocols() const { 1645f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1646f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1647f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->getNumProtocols(); 1648f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1649f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1650f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1651d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner/// getProtocol - Return the specified qualifying protocol. 1652d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattnerinline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { 1653d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i); 1654f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1655f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1656f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1657e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1658e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// ObjCQualifiedIdType - to represent id<protocol-list>. 1659e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1660e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// Duplicate protocols are removed and protocol list is canonicalized to be in 1661e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// alphabetical order. 166242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedIdType : public Type, 1663e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian public llvm::FoldingSetNode { 1664e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List of protocols for this protocol conforming 'id' type 1665e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 166642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1667e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 16684a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP) 16691b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(ObjCQualifiedId, QualType()/*these are always canonical*/, 1670f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman /*Dependent=*/false), 1671e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian Protocols(Protos, Protos+NumP) { } 1672e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian friend class ASTContext; // ASTContext creates these. 1673e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianpublic: 1674e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 167542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl *getProtocols(unsigned i) const { 1676e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols[i]; 1677e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 1678e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian unsigned getNumProtocols() const { 1679e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols.size(); 1680e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 168142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **getReferencedProtocols() { 1682957442db1d23f62ee2d0d71310bee240606b267dFariborz Jahanian return &Protocols[0]; 1683b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner } 1684b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1685b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1686b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1687b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1688e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1689e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 1690e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1691e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 16924a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, 169342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 1694e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1695e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian static bool classof(const Type *T) { 169642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedId; 1697e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 169842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedIdType *) { return true; } 1699e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1700e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian}; 1701c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 17024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1703b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner// Inline function definitions. 17044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 17052a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getUnqualifiedType - Return the type without any qualifiers. 17062a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline QualType QualType::getUnqualifiedType() const { 170735fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *TP = getTypePtr(); 170835fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(TP)) 170935fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner TP = ASQT->getBaseType(); 171035fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner return QualType(TP, 0); 17112a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 17122a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 17132a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getAddressSpace - Return the address space of this type. 17142a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline unsigned QualType::getAddressSpace() const { 171501ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner QualType CT = getTypePtr()->getCanonicalTypeInternal(); 171601ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 1717a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return AT->getElementType().getAddressSpace(); 171801ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(CT)) 1719efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman return RT->getAddressSpace(); 172001ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(CT)) 17212a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return ASQT->getAddressSpace(); 17222a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return 0; 17232a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 1724b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner 17253fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// isMoreQualifiedThan - Determine whether this type is more 17263fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// qualified than the Other type. For example, "const volatile int" 17273fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// is more qualified than "const int", "volatile int", and 17283fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// "int". However, it is not more qualified than "const volatile 17293fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int". 17303fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregorinline bool QualType::isMoreQualifiedThan(QualType Other) const { 17313fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor // FIXME: Handle address spaces 17323fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned MyQuals = this->getCVRQualifiers(); 17333fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned OtherQuals = Other.getCVRQualifiers(); 17344459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(this->getAddressSpace() == 0 && "Address space not checked"); 17354459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(Other.getAddressSpace() == 0 && "Address space not checked"); 17363fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals; 17373fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor} 17383fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor 17393fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// isAtLeastAsQualifiedAs - Determine whether this type is at last 17403fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// as qualified as the Other type. For example, "const volatile 17413fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int" is at least as qualified as "const int", "volatile int", 17423fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// "int", and "const volatile int". 17433fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregorinline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const { 17443fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor // FIXME: Handle address spaces 17453fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned MyQuals = this->getCVRQualifiers(); 17463fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned OtherQuals = Other.getCVRQualifiers(); 17474459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(this->getAddressSpace() == 0 && "Address space not checked"); 17484459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(Other.getAddressSpace() == 0 && "Address space not checked"); 17493fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return (MyQuals | OtherQuals) == MyQuals; 17503fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor} 17513fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor 17523fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// getNonReferenceType - If Type is a reference type (e.g., const 17533fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int&), returns the type that the reference refers to ("const 17543fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int"). Otherwise, returns the type itself. This routine is used 17553fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// throughout Sema to implement C++ 5p6: 17563fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// 17573fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// If an expression initially has the type "reference to T" (8.3.2, 17583fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// 8.5.3), the type is adjusted to "T" prior to any further 17593fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// analysis, the expression designates the object or function 17603fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// denoted by the reference, and the expression is an lvalue. 17613fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregorinline QualType QualType::getNonReferenceType() const { 17623fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor if (const ReferenceType *RefType = (*this)->getAsReferenceType()) 17633fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return RefType->getPointeeType(); 17643fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor else 17653fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return *this; 17663fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor} 17673fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor 17685c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenekinline const TypedefType* Type::getAsTypedefType() const { 17695c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek return dyn_cast<TypedefType>(this); 17705c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek} 1771f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattnerinline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const { 1772f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner if (const PointerType *PT = getAsPointerType()) 1773f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner return PT->getPointeeType()->getAsObjCInterfaceType(); 1774f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner return 0; 1775f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner} 1776f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner 1777a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner// NOTE: All of these methods use "getUnqualifiedType" to strip off address 1778a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner// space qualifiers if present. 1779b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isFunctionType() const { 17802a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<FunctionType>(CanonicalType.getUnqualifiedType()); 1781b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1782b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isPointerType() const { 17832a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<PointerType>(CanonicalType.getUnqualifiedType()); 1784b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 17857aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroffinline bool Type::isBlockPointerType() const { 17867aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff return isa<BlockPointerType>(CanonicalType); 17877aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff} 1788cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isReferenceType() const { 1789cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<ReferenceType>(CanonicalType.getUnqualifiedType()); 1790cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 1791cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isPointerLikeType() const { 1792cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<PointerLikeType>(CanonicalType.getUnqualifiedType()); 1793cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 179483b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenekinline bool Type::isFunctionPointerType() const { 179574a340749eb63af1ba7098c67f3ef72bd48f5ae8Ted Kremenek if (const PointerType* T = getAsPointerType()) 179683b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return T->getPointeeType()->isFunctionType(); 179783b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek else 179883b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return false; 179983b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek} 18007555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlinline bool Type::isMemberPointerType() const { 18017555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return isa<MemberPointerType>(CanonicalType.getUnqualifiedType()); 18027555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl} 18037555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlinline bool Type::isMemberFunctionPointerType() const { 18047555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl if (const MemberPointerType* T = getAsMemberPointerType()) 18057555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return T->getPointeeType()->isFunctionType(); 18067555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl else 18077555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return false; 18087555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl} 1809b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isArrayType() const { 18102a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<ArrayType>(CanonicalType.getUnqualifiedType()); 1811b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1812a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isConstantArrayType() const { 1813a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()); 1814a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1815a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isIncompleteArrayType() const { 1816a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()); 1817a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1818a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isVariableArrayType() const { 1819a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<VariableArrayType>(CanonicalType.getUnqualifiedType()); 1820a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 18211b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorinline bool Type::isDependentSizedArrayType() const { 18221b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return isa<DependentSizedArrayType>(CanonicalType.getUnqualifiedType()); 18231b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor} 1824b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isRecordType() const { 18252a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<RecordType>(CanonicalType.getUnqualifiedType()); 1826b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 18273277df47de6b65b55721726dc3f7b294e70ef6feChris Lattnerinline bool Type::isAnyComplexType() const { 1828a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ComplexType>(CanonicalType.getUnqualifiedType()); 18293277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner} 1830b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isVectorType() const { 18312a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<VectorType>(CanonicalType.getUnqualifiedType()); 1832b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1833af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemaninline bool Type::isExtVectorType() const { 1834af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return isa<ExtVectorType>(CanonicalType.getUnqualifiedType()); 1835b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 183642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCInterfaceType() const { 1837a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCInterfaceType>(CanonicalType.getUnqualifiedType()); 1838b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner} 1839b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerinline bool Type::isObjCQualifiedInterfaceType() const { 1840a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType()); 1841550e05034c6c8efcb7ab4c65f58048eee0892237Fariborz Jahanian} 184242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCQualifiedIdType() const { 1843a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType()); 1844dcb2b1e489948a570ee07ca65e12d42edffa20efFariborz Jahanian} 1845dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregorinline bool Type::isTemplateTypeParmType() const { 1846dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor return isa<TemplateTypeParmType>(CanonicalType.getUnqualifiedType()); 1847dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor} 1848dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 184945014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregorinline bool Type::isOverloadType() const { 185045014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor if (const BuiltinType *BT = getAsBuiltinType()) 185145014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor return BT->getKind() == BuiltinType::Overload; 185245014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor else 185345014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor return false; 185445014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor} 185545014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor 1856da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner/// Insertion operator for diagnostics. This allows sending QualType's into a 1857da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner/// diagnostic with <<. 1858da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattnerinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 1859da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner QualType T) { 1860da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 1861da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner Diagnostic::ak_qualtype); 1862da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner return DB; 1863da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner} 1864da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner 18654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end namespace clang 18664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 18674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#endif 1868