Type.h revision d5f8179ed2b75e5c21109f3dd996836b5f743ecd
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; 344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class EnumDecl; 3564be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek class FieldDecl; 3642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCInterfaceDecl; 3742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCProtocolDecl; 3842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCMethodDecl; 394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Expr; 40718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek class Stmt; 414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class SourceLocation; 42cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner class PointerLikeType; 434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class PointerType; 444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ReferenceType; 454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class VectorType; 464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ArrayType; 475eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff class ConstantArrayType; 485eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff class VariableArrayType; 498ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman class IncompleteArrayType; 502cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff class RecordType; 510832dbca0e11ee020bbed181c515b3835158436eEli Friedman class EnumType; 527a85fa1ba94c9f4cf960463dd3eb444ef6f89446Chris Lattner class ComplexType; 53806b319509d01bffe47317f11140c930da800dbbSteve Naroff class TagType; 545c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek class TypedefType; 55806b319509d01bffe47317f11140c930da800dbbSteve Naroff class FunctionType; 56af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman class ExtVectorType; 57c33c060e2f4e7c7e89e3b809f52cfc6d55ea9838Steve Naroff class BuiltinType; 58b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner class ObjCInterfaceType; 59b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner class ObjCQualifiedIdType; 6042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek class ObjCQualifiedInterfaceType; 61fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek class StmtIteratorBase; 624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// QualType - For efficiency, we don't store CVR-qualified types as nodes on 644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// their own: instead each reference to a type stores the qualifiers. This 654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// greatly reduces the number of nodes we need to allocate for types (for 664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// example we only need one for 'int', 'const int', 'volatile int', 674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'const volatile int', etc). 684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// As an added efficiency bonus, instead of making this a pair, we just store 704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// the three bits we care about in the low bits of the pointer. To handle the 714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// packing/unpacking, we make QualType be a simple wrapper class that acts like 724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// a smart pointer. 734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass QualType { 744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner uintptr_t ThePtr; 754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Const = 0x1, 784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Restrict = 0x2, 794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Volatile = 0x4, 804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner CVRFlags = Const|Restrict|Volatile 814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType() : ThePtr(0) {} 844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType(Type *Ptr, unsigned Quals) { 864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert((Quals & ~CVRFlags) == 0 && "Invalid type qualifiers!"); 874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ThePtr = reinterpret_cast<uintptr_t>(Ptr); 884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert((ThePtr & CVRFlags) == 0 && "Type pointer not 8-byte aligned?"); 894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ThePtr |= Quals; 904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static QualType getFromOpaquePtr(void *Ptr) { 934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType T; 944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T.ThePtr = reinterpret_cast<uintptr_t>(Ptr); 954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T; 964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9835fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner unsigned getCVRQualifiers() const { 994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr & CVRFlags; 1004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type *getTypePtr() const { 1024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<Type*>(ThePtr & ~CVRFlags); 1034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void *getAsOpaquePtr() const { 1064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<void*>(ThePtr); 1074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type &operator*() const { 1104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return *getTypePtr(); 1114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type *operator->() const { 1144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return getTypePtr(); 1154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isNull - Return true if this QualType doesn't point to a type yet. 1184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isNull() const { 1194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr == 0; 1204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isConstQualified() const { 123c75ccff9e318638cac63fe392f68893ab4177f45Chris Lattner return (ThePtr & Const) ? true : false; 1244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVolatileQualified() const { 126c75ccff9e318638cac63fe392f68893ab4177f45Chris Lattner return (ThePtr & Volatile) ? true : false; 1274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRestrictQualified() const { 129c75ccff9e318638cac63fe392f68893ab4177f45Chris Lattner return (ThePtr & Restrict) ? true : false; 1304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1312e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner 1322e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner /// addConst/addVolatile/addRestrict - add the specified type qual to this 1332e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner /// QualType. 1342e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner void addConst() { ThePtr |= Const; } 1352e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner void addVolatile() { ThePtr |= Volatile; } 1362e3b1d2ed22e5638fa9c55cc1ea5dac4db6aecdcChris Lattner void addRestrict() { ThePtr |= Restrict; } 1374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13893eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta void removeConst() { ThePtr &= ~Const; } 13993eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta void removeVolatile() { ThePtr &= ~Volatile; } 14093eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta void removeRestrict() { ThePtr &= ~Restrict; } 14193eb82549eec82d75ce5dd3afbeeaf6fdb0e2a27Sanjiv Gupta 1424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getQualifiedType(unsigned TQs) const { 1434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return QualType(getTypePtr(), TQs); 1444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1462a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb inline QualType getUnqualifiedType() const; 1474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// operator==/!= - Indicate whether the specified types and qualifiers are 1494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// identical. 1504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator==(const QualType &RHS) const { 1514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr == RHS.ThePtr; 1524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator!=(const QualType &RHS) const { 1544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr != RHS.ThePtr; 1554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string getAsString() const { 1574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string S; 1584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getAsStringInternal(S); 1594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return S; 1604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void getAsStringInternal(std::string &Str) const; 1624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void dump(const char *s = 0) const; 1649d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek 1659d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) const { 1669d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek ID.AddPointer(getAsOpaquePtr()); 1679d464449c2a782e0a91ea85d79ad9e35418ec441Ted Kremenek } 1684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 169b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner//private: 1704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// getCanonicalType - Return the canonical version of this type, with the 1714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// appropriate type qualifiers on it. 1724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner inline QualType getCanonicalType() const; 173b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerpublic: 1744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1752a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// getAddressSpace - Return the address space of this type. 1762a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb inline unsigned getAddressSpace() const; 1772a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 178034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Emit - Serialize a QualType to Bitcode. 17978f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek void Emit(llvm::Serializer& S) const; 18078f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 181034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Read - Deserialize a QualType from Bitcode. 182034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static QualType ReadVal(llvm::Deserializer& D); 18364be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek 18464be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenekprivate: 18564be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek void ReadBackpatch(llvm::Deserializer& D); 18664be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek friend class FieldDecl; 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 292771d8f421cc12a168e92a45f7f0be713ebda5b11Steve Naroff /// isIncompleteArrayType (C99 6.2.5p22) - Return true for variable array 293771d8f421cc12a168e92a45f7f0be713ebda5b11Steve Naroff /// types that don't have any expression ("[]"). 294771d8f421cc12a168e92a45f7f0be713ebda5b11Steve Naroff bool isIncompleteArrayType() const; 295771d8f421cc12a168e92a45f7f0be713ebda5b11Steve Naroff 2964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Helper methods to distinguish type categories. All type predicates 2972a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// operate on the canonical type, ignoring typedefs and qualifiers. 2988888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff 2998888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff /// isIntegerType() does *not* include complex integers (a GCC extension). 3008888c7acd5cd43c7f910bfe03f5979ed4011de2aSteve Naroff /// isComplexIntegerType() can be used to test for complex integers. 3014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 3028d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isEnumeralType() const; 3038d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isBooleanType() const; 3048d3b170e5cb1700b5cbd227182bc29ca0d16819dSteve Naroff bool isCharType() const; 305c81f316d260b8b8b9da21a0f9a22baa334e063fbFariborz Jahanian bool isIntegralType() const; 3064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Floating point categories. 3084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 3094300121ffff80d4b23d17689930e2aa2a83086b9Steve Naroff /// isComplexType() does *not* include complex integers (a GCC extension). 3104300121ffff80d4b23d17689930e2aa2a83086b9Steve Naroff /// isComplexIntegerType() can be used to test for complex integers. 3114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isComplexType() const; // C99 6.2.5p11 (complex) 3123277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner bool isAnyComplexType() const; // C99 6.2.5p11 (complex) + Complex Int. 3134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 3144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 3154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 316e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isVoidType() const; // C99 6.2.5p19 317e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isDerivedType() const; // C99 6.2.5p20 318e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 319e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isAggregateType() const; // C99 6.2.5p21 (arrays, structures) 3204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 321e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner // Type Predicates: Check to see if this type is structurally the specified 3222a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb // type, ignoring typedefs and qualifiers. 323e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isFunctionType() const; 324cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner bool isPointerLikeType() const; // Pointer or Reference. 3257931f4a186bc76b21dd4629ee74d64264a7fb8a2Chris Lattner bool isPointerType() const; 326f0c4a0a830c9154b1ae72e497c2ce586c10e9b71Chris Lattner bool isReferenceType() const; 327cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner bool isFunctionPointerType() const; 328e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isArrayType() const; 329e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isRecordType() const; 3302e78db3510b136b3f961af202e6a1a3df4839172Chris Lattner bool isClassType() const; 331e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner bool isStructureType() const; 33236e35e652e28cbdffbeda8cc3362888357ec7173Steve Naroff bool isUnionType() const; 333b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isComplexIntegerType() const; // GCC _Complex integer type. 334b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isVectorType() const; // GCC vector type. 335af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman bool isExtVectorType() const; // Extended vector type. 336b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCInterfaceType() const; // NSString or NSString<foo> 337b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCQualifiedInterfaceType() const; // NSString<foo> 338b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner bool isObjCQualifiedIdType() const; // id<foo> 339e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner 340e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner // Type Checking Functions: Check to see if this type is structurally the 34135fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner // specified type, ignoring typedefs and qualifiers, and return a pointer to 34235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner // the best type we can. 343c33c060e2f4e7c7e89e3b809f52cfc6d55ea9838Steve Naroff const BuiltinType *getAsBuiltinType() const; 344e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const FunctionType *getAsFunctionType() 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 ArrayType *getAsArrayType() const; 3495eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff const ConstantArrayType *getAsConstantArrayType() const; 3505eb879b0ab7cc0b98c5700b0c19cae3797530d9cSteve Naroff const VariableArrayType *getAsVariableArrayType() const; 3518ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman const IncompleteArrayType *getAsIncompleteArrayType() const; 352e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const RecordType *getAsRecordType() const; 3535c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek const RecordType *getAsStructureType() const; 3545c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek const TypedefType *getAsTypedefType() const; 355e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const RecordType *getAsUnionType() const; 3560832dbca0e11ee020bbed181c515b3835158436eEli Friedman const EnumType *getAsEnumType() const; 357e35a104a7d5caf8fa71117fbaa6f18cacc53c7a7Chris Lattner const VectorType *getAsVectorType() const; // GCC vector type. 3587a85fa1ba94c9f4cf960463dd3eb444ef6f89446Chris Lattner const ComplexType *getAsComplexType() const; 35936e35e652e28cbdffbeda8cc3362888357ec7173Steve Naroff const ComplexType *getAsComplexIntegerType() const; // GCC complex int type. 360af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman const ExtVectorType *getAsExtVectorType() const; // Extended vector type. 361b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCInterfaceType *getAsObjCInterfaceType() const; 362b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const; 363b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const; 364b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner 3654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3662afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// getDesugaredType - Return the specified type with any "sugar" removed from 3675c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek /// the type. This takes off typedefs, typeof's etc. If the outer level of 3682afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// the type is already concrete, it returns it unmodified. This is similar 3692afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// to getting the canonical type, but it doesn't remove *all* typedefs. For 3702ea769b494649b5ca4864acf154f2fedc7718029Chris Lattner /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 3712afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner /// concrete. 3722afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner const Type *getDesugaredType() const; 3732afc72b0b6b3d2f44ca2576c98d307310d556983Chris Lattner 3744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// More type predicates useful for type checking/promotion 3754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isPromotableIntegerType() const; // C99 6.3.1.1p2 3764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isSignedIntegerType - Return true if this is an integer type that is 378bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 379bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// an enum decl which has a signed representation, or a vector of signed 380bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// integer element type. 3814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isSignedIntegerType() const; 3824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isUnsignedIntegerType - Return true if this is an integer type that is 384bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 385bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// decl which has an unsigned representation, or a vector of unsigned integer 386bbe686be29157b575e53fbed328613117b525f26Chris Lattner /// element type. 3874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isUnsignedIntegerType() const; 388bbe686be29157b575e53fbed328613117b525f26Chris Lattner 3894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isConstantSizeType - Return true if this is not a variable sized type, 3900448b4f2fecceebc0bddd67fe0f2c89afe604fdfChris Lattner /// according to the rules of C99 6.7.5p3. It is not legal to call this on 3910448b4f2fecceebc0bddd67fe0f2c89afe604fdfChris Lattner /// incomplete types. 39262f67fd7f670f1a8b222c6565b257c05e8e80faeEli Friedman bool isConstantSizeType() const; 3934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 3944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getCanonicalTypeInternal() const { return CanonicalType; } 3954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class QualType; 3964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 3974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const = 0; 3984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *) { return true; } 399034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 400034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 401034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Emit - Emit a Type to bitcode. Used by ASTContext. 402034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek void Emit(llvm::Serializer& S) const; 403034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 404034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// Create - Construct a Type from bitcode. Used by ASTContext. 405034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static void Create(ASTContext& Context, unsigned i, llvm::Deserializer& S); 406034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 407034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// EmitImpl - Subclasses must implement this method in order to 408034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek /// be serialized. 409034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 4104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4122a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// ASQualType - TR18037 (C embedded extensions) 6.2.5p26 4132a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// This supports address space qualified types. 4142a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// 4152a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambclass ASQualType : public Type, public llvm::FoldingSetNode { 41635fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// BaseType - This is the underlying type that this qualifies. All CVR 41735fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// qualifiers are stored on the QualType that references this type, so we 41835fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner /// can't have any here. 41935fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *BaseType; 4202a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb /// Address Space ID - The address space ID this type is qualified with. 4212a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddressSpace; 42235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ASQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) : 4232a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb Type(ASQual, CanonicalPtr), BaseType(Base), AddressSpace(AddrSpace) { 4242a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4252a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class ASTContext; // ASTContext creates these. 4262a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambpublic: 42735fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *getBaseType() const { return BaseType; } 4282a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned getAddressSpace() const { return AddressSpace; } 4292a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4302a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void getAsStringInternal(std::string &InnerString) const; 4312a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4322a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb void Profile(llvm::FoldingSetNodeID &ID) { 4332a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb Profile(ID, getBaseType(), AddressSpace); 4342a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 43535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, Type *Base, 4362a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb unsigned AddrSpace) { 43735fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner ID.AddPointer(Base); 4382a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb ID.AddInteger(AddrSpace); 4392a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb } 4402a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4412a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static bool classof(const Type *T) { return T->getTypeClass() == ASQual; } 4422a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static bool classof(const ASQualType *) { return true; } 4432a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4442a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambprotected: 4452a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb virtual void EmitImpl(llvm::Serializer& S) const; 4462a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 4472a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb friend class Type; 4482a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb}; 4492a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4502a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 4514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// BuiltinType - This class is used for builtin types like 'int'. Builtin 4524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types are always canonical and have a literal name field. 4534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass BuiltinType : public Type { 4544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum Kind { 4564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Void, 4574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Bool, // This is bool and/or _Bool. 4594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_U, // This is 'char' for targets where char is unsigned. 4604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UChar, // This is explicitly qualified unsigned char. 4614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UShort, 4624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UInt, 4634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULong, 4644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULongLong, 4654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_S, // This is 'char' for targets where char is signed. 4674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner SChar, // This is explicitly qualified signed char. 4684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Short, 4694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Int, 4704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Long, 4714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner LongLong, 4724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Float, Double, LongDouble 4744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 4754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 4764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind TypeKind; 4774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner BuiltinType(Kind K) : Type(Builtin, QualType()), TypeKind(K) {} 4794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind getKind() const { return TypeKind; } 4814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const char *getName() const; 4824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 4844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 4864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const BuiltinType *) { return true; } 4874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 4904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types (_Complex float etc) as well as the GCC integer complex extensions. 4914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 4924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ComplexType : public Type, public llvm::FoldingSetNode { 4934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 4944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ComplexType(QualType Element, QualType CanonicalPtr) : 4954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Complex, CanonicalPtr), ElementType(Element) { 4964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 4974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 4984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 5004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 502034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 5034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType()); 5054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 5074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Element.getAsOpaquePtr()); 5084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 5114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ComplexType *) { return true; } 51278f138f44886abc5ab7fc1551d501308f1846d80Ted Kremenek 513034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 514034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 515034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 516034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 5174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 519cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// PointerLikeType - Common base class for pointers and references. 520cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner/// 521cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerLikeType : public Type { 522cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType PointeeType; 523cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerprotected: 524cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(TypeClass K, QualType Pointee, QualType CanonicalPtr) : 525cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner Type(K, CanonicalPtr), PointeeType(Pointee) { 526cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 527cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerpublic: 528cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 529cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner QualType getPointeeType() const { return PointeeType; } 530cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner 531cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const Type *T) { 532cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return T->getTypeClass() == Pointer || T->getTypeClass() == Reference; 533cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner } 534cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner static bool classof(const PointerLikeType *) { return true; } 535cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner}; 5364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// PointerType - C99 6.7.5.1 - Pointer Declarators. 5384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 539cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass PointerType : public PointerLikeType, public llvm::FoldingSetNode { 5404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner PointerType(QualType Pointee, QualType CanonicalPtr) : 541cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Pointer, Pointee, CanonicalPtr) { 5424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getPointeeType()); 5504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 5524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Pointee.getAsOpaquePtr()); 5534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 5564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const PointerType *) { return true; } 557034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 558034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 559034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 560034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 561034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 5624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ReferenceType - C++ 8.3.2 - Reference Declarators. 5654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 566cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerclass ReferenceType : public PointerLikeType, public llvm::FoldingSetNode { 5674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ReferenceType(QualType Referencee, QualType CanonicalRef) : 568cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner PointerLikeType(Reference, Referencee, CanonicalRef) { 5694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 575cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner Profile(ID, getPointeeType()); 5764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 5784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Referencee.getAsOpaquePtr()); 5794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Reference; } 5824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ReferenceType *) { return true; } 5834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ArrayType - C99 6.7.5.2 - Array Declarators. 5864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 587c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ArrayType : public Type, public llvm::FoldingSetNode { 5884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 5904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// an array with a static size (e.g. int X[static 4]), or with a star size 59124c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// (e.g. int X[*]). 'static' is only allowed on function parameters. 5924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum ArraySizeModifier { 5934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Normal, Static, Star 5944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 5954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 59683c13010359c33354c581acee65d0c986a75247eSteve Naroff /// ElementType - The element type of the array. 59783c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType ElementType; 59824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 599dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum 60024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// NOTE: These fields are packed into the bitfields space in the Type class. 601dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek unsigned SizeModifier : 2; 60224c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 60324c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// IndexTypeQuals - Capture qualifiers in declarations like: 60424c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff /// 'int X[static restrict 4]'. For function parameters only. 60524c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned IndexTypeQuals : 3; 60624c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff 60783c13010359c33354c581acee65d0c986a75247eSteve Naroffprotected: 60824c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArrayType(TypeClass tc, QualType et, QualType can, 60924c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 61024c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff : Type(tc, can), ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {} 61183c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 61283c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 61383c13010359c33354c581acee65d0c986a75247eSteve Naroff QualType getElementType() const { return ElementType; } 614dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek ArraySizeModifier getSizeModifier() const { 615dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek return ArraySizeModifier(SizeModifier); 616dbd96b23eae3784172d91cfb086abb8ca732f92eTed Kremenek } 61724c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 61883c13010359c33354c581acee65d0c986a75247eSteve Naroff 6194f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff QualType getBaseType() const { 6204f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff const ArrayType *AT; 6214f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff QualType ElmtType = getElementType(); 6224f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff // If we have a multi-dimensional array, navigate to the base type. 6234f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff while ((AT = ElmtType->getAsArrayType())) 6244f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff ElmtType = AT->getElementType(); 6254f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff return ElmtType; 6264f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff } 62783c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 62883c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray || 6298ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman T->getTypeClass() == VariableArray || 6308ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman T->getTypeClass() == IncompleteArray; 63183c13010359c33354c581acee65d0c986a75247eSteve Naroff } 63283c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ArrayType *) { return true; } 63383c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 63483c13010359c33354c581acee65d0c986a75247eSteve Naroff 63556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ConstantArrayType - This class represents C arrays with a specified constant 63656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[100]' has ConstantArrayType where the element type 63756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// is 'int' and the size is 100. 638c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass ConstantArrayType : public ArrayType { 63983c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt Size; // Allows us to unique the type. 64083c13010359c33354c581acee65d0c986a75247eSteve Naroff 64124c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ConstantArrayType(QualType et, QualType can, llvm::APInt sz, 64224c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 64324c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {} 64483c13010359c33354c581acee65d0c986a75247eSteve Naroff friend class ASTContext; // ASTContext creates these. 64583c13010359c33354c581acee65d0c986a75247eSteve Naroffpublic: 64683c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt getSize() const { return Size; } 6474f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff int getMaximumElements() const { 6484f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff QualType ElmtType = getElementType(); 6497c6f0c755e48a2782bc0a0a4cfc63dc84e0f11d5Hartmut Kaiser int maxElements = static_cast<int>(getSize().getZExtValue()); 65083c13010359c33354c581acee65d0c986a75247eSteve Naroff 6514f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff const ConstantArrayType *CAT; 6524f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff // If we have a multi-dimensional array, include it's elements. 6534f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff while ((CAT = ElmtType->getAsConstantArrayType())) { 6544f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff ElmtType = CAT->getElementType(); 6557c6f0c755e48a2782bc0a0a4cfc63dc84e0f11d5Hartmut Kaiser maxElements *= static_cast<int>(CAT->getSize().getZExtValue()); 6564f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff } 6574f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff return maxElements; 6584f9109983a4b4e69c41436ac4b3ae9a370e9a725Steve Naroff } 65983c13010359c33354c581acee65d0c986a75247eSteve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 66083c13010359c33354c581acee65d0c986a75247eSteve Naroff 66183c13010359c33354c581acee65d0c986a75247eSteve Naroff void Profile(llvm::FoldingSetNodeID &ID) { 66283c13010359c33354c581acee65d0c986a75247eSteve Naroff Profile(ID, getElementType(), getSize()); 66383c13010359c33354c581acee65d0c986a75247eSteve Naroff } 66483c13010359c33354c581acee65d0c986a75247eSteve Naroff static void Profile(llvm::FoldingSetNodeID &ID, QualType ET, 66583c13010359c33354c581acee65d0c986a75247eSteve Naroff llvm::APInt ArraySize) { 66683c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddPointer(ET.getAsOpaquePtr()); 66783c13010359c33354c581acee65d0c986a75247eSteve Naroff ID.AddInteger(ArraySize.getZExtValue()); 66883c13010359c33354c581acee65d0c986a75247eSteve Naroff } 66983c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 67083c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == ConstantArray; 67183c13010359c33354c581acee65d0c986a75247eSteve Naroff } 67283c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const ConstantArrayType *) { return true; } 6734234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek 6744234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenekprotected: 6754234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 6764234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 6774234c1b1a9c858b005f4ad7dc85908b63adcafddTed Kremenek friend class Type; 67883c13010359c33354c581acee65d0c986a75247eSteve Naroff}; 67983c13010359c33354c581acee65d0c986a75247eSteve Naroff 68056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// IncompleteArrayType - This class represents C arrays with an unspecified 68156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// size. For example 'int A[]' has an IncompleteArrayType where the element 68256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// type is 'int' and the size is unspecified. 6838ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanclass IncompleteArrayType : public ArrayType { 6848ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman IncompleteArrayType(QualType et, QualType can, 6858ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ArraySizeModifier sm, unsigned tq) 6868ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman : ArrayType(IncompleteArray, et, can, sm, tq) {} 6878ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class ASTContext; // ASTContext creates these. 6888ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanpublic: 6898ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6908ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void getAsStringInternal(std::string &InnerString) const; 6918ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6928ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const Type *T) { 6938ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman return T->getTypeClass() == IncompleteArray; 6948ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 6958ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static bool classof(const IncompleteArrayType *) { return true; } 6968ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6978ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class StmtIteratorBase; 6988ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 6998ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman void Profile(llvm::FoldingSetNodeID &ID) { 7008ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman Profile(ID, getElementType()); 7018ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 7028ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 7038ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) { 7048ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman ID.AddPointer(ET.getAsOpaquePtr()); 7058ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman } 7068ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 7078ff077864feed2c2b75424d37724f60e56d5a597Eli Friedmanprotected: 7088ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman virtual void EmitImpl(llvm::Serializer& S) const; 7098ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 7108ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman friend class Type; 7118ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman}; 7128ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman 71356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// VariableArrayType - This class represents C arrays with a specified size 71456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// which is not an integer-constant-expression. For example, 'int s[x+foo()]'. 71556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Since the size expression is an arbitrary expression, we store it as such. 71656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 71756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and 71856846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// should not be: two lexically equivalent variable array types could mean 71956846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// different things, for example, these variables do not have the same type 72056846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// dynamically: 72156846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 72256846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// void foo(int x) { 72356846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Y[x]; 72456846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// ++x; 72556846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// int Z[x]; 72656846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// } 72756846f2ed2594f49d78eee3645482a5e77d5e236Chris Lattner/// 728c8253192b917a5684717c58f4032e0891d089b00Ted Kremenekclass VariableArrayType : public ArrayType { 72983c13010359c33354c581acee65d0c986a75247eSteve Naroff /// SizeExpr - An assignment expression. VLA's are only permitted within 73083c13010359c33354c581acee65d0c986a75247eSteve Naroff /// a function block. 731718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek Stmt *SizeExpr; 7324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 73324c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff VariableArrayType(QualType et, QualType can, Expr *e, 73424c9b98cc6a8de4a080e2dedb2797bdc2eeb688bSteve Naroff ArraySizeModifier sm, unsigned tq) 735718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {} 7364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 737db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 738db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 7394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 740718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek const Expr *getSizeExpr() const { 741718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // We use C-style casts instead of cast<> here because we do not wish 742718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek // to have a dependency of Type.h on Stmt.h/Expr.h. 743718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek return (Expr*) SizeExpr; 744718b6638e0d259d1b8371ef30e475e9c2e981ffcTed Kremenek } 7454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 7474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 74883c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const Type *T) { 74983c13010359c33354c581acee65d0c986a75247eSteve Naroff return T->getTypeClass() == VariableArray; 7504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 75183c13010359c33354c581acee65d0c986a75247eSteve Naroff static bool classof(const VariableArrayType *) { return true; } 75227a32d6f18844a97446d6e2002bf181da591332aTed Kremenek 753fce813e3159a67a57a03cdca45ac4e10d4cffac3Ted Kremenek friend class StmtIteratorBase; 7543793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek 7553793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek void Profile(llvm::FoldingSetNodeID &ID) { 7568ff077864feed2c2b75424d37724f60e56d5a597Eli Friedman assert (0 && "Cannnot unique VariableArrayTypes."); 7573793e1ab25169c0d5be43f3abe2b4dc92989c043Ted Kremenek } 7585cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek 7595cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenekprotected: 7605cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 7615cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 7625cde3834f43c0946ec8debfda9c6fb588b6b33fdTed Kremenek friend class Type; 7634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 7644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// VectorType - GCC generic vector type. This type is created using 7664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// __attribute__((vector_size(n)), where "n" specifies the vector size in 7674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// bytes. Since the constructor takes the number of vector elements, the 7684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// client is responsible for converting the size into the number of elements. 7694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass VectorType : public Type, public llvm::FoldingSetNode { 7704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 7714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ElementType - The element type of the vector. 7724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 7734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumElements - The number of elements in the vector. 7754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements; 7764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(QualType vecType, unsigned nElements, QualType canonType) : 7784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Vector, canonType), ElementType(vecType), NumElements(nElements) {} 7794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(TypeClass tc, QualType vecType, unsigned nElements, 7804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType canonType) : Type(tc, canonType), ElementType(vecType), 7814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumElements(nElements) {} 7824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 7834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 7844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 7864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumElements() const { return NumElements; } 7874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 7894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 7904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 7914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType(), getNumElements(), getTypeClass()); 7924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 7934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 7944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements, TypeClass TypeClass) { 7954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ElementType.getAsOpaquePtr()); 7964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(NumElements); 7974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(TypeClass); 7984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 7994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 800af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector; 8014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 8024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const VectorType *) { return true; } 8034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 8044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 805af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// ExtVectorType - Extended vector type. This type is created using 806af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// __attribute__((ext_vector_type(n)), where "n" is the number of elements. 807af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This 8086154214e20225a883a8a00226499534e9b514315Steve Naroff/// class enables syntactic extensions, like Vector Components for accessing 8096154214e20225a883a8a00226499534e9b514315Steve Naroff/// points, colors, and textures (modeled after OpenGL Shading Language). 810af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemanclass ExtVectorType : public VectorType { 811af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) : 812af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman VectorType(ExtVector, vecType, nElements, canonType) {} 8134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 8144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 8159096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getPointAccessorIdx(char c) { 8169096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 8179096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 8189096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'x': return 0; 8199096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'y': return 1; 8209096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'z': return 2; 8219096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'w': return 3; 8229096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 8231b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 8249096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getColorAccessorIdx(char c) { 8259096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 8269096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 8279096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'r': return 0; 8289096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'g': return 1; 8299096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'b': return 2; 8309096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'a': return 3; 8319096b795541c783297fb19684a58c54d0fe823b8Chris Lattner } 8321b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 8339096b795541c783297fb19684a58c54d0fe823b8Chris Lattner static int getTextureAccessorIdx(char c) { 8349096b795541c783297fb19684a58c54d0fe823b8Chris Lattner switch (c) { 8359096b795541c783297fb19684a58c54d0fe823b8Chris Lattner default: return -1; 8369096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 's': return 0; 8379096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 't': return 1; 8389096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'p': return 2; 8399096b795541c783297fb19684a58c54d0fe823b8Chris Lattner case 'q': return 3; 8401b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 8419096b795541c783297fb19684a58c54d0fe823b8Chris Lattner }; 84242158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 84342158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner static int getAccessorIdx(char c) { 84442158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getPointAccessorIdx(c)+1) return idx-1; 84542158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getColorAccessorIdx(c)+1) return idx-1; 84642158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner return getTextureAccessorIdx(c); 84742158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner } 84842158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner 8499096b795541c783297fb19684a58c54d0fe823b8Chris Lattner bool isAccessorWithinNumElements(char c) const { 85042158e7b3a95f41d3482f1fb3a67392dbbf745daChris Lattner if (int idx = getAccessorIdx(c)+1) 8519096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return unsigned(idx-1) < NumElements; 8529096b795541c783297fb19684a58c54d0fe823b8Chris Lattner return false; 8531b8a46c945927340ae7e79b771e93e7d36da4851Steve Naroff } 854c11705f9b742b542724dd56796bf90e07191e342Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 855c11705f9b742b542724dd56796bf90e07191e342Steve Naroff 856806b319509d01bffe47317f11140c930da800dbbSteve Naroff static bool classof(const Type *T) { 857af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return T->getTypeClass() == ExtVector; 8584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 859af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman static bool classof(const ExtVectorType *) { return true; } 8604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 8614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 8634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// class of FunctionTypeNoProto and FunctionTypeProto. 8644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 8654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionType : public Type { 8664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// SubClassData - This field is owned by the subclass, put here to pack 8674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// tightly with the ivars in Type. 8684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool SubClassData : 1; 8694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // The type returned by the function. 8714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ResultType; 8724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 8734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionType(TypeClass tc, QualType res, bool SubclassInfo,QualType Canonical) 8744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : Type(tc, Canonical), SubClassData(SubclassInfo), ResultType(res) {} 8754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool getSubClassData() const { return SubClassData; } 8764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 8774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getResultType() const { return ResultType; } 8794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 8824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto || 8834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T->getTypeClass() == FunctionProto; 8844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 8854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionType *) { return true; } 8864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 8874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has 8894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// no information available about its arguments. 8904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode { 8914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeNoProto(QualType Result, QualType Canonical) 8924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : FunctionType(FunctionNoProto, Result, false, Canonical) {} 8934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 8944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 8954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // No additional state past what FunctionType provides. 8964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 8984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 8994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 9004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getResultType()); 9014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 9034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ResultType.getAsOpaquePtr()); 9044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 9074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto; 9084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeNoProto *) { return true; } 91087f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek 91187f0429f888ee5d332304641611b88f7b54b5065Ted Kremenekprotected: 91287f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 91387f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 91487f0429f888ee5d332304641611b88f7b54b5065Ted Kremenek friend class Type; 9154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeProto - Represents a prototype with argument type info, e.g. 9184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 9194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// arguments, not as having a single void argument. 9204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { 9214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeProto(QualType Result, QualType *ArgArray, unsigned numArgs, 9224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic, QualType Canonical) 9234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : FunctionType(FunctionProto, Result, isVariadic, Canonical), 9244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumArgs(numArgs) { 9254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // Fill in the trailing argument array. 9264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 9274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner for (unsigned i = 0; i != numArgs; ++i) 9284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArgInfo[i] = ArgArray[i]; 9294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumArgs - The number of arguments this function has, not counting '...'. 9324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumArgs; 9334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArgInfo - There is an variable size array after the class in memory that 9354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// holds the argument types. 936db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 9374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 938db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek virtual void Destroy(ASTContext& C); 939db4d5970d9243fb699f250f74eab6b7cce901a40Ted Kremenek 9404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 9414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumArgs() const { return NumArgs; } 9424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getArgType(unsigned i) const { 9434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(i < NumArgs && "Invalid argument number!"); 9444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return arg_type_begin()[i]; 9454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic() const { return getSubClassData(); } 9484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef const QualType *arg_type_iterator; 9504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_begin() const { 9514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<const QualType *>(this+1); 9524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 9544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 9584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionProto; 9594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeProto *) { return true; } 9614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID); 9634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 9644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator ArgTys, unsigned NumArgs, 9654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic); 966034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek 967034a78cafc3505323698ea72db19dc5095324e06Ted Kremenekprotected: 968034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 969034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 970034a78cafc3505323698ea72db19dc5095324e06Ted Kremenek friend class Type; 9714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 9724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TypedefType : public Type { 9754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *Decl; 976e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianprotected: 977e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian TypedefType(TypeClass tc, TypedefDecl *D, QualType can) 978e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian : Type(tc, can), Decl(D) { 9794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(!isa<TypedefType>(can) && "Invalid canonical type"); 9804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 9814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 9824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 9834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *getDecl() const { return Decl; } 9854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 9874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// potentially looking through *all* consequtive typedefs. This returns the 9884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// sum of the type qualifiers, so if you have: 9894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef const int A; 9904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef volatile A B; 9914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// looking through the typedefs for B will give you "const volatile A". 9924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType LookThroughTypedefs() const; 9934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 9954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 9964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == TypeName; } 9974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TypedefType *) { return true; } 9982f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek 9992f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenekprotected: 10002f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 10012f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D); 10022f665cd2aa263b89ac880dc45283847e5322a6c2Ted Kremenek friend class Type; 10034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10057cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfExpr (GCC extension). 10067cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfExpr : public Type { 10077cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *TOExpr; 10087cbb14653934a298c09002b87704dc6531261771Steve Naroff TypeOfExpr(Expr *E, QualType can) : Type(TypeOfExp, can), TOExpr(E) { 10097cbb14653934a298c09002b87704dc6531261771Steve Naroff assert(!isa<TypedefType>(can) && "Invalid canonical type"); 10107cbb14653934a298c09002b87704dc6531261771Steve Naroff } 10117cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 10127cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 10137cbb14653934a298c09002b87704dc6531261771Steve Naroff Expr *getUnderlyingExpr() const { return TOExpr; } 10147cbb14653934a298c09002b87704dc6531261771Steve Naroff 10157cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 10167cbb14653934a298c09002b87704dc6531261771Steve Naroff 10177cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExp; } 10187cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfExpr *) { return true; } 10197cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 10207cbb14653934a298c09002b87704dc6531261771Steve Naroff 10217cbb14653934a298c09002b87704dc6531261771Steve Naroff/// TypeOfType (GCC extension). 10227cbb14653934a298c09002b87704dc6531261771Steve Naroffclass TypeOfType : public Type { 10237cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType TOType; 10247cbb14653934a298c09002b87704dc6531261771Steve Naroff TypeOfType(QualType T, QualType can) : Type(TypeOfTyp, can), TOType(T) { 10257cbb14653934a298c09002b87704dc6531261771Steve Naroff assert(!isa<TypedefType>(can) && "Invalid canonical type"); 10267cbb14653934a298c09002b87704dc6531261771Steve Naroff } 10277cbb14653934a298c09002b87704dc6531261771Steve Naroff friend class ASTContext; // ASTContext creates these. 10287cbb14653934a298c09002b87704dc6531261771Steve Naroffpublic: 10297cbb14653934a298c09002b87704dc6531261771Steve Naroff QualType getUnderlyingType() const { return TOType; } 10307cbb14653934a298c09002b87704dc6531261771Steve Naroff 10317cbb14653934a298c09002b87704dc6531261771Steve Naroff virtual void getAsStringInternal(std::string &InnerString) const; 10327cbb14653934a298c09002b87704dc6531261771Steve Naroff 10337cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const Type *T) { return T->getTypeClass() == TypeOfTyp; } 10347cbb14653934a298c09002b87704dc6531261771Steve Naroff static bool classof(const TypeOfType *) { return true; } 10357cbb14653934a298c09002b87704dc6531261771Steve Naroff}; 10364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TagType : public Type { 1038581571c848395ba6c7401b5384f91ead457c9adcTed Kremenek TagDecl *decl; 10391d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 10401d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorprotected: 1041581571c848395ba6c7401b5384f91ead457c9adcTed Kremenek TagType(TagDecl *D, QualType can) : Type(Tagged, can), decl(D) {} 10421d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor 10431d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregorpublic: 1044581571c848395ba6c7401b5384f91ead457c9adcTed Kremenek TagDecl *getDecl() const { return decl; } 10454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 10474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Tagged; } 10494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TagType *) { return true; } 10508db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek 10518db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenekprotected: 10528db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek virtual void EmitImpl(llvm::Serializer& S) const; 105364be4ada44c719304c1dee75fb1e551f84b7779aTed Kremenek static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D); 10548db5aa1ca0d42cf8aeaa78cbe196a50f70fc9fc1Ted Kremenek friend class Type; 10554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 10564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 10571baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 10581baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of structs/unions/classes. 10591baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass RecordType : public TagType { 10601d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor explicit RecordType(RecordDecl *D) : TagType(cast<TagDecl>(D), QualType()) { } 10611d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 10621baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 10631baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10641baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner RecordDecl *getDecl() const { 10651baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 10661baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 10671baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10681baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: This predicate is a helper to QualType/Type. It needs to 10691baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // recursively check all fields for const-ness. If any field is declared 10701baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // const, it needs to return false. 10711baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner bool hasConstFields() const { return false; } 10721baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10731baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // FIXME: RecordType needs to check when it is created that all fields are in 10741baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner // the same address space, and return that. 10751baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner unsigned getAddressSpace() const { return 0; } 10761baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1077eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1078eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1079eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1080eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 10811baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const RecordType *) { return true; } 10821baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 10831baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10841baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// EnumType - This is a helper class that allows the use of isa/cast/dyncast 10851baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner/// to detect TagType objects of enums. 10861baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerclass EnumType : public TagType { 10871d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor explicit EnumType(EnumDecl *D) : TagType(cast<TagDecl>(D), QualType()) { } 10881d661556b9263f4d635372aecdea8c55dac84e83Douglas Gregor friend class ASTContext; // ASTContext creates these. 10891baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattnerpublic: 10901baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 10911baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner EnumDecl *getDecl() const { 10921baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner return reinterpret_cast<EnumDecl*>(TagType::getDecl()); 10931baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner } 10941baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1095eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const TagType *T); 1096eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner static bool classof(const Type *T) { 1097eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner return isa<TagType>(T) && classof(cast<TagType>(T)); 1098eae0eaa09f163aa27d2eb0244ed2d3ebed8eed6fChris Lattner } 10991baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner static bool classof(const EnumType *) { return true; } 11001baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner}; 11011baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 11021baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 11031baaf13ea33c7b60742bf772bca8df2ccc1a51a8Chris Lattner 1104f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for 1105f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// object oriented design. They basically correspond to C++ classes. There 1106f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// are two kinds of interface types, normal interfaces like "NSString" and 1107f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// qualified interfaces, which are qualified with a protocol list like 1108f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// "NSString<NSCopyable, NSAmazing>". Qualified interface types are instances 1109f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType. 111042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCInterfaceType : public Type { 111142730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *Decl; 11120c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanianprotected: 111342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) : 11140c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian Type(tc, QualType()), Decl(D) { } 111581f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff friend class ASTContext; // ASTContext creates these. 111681f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroffpublic: 111781f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 111842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceDecl *getDecl() const { return Decl; } 111981f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 1120f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// qual_iterator and friends: this provides access to the (potentially empty) 1121f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// list of protocols qualifying this interface. If this is an instance of 1122f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an 1123f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// empty list if there are no qualifying protocols. 1124f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1125f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_begin() const; 1126f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline qual_iterator qual_end() const; 1127f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; } 1128f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1129f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// getNumProtocols - Return the number of qualifying protocols in this 1130f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner /// interface type, or 0 if there are none. 1131f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner inline unsigned getNumProtocols() const; 1132f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1133d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner /// getProtocol - Return the specified qualifying protocol. 1134d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner inline ObjCProtocolDecl *getProtocol(unsigned i) const; 113591193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1136f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1137f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 113881f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff static bool classof(const Type *T) { 1139b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner return T->getTypeClass() == ObjCInterface || 1140b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner T->getTypeClass() == ObjCQualifiedInterface; 114181f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff } 114242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCInterfaceType *) { return true; } 114381f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff}; 114481f1bbabbdb7dce07802111e2d9648eedc866d51Steve Naroff 114542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek/// ObjCQualifiedInterfaceType - This class represents interface types 1146e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>. 1147e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1148c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// Duplicate protocols are removed and protocol list is canonicalized to be in 1149c5a342d3b1cc5fa6eef09653a6d8d091928366c0Fariborz Jahanian/// alphabetical order. 115042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedInterfaceType : public ObjCInterfaceType, 11510c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian public llvm::FoldingSetNode { 11520c2f214d3500d1d080afa36b96db40407b91e70dFariborz Jahanian 1153c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List of protocols for this protocol conforming object type 1154c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 1155f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols; 1156c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 115742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D, 1158b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner ObjCProtocolDecl **Protos, unsigned NumP) : 115942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCInterfaceType(ObjCQualifiedInterface, D), 1160d855a6ead44e3a875179400c472ac0b37df35f70Chris Lattner Protocols(Protos, Protos+NumP) { } 116191193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian friend class ASTContext; // ASTContext creates these. 1162c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanianpublic: 1163c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 1164d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner ObjCProtocolDecl *getProtocol(unsigned i) const { 116591193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols[i]; 116691193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 116791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian unsigned getNumProtocols() const { 116891193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian return Protocols.size(); 116991193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian } 1170b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1171b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1172b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1173b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 117491193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 117591193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 117691193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 117791193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian static void Profile(llvm::FoldingSetNodeID &ID, 1178fd5690fe6b5ea1c553dfe20f99d3fef269a50bd1Chris Lattner const ObjCInterfaceDecl *Decl, 117942730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 118091193f64449fe1faf9306a04ade6539d26f44037Fariborz Jahanian 1181c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian static bool classof(const Type *T) { 118242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedInterface; 1183c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian } 118442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedInterfaceType *) { return true; } 1185c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian}; 1186f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1187f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const { 1188f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1189f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1190f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_begin(); 1191f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1192f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1193f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const { 1194f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1195f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1196f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->qual_end(); 1197f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1198f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1199f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1200f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// getNumProtocols - Return the number of qualifying protocols in this 1201f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner/// interface type, or 0 if there are none. 1202f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattnerinline unsigned ObjCInterfaceType::getNumProtocols() const { 1203f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner if (const ObjCQualifiedInterfaceType *QIT = 1204f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner dyn_cast<ObjCQualifiedInterfaceType>(this)) 1205f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return QIT->getNumProtocols(); 1206f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner return 0; 1207f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1208f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1209d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner/// getProtocol - Return the specified qualifying protocol. 1210d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattnerinline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const { 1211d5f8179ed2b75e5c21109f3dd996836b5f743ecdChris Lattner return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i); 1212f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner} 1213f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1214f81d921ec2f5bac3f35a94392fe2b764473884eeChris Lattner 1215e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1216e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// ObjCQualifiedIdType - to represent id<protocol-list>. 1217e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// 1218e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// Duplicate protocols are removed and protocol list is canonicalized to be in 1219e86716008551d268871e9aa7b27ea1b64b462991Chris Lattner/// alphabetical order. 122042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekclass ObjCQualifiedIdType : public Type, 1221e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian public llvm::FoldingSetNode { 1222e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List of protocols for this protocol conforming 'id' type 1223e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian // List is sorted on protocol name. No protocol is enterred more than once. 122442730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols; 1225e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 122642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCQualifiedIdType(QualType can, ObjCProtocolDecl **Protos, unsigned NumP) 122742730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek : Type(ObjCQualifiedId, can), 1228e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian Protocols(Protos, Protos+NumP) { } 1229e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian friend class ASTContext; // ASTContext creates these. 1230e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanianpublic: 1231e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 123242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl *getProtocols(unsigned i) const { 1233e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols[i]; 1234e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 1235e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian unsigned getNumProtocols() const { 1236e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian return Protocols.size(); 1237e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 123842730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **getReferencedProtocols() { 1239957442db1d23f62ee2d0d71310bee240606b267dFariborz Jahanian return &Protocols[0]; 1240b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner } 1241b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner 1242b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator; 1243b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_begin() const { return Protocols.begin(); } 1244b0c6a1fcc5d43696387d2870cc4722581f6db671Chris Lattner qual_iterator qual_end() const { return Protocols.end(); } 1245e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1246e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian virtual void getAsStringInternal(std::string &InnerString) const; 1247e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1248e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian void Profile(llvm::FoldingSetNodeID &ID); 1249e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian static void Profile(llvm::FoldingSetNodeID &ID, 125042730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek ObjCProtocolDecl **protocols, unsigned NumProtocols); 1251e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1252e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian static bool classof(const Type *T) { 125342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return T->getTypeClass() == ObjCQualifiedId; 1254e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian } 125542730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek static bool classof(const ObjCQualifiedIdType *) { return true; } 1256e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian 1257e76e8416ff29ee39140b64ed47731237c67434aeFariborz Jahanian}; 1258c04aff17dcfaa5f628bcfed0e393f2e946ea5184Fariborz Jahanian 12594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1260b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner// Inline function definitions. 12614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 12624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// getCanonicalType - Return the canonical version of this type, with the 12634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// appropriate type qualifiers on it. 12644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerinline QualType QualType::getCanonicalType() const { 126535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner QualType CanType = getTypePtr()->getCanonicalTypeInternal(); 126635fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner return QualType(CanType.getTypePtr(), 126735fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner getCVRQualifiers() | CanType.getCVRQualifiers()); 12684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} 1269b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner 12702a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getUnqualifiedType - Return the type without any qualifiers. 12712a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline QualType QualType::getUnqualifiedType() const { 127235fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner Type *TP = getTypePtr(); 127335fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(TP)) 127435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner TP = ASQT->getBaseType(); 127535fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner return QualType(TP, 0); 12762a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb} 12772a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb 12782a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb/// getAddressSpace - Return the address space of this type. 12792a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lambinline unsigned QualType::getAddressSpace() const { 1280efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman if (const ArrayType *AT = dyn_cast<ArrayType>(getCanonicalType())) 1281efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman return AT->getBaseType().getAddressSpace(); 1282efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman if (const RecordType *RT = dyn_cast<RecordType>(getCanonicalType())) 1283efc11216a5755f69b5540289aa2dd374d4bc82abNate Begeman return RT->getAddressSpace(); 128435fef52886c88e3855745917fcb0bf6a19fa0ba1Chris Lattner if (const ASQualType *ASQT = dyn_cast<ASQualType>(getCanonicalType())) 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} 12925c45be48e6125c5981ad48708dc7e8267bace63aTed Kremenek 1293b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isFunctionType() const { 12942a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<FunctionType>(CanonicalType.getUnqualifiedType()); 1295b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1296b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isPointerType() const { 12972a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<PointerType>(CanonicalType.getUnqualifiedType()); 1298b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1299cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isReferenceType() const { 1300cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<ReferenceType>(CanonicalType.getUnqualifiedType()); 1301cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 1302cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattnerinline bool Type::isPointerLikeType() const { 1303cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner return isa<PointerLikeType>(CanonicalType.getUnqualifiedType()); 1304cfac88de7de7d970a2436af939ea87c0e5a9cf9fChris Lattner} 130583b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenekinline bool Type::isFunctionPointerType() const { 130674a340749eb63af1ba7098c67f3ef72bd48f5ae8Ted Kremenek if (const PointerType* T = getAsPointerType()) 130783b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return T->getPointeeType()->isFunctionType(); 130883b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek else 130983b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek return false; 131083b01279f2e6718581eeb1e5bdba58aa88e4649bTed Kremenek} 1311b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isArrayType() const { 13122a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<ArrayType>(CanonicalType.getUnqualifiedType()); 1313b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1314b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isRecordType() const { 13152a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<RecordType>(CanonicalType.getUnqualifiedType()); 1316b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 13173277df47de6b65b55721726dc3f7b294e70ef6feChris Lattnerinline bool Type::isAnyComplexType() const { 13183277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner return isa<ComplexType>(CanonicalType); 13193277df47de6b65b55721726dc3f7b294e70ef6feChris Lattner} 1320b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattnerinline bool Type::isVectorType() const { 13212a72bb32dfda134cb2bab50f5bb4a6b214f84348Christopher Lamb return isa<VectorType>(CanonicalType.getUnqualifiedType()); 1322b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 1323af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begemaninline bool Type::isExtVectorType() const { 1324af6ed504d90dc3b813c573bfbee8bc0e92e7fdc0Nate Begeman return isa<ExtVectorType>(CanonicalType.getUnqualifiedType()); 1325b0fdfd50e1e4011486d5cb3773e1e87c8ec4325aChris Lattner} 132642730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCInterfaceType() const { 1327b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner return isa<ObjCInterfaceType>(CanonicalType); 1328b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner} 1329b06cf30badcddfea862bc9a538447453bdd94598Chris Lattnerinline bool Type::isObjCQualifiedInterfaceType() const { 1330b06cf30badcddfea862bc9a538447453bdd94598Chris Lattner return isa<ObjCQualifiedInterfaceType>(CanonicalType); 1331550e05034c6c8efcb7ab4c65f58048eee0892237Fariborz Jahanian} 133242730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenekinline bool Type::isObjCQualifiedIdType() const { 133342730c53aeef9ac6c258d317065fdf38da4e043cTed Kremenek return isa<ObjCQualifiedIdType>(CanonicalType); 1334dcb2b1e489948a570ee07ca65e12d42edffa20efFariborz Jahanian} 13354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end namespace clang 13364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 13374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#endif 1338