Type.h revision 2cb6638a26cfa999e5fb999e6af9211127e681c1
14b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner//===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===// 24b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 34b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// The LLVM Compiler Infrastructure 44b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 54b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// This file was developed by Chris Lattner and is distributed under 64b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// the University of Illinois Open Source 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" 194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::isa; 214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::cast; 224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::cast_or_null; 234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::dyn_cast; 244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerusing llvm::dyn_cast_or_null; 254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace clang { 274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ASTContext; 284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Type; 294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class TypedefDecl; 304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class TagDecl; 314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class RecordDecl; 324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class EnumDecl; 334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class Expr; 344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class SourceLocation; 354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class PointerType; 364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ReferenceType; 374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class VectorType; 384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner class ArrayType; 392cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff class RecordType; 404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// QualType - For efficiency, we don't store CVR-qualified types as nodes on 424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// their own: instead each reference to a type stores the qualifiers. This 434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// greatly reduces the number of nodes we need to allocate for types (for 444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// example we only need one for 'int', 'const int', 'volatile int', 454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'const volatile int', etc). 464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// As an added efficiency bonus, instead of making this a pair, we just store 484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// the three bits we care about in the low bits of the pointer. To handle the 494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// packing/unpacking, we make QualType be a simple wrapper class that acts like 504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// a smart pointer. 514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass QualType { 524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner uintptr_t ThePtr; 534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TQ { // NOTE: These flags must be kept in sync with DeclSpec::TQ. 554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Const = 0x1, 564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Restrict = 0x2, 574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Volatile = 0x4, 584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner CVRFlags = Const|Restrict|Volatile 594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType() : ThePtr(0) {} 624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType(Type *Ptr, unsigned Quals) { 644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert((Quals & ~CVRFlags) == 0 && "Invalid type qualifiers!"); 654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ThePtr = reinterpret_cast<uintptr_t>(Ptr); 664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert((ThePtr & CVRFlags) == 0 && "Type pointer not 8-byte aligned?"); 674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ThePtr |= Quals; 684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static QualType getFromOpaquePtr(void *Ptr) { 714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType T; 724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T.ThePtr = reinterpret_cast<uintptr_t>(Ptr); 734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T; 744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getQualifiers() const { 774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr & CVRFlags; 784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type *getTypePtr() const { 804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<Type*>(ThePtr & ~CVRFlags); 814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void *getAsOpaquePtr() const { 844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<void*>(ThePtr); 854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type &operator*() const { 884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return *getTypePtr(); 894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type *operator->() const { 924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return getTypePtr(); 934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isNull - Return true if this QualType doesn't point to a type yet. 964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isNull() const { 974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr == 0; 984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isConstQualified() const { 1014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr & Const; 1024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVolatileQualified() const { 1044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr & Volatile; 1054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRestrictQualified() const { 1074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr & Restrict; 1084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getQualifiedType(unsigned TQs) const { 1114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return QualType(getTypePtr(), TQs); 1124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getUnqualifiedType() const { 1154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return QualType(getTypePtr(), 0); 1164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// operator==/!= - Indicate whether the specified types and qualifiers are 1194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// identical. 1204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator==(const QualType &RHS) const { 1214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr == RHS.ThePtr; 1224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool operator!=(const QualType &RHS) const { 1244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return ThePtr != RHS.ThePtr; 1254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string getAsString() const { 1274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner std::string S; 1284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getAsStringInternal(S); 1294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return S; 1304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void getAsStringInternal(std::string &Str) const; 1324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void dump(const char *s = 0) const; 1344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// getCanonicalType - Return the canonical version of this type, with the 1364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// appropriate type qualifiers on it. 1374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner inline QualType getCanonicalType() const; 1384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 1404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 1414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end clang. 1434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace llvm { 1454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Implement simplify_type for QualType, so that we can dyn_cast from QualType 1464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// to a specific Type class. 1474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnertemplate<> struct simplify_type<const ::clang::QualType> { 1484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef ::clang::Type* SimpleType; 1494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static SimpleType getSimplifiedValue(const ::clang::QualType &Val) { 1504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return Val.getTypePtr(); 1514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 1524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 1534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnertemplate<> struct simplify_type< ::clang::QualType> 1544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : public simplify_type<const ::clang::QualType> {}; 1554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} 1564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnernamespace clang { 1584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Type - This is the base class of the type hierarchy. A central concept 1604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// with types is that each type always has a canonical type. A canonical type 1614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// is the type with any typedef names stripped out of it or the types it 1624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// references. For example, consider: 1634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 1644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// typedef int foo; 1654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// typedef foo* bar; 1664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int *' 'foo *' 'bar' 1674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 1684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// There will be a Type object created for 'int'. Since int is canonical, its 1694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// canonicaltype pointer points to itself. There is also a Type for 'foo' (a 1704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// TypeNameType). Its CanonicalType pointer points to the 'int' Type. Next 1714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// there is a PointerType that represents 'int*', which, like 'int', is 1724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// canonical. Finally, there is a PointerType type for 'foo*' whose canonical 1734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// type is 'int*', and there is a TypeNameType for 'bar', whose canonical type 1744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// is also 'int*'. 1754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 1764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Non-canonical types are useful for emitting diagnostics, without losing 1774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// information about typedefs being used. Canonical types are useful for type 1784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// comparisons (they allow by-pointer equality tests) and useful for reasoning 1794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// about whether something has a particular form (e.g. is a function type), 1804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// because they implicitly, recursively, strip all typedefs out of a type. 1814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 1824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Types, once created, are immutable. 1834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 1844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass Type { 1854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 1864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum TypeClass { 1874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Builtin, Complex, Pointer, Reference, Array, Vector, OCUVector, 1884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionNoProto, FunctionProto, 1894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypeName, Tagged 1904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 1914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 1924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType CanonicalType; 1934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 1944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// TypeClass bitfield - Enum that specifies what subclass this belongs to. 1954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Note that this should stay at the end of the ivars for Type so that 1964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// subclasses can pack their bitfields into the same word. 1974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypeClass TC : 4; 1984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 1994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(TypeClass tc, QualType Canonical) 2004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : CanonicalType(Canonical.isNull() ? QualType(this,0) : Canonical), TC(tc){} 2014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual ~Type(); 2024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; 2034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 2044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypeClass getTypeClass() const { return TC; } 2054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isCanonical() const { return CanonicalType.getTypePtr() == this; } 2074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Types are partitioned into 3 broad categories (C99 6.2.5p1): 2094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// object types, function types, and incomplete types. 2104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isObjectType - types that fully describe objects. An object is a region 2124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// of memory that can be examined and stored into (H&S). 2134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isObjectType() const; 2144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isFunctionType - types that describe functions. 2164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isFunctionType() const; 2174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isIncompleteType - Return true if this is an incomplete type. 2194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// A type that can describe objects, but which lacks information needed to 2204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// determine its size (e.g. void, or a fwd declared struct). Clients of this 2214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// routine will need to determine if the size is actually required. 2224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIncompleteType() const; 2234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Helper methods to distinguish type categories. All type predicates 2254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// operate on the canonical type, ignoring typedefs. 2264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isIntegerType() const; // C99 6.2.5p17 (int, char, bool, enum) 2274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Floating point categories. 2294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double) 2304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isComplexType() const; // C99 6.2.5p11 (complex) 2314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isFloatingType() const; // C99 6.2.5p11 (real floating + complex) 2324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isRealType() const; // C99 6.2.5p17 (real floating + integer) 2334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isArithmeticType() const; // C99 6.2.5p18 (integer + floating) 2344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Vector types 2364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const VectorType *isVectorType() const; // GCC vector type. 2374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Derived types (C99 6.2.5p20). isFunctionType() is also a derived type. 2394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isDerivedType() const; 2404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const PointerType *isPointerType() const; 2414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const ReferenceType *isReferenceType() const; 2424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const ArrayType *isArrayType() const; 2432cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff const RecordType *isRecordType() const; 2444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isStructureType() const; 2454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isUnionType() const; 2464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVoidType() const; // C99 6.2.5p19 2484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isScalarType() const; // C99 6.2.5p21 (arithmetic + pointers) 2494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isAggregateType() const; // C99 6.2.5p21 (arrays, structures) 2504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// More type predicates useful for type checking/promotion 2524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isPromotableIntegerType() const; // C99 6.3.1.1p2 2534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isSignedIntegerType - Return true if this is an integer type that is 2554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// signed, according to C99 6.2.5p4. 2564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isSignedIntegerType() const; 2574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isUnsignedIntegerType - Return true if this is an integer type that is 2594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// unsigned, according to C99 6.2.5p6. Note that this returns true for _Bool. 2604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isUnsignedIntegerType() const; 2614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// isConstantSizeType - Return true if this is not a variable sized type, 2634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// according to the rules of C99 6.7.5p3. If Loc is non-null, it is set to 2644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// the location of the subexpression that makes it a vla type. It is not 2654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// legal to call this on incomplete types. 2664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isConstantSizeType(ASTContext &Ctx, SourceLocation *Loc = 0) const; 2674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Compatibility predicates used to check assignment expressions. 2694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool typesAreCompatible(QualType, QualType); // C99 6.2.7p1 2704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool tagTypesAreCompatible(QualType, QualType); // C99 6.2.7p1 2714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool pointerTypesAreCompatible(QualType, QualType); // C99 6.7.5.1p2 2724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool referenceTypesAreCompatible(QualType, QualType); // C++ 5.17p6 2734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool functionTypesAreCompatible(QualType, QualType); // C99 6.7.5.3p15 2744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool arrayTypesAreCompatible(QualType, QualType); // C99 6.7.5.2p6 2754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 2764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getCanonicalTypeInternal() const { return CanonicalType; } 2774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class QualType; 2784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 2794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const = 0; 2804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *) { return true; } 2824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 2834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// BuiltinType - This class is used for builtin types like 'int'. Builtin 2854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types are always canonical and have a literal name field. 2864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass BuiltinType : public Type { 2874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 2884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum Kind { 2894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Void, 2904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Bool, // This is bool and/or _Bool. 2924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_U, // This is 'char' for targets where char is unsigned. 2934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UChar, // This is explicitly qualified unsigned char. 2944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UShort, 2954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner UInt, 2964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULong, 2974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ULongLong, 2984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 2994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Char_S, // This is 'char' for targets where char is signed. 3004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner SChar, // This is explicitly qualified signed char. 3014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Short, 3024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Int, 3034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Long, 3044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner LongLong, 3054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Float, Double, LongDouble 3074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 3084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 3094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind TypeKind; 3104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 3114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner BuiltinType(Kind K) : Type(Builtin, QualType()), TypeKind(K) {} 3124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Kind getKind() const { return TypeKind; } 3144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner const char *getName() const; 3154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 3174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Builtin; } 3194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const BuiltinType *) { return true; } 3204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 3214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ComplexType - C99 6.2.5p11 - Complex values. This supports the C99 complex 3234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// types (_Complex float etc) as well as the GCC integer complex extensions. 3244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 3254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ComplexType : public Type, public llvm::FoldingSetNode { 3264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 3274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ComplexType(QualType Element, QualType CanonicalPtr) : 3284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Complex, CanonicalPtr), ElementType(Element) { 3294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 3314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 3324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 3334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 3354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 3384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType()); 3394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) { 3414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Element.getAsOpaquePtr()); 3424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Complex; } 3454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ComplexType *) { return true; } 3464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 3474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// PointerType - C99 6.7.5.1 - Pointer Declarators. 3504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 3514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass PointerType : public Type, public llvm::FoldingSetNode { 3524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType PointeeType; 3534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner PointerType(QualType Pointee, QualType CanonicalPtr) : 3544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Pointer, CanonicalPtr), PointeeType(Pointee) { 3554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 3574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 3584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getPointeeType() const { return PointeeType; } 3604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 3624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 3654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getPointeeType()); 3664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) { 3684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Pointee.getAsOpaquePtr()); 3694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Pointer; } 3724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const PointerType *) { return true; } 3734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 3744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ReferenceType - C++ 8.3.2 - Reference Declarators. 3764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 3774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ReferenceType : public Type, public llvm::FoldingSetNode { 3784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ReferenceeType; 3794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ReferenceType(QualType Referencee, QualType CanonicalRef) : 3804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Reference, CanonicalRef), ReferenceeType(Referencee) { 3814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 3834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 3844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 3854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getReferenceeType() const { return ReferenceeType; } 3874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 3894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getReferenceeType()); 3904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) { 3924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(Referencee.getAsOpaquePtr()); 3934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 3944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Reference; } 3964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ReferenceType *) { return true; } 3974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 3984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 3994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ArrayType - C99 6.7.5.2 - Array Declarators. 4004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 4014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass ArrayType : public Type, public llvm::FoldingSetNode { 4024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) 4044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// an array with a static size (e.g. int X[static 4]), or with a star size 4054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// (e.g. int X[*]). 4064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner enum ArraySizeModifier { 4074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Normal, Static, Star 4084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner }; 4094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprivate: 4104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NOTE: These fields are packed into the bitfields space in the Type class. 4114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArraySizeModifier SizeModifier : 2; 4124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// IndexTypeQuals - Capture qualifiers in declarations like: 4144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// 'int X[static restrict 4]'. 4154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned IndexTypeQuals : 3; 4164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ElementType - The element type of the array. 4184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 4194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// SizeExpr - The size is either a constant or assignment expression (for 4214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// Variable Length Arrays). VLA's are only permitted within a function block. 4224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Expr *SizeExpr; 4234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArrayType(QualType et, ArraySizeModifier sm, unsigned tq, QualType can, 4254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Expr *e) 4264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : Type(Array, can), SizeModifier(sm), IndexTypeQuals(tq), ElementType(et), 4274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner SizeExpr(e) {} 4284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 4294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 4324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArraySizeModifier getSizeModifier() const { return SizeModifier; } 4334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getIndexTypeQualifier() const { return IndexTypeQuals; } 4344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Expr *getSizeExpr() const { return SizeExpr; } 4354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 4374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 4394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getSizeModifier(), getIndexTypeQualifier(), getElementType(), 4404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getSizeExpr()); 4414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 4424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, 4434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArraySizeModifier SizeModifier, 4444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned IndexTypeQuals, QualType ElementType, 4454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Expr *SizeExpr) { 4464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(SizeModifier); 4474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(IndexTypeQuals); 4484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ElementType.getAsOpaquePtr()); 4494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(SizeExpr); 4504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 4514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Array; } 4534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const ArrayType *) { return true; } 4544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// VectorType - GCC generic vector type. This type is created using 4574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// __attribute__((vector_size(n)), where "n" specifies the vector size in 4584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// bytes. Since the constructor takes the number of vector elements, the 4594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// client is responsible for converting the size into the number of elements. 4604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass VectorType : public Type, public llvm::FoldingSetNode { 4614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 4624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ElementType - The element type of the vector. 4634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ElementType; 4644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumElements - The number of elements in the vector. 4664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements; 4674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(QualType vecType, unsigned nElements, QualType canonType) : 4694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Type(Vector, canonType), ElementType(vecType), NumElements(nElements) {} 4704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(TypeClass tc, QualType vecType, unsigned nElements, 4714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType canonType) : Type(tc, canonType), ElementType(vecType), 4724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumElements(nElements) {} 4734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 4744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 4754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getElementType() const { return ElementType; } 4774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumElements() const { return NumElements; } 4784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 4804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 4824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getElementType(), getNumElements(), getTypeClass()); 4834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 4844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType, 4854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumElements, TypeClass TypeClass) { 4864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ElementType.getAsOpaquePtr()); 4874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(NumElements); 4884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddInteger(TypeClass); 4894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 4904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 4914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == Vector || T->getTypeClass() == OCUVector; 4924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 4934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const VectorType *) { return true; } 4944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 4954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 4964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// OCUVectorType - Extended vector type. This type is created using 4974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// __attribute__((ocu_vector_type(n)), where "n" is the number of elements. 4984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// Unlike vector_size, ocu_vector_type is only allowed on typedef's. 4994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// This class will enable syntactic extensions, like C++ style initializers. 5004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass OCUVectorType : public VectorType { 5014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner OCUVectorType(QualType vecType, unsigned nElements, QualType canonType) : 5024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner VectorType(OCUVector, vecType, nElements, canonType) {} 5034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const VectorType *T) { 5064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == OCUVector; 5074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const OCUVectorType *) { return true; } 5094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionType - C99 6.7.5.3 - Function Declarators. This is the common base 5124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// class of FunctionTypeNoProto and FunctionTypeProto. 5134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 5144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionType : public Type { 5154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// SubClassData - This field is owned by the subclass, put here to pack 5164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// tightly with the ivars in Type. 5174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool SubClassData : 1; 5184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // The type returned by the function. 5204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType ResultType; 5214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerprotected: 5224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionType(TypeClass tc, QualType res, bool SubclassInfo,QualType Canonical) 5234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : Type(tc, Canonical), SubClassData(SubclassInfo), ResultType(res) {} 5244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool getSubClassData() const { return SubClassData; } 5254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getResultType() const { return ResultType; } 5284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 5314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto || 5324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner T->getTypeClass() == FunctionProto; 5334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionType *) { return true; } 5354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has 5384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// no information available about its arguments. 5394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode { 5404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeNoProto(QualType Result, QualType Canonical) 5414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : FunctionType(FunctionNoProto, Result, false, Canonical) {} 5424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // No additional state past what FunctionType provides. 5454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID) { 5494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner Profile(ID, getResultType()); 5504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) { 5524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ID.AddPointer(ResultType.getAsOpaquePtr()); 5534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5554b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 5564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionNoProto; 5574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5584b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeNoProto *) { return true; } 5594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 5604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// FunctionTypeProto - Represents a prototype with argument type info, e.g. 5624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// 'int foo(int)' or 'int foo(void)'. 'void' is represented as having no 5634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// arguments, not as having a single void argument. 5644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode { 5654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner FunctionTypeProto(QualType Result, QualType *ArgArray, unsigned numArgs, 5664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic, QualType Canonical) 5674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner : FunctionType(FunctionProto, Result, isVariadic, Canonical), 5684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner NumArgs(numArgs) { 5694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // Fill in the trailing argument array. 5704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);; 5714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner for (unsigned i = 0; i != numArgs; ++i) 5724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner ArgInfo[i] = ArgArray[i]; 5734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// NumArgs - The number of arguments this function has, not counting '...'. 5764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned NumArgs; 5774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// ArgInfo - There is an variable size array after the class in memory that 5794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// holds the argument types. 5804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 5814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 5824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner unsigned getNumArgs() const { return NumArgs; } 5834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType getArgType(unsigned i) const { 5844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(i < NumArgs && "Invalid argument number!"); 5854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return arg_type_begin()[i]; 5864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic() const { return getSubClassData(); } 5894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner typedef const QualType *arg_type_iterator; 5914b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_begin() const { 5924b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<const QualType *>(this+1); 5934b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 5944b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; } 5954b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5964b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 5974b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 5984b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { 5994b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return T->getTypeClass() == FunctionProto; 6004b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6014b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const FunctionTypeProto *) { return true; } 6024b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6034b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner void Profile(llvm::FoldingSetNodeID &ID); 6044b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static void Profile(llvm::FoldingSetNodeID &ID, QualType Result, 6054b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner arg_type_iterator ArgTys, unsigned NumArgs, 6064b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool isVariadic); 6074b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 6084b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6094b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6104b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TypedefType : public Type { 6114b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *Decl; 6124b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefType(TypedefDecl *D, QualType can) : Type(TypeName, can), Decl(D) { 6134b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner assert(!isa<TypedefType>(can) && "Invalid canonical type"); 6144b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6154b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 6164b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6174b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6184b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TypedefDecl *getDecl() const { return Decl; } 6194b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6204b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 6214b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// potentially looking through *all* consequtive typedefs. This returns the 6224b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// sum of the type qualifiers, so if you have: 6234b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef const int A; 6244b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// typedef volatile A B; 6254b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner /// looking through the typedefs for B will give you "const volatile A". 6264b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner QualType LookThroughTypedefs() const; 6274b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6284b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 6294b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6304b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == TypeName; } 6314b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TypedefType *) { return true; } 6324b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 6334b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6344b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6354b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass TagType : public Type { 6364b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TagDecl *Decl; 6374b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TagType(TagDecl *D, QualType can) : Type(Tagged, can), Decl(D) {} 6384b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner friend class ASTContext; // ASTContext creates these. 6394b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6404b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6414b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner TagDecl *getDecl() const { return Decl; } 6424b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6434b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner virtual void getAsStringInternal(std::string &InnerString) const; 6444b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6454b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T) { return T->getTypeClass() == Tagged; } 6464b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const TagType *) { return true; } 6474b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 6484b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6494b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// RecordType - This is a helper class that allows the use of isa/cast/dyncast 6504b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// to detect TagType objects of structs/unions/classes. 6514b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerclass RecordType : public TagType { 6524b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner RecordType(); // DO NOT IMPLEMENT 6534b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerpublic: 6544b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6552cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff const RecordDecl *getDecl() { 6564b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 6574b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6582cb6638a26cfa999e5fb999e6af9211127e681c1Steve Naroff RecordDecl *getDecl() const { 6594b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return reinterpret_cast<RecordDecl*>(TagType::getDecl()); 6604b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner } 6614b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6624b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // FIXME: This predicate is a helper to QualType/Type. It needs to 6634b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // recursively check all fields for const-ness. If any field is declared 6644b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner // const, it needs to return false. 6654b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner bool hasConstFields() const { return false; } 6664b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6674b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const Type *T); 6684b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner static bool classof(const RecordType *) { return true; } 6694b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner}; 6704b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6714b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6724b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// ... 6734b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6744b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// TODO: When we support C++, we should have types for uses of template with 6754b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// default parameters. We should be able to distinguish source use of 6764b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// 'std::vector<int>' from 'std::vector<int, std::allocator<int> >'. Though they 6774b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// specify the same type, we want to print the default argument only if 6784b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner// specified in the source code. 6794b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6804b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// getCanonicalType - Return the canonical version of this type, with the 6814b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner/// appropriate type qualifiers on it. 6824b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattnerinline QualType QualType::getCanonicalType() const { 6834b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner return QualType(getTypePtr()->getCanonicalTypeInternal().getTypePtr(), 6844b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getQualifiers() | 6854b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner getTypePtr()->getCanonicalTypeInternal().getQualifiers()); 6864b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} 6874b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6884b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner} // end namespace clang 6894b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner 6904b0096578e961587d1ec0ed5dce45f592a65ed4Chris Lattner#endif 691