Type.h revision b60352aa80d17026f445267940db558ab9cfb92e
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, 249b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian TypeName, Tagged, ExtQual, 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 457b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian/// ExtQualType - TR18037 (C embedded extensions) 6.2.5p26 458b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian/// This supports all kinds of type attributes; including, 459b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian/// address space qualified types, objective-c's __weak and 460b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian/// __strong attributes. 4612a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// 462b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanianclass ExtQualType : public Type, public llvm::FoldingSetNode { 46335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// BaseType - This is the underlying type that this qualifies. All CVR 46435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// qualifiers are stored on the QualType that references this type, so we 46535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// can't have any here. 46635fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *BaseType; 4672a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// Address Space ID - The address space ID this type is qualified with. 4682a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddressSpace; 469b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian ExtQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) : 470b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian Type(ExtQual, CanonicalPtr, Base->isDependentType()), BaseType(Base), 4711b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor AddressSpace(AddrSpace) { 4722a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4732a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class ASTContext; // ASTContext creates these. 4742a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambpublic: 47535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *getBaseType() const { return BaseType; } 4762a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned getAddressSpace() const { return AddressSpace; } 4772a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4782a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void getAsStringInternal(std::string &InnerString) const; 4792a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4802a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb void Profile(llvm::FoldingSetNodeID &ID) { 4812a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb Profile(ID, getBaseType(), AddressSpace); 4822a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 48335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 4842a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddrSpace) { 48535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ID.AddPointer(Base); 4862a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb ID.AddInteger(AddrSpace); 4872a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4882a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 489b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian static bool classof(const Type *T) { return T->getTypeClass() == ExtQual; } 490b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian static bool classof(const ExtQualType *) { return true; } 4912a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4922a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambprotected: 4932a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void EmitImpl(llvm::Serializer& S) const; 4942a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 4952a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class Type; 4962a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb}; 4972a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4982a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// BuiltinType - This class is used for builtin types like 'int'. Builtin 5004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types are always canonical and have a literal name field. 5014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass BuiltinType : public Type { 5024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum Kind { 5044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Void, 5054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Bool, // This is bool and/or _Bool. 5074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_U, // This is 'char' for targets where char is unsigned. 5084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UChar, // This is explicitly qualified unsigned char. 5094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UShort, 5104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UInt, 5114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULong, 5124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULongLong, 5134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_S, // This is 'char' for targets where char is signed. 5154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner SChar, // This is explicitly qualified signed char. 51685bd81edce4057156d7f49408147f07daa675096Argiris Kirtzidis WChar, // This is 'wchar_t' for C++. 5174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Short, 5184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Int, 5194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Long, 5204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner LongLong, 5214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 522d2baafd07bc5c7679a6f1f10e5587a95842ffa15Douglas Gregor Float, Double, LongDouble, 523d2baafd07bc5c7679a6f1f10e5587a95842ffa15Douglas Gregor 5241b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Overload, // This represents the type of an overloaded function declaration. 5251b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Dependent // This represents the type of a type-dependent expression. 5264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 5274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 5284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind TypeKind; 5294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5301b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor BuiltinType(Kind K) 5311b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent)), 5321b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TypeKind(K) {} 5334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind getKind() const { return TypeKind; } 5354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const char *getName() const; 5364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 5404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const BuiltinType *) { return true; } 5414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 543ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman/// FixedWidthIntType - Used for arbitrary width types that we either don't 544ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman/// want to or can't map to named integer types. These always have a lower 545ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman/// integer rank than builtin types of the same width. 546ff3fcdf47370a4577d971a2adefd259807152078Eli Friedmanclass FixedWidthIntType : public Type { 547ff3fcdf47370a4577d971a2adefd259807152078Eli Friedmanprivate: 548ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman unsigned Width; 549ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman bool Signed; 550ff3fcdf47370a4577d971a2adefd259807152078Eli Friedmanpublic: 551ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman FixedWidthIntType(unsigned W, bool S) : Type(FixedWidthInt, QualType(), false), 552ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman Width(W), Signed(S) {} 553ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 554ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman unsigned getWidth() const { return Width; } 555ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman bool isSigned() const { return Signed; } 556ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman const char *getName() const; 557ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 558ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman virtual void getAsStringInternal(std::string &InnerString) const; 559ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 560ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman static bool classof(const Type *T) { return T->getTypeClass() == FixedWidthInt; } 561ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman static bool classof(const FixedWidthIntType *) { return true; } 562ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman}; 563ff3fcdf47370a4577d971a2adefd259807152078Eli Friedman 5644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 5654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types (_Complex float etc) as well as the GCC integer complex extensions. 5664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 5674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ComplexType : public Type, public llvm::FoldingSetNode { 5684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 5694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ComplexType(QualType Element, QualType CanonicalPtr) : 5701b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(Complex, CanonicalPtr, Element->isDependentType()), 5711b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ElementType(Element) { 5724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 5764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 578034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 5794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType()); 5814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 5834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Element.getAsOpaquePtr()); 5844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 5874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ComplexType *) { return true; } 58878f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 589034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 590034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 591034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 592034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 5934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 595cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// PointerLikeType - Common base class for pointers and references. 5964fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// FIXME: Add more documentation on this classes design point. For example, 5974fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// should BlockPointerType inherit from it? Is the concept of a PointerLikeType 5984fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// in the C++ standard? 599cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// 600cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerLikeType : public Type { 601cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType PointeeType; 602cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerprotected: 603cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(TypeClass K, QualType Pointee, QualType CanonicalPtr) : 6041b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(K, CanonicalPtr, Pointee->isDependentType()), PointeeType(Pointee) { 605cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 606cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerpublic: 607cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 608cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType getPointeeType() const { return PointeeType; } 609cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 610cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const Type *T) { 611cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return T->getTypeClass() == Pointer || T->getTypeClass() == Reference; 612cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 613cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const PointerLikeType *) { return true; } 614cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner}; 6154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// PointerType - C99 6.7.5.1 - Pointer Declarators. 6174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 618cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerType : public PointerLikeType, public llvm::FoldingSetNode { 6194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner PointerType(QualType Pointee, QualType CanonicalPtr) : 620cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Pointer, Pointee, CanonicalPtr) { 6214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 6234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 6264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 6284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getPointeeType()); 6294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Pointee.getAsOpaquePtr()); 6324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 6354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const PointerType *) { return true; } 636034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 637034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 638034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 639034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 640034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 6414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 6424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6437aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// BlockPointerType - pointer to a block type. 6447aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// This type is to represent types syntactically represented as 6457aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// "void (^)(int)", etc. Pointee is required to always be a function type. 6464fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// FIXME: Should BlockPointerType inherit from PointerLikeType? It could 6474fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// simplfy some type checking code, however PointerLikeType doesn't appear 6484fea7b688be1fd4fd3fd34ed70127c78904eaa91Steve Naroff/// to be used by the type checker. 6497aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff/// 6507aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroffclass BlockPointerType : public Type, public llvm::FoldingSetNode { 6517aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff QualType PointeeType; // Block is some kind of pointer type 6527aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff BlockPointerType(QualType Pointee, QualType CanonicalCls) : 6531b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(BlockPointer, CanonicalCls, Pointee->isDependentType()), 6541b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor PointeeType(Pointee) { 6557aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6567aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff friend class ASTContext; // ASTContext creates these. 6577aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroffpublic: 6587aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6597aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff // Get the pointee type. Pointee is required to always be a function type. 6607aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff QualType getPointeeType() const { return PointeeType; } 6617aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6627aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 6637aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6647aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff void Profile(llvm::FoldingSetNodeID &ID) { 6657aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff Profile(ID, getPointeeType()); 6667aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6677aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 6687aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff ID.AddPointer(Pointee.getAsOpaquePtr()); 6697aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6707aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6717aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static bool classof(const Type *T) { 6727aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff return T->getTypeClass() == BlockPointer; 6737aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff } 6747aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static bool classof(const BlockPointerType *) { return true; } 6757aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6767aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff protected: 6777aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff virtual void EmitImpl(llvm::Serializer& S) const; 6787aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6797aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff friend class Type; 6807aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff}; 6817aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff 6824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ReferenceType - C++ 8.3.2 - Reference Declarators. 6834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 684cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass ReferenceType : public PointerLikeType, public llvm::FoldingSetNode { 6854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ReferenceType(QualType Referencee, QualType CanonicalRef) : 686cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Reference, Referencee, CanonicalRef) { 6874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 6894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 6914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 693cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner Profile(ID, getPointeeType()); 6944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 6964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Referencee.getAsOpaquePtr()); 6974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Reference; } 7004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ReferenceType *) { return true; } 7017555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7027555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlprotected: 7037555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl virtual void EmitImpl(llvm::Serializer& S) const; 7047555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7057555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl friend class Type; 7067555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl}; 7077555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7087555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl/// MemberPointerType - C++ 8.3.3 - Pointers to members 7097555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl/// 7107555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlclass MemberPointerType : public Type, public llvm::FoldingSetNode { 7117555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl QualType PointeeType; 7127555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl /// The class of which the pointee is a member. Must ultimately be a 7137555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl /// RecordType, but could be a typedef or a template parameter too. 7147555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const Type *Class; 7157555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7167555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) : 7177555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Type(MemberPointer, CanonicalPtr, 7187555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Cls->isDependentType() || Pointee->isDependentType()), 7197555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl PointeeType(Pointee), Class(Cls) { 7207555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7217555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl friend class ASTContext; // ASTContext creates these. 7227555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlpublic: 7237555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7247555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl QualType getPointeeType() const { return PointeeType; } 7257555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7267555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const Type *getClass() const { return Class; } 7277555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7287555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl virtual void getAsStringInternal(std::string &InnerString) const; 7297555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7307555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl void Profile(llvm::FoldingSetNodeID &ID) { 7317555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl Profile(ID, getPointeeType(), getClass()); 7327555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7337555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee, 7347555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl const Type *Class) { 7357555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl ID.AddPointer(Pointee.getAsOpaquePtr()); 7367555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl ID.AddPointer(Class); 7377555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7387555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7397555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static bool classof(const Type *T) { 7407555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return T->getTypeClass() == MemberPointer; 7417555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl } 7427555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static bool classof(const MemberPointerType *) { return true; } 7437555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl 7447555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlprotected: 7457555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl virtual void EmitImpl(llvm::Serializer& S) const; 7467555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 7477555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl friend class Type; 7484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 7494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ArrayType - C99 6.7.5.2 - Array Declarators. 7514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 752c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ArrayType : public Type, public llvm::FoldingSetNode { 7534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 7544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 7551b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// an array with a static size (e.g. int X[static 4]), or an array 7561b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// with a star size (e.g. int X[*]). 7571b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// 'static' is only allowed on function parameters. 7584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum ArraySizeModifier { 7594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Normal, Static, Star 7604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 7614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 76283c13010359c33354c581acee65d0c986a75247eSteve Naroff /// ElementType - The element type of the array. 76383c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType ElementType; 76424c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 765dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 76624c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// NOTE: These fields are packed into the bitfields space in the Type class. 767dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek unsigned SizeModifier : 2; 76824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 76924c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// IndexTypeQuals - Capture qualifiers in declarations like: 77024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// 'int X[static restrict 4]'. For function parameters only. 77124c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned IndexTypeQuals : 3; 77224c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 77383c13010359c33354c581acee65d0c986a75247eSteve Naroffprotected: 7741b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // C++ [temp.dep.type]p1: 7751b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // A type is dependent if it is... 7761b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // - an array type constructed from any dependent type or whose 7771b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // size is specified by a constant expression that is 7781b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // value-dependent, 77924c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArrayType(TypeClass tc, QualType et, QualType can, 78024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 7811b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, can, et->isDependentType() || tc == DependentSizedArray), 7821b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 7831b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 78483c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 78583c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 78683c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType getElementType() const { return ElementType; } 787dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek ArraySizeModifier getSizeModifier() const { 788dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek return ArraySizeModifier(SizeModifier); 789dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek } 79024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 79183c13010359c33354c581acee65d0c986a75247eSteve Naroff 79283c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 79383c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray || 7948ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman T->getTypeClass() == VariableArray || 7951b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor T->getTypeClass() == IncompleteArray || 7961b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor T->getTypeClass() == DependentSizedArray; 79783c13010359c33354c581acee65d0c986a75247eSteve Naroff } 79883c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ArrayType *) { return true; } 79983c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 80083c13010359c33354c581acee65d0c986a75247eSteve Naroff 80156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ConstantArrayType - This class represents C arrays with a specified constant 80256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[100]' has ConstantArrayType where the element type 80356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// is 'int' and the size is 100. 804c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ConstantArrayType : public ArrayType { 80583c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt Size; // Allows us to unique the type. 80683c13010359c33354c581acee65d0c986a75247eSteve Naroff 80724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ConstantArrayType(QualType et, QualType can, llvm::APInt sz, 80824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 80924c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {} 81083c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 81183c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 812a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner const llvm::APInt &getSize() const { return Size; } 81383c13010359c33354c581acee65d0c986a75247eSteve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 81483c13010359c33354c581acee65d0c986a75247eSteve Naroff 81583c13010359c33354c581acee65d0c986a75247eSteve Naroff void Profile(llvm::FoldingSetNodeID &ID) { 81683c13010359c33354c581acee65d0c986a75247eSteve Naroff Profile(ID, getElementType(), getSize()); 81783c13010359c33354c581acee65d0c986a75247eSteve Naroff } 81883c13010359c33354c581acee65d0c986a75247eSteve Naroff static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 81983c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt ArraySize) { 82083c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddPointer(ET.getAsOpaquePtr()); 82183c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddInteger(ArraySize.getZExtValue()); 82283c13010359c33354c581acee65d0c986a75247eSteve Naroff } 82383c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 82483c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray; 82583c13010359c33354c581acee65d0c986a75247eSteve Naroff } 82683c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ConstantArrayType *) { return true; } 8274234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek 8284234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenekprotected: 8294234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 8304234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 8314234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek friend class Type; 83283c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 83383c13010359c33354c581acee65d0c986a75247eSteve Naroff 83456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// IncompleteArrayType - This class represents C arrays with an unspecified 83556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[]' has an IncompleteArrayType where the element 83656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// type is 'int' and the size is unspecified. 8378ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanclass IncompleteArrayType : public ArrayType { 8388ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman IncompleteArrayType(QualType et, QualType can, 8398ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ArraySizeModifier sm, unsigned tq) 8408ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman : ArrayType(IncompleteArray, et, can, sm, tq) {} 8418ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class ASTContext; // ASTContext creates these. 8428ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanpublic: 8438ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8448ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void getAsStringInternal(std::string &InnerString) const; 8458ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8468ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const Type *T) { 8478ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman return T->getTypeClass() == IncompleteArray; 8488ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 8498ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const IncompleteArrayType *) { return true; } 8508ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8518ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class StmtIteratorBase; 8528ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8538ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman void Profile(llvm::FoldingSetNodeID &ID) { 8548ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman Profile(ID, getElementType()); 8558ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 8568ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8578ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) { 8588ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ID.AddPointer(ET.getAsOpaquePtr()); 8598ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 8608ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 8618ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanprotected: 8628ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void EmitImpl(llvm::Serializer& S) const; 8638ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 8648ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class Type; 8658ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman}; 8668ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 86756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// VariableArrayType - This class represents C arrays with a specified size 86856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 86956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Since the size expression is an arbitrary expression, we store it as such. 87056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 87156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 87256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// should not be: two lexically equivalent variable array types could mean 87356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// different things, for example, these variables do not have the same type 87456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// dynamically: 87556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 87656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// void foo(int x) { 87756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Y[x]; 87856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ++x; 87956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Z[x]; 88056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// } 88156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 882c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass VariableArrayType : public ArrayType { 88383c13010359c33354c581acee65d0c986a75247eSteve Naroff /// SizeExpr - An assignment expression. VLA's are only permitted within 88483c13010359c33354c581acee65d0c986a75247eSteve Naroff /// a function block. 885718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek Stmt *SizeExpr; 8864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 88724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff VariableArrayType(QualType et, QualType can, Expr *e, 88824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 889718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 8904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 891db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 892db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 8934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 894a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner Expr *getSizeExpr() const { 895718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // We use C-style casts instead of cast<> here because we do not wish 896718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // to have a dependency of Type.h on Stmt.h/Expr.h. 897718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek return (Expr*) SizeExpr; 898718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek } 8994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 90283c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 90383c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == VariableArray; 9044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 90583c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const VariableArrayType *) { return true; } 90627a32d6f18844a97446d6e2002bf181da591332aTed Kremenek 907fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek friend class StmtIteratorBase; 9083793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek 9093793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) { 9108ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman assert (0 && "Cannnot unique VariableArrayTypes."); 9113793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek } 9125cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek 9135cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenekprotected: 9145cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 9155cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 9165cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek friend class Type; 9174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9191b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// DependentSizedArrayType - This type represents an array type in 9201b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// C++ whose size is a value-dependent expression. For example: 9211b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// @code 9221b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// template<typename T, int Size> 9231b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// class array { 9241b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// T data[Size]; 9251b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// }; 9261b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// @endcode 9271b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// For these types, we won't actually know what the array bound is 9281b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// until template instantiation occurs, at which point this will 9291b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor/// become either a ConstantArrayType or a VariableArrayType. 9301b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorclass DependentSizedArrayType : public ArrayType { 9311b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// SizeExpr - An assignment expression that will instantiate to the 9321b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// size of the array. 9331b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Stmt *SizeExpr; 9341b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9351b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor DependentSizedArrayType(QualType et, QualType can, Expr *e, 9361b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ArraySizeModifier sm, unsigned tq) 9371b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : ArrayType(DependentSizedArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 9381b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor friend class ASTContext; // ASTContext creates these. 9391b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual void Destroy(ASTContext& C); 9401b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9411b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorpublic: 9421b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Expr *getSizeExpr() const { 9431b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // We use C-style casts instead of cast<> here because we do not wish 9441b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // to have a dependency of Type.h on Stmt.h/Expr.h. 9451b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return (Expr*) SizeExpr; 9461b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 9471b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9481b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual void getAsStringInternal(std::string &InnerString) const; 9491b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9501b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static bool classof(const Type *T) { 9511b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return T->getTypeClass() == DependentSizedArray; 9521b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 9531b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static bool classof(const DependentSizedArrayType *) { return true; } 9541b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9551b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor friend class StmtIteratorBase; 9561b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9571b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 9581b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor assert (0 && "Cannnot unique DependentSizedArrayTypes."); 9591b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 9601b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9611b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorprotected: 9621b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 9631b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 9641b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor friend class Type; 9651b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor}; 9661b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 9674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// VectorType - GCC generic vector type. This type is created using 9684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// __attribute__((vector_size(n)), where "n" specifies the vector size in 9694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// bytes. Since the constructor takes the number of vector elements, the 9704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// client is responsible for converting the size into the number of elements. 9714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass VectorType : public Type, public llvm::FoldingSetNode { 9724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 9734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ElementType - The element type of the vector. 9744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 9754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumElements - The number of elements in the vector. 9774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements; 9784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(QualType vecType, unsigned nElements, QualType canonType) : 9801b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(Vector, canonType, vecType->isDependentType()), 9811b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor ElementType(vecType), NumElements(nElements) {} 9824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(TypeClass tc, QualType vecType, unsigned nElements, 9831486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman QualType canonType) 9841b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, canonType, vecType->isDependentType()), ElementType(vecType), 9851b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor NumElements(nElements) {} 9864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 9874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 9884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 9904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumElements() const { return NumElements; } 9914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 9954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType(), getNumElements(), getTypeClass()); 9964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 9984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements, TypeClass TypeClass) { 9994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ElementType.getAsOpaquePtr()); 10004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(NumElements); 10014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(TypeClass); 10024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 10034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 1004af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 10054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 10064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const VectorType *) { return true; } 10074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1009af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// ExtVectorType - Extended vector type. This type is created using 1010af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 1011af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 10126154214e20225a883a8a00226499534e9b514315Steve Naroff/// class enables syntactic extensions, like Vector Components for accessing 10136154214e20225a883a8a00226499534e9b514315Steve Naroff/// points, colors, and textures (modeled after OpenGL Shading Language). 1014af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemanclass ExtVectorType : public VectorType { 1015af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 1016af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman VectorType(ExtVector, vecType, nElements, canonType) {} 10174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 10184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 10199096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getPointAccessorIdx(char c) { 10209096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 10219096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 10229096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'x': return 0; 10239096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'y': return 1; 10249096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'z': return 2; 10259096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'w': return 3; 10269096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 10271b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 10281486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman static int getNumericAccessorIdx(char c) { 10299096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 10301486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman default: return -1; 10311486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '0': return 0; 10321486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '1': return 1; 10331486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '2': return 2; 10341486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '3': return 3; 10351486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '4': return 4; 10361486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '5': return 5; 10371486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '6': return 6; 10381486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '7': return 7; 10391486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '8': return 8; 10401486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case '9': return 9; 10411486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'a': return 10; 10421486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'b': return 11; 10431486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'c': return 12; 10441486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'd': return 13; 10451486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'e': return 14; 10461486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman case 'f': return 15; 10479096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 10481b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 104942158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 105042158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner static int getAccessorIdx(char c) { 105142158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getPointAccessorIdx(c)+1) return idx-1; 10521486b507eb8b13d3cc77b42a32395a811c5c962eNate Begeman return getNumericAccessorIdx(c); 105342158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner } 105442158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 10559096b795541c783297fb19684a58c54d0fe823b8Chris Lattner bool isAccessorWithinNumElements(char c) const { 105642158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getAccessorIdx(c)+1) 10579096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return unsigned(idx-1) < NumElements; 10589096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return false; 10591b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 1060c11705f9b742b542724dd56796bf90e07191e342Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 1061c11705f9b742b542724dd56796bf90e07191e342Steve Naroff 1062806b319509d01bffe47317f11140c930da800dbbSteve Naroff static bool classof(const Type *T) { 1063af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == ExtVector; 10644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1065af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman static bool classof(const ExtVectorType *) { return true; } 10664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 10694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// class of FunctionTypeNoProto and FunctionTypeProto. 10704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 10714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionType : public Type { 10724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// SubClassData - This field is owned by the subclass, put here to pack 10734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// tightly with the ivars in Type. 10744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool SubClassData : 1; 10754b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis 10764b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// TypeQuals - Used only by FunctionTypeProto, put here to pack with the 10774b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// other bitfields. 10784b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// The qualifiers are part of FunctionTypeProto because... 10794b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// 10804b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// C++ 8.3.5p4: The return type, the parameter type list and the 10814b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// cv-qualifier-seq, [...], are part of the function type. 10824b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis /// 10834b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis unsigned TypeQuals : 3; 10844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // The type returned by the function. 10864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ResultType; 10874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 10884b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis FunctionType(TypeClass tc, QualType res, bool SubclassInfo, 10891b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor unsigned typeQuals, QualType Canonical, bool Dependent) 10901b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, Canonical, Dependent), 10914b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis SubClassData(SubclassInfo), TypeQuals(typeQuals), ResultType(res) {} 10924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool getSubClassData() const { return SubClassData; } 10934b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis unsigned getTypeQuals() const { return TypeQuals; } 10944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 10954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getResultType() const { return ResultType; } 10974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 11004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto || 11014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T->getTypeClass() == FunctionProto; 11024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionType *) { return true; } 11044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 11054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has 11074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// no information available about its arguments. 11084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode { 11094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeNoProto(QualType Result, QualType Canonical) 11101b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : FunctionType(FunctionNoProto, Result, false, 0, Canonical, 1111f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman /*Dependent=*/false) {} 11124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 11134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 11144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // No additional state past what FunctionType provides. 11154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 11174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 11194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getResultType()); 11204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 11224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ResultType.getAsOpaquePtr()); 11234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 11264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto; 11274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeNoProto *) { return true; } 112987f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek 113087f0429f888ee5d332304641611b88f7b54b5065Ted Kremenekprotected: 113187f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 113287f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 113387f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek friend class Type; 11344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 11354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeProto - Represents a prototype with argument type info, e.g. 11374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 11384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// arguments, not as having a single void argument. 11394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { 11401b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// hasAnyDependentType - Determine whether there are any dependent 11411b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor /// types within the arguments passed in. 11421b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor static bool hasAnyDependentType(const QualType *ArgArray, unsigned numArgs) { 11431b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor for (unsigned Idx = 0; Idx < numArgs; ++Idx) 11441b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor if (ArgArray[Idx]->isDependentType()) 1145f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman return true; 11461b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 11471b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return false; 11481b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor } 11491b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor 115036104c1a2a18f1f78eba031e3a7a76d40416c4a7Eli Friedman FunctionTypeProto(QualType Result, const QualType *ArgArray, unsigned numArgs, 11514b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis bool isVariadic, unsigned typeQuals, QualType Canonical) 11521b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : FunctionType(FunctionProto, Result, isVariadic, typeQuals, Canonical, 1153f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman (Result->isDependentType() || 1154f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman hasAnyDependentType(ArgArray, numArgs))), 11554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumArgs(numArgs) { 11564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // Fill in the trailing argument array. 11574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 11584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner for (unsigned i = 0; i != numArgs; ++i) 11594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArgInfo[i] = ArgArray[i]; 11604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumArgs - The number of arguments this function has, not counting '...'. 11634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumArgs; 11644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArgInfo - There is an variable size array after the class in memory that 11664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// holds the argument types. 1167db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 11684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 1169db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 11704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 11714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumArgs() const { return NumArgs; } 11724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getArgType(unsigned i) const { 11734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(i < NumArgs && "Invalid argument number!"); 11744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return arg_type_begin()[i]; 11754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic() const { return getSubClassData(); } 11784b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); } 11794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef const QualType *arg_type_iterator; 11814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_begin() const { 11824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<const QualType *>(this+1); 11834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 11854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 11874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 11894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionProto; 11904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 11914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeProto *) { return true; } 11924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 11934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID); 11944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 11954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator ArgTys, unsigned NumArgs, 11964b269b4f8fe1509a5d9a92bc02b1b8b503fcd2fdArgiris Kirtzidis bool isVariadic, unsigned TypeQuals); 1197034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 1198034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 1199034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 1200034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 1201034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 12024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 12034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TypedefType : public Type { 12064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *Decl; 1207e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianprotected: 1208e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian TypedefType(TypeClass tc, TypedefDecl *D, QualType can) 12091b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(tc, can, can->isDependentType()), Decl(D) { 12104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(!isa<TypedefType>(can) && "Invalid canonical type"); 12114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 12124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 12134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 12144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *getDecl() const { return Decl; } 12164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 1218a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor /// potentially looking through *all* consecutive typedefs. This returns the 12194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// sum of the type qualifiers, so if you have: 12204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef const int A; 12214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef volatile A B; 12224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// looking through the typedefs for B will give you "const volatile A". 12234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType LookThroughTypedefs() const; 12244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 12264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == TypeName; } 12284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TypedefType *) { return true; } 12292f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek 12302f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenekprotected: 12312f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 12322f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 12332f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek friend class Type; 12344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 12354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12367cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfExpr (GCC extension). 12377cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfExpr : public Type { 12387cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *TOExpr; 12391b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TypeOfExpr(Expr *E, QualType can); 12407cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 12417cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 12427cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *getUnderlyingExpr() const { return TOExpr; } 12437cbb14653934a298c09002b87704dc6531261771Steve Naroff 12447cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 12457cbb14653934a298c09002b87704dc6531261771Steve Naroff 12467cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExp; } 12477cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfExpr *) { return true; } 124871af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu 124971af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xuprotected: 125071af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu virtual void EmitImpl(llvm::Serializer& S) const; 125171af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 125271af02f1cea2bcedacbff2a20d883bf2b8042eb0Zhongxing Xu friend class Type; 12537cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 12547cbb14653934a298c09002b87704dc6531261771Steve Naroff 12557cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfType (GCC extension). 12567cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfType : public Type { 12577cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType TOType; 12581b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TypeOfType(QualType T, QualType can) 12591b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(TypeOfTyp, can, T->isDependentType()), TOType(T) { 12607cbb14653934a298c09002b87704dc6531261771Steve Naroff assert(!isa<TypedefType>(can) && "Invalid canonical type"); 12617cbb14653934a298c09002b87704dc6531261771Steve Naroff } 12627cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 12637cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 12647cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType getUnderlyingType() const { return TOType; } 12657cbb14653934a298c09002b87704dc6531261771Steve Naroff 12667cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 12677cbb14653934a298c09002b87704dc6531261771Steve Naroff 12687cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfTyp; } 12697cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfType *) { return true; } 12700da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu 12710da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xuprotected: 12720da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu virtual void EmitImpl(llvm::Serializer& S) const; 12730da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 12740da0273153e4526863ce8d1e06f94c8957bd4341Zhongxing Xu friend class Type; 12757cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 12764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TagType : public Type { 127898b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// Stores the TagDecl associated with this type. The decl will 127998b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// point to the TagDecl that actually defines the entity (or is a 128098b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// definition in progress), if there is such a definition. The 128198b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// single-bit value will be non-zero when this tag is in the 128298b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// process of being defined. 128398b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor llvm::PointerIntPair<TagDecl *, 1> decl; 128446a837c7ced306c55d1686cea5f77cb7a2f3b908Ted Kremenek friend class ASTContext; 128598b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor friend class TagDecl; 12861d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 12871d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorprotected: 12881b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // FIXME: We'll need the user to pass in information about whether 12891b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // this type is dependent or not, because we don't have enough 12901b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor // information to compute it here. 12911b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor TagType(TagDecl *D, QualType can) 129298b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor : Type(Tagged, can, /*Dependent=*/false), decl(D, 0) {} 12931d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 12941d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorpublic: 129598b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor TagDecl *getDecl() const { return decl.getPointer(); } 12964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 129798b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// @brief Determines whether this type is in the process of being 129898b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor /// defined. 129998b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor bool isBeingDefined() const { return decl.getInt(); } 130098b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor void setBeingDefined(bool Def) { decl.setInt(Def? 1 : 0); } 130198b275417eab0af35ba0bf0d7dbd89253c710f3cDouglas Gregor 13024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 13034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Tagged; } 13054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TagType *) { return true; } 13068db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek 13078db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenekprotected: 13088db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 130964be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 13108db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek friend class Type; 13114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 13124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13131baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 13141baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of structs/unions/classes. 13151baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass RecordType : public TagType { 1316ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidisprotected: 13173cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis explicit RecordType(RecordDecl *D) 13183cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { } 13191d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 13201baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 13211baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13221baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner RecordDecl *getDecl() const { 13231baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 13241baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 13251baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13261baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: This predicate is a helper to QualType/Type. It needs to 13271baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // recursively check all fields for const-ness. If any field is declared 13281baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // const, it needs to return false. 13291baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner bool hasConstFields() const { return false; } 13301baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13311baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: RecordType needs to check when it is created that all fields are in 13321baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // the same address space, and return that. 13331baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner unsigned getAddressSpace() const { return 0; } 13341baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1335eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1336eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1337eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1338eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 13391baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const RecordType *) { return true; } 13401baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 13411baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1342ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis/// CXXRecordType - This is a helper class that allows the use of 1343ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis/// isa/cast/dyncast to detect TagType objects of C++ structs/unions/classes. 1344ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidisclass CXXRecordType : public RecordType { 1345ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis explicit CXXRecordType(CXXRecordDecl *D) 1346ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis : RecordType(reinterpret_cast<RecordDecl*>(D)) { } 1347ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis friend class ASTContext; // ASTContext creates these. 1348ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidispublic: 1349ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 1350ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis CXXRecordDecl *getDecl() const { 1351ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis return reinterpret_cast<CXXRecordDecl*>(RecordType::getDecl()); 1352ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis } 1353ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 1354ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const TagType *T); 1355ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const Type *T) { 1356ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis return isa<TagType>(T) && classof(cast<TagType>(T)); 1357ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis } 1358ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const CXXRecordType *) { return true; } 1359ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis}; 1360ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 13611baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 13621baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of enums. 13631baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass EnumType : public TagType { 13643cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis explicit EnumType(EnumDecl *D) 13653cbc064cf343c2151488b7822430ed327ade176eArgiris Kirtzidis : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { } 13661d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 13671baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 13681baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 13691baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner EnumDecl *getDecl() const { 13701baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 13711baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 13721baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1373eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1374eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1375eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1376eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 13771baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const EnumType *) { return true; } 13781baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 13791baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1380a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregorclass TemplateTypeParmType : public Type, public llvm::FoldingSetNode { 1381a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned Depth : 16; 1382a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned Index : 16; 1383a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor IdentifierInfo *Name; 1384dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1385a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor TemplateTypeParmType(unsigned D, unsigned I, IdentifierInfo *N, 1386a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor QualType Canon) 1387a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor : Type(TemplateTypeParm, Canon, /*Dependent=*/true), 1388a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor Depth(D), Index(I), Name(N) { } 1389dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1390a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor TemplateTypeParmType(unsigned D, unsigned I) 1391a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true), 1392a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor Depth(D), Index(I), Name(0) { } 1393dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1394a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor friend class ASTContext; // ASTContext creates these 1395dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1396a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregorpublic: 1397a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned getDepth() const { return Depth; } 1398a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned getIndex() const { return Index; } 1399a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor IdentifierInfo *getName() const { return Name; } 1400a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 1401dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor virtual void getAsStringInternal(std::string &InnerString) const; 14021baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1403a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 1404a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor Profile(ID, Depth, Index, Name); 1405a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor } 1406a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 1407a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor static void Profile(llvm::FoldingSetNodeID &ID, unsigned Depth, 1408a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor unsigned Index, IdentifierInfo *Name) { 1409a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor ID.AddInteger(Depth); 1410a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor ID.AddInteger(Index); 1411a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor ID.AddPointer(Name); 1412a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor } 1413a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 1414dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor static bool classof(const Type *T) { 1415dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor return T->getTypeClass() == TemplateTypeParm; 1416dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor } 1417dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor static bool classof(const TemplateTypeParmType *T) { return true; } 1418dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 1419dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregorprotected: 1420dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 1421dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 1422dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor friend class Type; 1423dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor}; 1424a491877807202cfb1812f6dcdbb7b992c41ca634Douglas Gregor 14258e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// \brief Represents the type of a class template specialization as 14268e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// written in the source code. 14278e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// 14288e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// Class template specialization types represent the syntactic form 14298e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// of a template-id that refers to a type, e.g., @c vector<int>. All 14308e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// class template specialization types are syntactic sugar, whose 14318e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// canonical type will point to some other type node that represents 14328e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// the instantiation or class template specialization. For example, a 14338e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// class template specialization type of @c vector<int> will refer to 14348e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// a tag type for the instantiation 14358e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor/// @c std::vector<int, std::allocator<int>>. 14368e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregorclass ClassTemplateSpecializationType 14378e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor : public Type, public llvm::FoldingSetNode { 14388e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14398e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // FIXME: Do we want templates to have a representation in the type 14408e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // system? It will probably help with dependent templates and 14418e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // possibly with template-names preceded by a nested-name-specifier. 14428e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor TemplateDecl *Template; 14438e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14448e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumArgs; 14458e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14468e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ClassTemplateSpecializationType(TemplateDecl *T, unsigned NumArgs, 14478e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t *Args, bool *ArgIsType, 14488e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor QualType Canon); 14498e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14508e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve the number of packed words that precede the 14518e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// actual arguments. 14528e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// 14538e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// The flags that specify whether each argument is a type or an 14548e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// expression are packed into the 14558e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// ClassTemplateSpecializationType. This routine computes the 14568e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// number of pointer-sized words we need to store this information, 14578e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// based on the number of template arguments 14588e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static unsigned getNumPackedWords(unsigned NumArgs) { 1459e3c19c3cce2d8bdbbb174eff1f887e80b964a18eDouglas Gregor const unsigned BitsPerWord = sizeof(uintptr_t) * 8; 14608e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return NumArgs / BitsPerWord + (NumArgs % BitsPerWord > 0); 14618e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 14628e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14638e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Pack the given boolean values into words. 14648e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static void 14658e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor packBooleanValues(unsigned NumArgs, bool *Values, uintptr_t *Words); 14668e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14676f37b58716e89420c13ac067fe605c3b6d5821d0Douglas Gregor virtual void Destroy(ASTContext& C); 14686f37b58716e89420c13ac067fe605c3b6d5821d0Douglas Gregor 14698e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor friend class ASTContext; // ASTContext creates these 14708e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14718e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregorpublic: 14728e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve the template that we are specializing. 14738e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor TemplateDecl *getTemplate() const { return Template; } 14748e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14758e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \briefe Retrieve the number of template arguments. 14768e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned getNumArgs() const { return NumArgs; } 14778e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14788e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve a specific template argument as a type. 14798e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \precondition @c isArgType(Arg) 14808e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor QualType getArgAsType(unsigned Arg) const { 14818e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor assert(isArgType(Arg) && "Argument is not a type"); 14828e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return QualType::getFromOpaquePtr( 14838e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor reinterpret_cast<void *>(getArgAsOpaqueValue(Arg))); 14848e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 14858e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14868e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve a specific template argument as an expression. 14878e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \precondition @c !isArgType(Arg) 14888e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor Expr *getArgAsExpr(unsigned Arg) const { 14898e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor assert(!isArgType(Arg) && "Argument is not an expression"); 14908e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return reinterpret_cast<Expr *>(getArgAsOpaqueValue(Arg)); 14918e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 14928e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14938e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Retrieve the specified template argument as an opaque value. 14948e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t getArgAsOpaqueValue(unsigned Arg) const; 14958e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14968e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor /// \brief Determine whether the given template argument is a type. 14978e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor bool isArgType(unsigned Arg) const; 14988e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 14998e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor virtual void getAsStringInternal(std::string &InnerString) const; 15008e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15018e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor void Profile(llvm::FoldingSetNodeID &ID) { 15028e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template 15038e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddPointer(Template); 15048e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15058e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the packed words describing what kind of template arguments 15068e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // we have. 1507ad964b3c41f4fc5fb7e19a0ce28b200e137bab84Douglas Gregor // FIXME: Would like to be smarter about the profile of expressions, 1508ad964b3c41f4fc5fb7e19a0ce28b200e137bab84Douglas Gregor // so that we can combine expression nodes more effectively. 15098e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t *Data = reinterpret_cast<uintptr_t *>(this + 1); 15108e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Packed = 0, NumPacked = getNumPackedWords(NumArgs); 15118e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor Packed != NumPacked; ++Packed) 15128e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(Data[Packed]); 15138e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15148e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template arguments themselves. 15158e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 15168e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(getArgAsOpaqueValue(Arg)); 15178e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 15188e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15198e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static void Profile(llvm::FoldingSetNodeID &ID, TemplateDecl *T, 15208e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumArgs, uintptr_t *Args, bool *ArgIsType) { 15218e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template 15228e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddPointer(T); 15238e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15248e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the packed words describing what kind of template arguments 15258e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // we have. 15268e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumPackedWords = getNumPackedWords(NumArgs); 15278e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor unsigned NumPackedBytes = NumPackedWords * sizeof(uintptr_t); 15288e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor uintptr_t *PackedWords 15298e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor = reinterpret_cast<uintptr_t *>(alloca(NumPackedBytes)); 15308e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor packBooleanValues(NumArgs, ArgIsType, PackedWords); 15318e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Packed = 0; Packed != NumPackedWords; ++Packed) 15328e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(PackedWords[Packed]); 15338e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15348e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor // Add the template arguments themselves. 15358e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 15368e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor ID.AddInteger(Args[Arg]); 15378e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 15388e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15398e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static bool classof(const Type *T) { 15408e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor return T->getTypeClass() == ClassTemplateSpecialization; 15418e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor } 15428e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static bool classof(const ClassTemplateSpecializationType *T) { return true; } 15438e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 15448e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregorprotected: 15458e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor virtual void EmitImpl(llvm::Serializer& S) const; 15468e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 15478e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor friend class Type; 15488e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor}; 15498e458f48f07276fe279a3d02e709e7ce15b2f9c3Douglas Gregor 1550f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 1551f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// object oriented design. They basically correspond to C++ classes. There 1552f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// are two kinds of interface types, normal interfaces like "NSString" and 1553f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// qualified interfaces, which are qualified with a protocol list like 1554f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// "NSString<NSCopyable, NSAmazing>". Qualified interface types are instances 1555f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType. 155642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCInterfaceType : public Type { 155742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *Decl; 15580c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanianprotected: 155942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) : 15601b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor Type(tc, QualType(), /*Dependent=*/false), Decl(D) { } 156181f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff friend class ASTContext; // ASTContext creates these. 156281f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroffpublic: 156381f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 156442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *getDecl() const { return Decl; } 156581f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 1566f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// qual_iterator and friends: this provides access to the (potentially empty) 1567f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// list of protocols qualifying this interface. If this is an instance of 1568f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an 1569f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// empty list if there are no qualifying protocols. 1570f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1571f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_begin() const; 1572f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_end() const; 1573f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; } 1574f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1575f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// getNumProtocols - Return the number of qualifying protocols in this 1576f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// interface type, or 0 if there are none. 1577f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline unsigned getNumProtocols() const; 1578f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1579d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner /// getProtocol - Return the specified qualifying protocol. 1580d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner inline ObjCProtocolDecl *getProtocol(unsigned i) const; 158191193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1582f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1583f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 158481f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff static bool classof(const Type *T) { 1585b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner return T->getTypeClass() == ObjCInterface || 1586b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner T->getTypeClass() == ObjCQualifiedInterface; 158781f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff } 158842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCInterfaceType *) { return true; } 158981f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff}; 159081f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 159142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek/// ObjCQualifiedInterfaceType - This class represents interface types 1592e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>. 1593e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1594c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// Duplicate protocols are removed and protocol list is canonicalized to be in 1595c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// alphabetical order. 159642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedInterfaceType : public ObjCInterfaceType, 15970c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian public llvm::FoldingSetNode { 15980c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian 1599c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List of protocols for this protocol conforming object type 1600c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 1601f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols; 1602c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 160342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D, 1604b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner ObjCProtocolDecl **Protos, unsigned NumP) : 160542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(ObjCQualifiedInterface, D), 1606d855a6ead44e3a875179400c472ac0b37df35f70Chris Lattner Protocols(Protos, Protos+NumP) { } 160791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian friend class ASTContext; // ASTContext creates these. 1608c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanianpublic: 1609c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 1610d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner ObjCProtocolDecl *getProtocol(unsigned i) const { 161191193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols[i]; 161291193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 161391193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian unsigned getNumProtocols() const { 161491193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols.size(); 161591193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 1616b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1617b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1618b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1619b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 162091193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 162191193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 162291193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 162391193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian static void Profile(llvm::FoldingSetNodeID &ID, 1624fd5690fe6b5ea1c553dfe20f99d3fef269a50bd1Chris Lattner const ObjCInterfaceDecl *Decl, 162542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 162691193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1627c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian static bool classof(const Type *T) { 162842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedInterface; 1629c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian } 163042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedInterfaceType *) { return true; } 1631c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian}; 1632f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1633f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const { 1634f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1635f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1636f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_begin(); 1637f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1638f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1639f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const { 1640f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1641f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1642f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_end(); 1643f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1644f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1645f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1646f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// getNumProtocols - Return the number of qualifying protocols in this 1647f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// interface type, or 0 if there are none. 1648f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline unsigned ObjCInterfaceType::getNumProtocols() const { 1649f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1650f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1651f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->getNumProtocols(); 1652f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1653f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1654f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1655d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner/// getProtocol - Return the specified qualifying protocol. 1656d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattnerinline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { 1657d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i); 1658f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1659f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1660f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1661e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1662e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// ObjCQualifiedIdType - to represent id<protocol-list>. 1663e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1664e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// Duplicate protocols are removed and protocol list is canonicalized to be in 1665e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// alphabetical order. 166642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedIdType : public Type, 1667e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian public llvm::FoldingSetNode { 1668e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List of protocols for this protocol conforming 'id' type 1669e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 167042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1671e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 16724a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP) 16731b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor : Type(ObjCQualifiedId, QualType()/*these are always canonical*/, 1674f1791b0a471cd61641eca7f4c0815cdce2f105eaNate Begeman /*Dependent=*/false), 1675e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian Protocols(Protos, Protos+NumP) { } 1676e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian friend class ASTContext; // ASTContext creates these. 1677e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianpublic: 1678e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 167942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl *getProtocols(unsigned i) const { 1680e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols[i]; 1681e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 1682e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian unsigned getNumProtocols() const { 1683e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols.size(); 1684e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 168542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **getReferencedProtocols() { 1686957442db1d23f62ee2d0d71310bee240606b267dFariborz Jahanian return &Protocols[0]; 1687b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner } 1688b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1689b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1690b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1691b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1692e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1693e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 1694e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1695e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 16964a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, 169742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 1698e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1699e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian static bool classof(const Type *T) { 170042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedId; 1701e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 170242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedIdType *) { return true; } 1703e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1704e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian}; 1705c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 17064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1707b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner// Inline function definitions. 17084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 17092a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getUnqualifiedType - Return the type without any qualifiers. 17102a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline QualType QualType::getUnqualifiedType() const { 171135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *TP = getTypePtr(); 1712b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(TP)) 1713b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian TP = EXTQT->getBaseType(); 171435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner return QualType(TP, 0); 17152a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 17162a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 17172a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getAddressSpace - Return the address space of this type. 17182a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline unsigned QualType::getAddressSpace() const { 171901ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner QualType CT = getTypePtr()->getCanonicalTypeInternal(); 172001ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 1721a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return AT->getElementType().getAddressSpace(); 172201ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(CT)) 1723efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman return RT->getAddressSpace(); 1724b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CT)) 1725b60352aa80d17026f445267940db558ab9cfb92eFariborz Jahanian return EXTQT->getAddressSpace(); 17262a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return 0; 17272a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 1728b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner 17293fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// isMoreQualifiedThan - Determine whether this type is more 17303fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// qualified than the Other type. For example, "const volatile int" 17313fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// is more qualified than "const int", "volatile int", and 17323fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// "int". However, it is not more qualified than "const volatile 17333fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int". 17343fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregorinline bool QualType::isMoreQualifiedThan(QualType Other) const { 17353fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor // FIXME: Handle address spaces 17363fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned MyQuals = this->getCVRQualifiers(); 17373fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned OtherQuals = Other.getCVRQualifiers(); 17384459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(this->getAddressSpace() == 0 && "Address space not checked"); 17394459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(Other.getAddressSpace() == 0 && "Address space not checked"); 17403fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals; 17413fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor} 17423fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor 17433fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// isAtLeastAsQualifiedAs - Determine whether this type is at last 17443fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// as qualified as the Other type. For example, "const volatile 17453fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int" is at least as qualified as "const int", "volatile int", 17463fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// "int", and "const volatile int". 17473fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregorinline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const { 17483fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor // FIXME: Handle address spaces 17493fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned MyQuals = this->getCVRQualifiers(); 17503fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor unsigned OtherQuals = Other.getCVRQualifiers(); 17514459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(this->getAddressSpace() == 0 && "Address space not checked"); 17524459bbe1ad110c100d74af8c74fdc82d87317dfeDouglas Gregor assert(Other.getAddressSpace() == 0 && "Address space not checked"); 17533fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return (MyQuals | OtherQuals) == MyQuals; 17543fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor} 17553fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor 17563fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// getNonReferenceType - If Type is a reference type (e.g., const 17573fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int&), returns the type that the reference refers to ("const 17583fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// int"). Otherwise, returns the type itself. This routine is used 17593fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// throughout Sema to implement C++ 5p6: 17603fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// 17613fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// If an expression initially has the type "reference to T" (8.3.2, 17623fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// 8.5.3), the type is adjusted to "T" prior to any further 17633fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// analysis, the expression designates the object or function 17643fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor/// denoted by the reference, and the expression is an lvalue. 17653fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregorinline QualType QualType::getNonReferenceType() const { 17663fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor if (const ReferenceType *RefType = (*this)->getAsReferenceType()) 17673fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return RefType->getPointeeType(); 17683fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor else 17693fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor return *this; 17703fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor} 17713fb675ab045253ffe2f1b333e9f8e746b50abeb4Douglas Gregor 17725c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenekinline const TypedefType* Type::getAsTypedefType() const { 17735c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek return dyn_cast<TypedefType>(this); 17745c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek} 1775f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattnerinline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const { 1776f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner if (const PointerType *PT = getAsPointerType()) 1777f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner return PT->getPointeeType()->getAsObjCInterfaceType(); 1778f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner return 0; 1779f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner} 1780f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner 1781a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner// NOTE: All of these methods use "getUnqualifiedType" to strip off address 1782a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner// space qualifiers if present. 1783b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isFunctionType() const { 17842a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<FunctionType>(CanonicalType.getUnqualifiedType()); 1785b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1786b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isPointerType() const { 17872a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<PointerType>(CanonicalType.getUnqualifiedType()); 1788b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 17897aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroffinline bool Type::isBlockPointerType() const { 17907aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff return isa<BlockPointerType>(CanonicalType); 17917aa5475ca2f62df5ba3f3b647ee141a40bf48fd3Steve Naroff} 1792cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isReferenceType() const { 1793cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<ReferenceType>(CanonicalType.getUnqualifiedType()); 1794cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 1795cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isPointerLikeType() const { 1796cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<PointerLikeType>(CanonicalType.getUnqualifiedType()); 1797cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 179883b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenekinline bool Type::isFunctionPointerType() const { 179974a340749eb63af1ba7098c67f3ef72bd48f5ae8Ted Kremenek if (const PointerType* T = getAsPointerType()) 180083b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return T->getPointeeType()->isFunctionType(); 180183b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek else 180283b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return false; 180383b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek} 18047555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlinline bool Type::isMemberPointerType() const { 18057555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return isa<MemberPointerType>(CanonicalType.getUnqualifiedType()); 18067555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl} 18077555503bb5f08651638f269c44c15bb425d10c5eSebastian Redlinline bool Type::isMemberFunctionPointerType() const { 18087555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl if (const MemberPointerType* T = getAsMemberPointerType()) 18097555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return T->getPointeeType()->isFunctionType(); 18107555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl else 18117555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl return false; 18127555503bb5f08651638f269c44c15bb425d10c5eSebastian Redl} 1813b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isArrayType() const { 18142a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<ArrayType>(CanonicalType.getUnqualifiedType()); 1815b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1816a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isConstantArrayType() const { 1817a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()); 1818a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1819a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isIncompleteArrayType() const { 1820a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()); 1821a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1822a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isVariableArrayType() const { 1823a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<VariableArrayType>(CanonicalType.getUnqualifiedType()); 1824a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 18251b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregorinline bool Type::isDependentSizedArrayType() const { 18261b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor return isa<DependentSizedArrayType>(CanonicalType.getUnqualifiedType()); 18271b21c7ffe5fac1711fea35e4830159004a835c1aDouglas Gregor} 1828b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isRecordType() const { 18292a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<RecordType>(CanonicalType.getUnqualifiedType()); 1830b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 18313277df47de6b65b55721726dc3f7b294e70ef6feChris Lattnerinline bool Type::isAnyComplexType() const { 1832a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ComplexType>(CanonicalType.getUnqualifiedType()); 18333277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner} 1834b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isVectorType() const { 18352a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<VectorType>(CanonicalType.getUnqualifiedType()); 1836b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1837af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemaninline bool Type::isExtVectorType() const { 1838af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return isa<ExtVectorType>(CanonicalType.getUnqualifiedType()); 1839b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 184042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCInterfaceType() const { 1841a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCInterfaceType>(CanonicalType.getUnqualifiedType()); 1842b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner} 1843b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerinline bool Type::isObjCQualifiedInterfaceType() const { 1844a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType()); 1845550e05034c6c8efcb7ab4c65f58048eee0892237Fariborz Jahanian} 184642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCQualifiedIdType() const { 1847a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType()); 1848dcb2b1e489948a570ee07ca65e12d42edffa20efFariborz Jahanian} 1849dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregorinline bool Type::isTemplateTypeParmType() const { 1850dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor return isa<TemplateTypeParmType>(CanonicalType.getUnqualifiedType()); 1851dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor} 1852dd861060e2e1f1e41f7b023d025fcd8eb183686dDouglas Gregor 185345014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregorinline bool Type::isOverloadType() const { 185445014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor if (const BuiltinType *BT = getAsBuiltinType()) 185545014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor return BT->getKind() == BuiltinType::Overload; 185645014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor else 185745014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor return false; 185845014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor} 185945014fd2d7e50079dc092df04fec9af7ea0cb0e0Douglas Gregor 1860da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner/// Insertion operator for diagnostics. This allows sending QualType's into a 1861da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner/// diagnostic with <<. 1862da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattnerinline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, 1863da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner QualType T) { 1864da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()), 1865da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner Diagnostic::ak_qualtype); 1866da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner return DB; 1867da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner} 1868da5c087ebf3d47b40bae2e99671ce1929156a427Chris Lattner 18694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end namespace clang 18704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 18714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#endif 1872