Type.h revision 85bd81edce4057156d7f49408147f07daa675096
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 174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#include "llvm/Support/Casting.h" 184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#include "llvm/ADT/FoldingSet.h" 1983c13010359c33354c581acee65d0c986a75247eSteve Naroff#include "llvm/ADT/APSInt.h" 2078f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek#include "llvm/Bitcode/SerializationFwd.h" 214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::isa; 234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::cast; 244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::cast_or_null; 254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::dyn_cast; 264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::dyn_cast_or_null; 274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace clang { 294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ASTContext; 304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Type; 314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class TypedefDecl; 324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class TagDecl; 334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class RecordDecl; 34ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis class CXXRecordDecl; 354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class EnumDecl; 3664be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek class FieldDecl; 3742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCInterfaceDecl; 3842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCProtocolDecl; 3942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCMethodDecl; 404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Expr; 41718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek class Stmt; 424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class SourceLocation; 43cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner class PointerLikeType; 444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class PointerType; 454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ReferenceType; 464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class VectorType; 474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ArrayType; 485eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff class ConstantArrayType; 495eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff class VariableArrayType; 508ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman class IncompleteArrayType; 512cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff class RecordType; 520832dbca0e11ee020bbed181c515b3835158436eEli Friedman class EnumType; 537a85fa1ba94c9f4cf960463dd3eb444ef6f89446Chris Lattner class ComplexType; 54806b319509d01bffe47317f11140c930da800dbbSteve Naroff class TagType; 555c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek class TypedefType; 56806b319509d01bffe47317f11140c930da800dbbSteve Naroff class FunctionType; 57d5a56aae166344e13f1f8c845530beee0868db49Chris Lattner class FunctionTypeProto; 58af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman class ExtVectorType; 59c33c060e2f4e7c7e89e3b809f52cfc6d55ea9838Steve Naroff class BuiltinType; 60b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner class ObjCInterfaceType; 61b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner class ObjCQualifiedIdType; 6242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCQualifiedInterfaceType; 63fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek class StmtIteratorBase; 644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// QualType - For efficiency, we don't store CVR-qualified types as nodes on 664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// their own: instead each reference to a type stores the qualifiers. This 674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// greatly reduces the number of nodes we need to allocate for types (for 684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// example we only need one for 'int', 'const int', 'volatile int', 694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'const volatile int', etc). 704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// As an added efficiency bonus, instead of making this a pair, we just store 724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// the three bits we care about in the low bits of the pointer. To handle the 734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// packing/unpacking, we make QualType be a simple wrapper class that acts like 744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// a smart pointer. 754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass QualType { 764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner uintptr_t ThePtr; 774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Const = 0x1, 804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Restrict = 0x2, 814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Volatile = 0x4, 824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner CVRFlags = Const|Restrict|Volatile 834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType() : ThePtr(0) {} 864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType(Type *Ptr, unsigned Quals) { 884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert((Quals & ~CVRFlags) == 0 && "Invalid type qualifiers!"); 894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ThePtr = reinterpret_cast<uintptr_t>(Ptr); 904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert((ThePtr & CVRFlags) == 0 && "Type pointer not 8-byte aligned?"); 914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ThePtr |= Quals; 924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static QualType getFromOpaquePtr(void *Ptr) { 954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType T; 964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T.ThePtr = reinterpret_cast<uintptr_t>(Ptr); 974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T; 984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10035fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner unsigned getCVRQualifiers() const { 1014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr & CVRFlags; 1024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type *getTypePtr() const { 1044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<Type*>(ThePtr & ~CVRFlags); 1054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void *getAsOpaquePtr() const { 1084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<void*>(ThePtr); 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 { 1214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr == 0; 1224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isConstQualified() const { 125c75ccff9e318638cac63fe392f68893ab4177f45Chris Lattner return (ThePtr & Const) ? true : false; 1264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVolatileQualified() const { 128c75ccff9e318638cac63fe392f68893ab4177f45Chris Lattner return (ThePtr & Volatile) ? true : false; 1294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRestrictQualified() const { 131c75ccff9e318638cac63fe392f68893ab4177f45Chris Lattner return (ThePtr & Restrict) ? true : false; 1324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1332e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner 1342e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner /// addConst/addVolatile/addRestrict - add the specified type qual to this 1352e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner /// QualType. 1362e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner void addConst() { ThePtr |= Const; } 1372e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner void addVolatile() { ThePtr |= Volatile; } 1382e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner void addRestrict() { ThePtr |= Restrict; } 1394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 14093eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta void removeConst() { ThePtr &= ~Const; } 14193eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta void removeVolatile() { ThePtr &= ~Volatile; } 14293eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta void removeRestrict() { ThePtr &= ~Restrict; } 14393eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta 1444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getQualifiedType(unsigned TQs) const { 1454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return QualType(getTypePtr(), TQs); 1464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 147a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner QualType getWithAdditionalQualifiers(unsigned TQs) const { 148a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return QualType(getTypePtr(), TQs|getCVRQualifiers()); 149a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner } 1504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1512a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb inline QualType getUnqualifiedType() const; 1524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// operator==/!= - Indicate whether the specified types and qualifiers are 1544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// identical. 1554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator==(const QualType &RHS) const { 1564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr == RHS.ThePtr; 1574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator!=(const QualType &RHS) const { 1594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr != RHS.ThePtr; 1604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string getAsString() const { 1624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string S; 1634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getAsStringInternal(S); 1644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return S; 1654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void getAsStringInternal(std::string &Str) const; 1674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 168a55e321bd645398b514e246981c04a4889ee2472Chris Lattner void dump(const char *s) const; 169a55e321bd645398b514e246981c04a4889ee2472Chris Lattner void dump() const; 1709d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek 1719d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const { 1729d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek ID.AddPointer(getAsOpaquePtr()); 1739d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek } 1744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 175b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerpublic: 1764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1772a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// getAddressSpace - Return the address space of this type. 1782a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb inline unsigned getAddressSpace() const; 1792a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 180034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Emit - Serialize a QualType to Bitcode. 18178f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void Emit(llvm::Serializer& S) const; 18278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 183034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Read - Deserialize a QualType from Bitcode. 184034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static QualType ReadVal(llvm::Deserializer& D); 18564be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek 18664be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek void ReadBackpatch(llvm::Deserializer& D); 1874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 1884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end clang. 1904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace llvm { 1924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Implement simplify_type for QualType, so that we can dyn_cast from QualType 1934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// to a specific Type class. 1944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnertemplate<> struct simplify_type<const ::clang::QualType> { 1954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef ::clang::Type* SimpleType; 1964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static SimpleType getSimplifiedValue(const ::clang::QualType &Val) { 1974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return Val.getTypePtr(); 1984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 2004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnertemplate<> struct simplify_type< ::clang::QualType> 2014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : public simplify_type<const ::clang::QualType> {}; 20278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 20378f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek} // end namespace llvm 2044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace clang { 2064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Type - This is the base class of the type hierarchy. A central concept 2084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// with types is that each type always has a canonical type. A canonical type 2094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// is the type with any typedef names stripped out of it or the types it 2104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// references. For example, consider: 2114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// typedef int foo; 2134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// typedef foo* bar; 2144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int *' 'foo *' 'bar' 2154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// There will be a Type object created for 'int'. Since int is canonical, its 2174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// canonicaltype pointer points to itself. There is also a Type for 'foo' (a 2184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// TypeNameType). Its CanonicalType pointer points to the 'int' Type. Next 2194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// there is a PointerType that represents 'int*', which, like 'int', is 2204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 2214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// type is 'int*', and there is a TypeNameType for 'bar', whose canonical type 2224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// is also 'int*'. 2234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Non-canonical types are useful for emitting diagnostics, without losing 2254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// information about typedefs being used. Canonical types are useful for type 2264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// comparisons (they allow by-pointer equality tests) and useful for reasoning 2274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// about whether something has a particular form (e.g. is a function type), 2284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// because they implicitly, recursively, strip all typedefs out of a type. 2294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Types, once created, are immutable. 2314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 2324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass Type { 2334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 2344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TypeClass { 23583c13010359c33354c581acee65d0c986a75247eSteve Naroff Builtin, Complex, Pointer, Reference, 2368ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ConstantArray, VariableArray, IncompleteArray, 237af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman Vector, ExtVector, 2384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionNoProto, FunctionProto, 2392a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb TypeName, Tagged, ASQual, 24042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterface, ObjCQualifiedInterface, 24142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedId, 2427cbb14653934a298c09002b87704dc6531261771Steve Naroff TypeOfExp, TypeOfTyp // GNU typeof extension. 2434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 2444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 2454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType CanonicalType; 2464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 2484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Note that this should stay at the end of the ivars for Type so that 2494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// subclasses can pack their bitfields into the same word. 2502a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned TC : 5; 2514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 2527c6f0c755e48a2782bc0a0a4cfc63dc84e0f11d5Hartmut Kaiser // silence VC++ warning C4355: 'this' : used in base member initializer list 2537c6f0c755e48a2782bc0a0a4cfc63dc84e0f11d5Hartmut Kaiser Type *this_() { return this; } 2544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(TypeClass tc, QualType Canonical) 25535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical), 25635fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner TC(tc) {} 257db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual ~Type() {}; 258db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 2594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; 26078f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 26178f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void EmitTypeInternal(llvm::Serializer& S) const; 26278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void ReadTypeInternal(llvm::Deserializer& D); 26378f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 2644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 26592803daaa6a40a3899c2e599bddc42732c2ce593Hartmut Kaiser TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); } 2664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isCanonical() const { return CanonicalType.getTypePtr() == this; } 2684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 2704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// object types, function types, and incomplete types. 2714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isObjectType - types that fully describe objects. An object is a region 2734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// of memory that can be examined and stored into (H&S). 2744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isObjectType() const; 2754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isIncompleteType - Return true if this is an incomplete type. 2774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// A type that can describe objects, but which lacks information needed to 2784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// determine its size (e.g. void, or a fwd declared struct). Clients of this 2794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// routine will need to determine if the size is actually required. 2804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIncompleteType() const; 2819db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner 2829db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner /// isIncompleteOrObjectType - Return true if this is an incomplete or object 2839db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner /// type, in other words, not a function type. 2849db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner bool isIncompleteOrObjectType() const { 2859db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner return !isFunctionType(); 2869db553e9ffdcd7c9fbd2fa6cf70646370e589159Chris Lattner } 2874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2885eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff /// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array 2895eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff /// types that have a non-constant expression. This does not include "[]". 2905eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff bool isVariablyModifiedType() const; 2915eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff 2924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Helper methods to distinguish type categories. All type predicates 2932a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// operate on the canonical type, ignoring typedefs and qualifiers. 2948888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff 2958888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff /// isIntegerType() does *not* include complex integers (a GCC extension). 2968888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff /// isComplexIntegerType() can be used to test for complex integers. 2974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 2988d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isEnumeralType() const; 2998d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isBooleanType() const; 3008d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isCharType() const; 301c81f316d260b8b8b9da21a0f9a22baa334e063fbFariborz Jahanian bool isIntegralType() const; 3024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Floating point categories. 3044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 3054300121ffff80d4b23d17689930e2aa2a83086b9Steve Naroff /// isComplexType() does *not* include complex integers (a GCC extension). 3064300121ffff80d4b23d17689930e2aa2a83086b9Steve Naroff /// isComplexIntegerType() can be used to test for complex integers. 3074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isComplexType() const; // C99 6.2.5p11 (complex) 3083277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 3094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 3104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 3114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 312e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isVoidType() const; // C99 6.2.5p19 313e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isDerivedType() const; // C99 6.2.5p20 314e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 315e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isAggregateType() const; // C99 6.2.5p21 (arrays, structures) 3164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 317e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner // Type Predicates: Check to see if this type is structurally the specified 3182a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb // type, ignoring typedefs and qualifiers. 319e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isFunctionType() const; 320cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner bool isPointerLikeType() const; // Pointer or Reference. 3217931f4a186bc76b21dd4629ee74d64264a7fb8a2Chris Lattner bool isPointerType() const; 322f0c4a0a830c9154b1ae72e497c2ce586c10e9b71Chris Lattner bool isReferenceType() const; 323cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner bool isFunctionPointerType() const; 324e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isArrayType() const; 325a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner bool isConstantArrayType() const; 326a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner bool isIncompleteArrayType() const; 327a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner bool isVariableArrayType() const; 328e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isRecordType() const; 3292e78db3510b136b3f961af202e6a1a3df4839172Chris Lattner bool isClassType() const; 330e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isStructureType() const; 33136e35e652e28cbdffbeda8cc3362888357ec7173Steve Naroff bool isUnionType() const; 332b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isComplexIntegerType() const; // GCC _Complex integer type. 333b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isVectorType() const; // GCC vector type. 334af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman bool isExtVectorType() const; // Extended vector type. 335b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCInterfaceType() const; // NSString or NSString<foo> 336b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCQualifiedInterfaceType() const; // NSString<foo> 337b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCQualifiedIdType() const; // id<foo> 338e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner 339e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner // Type Checking Functions: Check to see if this type is structurally the 34035fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner // specified type, ignoring typedefs and qualifiers, and return a pointer to 34135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner // the best type we can. 342c33c060e2f4e7c7e89e3b809f52cfc6d55ea9838Steve Naroff const BuiltinType *getAsBuiltinType() const; 343e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const FunctionType *getAsFunctionType() const; 344d5a56aae166344e13f1f8c845530beee0868db49Chris Lattner const FunctionTypeProto *getAsFunctionTypeProto() const; 345cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner const PointerLikeType *getAsPointerLikeType() const; // Pointer or Reference. 3467931f4a186bc76b21dd4629ee74d64264a7fb8a2Chris Lattner const PointerType *getAsPointerType() const; 347f0c4a0a830c9154b1ae72e497c2ce586c10e9b71Chris Lattner const ReferenceType *getAsReferenceType() const; 348e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const RecordType *getAsRecordType() const; 3495c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek const RecordType *getAsStructureType() const; 350a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// NOTE: getAsArrayType* are methods on ASTContext. 3515c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek const TypedefType *getAsTypedefType() const; 352e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const RecordType *getAsUnionType() const; 3530832dbca0e11ee020bbed181c515b3835158436eEli Friedman const EnumType *getAsEnumType() const; 354e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const VectorType *getAsVectorType() const; // GCC vector type. 3557a85fa1ba94c9f4cf960463dd3eb444ef6f89446Chris Lattner const ComplexType *getAsComplexType() const; 35636e35e652e28cbdffbeda8cc3362888357ec7173Steve Naroff const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 357af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman const ExtVectorType *getAsExtVectorType() const; // Extended vector type. 358b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCInterfaceType *getAsObjCInterfaceType() const; 359b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const; 360b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const; 361a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner 362f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner /// getAsPointerToObjCInterfaceType - If this is a pointer to an ObjC 363f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner /// interface, return the interface type, otherwise return null. 364f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner const ObjCInterfaceType *getAsPointerToObjCInterfaceType() const; 365f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner 366a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// getArrayElementTypeNoTypeQual - If this is an array type, return the 367a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// element type of the array, potentially with type qualifiers missing. 368a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner /// This method should never be used when type qualifiers are meaningful. 369a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner const Type *getArrayElementTypeNoTypeQual() const; 370a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner 371a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner 3724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3732afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// getDesugaredType - Return the specified type with any "sugar" removed from 3745c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek /// the type. This takes off typedefs, typeof's etc. If the outer level of 3752afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// the type is already concrete, it returns it unmodified. This is similar 3762afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// to getting the canonical type, but it doesn't remove *all* typedefs. For 3772ea769b494649b5ca4864acf154f2fedc7718029Chris Lattner /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 3782afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// concrete. 379a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner QualType getDesugaredType() const; 3802afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner 3814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// More type predicates useful for type checking/promotion 3824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isPromotableIntegerType() const; // C99 6.3.1.1p2 3834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isSignedIntegerType - Return true if this is an integer type that is 385bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 386bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// an enum decl which has a signed representation, or a vector of signed 387bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// integer element type. 3884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isSignedIntegerType() const; 3894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isUnsignedIntegerType - Return true if this is an integer type that is 391bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 392bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// decl which has an unsigned representation, or a vector of unsigned integer 393bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// element type. 3944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isUnsignedIntegerType() const; 395bbe686be29157b575e53fbed328613117b525f26Chris Lattner 3964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isConstantSizeType - Return true if this is not a variable sized type, 3970448b4f2fecceebc0bddd67fe0f2c89afe604fdfChris Lattner /// according to the rules of C99 6.7.5p3. It is not legal to call this on 3980448b4f2fecceebc0bddd67fe0f2c89afe604fdfChris Lattner /// incomplete types. 39962f67fd7f670f1a8b222c6565b257c05e8e80faeEli Friedman bool isConstantSizeType() const; 400a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner 4014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getCanonicalTypeInternal() const { return CanonicalType; } 402a55e321bd645398b514e246981c04a4889ee2472Chris Lattner void dump() const; 4034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const = 0; 4044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *) { return true; } 405034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 406034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 407034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Emit - Emit a Type to bitcode. Used by ASTContext. 408034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek void Emit(llvm::Serializer& S) const; 409034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 410034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Create - Construct a Type from bitcode. Used by ASTContext. 411034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static void Create(ASTContext& Context, unsigned i, llvm::Deserializer& S); 412034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 413034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// EmitImpl - Subclasses must implement this method in order to 414034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// be serialized. 415034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 4164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4182a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// ASQualType - TR18037 (C embedded extensions) 6.2.5p26 4192a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// This supports address space qualified types. 4202a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// 4212a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambclass ASQualType : public Type, public llvm::FoldingSetNode { 42235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// BaseType - This is the underlying type that this qualifies. All CVR 42335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// qualifiers are stored on the QualType that references this type, so we 42435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// can't have any here. 42535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *BaseType; 4262a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// Address Space ID - The address space ID this type is qualified with. 4272a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddressSpace; 42835fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ASQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) : 4292a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb Type(ASQual, CanonicalPtr), BaseType(Base), AddressSpace(AddrSpace) { 4302a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4312a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class ASTContext; // ASTContext creates these. 4322a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambpublic: 43335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *getBaseType() const { return BaseType; } 4342a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned getAddressSpace() const { return AddressSpace; } 4352a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4362a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void getAsStringInternal(std::string &InnerString) const; 4372a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4382a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb void Profile(llvm::FoldingSetNodeID &ID) { 4392a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb Profile(ID, getBaseType(), AddressSpace); 4402a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 44135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 4422a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddrSpace) { 44335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ID.AddPointer(Base); 4442a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb ID.AddInteger(AddrSpace); 4452a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4462a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4472a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static bool classof(const Type *T) { return T->getTypeClass() == ASQual; } 4482a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static bool classof(const ASQualType *) { return true; } 4492a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4502a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambprotected: 4512a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void EmitImpl(llvm::Serializer& S) const; 4522a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 4532a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class Type; 4542a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb}; 4552a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4562a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// BuiltinType - This class is used for builtin types like 'int'. Builtin 4584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types are always canonical and have a literal name field. 4594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass BuiltinType : public Type { 4604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum Kind { 4624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Void, 4634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Bool, // This is bool and/or _Bool. 4654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_U, // This is 'char' for targets where char is unsigned. 4664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UChar, // This is explicitly qualified unsigned char. 4674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UShort, 4684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UInt, 4694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULong, 4704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULongLong, 4714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_S, // This is 'char' for targets where char is signed. 4734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner SChar, // This is explicitly qualified signed char. 47485bd81edce4057156d7f49408147f07daa675096Argiris Kirtzidis WChar, // This is 'wchar_t' for C++. 4754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Short, 4764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Int, 4774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Long, 4784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner LongLong, 4794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 48085bd81edce4057156d7f49408147f07daa675096Argiris Kirtzidis Float, Double, LongDouble 4814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 4824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 4834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind TypeKind; 4844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner BuiltinType(Kind K) : Type(Builtin, QualType()), TypeKind(K) {} 4864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind getKind() const { return TypeKind; } 4884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const char *getName() const; 4894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 4914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 4934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const BuiltinType *) { return true; } 4944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 4974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types (_Complex float etc) as well as the GCC integer complex extensions. 4984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 4994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ComplexType : public Type, public llvm::FoldingSetNode { 5004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 5014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ComplexType(QualType Element, QualType CanonicalPtr) : 5024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Complex, CanonicalPtr), ElementType(Element) { 5034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 5074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 509034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 5104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType()); 5124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 5144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Element.getAsOpaquePtr()); 5154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 5184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ComplexType *) { return true; } 51978f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 520034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 521034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 522034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 523034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 5244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 526cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// PointerLikeType - Common base class for pointers and references. 527cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// 528cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerLikeType : public Type { 529cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType PointeeType; 530cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerprotected: 531cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(TypeClass K, QualType Pointee, QualType CanonicalPtr) : 532cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner Type(K, CanonicalPtr), PointeeType(Pointee) { 533cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 534cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerpublic: 535cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 536cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType getPointeeType() const { return PointeeType; } 537cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 538cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const Type *T) { 539cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return T->getTypeClass() == Pointer || T->getTypeClass() == Reference; 540cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 541cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const PointerLikeType *) { return true; } 542cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner}; 5434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// PointerType - C99 6.7.5.1 - Pointer Declarators. 5454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 546cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerType : public PointerLikeType, public llvm::FoldingSetNode { 5474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner PointerType(QualType Pointee, QualType CanonicalPtr) : 548cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Pointer, Pointee, CanonicalPtr) { 5494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getPointeeType()); 5574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 5594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Pointee.getAsOpaquePtr()); 5604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 5634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const PointerType *) { return true; } 564034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 565034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 566034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 567034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 568034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 5694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ReferenceType - C++ 8.3.2 - Reference Declarators. 5724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 573cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass ReferenceType : public PointerLikeType, public llvm::FoldingSetNode { 5744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ReferenceType(QualType Referencee, QualType CanonicalRef) : 575cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Reference, Referencee, CanonicalRef) { 5764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 582cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner Profile(ID, getPointeeType()); 5834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 5854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Referencee.getAsOpaquePtr()); 5864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Reference; } 5894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ReferenceType *) { return true; } 5904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ArrayType - C99 6.7.5.2 - Array Declarators. 5934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 594c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ArrayType : public Type, public llvm::FoldingSetNode { 5954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 5974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// an array with a static size (e.g. int X[static 4]), or with a star size 59824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// (e.g. int X[*]). 'static' is only allowed on function parameters. 5994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum ArraySizeModifier { 6004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Normal, Static, Star 6014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 6024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 60383c13010359c33354c581acee65d0c986a75247eSteve Naroff /// ElementType - The element type of the array. 60483c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType ElementType; 60524c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 606dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 60724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// NOTE: These fields are packed into the bitfields space in the Type class. 608dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek unsigned SizeModifier : 2; 60924c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 61024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// IndexTypeQuals - Capture qualifiers in declarations like: 61124c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// 'int X[static restrict 4]'. For function parameters only. 61224c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned IndexTypeQuals : 3; 61324c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 61483c13010359c33354c581acee65d0c986a75247eSteve Naroffprotected: 61524c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArrayType(TypeClass tc, QualType et, QualType can, 61624c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 61724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff : Type(tc, can), ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 61883c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 61983c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 62083c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType getElementType() const { return ElementType; } 621dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek ArraySizeModifier getSizeModifier() const { 622dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek return ArraySizeModifier(SizeModifier); 623dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek } 62424c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 62583c13010359c33354c581acee65d0c986a75247eSteve Naroff 62683c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 62783c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray || 6288ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman T->getTypeClass() == VariableArray || 6298ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman T->getTypeClass() == IncompleteArray; 63083c13010359c33354c581acee65d0c986a75247eSteve Naroff } 63183c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ArrayType *) { return true; } 63283c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 63383c13010359c33354c581acee65d0c986a75247eSteve Naroff 63456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ConstantArrayType - This class represents C arrays with a specified constant 63556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[100]' has ConstantArrayType where the element type 63656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// is 'int' and the size is 100. 637c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ConstantArrayType : public ArrayType { 63883c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt Size; // Allows us to unique the type. 63983c13010359c33354c581acee65d0c986a75247eSteve Naroff 64024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ConstantArrayType(QualType et, QualType can, llvm::APInt sz, 64124c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 64224c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {} 64383c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 64483c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 645a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner const llvm::APInt &getSize() const { return Size; } 64683c13010359c33354c581acee65d0c986a75247eSteve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 64783c13010359c33354c581acee65d0c986a75247eSteve Naroff 64883c13010359c33354c581acee65d0c986a75247eSteve Naroff void Profile(llvm::FoldingSetNodeID &ID) { 64983c13010359c33354c581acee65d0c986a75247eSteve Naroff Profile(ID, getElementType(), getSize()); 65083c13010359c33354c581acee65d0c986a75247eSteve Naroff } 65183c13010359c33354c581acee65d0c986a75247eSteve Naroff static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 65283c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt ArraySize) { 65383c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddPointer(ET.getAsOpaquePtr()); 65483c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddInteger(ArraySize.getZExtValue()); 65583c13010359c33354c581acee65d0c986a75247eSteve Naroff } 65683c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 65783c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray; 65883c13010359c33354c581acee65d0c986a75247eSteve Naroff } 65983c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ConstantArrayType *) { return true; } 6604234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek 6614234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenekprotected: 6624234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 6634234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 6644234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek friend class Type; 66583c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 66683c13010359c33354c581acee65d0c986a75247eSteve Naroff 66756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// IncompleteArrayType - This class represents C arrays with an unspecified 66856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[]' has an IncompleteArrayType where the element 66956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// type is 'int' and the size is unspecified. 6708ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanclass IncompleteArrayType : public ArrayType { 6718ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman IncompleteArrayType(QualType et, QualType can, 6728ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ArraySizeModifier sm, unsigned tq) 6738ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman : ArrayType(IncompleteArray, et, can, sm, tq) {} 6748ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class ASTContext; // ASTContext creates these. 6758ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanpublic: 6768ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6778ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void getAsStringInternal(std::string &InnerString) const; 6788ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6798ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const Type *T) { 6808ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman return T->getTypeClass() == IncompleteArray; 6818ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 6828ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const IncompleteArrayType *) { return true; } 6838ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6848ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class StmtIteratorBase; 6858ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6868ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman void Profile(llvm::FoldingSetNodeID &ID) { 6878ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman Profile(ID, getElementType()); 6888ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 6898ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6908ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) { 6918ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ID.AddPointer(ET.getAsOpaquePtr()); 6928ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 6938ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6948ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanprotected: 6958ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void EmitImpl(llvm::Serializer& S) const; 6968ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 6978ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class Type; 6988ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman}; 6998ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 70056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// VariableArrayType - This class represents C arrays with a specified size 70156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 70256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Since the size expression is an arbitrary expression, we store it as such. 70356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 70456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 70556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// should not be: two lexically equivalent variable array types could mean 70656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// different things, for example, these variables do not have the same type 70756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// dynamically: 70856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 70956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// void foo(int x) { 71056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Y[x]; 71156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ++x; 71256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Z[x]; 71356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// } 71456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 715c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass VariableArrayType : public ArrayType { 71683c13010359c33354c581acee65d0c986a75247eSteve Naroff /// SizeExpr - An assignment expression. VLA's are only permitted within 71783c13010359c33354c581acee65d0c986a75247eSteve Naroff /// a function block. 718718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek Stmt *SizeExpr; 7194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 72024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff VariableArrayType(QualType et, QualType can, Expr *e, 72124c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 722718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 7234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 724db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 725db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 7264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 727a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner Expr *getSizeExpr() const { 728718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // We use C-style casts instead of cast<> here because we do not wish 729718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // to have a dependency of Type.h on Stmt.h/Expr.h. 730718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek return (Expr*) SizeExpr; 731718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek } 7324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 7344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 73583c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 73683c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == VariableArray; 7374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 73883c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const VariableArrayType *) { return true; } 73927a32d6f18844a97446d6e2002bf181da591332aTed Kremenek 740fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek friend class StmtIteratorBase; 7413793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek 7423793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) { 7438ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman assert (0 && "Cannnot unique VariableArrayTypes."); 7443793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek } 7455cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek 7465cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenekprotected: 7475cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 7485cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 7495cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek friend class Type; 7504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 7514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// VectorType - GCC generic vector type. This type is created using 7534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// __attribute__((vector_size(n)), where "n" specifies the vector size in 7544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// bytes. Since the constructor takes the number of vector elements, the 7554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// client is responsible for converting the size into the number of elements. 7564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass VectorType : public Type, public llvm::FoldingSetNode { 7574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 7584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ElementType - The element type of the vector. 7594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 7604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumElements - The number of elements in the vector. 7624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements; 7634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(QualType vecType, unsigned nElements, QualType canonType) : 7654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Vector, canonType), ElementType(vecType), NumElements(nElements) {} 7664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(TypeClass tc, QualType vecType, unsigned nElements, 7674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType canonType) : Type(tc, canonType), ElementType(vecType), 7684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumElements(nElements) {} 7694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 7704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 7714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 7734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumElements() const { return NumElements; } 7744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 7764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 7784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType(), getNumElements(), getTypeClass()); 7794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 7804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 7814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements, TypeClass TypeClass) { 7824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ElementType.getAsOpaquePtr()); 7834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(NumElements); 7844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(TypeClass); 7854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 7864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 787af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 7884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 7894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const VectorType *) { return true; } 7904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 7914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 792af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// ExtVectorType - Extended vector type. This type is created using 793af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 794af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 7956154214e20225a883a8a00226499534e9b514315Steve Naroff/// class enables syntactic extensions, like Vector Components for accessing 7966154214e20225a883a8a00226499534e9b514315Steve Naroff/// points, colors, and textures (modeled after OpenGL Shading Language). 797af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemanclass ExtVectorType : public VectorType { 798af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 799af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman VectorType(ExtVector, vecType, nElements, canonType) {} 8004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 8014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 8029096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getPointAccessorIdx(char c) { 8039096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 8049096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 8059096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'x': return 0; 8069096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'y': return 1; 8079096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'z': return 2; 8089096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'w': return 3; 8099096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 8101b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 8119096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getColorAccessorIdx(char c) { 8129096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 8139096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 8149096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'r': return 0; 8159096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'g': return 1; 8169096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'b': return 2; 8179096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'a': return 3; 8189096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 8191b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 8209096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getTextureAccessorIdx(char c) { 8219096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 8229096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 8239096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 's': return 0; 8249096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 't': return 1; 8259096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'p': return 2; 8269096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'q': return 3; 8271b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 8289096b795541c783297fb19684a58c54d0fe823b8Chris Lattner }; 82942158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 83042158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner static int getAccessorIdx(char c) { 83142158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getPointAccessorIdx(c)+1) return idx-1; 83242158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getColorAccessorIdx(c)+1) return idx-1; 83342158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner return getTextureAccessorIdx(c); 83442158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner } 83542158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 8369096b795541c783297fb19684a58c54d0fe823b8Chris Lattner bool isAccessorWithinNumElements(char c) const { 83742158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getAccessorIdx(c)+1) 8389096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return unsigned(idx-1) < NumElements; 8399096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return false; 8401b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 841c11705f9b742b542724dd56796bf90e07191e342Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 842c11705f9b742b542724dd56796bf90e07191e342Steve Naroff 843806b319509d01bffe47317f11140c930da800dbbSteve Naroff static bool classof(const Type *T) { 844af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == ExtVector; 8454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 846af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman static bool classof(const ExtVectorType *) { return true; } 8474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 8484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 8504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// class of FunctionTypeNoProto and FunctionTypeProto. 8514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 8524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionType : public Type { 8534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// SubClassData - This field is owned by the subclass, put here to pack 8544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// tightly with the ivars in Type. 8554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool SubClassData : 1; 8564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // The type returned by the function. 8584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ResultType; 8594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 8604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionType(TypeClass tc, QualType res, bool SubclassInfo,QualType Canonical) 8614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : Type(tc, Canonical), SubClassData(SubclassInfo), ResultType(res) {} 8624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool getSubClassData() const { return SubClassData; } 8634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 8644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getResultType() const { return ResultType; } 8664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 8694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto || 8704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T->getTypeClass() == FunctionProto; 8714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 8724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionType *) { return true; } 8734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 8744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has 8764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// no information available about its arguments. 8774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode { 8784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeNoProto(QualType Result, QualType Canonical) 8794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : FunctionType(FunctionNoProto, Result, false, Canonical) {} 8804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 8814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 8824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // No additional state past what FunctionType provides. 8834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 8854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 8874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getResultType()); 8884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 8894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 8904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ResultType.getAsOpaquePtr()); 8914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 8924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 8944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto; 8954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 8964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeNoProto *) { return true; } 89787f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek 89887f0429f888ee5d332304641611b88f7b54b5065Ted Kremenekprotected: 89987f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 90087f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 90187f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek friend class Type; 9024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeProto - Represents a prototype with argument type info, e.g. 9054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 9064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// arguments, not as having a single void argument. 9074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { 9084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeProto(QualType Result, QualType *ArgArray, unsigned numArgs, 9094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic, QualType Canonical) 9104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : FunctionType(FunctionProto, Result, isVariadic, Canonical), 9114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumArgs(numArgs) { 9124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // Fill in the trailing argument array. 9134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 9144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner for (unsigned i = 0; i != numArgs; ++i) 9154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArgInfo[i] = ArgArray[i]; 9164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumArgs - The number of arguments this function has, not counting '...'. 9194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumArgs; 9204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArgInfo - There is an variable size array after the class in memory that 9224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// holds the argument types. 923db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 9244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 925db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 926db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 9274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 9284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumArgs() const { return NumArgs; } 9294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getArgType(unsigned i) const { 9304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(i < NumArgs && "Invalid argument number!"); 9314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return arg_type_begin()[i]; 9324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic() const { return getSubClassData(); } 9354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef const QualType *arg_type_iterator; 9374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_begin() const { 9384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<const QualType *>(this+1); 9394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 9414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 9454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionProto; 9464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeProto *) { return true; } 9484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID); 9504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 9514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator ArgTys, unsigned NumArgs, 9524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic); 953034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 954034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 955034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 956034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 957034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 9584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TypedefType : public Type { 9624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *Decl; 963e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianprotected: 964e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian TypedefType(TypeClass tc, TypedefDecl *D, QualType can) 965e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian : Type(tc, can), Decl(D) { 9664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(!isa<TypedefType>(can) && "Invalid canonical type"); 9674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 9694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 9704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *getDecl() const { return Decl; } 9724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 9744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// potentially looking through *all* consequtive typedefs. This returns the 9754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// sum of the type qualifiers, so if you have: 9764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef const int A; 9774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef volatile A B; 9784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// looking through the typedefs for B will give you "const volatile A". 9794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType LookThroughTypedefs() const; 9804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == TypeName; } 9844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TypedefType *) { return true; } 9852f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek 9862f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenekprotected: 9872f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 9882f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 9892f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek friend class Type; 9904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9927cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfExpr (GCC extension). 9937cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfExpr : public Type { 9947cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *TOExpr; 9957cbb14653934a298c09002b87704dc6531261771Steve Naroff TypeOfExpr(Expr *E, QualType can) : Type(TypeOfExp, can), TOExpr(E) { 9967cbb14653934a298c09002b87704dc6531261771Steve Naroff assert(!isa<TypedefType>(can) && "Invalid canonical type"); 9977cbb14653934a298c09002b87704dc6531261771Steve Naroff } 9987cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 9997cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 10007cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *getUnderlyingExpr() const { return TOExpr; } 10017cbb14653934a298c09002b87704dc6531261771Steve Naroff 10027cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 10037cbb14653934a298c09002b87704dc6531261771Steve Naroff 10047cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExp; } 10057cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfExpr *) { return true; } 10067cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 10077cbb14653934a298c09002b87704dc6531261771Steve Naroff 10087cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfType (GCC extension). 10097cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfType : public Type { 10107cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType TOType; 10117cbb14653934a298c09002b87704dc6531261771Steve Naroff TypeOfType(QualType T, QualType can) : Type(TypeOfTyp, can), TOType(T) { 10127cbb14653934a298c09002b87704dc6531261771Steve Naroff assert(!isa<TypedefType>(can) && "Invalid canonical type"); 10137cbb14653934a298c09002b87704dc6531261771Steve Naroff } 10147cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 10157cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 10167cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType getUnderlyingType() const { return TOType; } 10177cbb14653934a298c09002b87704dc6531261771Steve Naroff 10187cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 10197cbb14653934a298c09002b87704dc6531261771Steve Naroff 10207cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfTyp; } 10217cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfType *) { return true; } 10227cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 10234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TagType : public Type { 1025581571c848395ba6c7401b5384f91ead457c9adcTed Kremenek TagDecl *decl; 10261d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 10271d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorprotected: 1028581571c848395ba6c7401b5384f91ead457c9adcTed Kremenek TagType(TagDecl *D, QualType can) : Type(Tagged, can), decl(D) {} 10291d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 10301d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorpublic: 1031581571c848395ba6c7401b5384f91ead457c9adcTed Kremenek TagDecl *getDecl() const { return decl; } 10324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 10344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Tagged; } 10364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TagType *) { return true; } 10378db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek 10388db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenekprotected: 10398db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 104064be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 10418db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek friend class Type; 10424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10441baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 10451baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of structs/unions/classes. 10461baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass RecordType : public TagType { 1047ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidisprotected: 10481d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor explicit RecordType(RecordDecl *D) : TagType(cast<TagDecl>(D), QualType()) { } 10491d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 10501baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 10511baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10521baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner RecordDecl *getDecl() const { 10531baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 10541baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 10551baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10561baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: This predicate is a helper to QualType/Type. It needs to 10571baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // recursively check all fields for const-ness. If any field is declared 10581baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // const, it needs to return false. 10591baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner bool hasConstFields() const { return false; } 10601baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10611baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: RecordType needs to check when it is created that all fields are in 10621baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // the same address space, and return that. 10631baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner unsigned getAddressSpace() const { return 0; } 10641baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1065eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1066eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1067eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1068eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 10691baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const RecordType *) { return true; } 10701baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 10711baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1072ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis/// CXXRecordType - This is a helper class that allows the use of 1073ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis/// isa/cast/dyncast to detect TagType objects of C++ structs/unions/classes. 1074ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidisclass CXXRecordType : public RecordType { 1075ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis explicit CXXRecordType(CXXRecordDecl *D) 1076ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis : RecordType(reinterpret_cast<RecordDecl*>(D)) { } 1077ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis friend class ASTContext; // ASTContext creates these. 1078ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidispublic: 1079ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 1080ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis CXXRecordDecl *getDecl() const { 1081ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis return reinterpret_cast<CXXRecordDecl*>(RecordType::getDecl()); 1082ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis } 1083ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 1084ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const TagType *T); 1085ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const Type *T) { 1086ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis return isa<TagType>(T) && classof(cast<TagType>(T)); 1087ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis } 1088ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis static bool classof(const CXXRecordType *) { return true; } 1089ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis}; 1090ea29d1ec6b76c3722d7c0fb6a3d35c2d8cc74a79Argiris Kirtzidis 10911baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 10921baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of enums. 10931baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass EnumType : public TagType { 10941d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor explicit EnumType(EnumDecl *D) : TagType(cast<TagDecl>(D), QualType()) { } 10951d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 10961baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 10971baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10981baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner EnumDecl *getDecl() const { 10991baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 11001baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 11011baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1102eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1103eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1104eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1105eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 11061baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const EnumType *) { return true; } 11071baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 11081baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 11091baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 11101baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1111f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 1112f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// object oriented design. They basically correspond to C++ classes. There 1113f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// are two kinds of interface types, normal interfaces like "NSString" and 1114f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// qualified interfaces, which are qualified with a protocol list like 1115f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// "NSString<NSCopyable, NSAmazing>". Qualified interface types are instances 1116f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType. 111742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCInterfaceType : public Type { 111842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *Decl; 11190c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanianprotected: 112042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) : 11210c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian Type(tc, QualType()), Decl(D) { } 112281f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff friend class ASTContext; // ASTContext creates these. 112381f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroffpublic: 112481f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 112542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *getDecl() const { return Decl; } 112681f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 1127f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// qual_iterator and friends: this provides access to the (potentially empty) 1128f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// list of protocols qualifying this interface. If this is an instance of 1129f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an 1130f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// empty list if there are no qualifying protocols. 1131f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1132f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_begin() const; 1133f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_end() const; 1134f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; } 1135f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1136f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// getNumProtocols - Return the number of qualifying protocols in this 1137f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// interface type, or 0 if there are none. 1138f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline unsigned getNumProtocols() const; 1139f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1140d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner /// getProtocol - Return the specified qualifying protocol. 1141d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner inline ObjCProtocolDecl *getProtocol(unsigned i) const; 114291193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1143f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1144f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 114581f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff static bool classof(const Type *T) { 1146b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner return T->getTypeClass() == ObjCInterface || 1147b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner T->getTypeClass() == ObjCQualifiedInterface; 114881f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff } 114942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCInterfaceType *) { return true; } 115081f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff}; 115181f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 115242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek/// ObjCQualifiedInterfaceType - This class represents interface types 1153e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>. 1154e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1155c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// Duplicate protocols are removed and protocol list is canonicalized to be in 1156c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// alphabetical order. 115742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedInterfaceType : public ObjCInterfaceType, 11580c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian public llvm::FoldingSetNode { 11590c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian 1160c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List of protocols for this protocol conforming object type 1161c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 1162f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols; 1163c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 116442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D, 1165b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner ObjCProtocolDecl **Protos, unsigned NumP) : 116642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(ObjCQualifiedInterface, D), 1167d855a6ead44e3a875179400c472ac0b37df35f70Chris Lattner Protocols(Protos, Protos+NumP) { } 116891193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian friend class ASTContext; // ASTContext creates these. 1169c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanianpublic: 1170c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 1171d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner ObjCProtocolDecl *getProtocol(unsigned i) const { 117291193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols[i]; 117391193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 117491193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian unsigned getNumProtocols() const { 117591193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols.size(); 117691193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 1177b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1178b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1179b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1180b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 118191193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 118291193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 118391193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 118491193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian static void Profile(llvm::FoldingSetNodeID &ID, 1185fd5690fe6b5ea1c553dfe20f99d3fef269a50bd1Chris Lattner const ObjCInterfaceDecl *Decl, 118642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 118791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1188c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian static bool classof(const Type *T) { 118942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedInterface; 1190c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian } 119142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedInterfaceType *) { return true; } 1192c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian}; 1193f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1194f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const { 1195f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1196f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1197f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_begin(); 1198f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1199f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1200f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const { 1201f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1202f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1203f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_end(); 1204f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1205f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1206f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1207f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// getNumProtocols - Return the number of qualifying protocols in this 1208f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// interface type, or 0 if there are none. 1209f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline unsigned ObjCInterfaceType::getNumProtocols() const { 1210f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1211f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1212f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->getNumProtocols(); 1213f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1214f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1215f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1216d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner/// getProtocol - Return the specified qualifying protocol. 1217d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattnerinline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { 1218d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i); 1219f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1220f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1221f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1222e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1223e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// ObjCQualifiedIdType - to represent id<protocol-list>. 1224e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1225e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// Duplicate protocols are removed and protocol list is canonicalized to be in 1226e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// alphabetical order. 122742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedIdType : public Type, 1228e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian public llvm::FoldingSetNode { 1229e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List of protocols for this protocol conforming 'id' type 1230e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 123142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1232e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 12334a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP) 12344a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner : Type(ObjCQualifiedId, QualType()/*these are always canonical*/), 1235e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian Protocols(Protos, Protos+NumP) { } 1236e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian friend class ASTContext; // ASTContext creates these. 1237e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianpublic: 1238e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 123942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl *getProtocols(unsigned i) const { 1240e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols[i]; 1241e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 1242e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian unsigned getNumProtocols() const { 1243e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols.size(); 1244e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 124542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **getReferencedProtocols() { 1246957442db1d23f62ee2d0d71310bee240606b267dFariborz Jahanian return &Protocols[0]; 1247b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner } 1248b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1249b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1250b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1251b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1252e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1253e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 1254e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1255e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 12564a68fe04deb7ab89ac7566dc55b3b623129c72e5Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, 125742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 1258e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1259e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian static bool classof(const Type *T) { 126042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedId; 1261e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 126242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedIdType *) { return true; } 1263e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1264e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian}; 1265c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 12664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1267b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner// Inline function definitions. 12684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12692a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getUnqualifiedType - Return the type without any qualifiers. 12702a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline QualType QualType::getUnqualifiedType() const { 127135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *TP = getTypePtr(); 127235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(TP)) 127335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner TP = ASQT->getBaseType(); 127435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner return QualType(TP, 0); 12752a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 12762a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 12772a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getAddressSpace - Return the address space of this type. 12782a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline unsigned QualType::getAddressSpace() const { 127901ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner QualType CT = getTypePtr()->getCanonicalTypeInternal(); 128001ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const ArrayType *AT = dyn_cast<ArrayType>(CT)) 1281a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return AT->getElementType().getAddressSpace(); 128201ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(CT)) 1283efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman return RT->getAddressSpace(); 128401ee73fb7b2734d3ca1c5876dc623811518985dfChris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(CT)) 12852a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return ASQT->getAddressSpace(); 12862a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return 0; 12872a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 1288b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner 12895c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenekinline const TypedefType* Type::getAsTypedefType() const { 12905c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek return dyn_cast<TypedefType>(this); 12915c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek} 1292f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattnerinline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const { 1293f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner if (const PointerType *PT = getAsPointerType()) 1294f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner return PT->getPointeeType()->getAsObjCInterfaceType(); 1295f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner return 0; 1296f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner} 1297f914765ba1d70f599fa69bde38b8646c02d9b1aaChris Lattner 1298a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner// NOTE: All of these methods use "getUnqualifiedType" to strip off address 1299a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner// space qualifiers if present. 1300b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isFunctionType() const { 13012a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<FunctionType>(CanonicalType.getUnqualifiedType()); 1302b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1303b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isPointerType() const { 13042a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<PointerType>(CanonicalType.getUnqualifiedType()); 1305b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1306cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isReferenceType() const { 1307cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<ReferenceType>(CanonicalType.getUnqualifiedType()); 1308cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 1309cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isPointerLikeType() const { 1310cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<PointerLikeType>(CanonicalType.getUnqualifiedType()); 1311cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 131283b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenekinline bool Type::isFunctionPointerType() const { 131374a340749eb63af1ba7098c67f3ef72bd48f5ae8Ted Kremenek if (const PointerType* T = getAsPointerType()) 131483b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return T->getPointeeType()->isFunctionType(); 131583b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek else 131683b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return false; 131783b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek} 1318b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isArrayType() const { 13192a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<ArrayType>(CanonicalType.getUnqualifiedType()); 1320b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1321a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isConstantArrayType() const { 1322a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()); 1323a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1324a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isIncompleteArrayType() const { 1325a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()); 1326a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1327a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattnerinline bool Type::isVariableArrayType() const { 1328a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<VariableArrayType>(CanonicalType.getUnqualifiedType()); 1329a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner} 1330b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isRecordType() const { 13312a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<RecordType>(CanonicalType.getUnqualifiedType()); 1332b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 13333277df47de6b65b55721726dc3f7b294e70ef6feChris Lattnerinline bool Type::isAnyComplexType() const { 1334a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ComplexType>(CanonicalType.getUnqualifiedType()); 13353277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner} 1336b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isVectorType() const { 13372a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<VectorType>(CanonicalType.getUnqualifiedType()); 1338b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1339af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemaninline bool Type::isExtVectorType() const { 1340af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return isa<ExtVectorType>(CanonicalType.getUnqualifiedType()); 1341b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 134242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCInterfaceType() const { 1343a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCInterfaceType>(CanonicalType.getUnqualifiedType()); 1344b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner} 1345b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerinline bool Type::isObjCQualifiedInterfaceType() const { 1346a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType()); 1347550e05034c6c8efcb7ab4c65f58048eee0892237Fariborz Jahanian} 134842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCQualifiedIdType() const { 1349a1923f6d95601582f4a5c3924b8e1c5ac3f658b3Chris Lattner return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType()); 1350dcb2b1e489948a570ee07ca65e12d42edffa20efFariborz Jahanian} 13514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end namespace clang 13524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#endif 1354