Type.h revision f30208ad5b334e93582e846a2a0c92f38a607b8a
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===--- Type.h - C Language Family Type Representation ---------*- C++ -*-===//
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//                     The LLVM Compiler Infrastructure
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file is distributed under the University of Illinois Open Source
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// License. See LICENSE.TXT for details.
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===//
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//  This file defines the Type interface and subclasses.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===//
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef LLVM_CLANG_AST_TYPE_H
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define LLVM_CLANG_AST_TYPE_H
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/Basic/Diagnostic.h"
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Support/Casting.h"
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/ADT/APSInt.h"
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/ADT/FoldingSet.h"
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/ADT/PointerIntPair.h"
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "llvm/Bitcode/SerializationFwd.h"
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::isa;
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::cast;
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::cast_or_null;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::dyn_cast;
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing llvm::dyn_cast_or_null;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace clang {
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ASTContext;
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class Type;
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class TypedefDecl;
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class TemplateTypeParmDecl;
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class TagDecl;
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class RecordDecl;
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class CXXRecordDecl;
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class EnumDecl;
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class FieldDecl;
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ObjCInterfaceDecl;
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ObjCProtocolDecl;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ObjCMethodDecl;
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class Expr;
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class Stmt;
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class SourceLocation;
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class PointerLikeType;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class PointerType;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class BlockPointerType;
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ReferenceType;
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class MemberPointerType;
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class VectorType;
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ArrayType;
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ConstantArrayType;
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class VariableArrayType;
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class IncompleteArrayType;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class DependentSizedArrayType;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class RecordType;
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class EnumType;
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ComplexType;
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class TagType;
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class TypedefType;
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class TemplateTypeParmType;
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class FunctionType;
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class FunctionTypeProto;
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ExtVectorType;
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class BuiltinType;
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ObjCInterfaceType;
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ObjCQualifiedIdType;
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class ObjCQualifiedInterfaceType;
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  class StmtIteratorBase;
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// QualType - For efficiency, we don't store CVR-qualified types as nodes on
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// their own: instead each reference to a type stores the qualifiers.  This
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// greatly reduces the number of nodes we need to allocate for types (for
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// example we only need one for 'int', 'const int', 'volatile int',
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 'const volatile int', etc).
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// As an added efficiency bonus, instead of making this a pair, we just store
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// the three bits we care about in the low bits of the pointer.  To handle the
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// packing/unpacking, we make QualType be a simple wrapper class that acts like
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// a smart pointer.
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass QualType {
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  llvm::PointerIntPair<Type*, 3> Value;
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  enum TQ {   // NOTE: These flags must be kept in sync with DeclSpec::TQ.
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Const    = 0x1,
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Restrict = 0x2,
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Volatile = 0x4,
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    CVRFlags = Const|Restrict|Volatile
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  };
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType() {}
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType(const Type *Ptr, unsigned Quals)
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : Value(const_cast<Type*>(Ptr), Quals) {}
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getCVRQualifiers() const { return Value.getInt(); }
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void setCVRQualifiers(unsigned Quals) { Value.setInt(Quals); }
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type *getTypePtr() const { return Value.getPointer(); }
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void *getAsOpaquePtr() const { return Value.getOpaqueValue(); }
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static QualType getFromOpaquePtr(void *Ptr) {
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QualType T;
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    T.Value.setFromOpaqueValue(Ptr);
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T;
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type &operator*() const {
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return *getTypePtr();
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type *operator->() const {
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return getTypePtr();
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isNull - Return true if this QualType doesn't point to a type yet.
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isNull() const {
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return getTypePtr() == 0;
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isConstQualified() const {
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (getCVRQualifiers() & Const) ? true : false;
1225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  }
1235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  bool isVolatileQualified() const {
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (getCVRQualifiers() & Volatile) ? true : false;
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isRestrictQualified() const {
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (getCVRQualifiers() & Restrict) ? true : false;
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isConstant(ASTContext& Ctx) const;
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// addConst/addVolatile/addRestrict - add the specified type qual to this
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// QualType.
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void addConst()    { Value.setInt(Value.getInt() | Const); }
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void addVolatile() { Value.setInt(Value.getInt() | Volatile); }
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void addRestrict() { Value.setInt(Value.getInt() | Restrict); }
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void removeConst()    { Value.setInt(Value.getInt() & ~Const); }
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void removeVolatile() { Value.setInt(Value.getInt() & ~Volatile); }
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void removeRestrict() { Value.setInt(Value.getInt() & ~Restrict); }
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getQualifiedType(unsigned TQs) const {
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return QualType(getTypePtr(), TQs);
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getWithAdditionalQualifiers(unsigned TQs) const {
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return QualType(getTypePtr(), TQs|getCVRQualifiers());
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType withConst() const { return getWithAdditionalQualifiers(Const); }
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType withVolatile() const { return getWithAdditionalQualifiers(Volatile);}
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType withRestrict() const { return getWithAdditionalQualifiers(Restrict);}
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getUnqualifiedType() const;
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isMoreQualifiedThan(QualType Other) const;
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isAtLeastAsQualifiedAs(QualType Other) const;
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getNonReferenceType() const;
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// operator==/!= - Indicate whether the specified types and qualifiers are
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// identical.
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool operator==(const QualType &RHS) const {
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return Value == RHS.Value;
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool operator!=(const QualType &RHS) const {
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return Value != RHS.Value;
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  std::string getAsString() const {
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    std::string S;
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    getAsStringInternal(S);
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return S;
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void getAsStringInternal(std::string &Str) const;
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void dump(const char *s) const;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void dump() const;
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) const {
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(getAsOpaquePtr());
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// getAddressSpace - Return the address space of this type.
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  inline unsigned getAddressSpace() const;
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Emit - Serialize a QualType to Bitcode.
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Emit(llvm::Serializer& S) const;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Read - Deserialize a QualType from Bitcode.
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static QualType ReadVal(llvm::Deserializer& D);
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ReadBackpatch(llvm::Deserializer& D);
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} // end clang.
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace llvm {
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Implement simplify_type for QualType, so that we can dyn_cast from QualType
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// to a specific Type class.
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttemplate<> struct simplify_type<const ::clang::QualType> {
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef ::clang::Type* SimpleType;
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static SimpleType getSimplifiedValue(const ::clang::QualType &Val) {
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return Val.getTypePtr();
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttemplate<> struct simplify_type< ::clang::QualType>
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  : public simplify_type<const ::clang::QualType> {};
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} // end namespace llvm
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectnamespace clang {
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Type - This is the base class of the type hierarchy.  A central concept
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// with types is that each type always has a canonical type.  A canonical type
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// is the type with any typedef names stripped out of it or the types it
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// references.  For example, consider:
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///  typedef int  foo;
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///  typedef foo* bar;
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///    'int *'    'foo *'    'bar'
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// There will be a Type object created for 'int'.  Since int is canonical, its
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// canonicaltype pointer points to itself.  There is also a Type for 'foo' (a
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// TypeNameType).  Its CanonicalType pointer points to the 'int' Type.  Next
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// there is a PointerType that represents 'int*', which, like 'int', is
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// canonical.  Finally, there is a PointerType type for 'foo*' whose canonical
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// type is 'int*', and there is a TypeNameType for 'bar', whose canonical type
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// is also 'int*'.
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Non-canonical types are useful for emitting diagnostics, without losing
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// information about typedefs being used.  Canonical types are useful for type
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// comparisons (they allow by-pointer equality tests) and useful for reasoning
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// about whether something has a particular form (e.g. is a function type),
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// because they implicitly, recursively, strip all typedefs out of a type.
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Types, once created, are immutable.
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass Type {
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  enum TypeClass {
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Builtin, Complex, Pointer, Reference, MemberPointer,
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ConstantArray, VariableArray, IncompleteArray, DependentSizedArray,
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Vector, ExtVector,
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    FunctionNoProto, FunctionProto,
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TypeName, Tagged, ASQual,
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TemplateTypeParm,
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ObjCInterface, ObjCQualifiedInterface,
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ObjCQualifiedId,
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    TypeOfExp, TypeOfTyp, // GNU typeof extension.
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    BlockPointer          // C extension
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  };
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprivate:
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType CanonicalType;
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Dependent - Whether this type is a dependent type (C++ [temp.dep.type]).
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool Dependent : 1;
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// TypeClass bitfield - Enum that specifies what subclass this belongs to.
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Note that this should stay at the end of the ivars for Type so that
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// subclasses can pack their bitfields into the same word.
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned TC : 5;
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // silence VC++ warning C4355: 'this' : used in base member initializer list
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type *this_() { return this; }
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type(TypeClass tc, QualType Canonical, bool dependent)
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : CanonicalType(Canonical.isNull() ? QualType(this_(), 0) : Canonical),
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      Dependent(dependent), TC(tc) {}
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual ~Type() {}
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void Destroy(ASTContext& C);
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void EmitTypeInternal(llvm::Serializer& S) const;
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void ReadTypeInternal(llvm::Deserializer& D);
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  TypeClass getTypeClass() const { return static_cast<TypeClass>(TC); }
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isCanonical() const { return CanonicalType.getTypePtr() == this; }
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Types are partitioned into 3 broad categories (C99 6.2.5p1):
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// object types, function types, and incomplete types.
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isObjectType - types that fully describe objects. An object is a region
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// of memory that can be examined and stored into (H&S).
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isObjectType() const;
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isIncompleteType - Return true if this is an incomplete type.
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// A type that can describe objects, but which lacks information needed to
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// determine its size (e.g. void, or a fwd declared struct). Clients of this
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// routine will need to determine if the size is actually required.
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isIncompleteType() const;
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isIncompleteOrObjectType - Return true if this is an incomplete or object
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// type, in other words, not a function type.
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isIncompleteOrObjectType() const {
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return !isFunctionType();
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10).
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isPODType() const;
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isVariablyModifiedType (C99 6.7.5.2p2) - Return true for variable array
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// types that have a non-constant expression. This does not include "[]".
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isVariablyModifiedType() const;
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Helper methods to distinguish type categories. All type predicates
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// operate on the canonical type, ignoring typedefs and qualifiers.
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isIntegerType() does *not* include complex integers (a GCC extension).
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isComplexIntegerType() can be used to test for complex integers.
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isIntegerType() const;     // C99 6.2.5p17 (int, char, bool, enum)
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isEnumeralType() const;
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isBooleanType() const;
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isCharType() const;
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isWideCharType() const;
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isIntegralType() const;
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Floating point categories.
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isRealFloatingType() const; // C99 6.2.5p10 (float, double, long double)
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isComplexType() does *not* include complex integers (a GCC extension).
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isComplexIntegerType() can be used to test for complex integers.
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isComplexType() const;      // C99 6.2.5p11 (complex)
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isAnyComplexType() const;   // C99 6.2.5p11 (complex) + Complex Int.
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isFloatingType() const;     // C99 6.2.5p11 (real floating + complex)
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isRealType() const;         // C99 6.2.5p17 (real floating + integer)
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isArithmeticType() const;   // C99 6.2.5p18 (integer + floating)
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isVoidType() const;         // C99 6.2.5p19
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isDerivedType() const;      // C99 6.2.5p20
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isScalarType() const;       // C99 6.2.5p21 (arithmetic + pointers)
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isAggregateType() const;    // C99 6.2.5p21 (arrays, structures)
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Type Predicates: Check to see if this type is structurally the specified
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // type, ignoring typedefs and qualifiers.
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isFunctionType() const;
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isPointerLikeType() const; // Pointer or Reference.
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isPointerType() const;
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isBlockPointerType() const;
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isReferenceType() const;
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isFunctionPointerType() const;
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isMemberPointerType() const;
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isMemberFunctionPointerType() const;
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isArrayType() const;
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isConstantArrayType() const;
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isIncompleteArrayType() const;
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isVariableArrayType() const;
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isDependentSizedArrayType() const;
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isRecordType() const;
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isClassType() const;
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isStructureType() const;
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isUnionType() const;
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isComplexIntegerType() const;            // GCC _Complex integer type.
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isVectorType() const;                    // GCC vector type.
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isExtVectorType() const;                 // Extended vector type.
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isObjCInterfaceType() const;             // NSString or NSString<foo>
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isObjCQualifiedInterfaceType() const;    // NSString<foo>
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isObjCQualifiedIdType() const;           // id<foo>
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isTemplateTypeParmType() const;          // C++ template type parameter
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isDependentType - Whether this type is a dependent type, meaning
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// that its definition somehow depends on a template parameter
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// (C++ [temp.dep.type]).
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isDependentType() const { return Dependent; }
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isOverloadType() const;                  // C++ overloaded function
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Type Checking Functions: Check to see if this type is structurally the
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // specified type, ignoring typedefs and qualifiers, and return a pointer to
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // the best type we can.
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const BuiltinType *getAsBuiltinType() const;
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const FunctionType *getAsFunctionType() const;
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const FunctionTypeProto *getAsFunctionTypeProto() const;
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const PointerLikeType *getAsPointerLikeType() const; // Pointer or Reference.
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const PointerType *getAsPointerType() const;
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const BlockPointerType *getAsBlockPointerType() const;
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ReferenceType *getAsReferenceType() const;
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const MemberPointerType *getAsMemberPointerType() const;
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const RecordType *getAsRecordType() const;
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const RecordType *getAsStructureType() const;
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// NOTE: getAs*ArrayType are methods on ASTContext.
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const TypedefType *getAsTypedefType() const;
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const RecordType *getAsUnionType() const;
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const EnumType *getAsEnumType() const;
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const VectorType *getAsVectorType() const; // GCC vector type.
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ComplexType *getAsComplexType() const;
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ComplexType *getAsComplexIntegerType() const; // GCC complex int type.
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ExtVectorType *getAsExtVectorType() const; // Extended vector type.
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ObjCInterfaceType *getAsObjCInterfaceType() const;
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ObjCQualifiedInterfaceType *getAsObjCQualifiedInterfaceType() const;
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ObjCQualifiedIdType *getAsObjCQualifiedIdType() const;
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const TemplateTypeParmType *getAsTemplateTypeParmType() const;
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// getAsPointerToObjCInterfaceType - If this is a pointer to an ObjC
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// interface, return the interface type, otherwise return null.
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const ObjCInterfaceType *getAsPointerToObjCInterfaceType() const;
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// getArrayElementTypeNoTypeQual - If this is an array type, return the
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// element type of the array, potentially with type qualifiers missing.
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// This method should never be used when type qualifiers are meaningful.
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const Type *getArrayElementTypeNoTypeQual() const;
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// getDesugaredType - Return the specified type with any "sugar" removed from
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// the type.  This takes off typedefs, typeof's etc.  If the outer level of
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// the type is already concrete, it returns it unmodified.  This is similar
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// to getting the canonical type, but it doesn't remove *all* typedefs.  For
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// concrete.
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getDesugaredType() const;
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// More type predicates useful for type checking/promotion
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isPromotableIntegerType() const; // C99 6.3.1.1p2
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isSignedIntegerType - Return true if this is an integer type that is
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// an enum decl which has a signed representation, or a vector of signed
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// integer element type.
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isSignedIntegerType() const;
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isUnsignedIntegerType - Return true if this is an integer type that is
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// decl which has an unsigned representation, or a vector of unsigned integer
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// element type.
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isUnsignedIntegerType() const;
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// isConstantSizeType - Return true if this is not a variable sized type,
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// according to the rules of C99 6.7.5p3.  It is not legal to call this on
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// incomplete types.
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isConstantSizeType() const;
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getCanonicalTypeInternal() const { return CanonicalType; }
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void dump() const;
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const = 0;
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *) { return true; }
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Emit - Emit a Type to bitcode.  Used by ASTContext.
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Emit(llvm::Serializer& S) const;
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// Create - Construct a Type from bitcode.  Used by ASTContext.
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Create(ASTContext& Context, unsigned i, llvm::Deserializer& S);
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// EmitImpl - Subclasses must implement this method in order to
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ///  be serialized.
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // FIXME: Make this abstract once implemented.
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const {
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    assert (false && "Serializization for type not supported.");
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ASQualType - TR18037 (C embedded extensions) 6.2.5p26
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// This supports address space qualified types.
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ASQualType : public Type, public llvm::FoldingSetNode {
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// BaseType - This is the underlying type that this qualifies.  All CVR
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// qualifiers are stored on the QualType that references this type, so we
4572910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner  /// can't have any here.
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type *BaseType;
4592910f183ddd5286911bc1e3499ea93cb57de8b75David 'Digit' Turner  /// Address Space ID - The address space ID this type is qualified with.
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned AddressSpace;
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ASQualType(Type *Base, QualType CanonicalPtr, unsigned AddrSpace) :
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Type(ASQual, CanonicalPtr, Base->isDependentType()), BaseType(Base),
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AddressSpace(AddrSpace) {
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Type *getBaseType() const { return BaseType; }
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getAddressSpace() const { return AddressSpace; }
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getBaseType(), AddressSpace);
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, Type *Base,
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      unsigned AddrSpace) {
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(Base);
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddInteger(AddrSpace);
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) { return T->getTypeClass() == ASQual; }
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const ASQualType *) { return true; }
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// BuiltinType - This class is used for builtin types like 'int'.  Builtin
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// types are always canonical and have a literal name field.
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass BuiltinType : public Type {
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  enum Kind {
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Void,
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Bool,     // This is bool and/or _Bool.
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Char_U,   // This is 'char' for targets where char is unsigned.
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    UChar,    // This is explicitly qualified unsigned char.
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    UShort,
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    UInt,
5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ULong,
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ULongLong,
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Char_S,   // This is 'char' for targets where char is signed.
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SChar,    // This is explicitly qualified signed char.
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    WChar,    // This is 'wchar_t' for C++.
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Short,
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Int,
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Long,
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    LongLong,
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Float, Double, LongDouble,
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Overload,  // This represents the type of an overloaded function declaration.
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Dependent  // This represents the type of a type-dependent expression.
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  };
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprivate:
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Kind TypeKind;
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  BuiltinType(Kind K)
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : Type(Builtin, QualType(), /*Dependent=*/(K == Dependent)),
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      TypeKind(K) {}
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Kind getKind() const { return TypeKind; }
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const char *getName() const;
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) { return T->getTypeClass() == Builtin; }
5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const BuiltinType *) { return true; }
5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ComplexType - C99 6.2.5p11 - Complex values.  This supports the C99 complex
5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// types (_Complex float etc) as well as the GCC integer complex extensions.
5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ComplexType : public Type, public llvm::FoldingSetNode {
5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType ElementType;
5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ComplexType(QualType Element, QualType CanonicalPtr) :
5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Type(Complex, CanonicalPtr, Element->isDependentType()),
5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ElementType(Element) {
5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getElementType() const { return ElementType; }
5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getElementType());
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType Element) {
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(Element.getAsOpaquePtr());
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) { return T->getTypeClass() == Complex; }
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const ComplexType *) { return true; }
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// PointerLikeType - Common base class for pointers and references.
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FIXME: Add more documentation on this classes design point. For example,
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// should BlockPointerType inherit from it? Is the concept of a PointerLikeType
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// in the C++ standard?
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass PointerLikeType : public Type {
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType PointeeType;
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PointerLikeType(TypeClass K, QualType Pointee, QualType CanonicalPtr) :
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Type(K, CanonicalPtr, Pointee->isDependentType()), PointeeType(Pointee) {
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getPointeeType() const { return PointeeType; }
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == Pointer || T->getTypeClass() == Reference;
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const PointerLikeType *) { return true; }
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// PointerType - C99 6.7.5.1 - Pointer Declarators.
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass PointerType : public PointerLikeType, public llvm::FoldingSetNode {
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  PointerType(QualType Pointee, QualType CanonicalPtr) :
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PointerLikeType(Pointer, Pointee, CanonicalPtr) {
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getPointeeType());
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(Pointee.getAsOpaquePtr());
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) { return T->getTypeClass() == Pointer; }
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const PointerType *) { return true; }
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// BlockPointerType - pointer to a block type.
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// This type is to represent types syntactically represented as
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// "void (^)(int)", etc. Pointee is required to always be a function type.
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FIXME: Should BlockPointerType inherit from PointerLikeType? It could
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// simplfy some type checking code, however PointerLikeType doesn't appear
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// to be used by the type checker.
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass BlockPointerType : public Type, public llvm::FoldingSetNode {
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType PointeeType;  // Block is some kind of pointer type
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  BlockPointerType(QualType Pointee, QualType CanonicalCls) :
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Type(BlockPointer, CanonicalCls, Pointee->isDependentType()),
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PointeeType(Pointee) {
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // Get the pointee type. Pointee is required to always be a function type.
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getPointeeType() const { return PointeeType; }
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      Profile(ID, getPointeeType());
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee) {
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ID.AddPointer(Pointee.getAsOpaquePtr());
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == BlockPointer;
6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const BlockPointerType *) { return true; }
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  protected:
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    virtual void EmitImpl(llvm::Serializer& S) const;
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    friend class Type;
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ReferenceType - C++ 8.3.2 - Reference Declarators.
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ReferenceType : public PointerLikeType, public llvm::FoldingSetNode {
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ReferenceType(QualType Referencee, QualType CanonicalRef) :
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PointerLikeType(Reference, Referencee, CanonicalRef) {
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getPointeeType());
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType Referencee) {
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(Referencee.getAsOpaquePtr());
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) { return T->getTypeClass() == Reference; }
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const ReferenceType *) { return true; }
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// MemberPointerType - C++ 8.3.3 - Pointers to members
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass MemberPointerType : public Type, public llvm::FoldingSetNode {
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType PointeeType;
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// The class of which the pointee is a member. Must ultimately be a
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// RecordType, but could be a typedef or a template parameter too.
6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const Type *Class;
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  MemberPointerType(QualType Pointee, const Type *Cls, QualType CanonicalPtr) :
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Type(MemberPointer, CanonicalPtr,
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         Cls->isDependentType() || Pointee->isDependentType()),
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    PointeeType(Pointee), Class(Cls) {
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext; // ASTContext creates these.
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getPointeeType() const { return PointeeType; }
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const Type *getClass() const { return Class; }
6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getPointeeType(), getClass());
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType Pointee,
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      const Type *Class) {
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(Pointee.getAsOpaquePtr());
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(Class);
7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == MemberPointer;
7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const MemberPointerType *) { return true; }
7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ArrayType - C99 6.7.5.2 - Array Declarators.
7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ArrayType : public Type, public llvm::FoldingSetNode {
7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4])
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// an array with a static size (e.g. int X[static 4]), or an array
7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// with a star size (e.g. int X[*]).
7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// 'static' is only allowed on function parameters.
7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  enum ArraySizeModifier {
7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Normal, Static, Star
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  };
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprivate:
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// ElementType - The element type of the array.
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType ElementType;
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // NOTE: VC++ treats enums as signed, avoid using the ArraySizeModifier enum
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// NOTE: These fields are packed into the bitfields space in the Type class.
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned SizeModifier : 2;
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// IndexTypeQuals - Capture qualifiers in declarations like:
7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// 'int X[static restrict 4]'. For function parameters only.
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned IndexTypeQuals : 3;
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // C++ [temp.dep.type]p1:
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //   A type is dependent if it is...
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //     - an array type constructed from any dependent type or whose
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //       size is specified by a constant expression that is
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  //       value-dependent,
7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ArrayType(TypeClass tc, QualType et, QualType can,
7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            ArraySizeModifier sm, unsigned tq)
7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : Type(tc, can, et->isDependentType() || tc == DependentSizedArray),
7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ElementType(et), SizeModifier(sm), IndexTypeQuals(tq) {}
7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getElementType() const { return ElementType; }
7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ArraySizeModifier getSizeModifier() const {
7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return ArraySizeModifier(SizeModifier);
7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getIndexTypeQualifier() const { return IndexTypeQuals; }
7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == ConstantArray ||
7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           T->getTypeClass() == VariableArray ||
7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           T->getTypeClass() == IncompleteArray ||
7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           T->getTypeClass() == DependentSizedArray;
7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const ArrayType *) { return true; }
7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ConstantArrayType - This class represents C arrays with a specified constant
7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// size.  For example 'int A[100]' has ConstantArrayType where the element type
7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// is 'int' and the size is 100.
7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ConstantArrayType : public ArrayType {
7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  llvm::APInt Size; // Allows us to unique the type.
7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ConstantArrayType(QualType et, QualType can, llvm::APInt sz,
7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    ArraySizeModifier sm, unsigned tq)
7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : ArrayType(ConstantArray, et, can, sm, tq), Size(sz) {}
7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  const llvm::APInt &getSize() const { return Size; }
7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getElementType(), getSize());
7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType ET,
7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      llvm::APInt ArraySize) {
7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(ET.getAsOpaquePtr());
7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddInteger(ArraySize.getZExtValue());
7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == ConstantArray;
7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const ConstantArrayType *) { return true; }
7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// IncompleteArrayType - This class represents C arrays with an unspecified
8068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// size.  For example 'int A[]' has an IncompleteArrayType where the element
8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// type is 'int' and the size is unspecified.
8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass IncompleteArrayType : public ArrayType {
8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  IncompleteArrayType(QualType et, QualType can,
8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    ArraySizeModifier sm, unsigned tq)
8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : ArrayType(IncompleteArray, et, can, sm, tq) {}
8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == IncompleteArray;
8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const IncompleteArrayType *) { return true; }
8218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class StmtIteratorBase;
8238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
8258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getElementType());
8268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType ET) {
8298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(ET.getAsOpaquePtr());
8308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
8338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
8348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
8358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
8368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
8378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// VariableArrayType - This class represents C arrays with a specified size
8398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// which is not an integer-constant-expression.  For example, 'int s[x+foo()]'.
8408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Since the size expression is an arbitrary expression, we store it as such.
8418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
8428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Note: VariableArrayType's aren't uniqued (since the expressions aren't) and
8438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// should not be: two lexically equivalent variable array types could mean
8448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// different things, for example, these variables do not have the same type
8458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// dynamically:
8468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
8478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// void foo(int x) {
8488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///   int Y[x];
8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///   ++x;
8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///   int Z[x];
8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// }
8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VariableArrayType : public ArrayType {
8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// SizeExpr - An assignment expression. VLA's are only permitted within
8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// a function block.
8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Stmt *SizeExpr;
8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  VariableArrayType(QualType et, QualType can, Expr *e,
8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    ArraySizeModifier sm, unsigned tq)
8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : ArrayType(VariableArray, et, can, sm, tq), SizeExpr((Stmt*) e) {}
8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void Destroy(ASTContext& C);
8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
8658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Expr *getSizeExpr() const {
8668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    // We use C-style casts instead of cast<> here because we do not wish
8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    // to have a dependency of Type.h on Stmt.h/Expr.h.
8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (Expr*) SizeExpr;
8698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == VariableArray;
8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const VariableArrayType *) { return true; }
8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class StmtIteratorBase;
8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    assert (0 && "Cannnot unique VariableArrayTypes.");
8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// DependentSizedArrayType - This type represents an array type in
8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// C++ whose size is a value-dependent expression. For example:
8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// @code
8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// template<typename T, int Size>
8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class array {
8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///   T data[Size];
8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// };
8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// @endcode
8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// For these types, we won't actually know what the array bound is
8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// until template instantiation occurs, at which point this will
9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// become either a ConstantArrayType or a VariableArrayType.
9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass DependentSizedArrayType : public ArrayType {
9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// SizeExpr - An assignment expression that will instantiate to the
9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// size of the array.
9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Stmt *SizeExpr;
9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  DependentSizedArrayType(QualType et, QualType can, Expr *e,
9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project			  ArraySizeModifier sm, unsigned tq)
9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : ArrayType(DependentSizedArray, et, can, sm, tq), SizeExpr((Stmt*) e) {}
9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void Destroy(ASTContext& C);
9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  Expr *getSizeExpr() const {
9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    // We use C-style casts instead of cast<> here because we do not wish
9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    // to have a dependency of Type.h on Stmt.h/Expr.h.
9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return (Expr*) SizeExpr;
9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == DependentSizedArray;
9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const DependentSizedArrayType *) { return true; }
9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class StmtIteratorBase;
9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    assert (0 && "Cannnot unique DependentSizedArrayTypes.");
9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
9338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// VectorType - GCC generic vector type. This type is created using
9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// __attribute__((vector_size(n)), where "n" specifies the vector size in
9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// bytes. Since the constructor takes the number of vector elements, the
9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// client is responsible for converting the size into the number of elements.
9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass VectorType : public Type, public llvm::FoldingSetNode {
9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// ElementType - The element type of the vector.
9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType ElementType;
9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// NumElements - The number of elements in the vector.
9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned NumElements;
9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  VectorType(QualType vecType, unsigned nElements, QualType canonType) :
9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Type(Vector, canonType, vecType->isDependentType()),
9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ElementType(vecType), NumElements(nElements) {}
9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  VectorType(TypeClass tc, QualType vecType, unsigned nElements,
9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project             QualType canonType)
9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : Type(tc, canonType, vecType->isDependentType()), ElementType(vecType),
9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      NumElements(nElements) {}
9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getElementType() const { return ElementType; }
9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getNumElements() const { return NumElements; }
9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID) {
9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Profile(ID, getElementType(), getNumElements(), getTypeClass());
9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType ElementType,
9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      unsigned NumElements, TypeClass TypeClass) {
9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddPointer(ElementType.getAsOpaquePtr());
9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddInteger(NumElements);
9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ID.AddInteger(TypeClass);
9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == Vector || T->getTypeClass() == ExtVector;
9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const VectorType *) { return true; }
9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// ExtVectorType - Extended vector type. This type is created using
9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// __attribute__((ext_vector_type(n)), where "n" is the number of elements.
9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// Unlike vector_size, ext_vector_type is only allowed on typedef's. This
9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class enables syntactic extensions, like Vector Components for accessing
9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// points, colors, and textures (modeled after OpenGL Shading Language).
9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass ExtVectorType : public VectorType {
9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ExtVectorType(QualType vecType, unsigned nElements, QualType canonType) :
9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    VectorType(ExtVector, vecType, nElements, canonType) {}
9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static int getPointAccessorIdx(char c) {
9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (c) {
9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    default: return -1;
9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'x': return 0;
9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'y': return 1;
9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'z': return 2;
9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    case 'w': return 3;
9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static int getNumericAccessorIdx(char c) {
10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    switch (c) {
10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      default: return -1;
10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '0': return 0;
10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '1': return 1;
10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '2': return 2;
10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '3': return 3;
10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '4': return 4;
10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '5': return 5;
10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '6': return 6;
10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '7': return 7;
10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '8': return 8;
10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case '9': return 9;
10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case 'a': return 10;
10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case 'b': return 11;
10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case 'c': return 12;
10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case 'd': return 13;
10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case 'e': return 14;
10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      case 'f': return 15;
10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static int getAccessorIdx(char c) {
10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (int idx = getPointAccessorIdx(c)+1) return idx-1;
10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return getNumericAccessorIdx(c);
10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isAccessorWithinNumElements(char c) const {
10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (int idx = getAccessorIdx(c)+1)
10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      return unsigned(idx-1) < NumElements;
10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return false;
10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == ExtVector;
10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const ExtVectorType *) { return true; }
10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FunctionType - C99 6.7.5.3 - Function Declarators.  This is the common base
10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class of FunctionTypeNoProto and FunctionTypeProto.
10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project///
10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FunctionType : public Type {
10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// SubClassData - This field is owned by the subclass, put here to pack
10448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// tightly with the ivars in Type.
10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool SubClassData : 1;
10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// TypeQuals - Used only by FunctionTypeProto, put here to pack with the
10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// other bitfields.
10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// The qualifiers are part of FunctionTypeProto because...
10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ///
10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// C++ 8.3.5p4: The return type, the parameter type list and the
10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// cv-qualifier-seq, [...], are part of the function type.
10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ///
10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned TypeQuals : 3;
10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // The type returned by the function.
10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType ResultType;
10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  FunctionType(TypeClass tc, QualType res, bool SubclassInfo,
10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               unsigned typeQuals, QualType Canonical, bool Dependent)
10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : Type(tc, Canonical, Dependent),
10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      SubClassData(SubclassInfo), TypeQuals(typeQuals), ResultType(res) {}
10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool getSubClassData() const { return SubClassData; }
10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getTypeQuals() const { return TypeQuals; }
10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getResultType() const { return ResultType; }
10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == FunctionNoProto ||
10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           T->getTypeClass() == FunctionProto;
10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const FunctionType *) { return true; }
10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FunctionTypeNoProto - Represents a K&R-style 'int foo()' function, which has
10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// no information available about its arguments.
10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FunctionTypeNoProto : public FunctionType, public llvm::FoldingSetNode {
10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  FunctionTypeNoProto(QualType Result, QualType Canonical)
10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : FunctionType(FunctionNoProto, Result, false, 0, Canonical,
10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   /*Dependent=*/false) {}
10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  // No additional state past what FunctionType provides.
10865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  virtual void getAsStringInternal(std::string &InnerString) const;
10885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  void Profile(llvm::FoldingSetNodeID &ID) {
10905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    Profile(ID, getResultType());
10915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  }
10925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  static void Profile(llvm::FoldingSetNodeID &ID, QualType ResultType) {
10935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    ID.AddPointer(ResultType.getAsOpaquePtr());
10945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  }
10955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
10965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  static bool classof(const Type *T) {
10975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    return T->getTypeClass() == FunctionNoProto;
10985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  }
10995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  static bool classof(const FunctionTypeNoProto *) { return true; }
11005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner
11015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerprotected:
11025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner  virtual void EmitImpl(llvm::Serializer& S) const;
11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// FunctionTypeProto - Represents a prototype with argument type info, e.g.
11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 'int foo(int)' or 'int foo(void)'.  'void' is represented as having no
11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// arguments, not as having a single void argument.
11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass FunctionTypeProto : public FunctionType, public llvm::FoldingSetNode {
11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// hasAnyDependentType - Determine whether there are any dependent
11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// types within the arguments passed in.
11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool hasAnyDependentType(const QualType *ArgArray, unsigned numArgs) {
11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (unsigned Idx = 0; Idx < numArgs; ++Idx)
11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      if (ArgArray[Idx]->isDependentType())
11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return true;
11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return false;
11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  FunctionTypeProto(QualType Result, const QualType *ArgArray, unsigned numArgs,
11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    bool isVariadic, unsigned typeQuals, QualType Canonical)
11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : FunctionType(FunctionProto, Result, isVariadic, typeQuals, Canonical,
11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                   (Result->isDependentType() ||
11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    hasAnyDependentType(ArgArray, numArgs))),
11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      NumArgs(numArgs) {
11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    // Fill in the trailing argument array.
11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    QualType *ArgInfo = reinterpret_cast<QualType *>(this+1);;
11295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    for (unsigned i = 0; i != numArgs; ++i)
11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project      ArgInfo[i] = ArgArray[i];
11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// NumArgs - The number of arguments this function has, not counting '...'.
11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned NumArgs;
11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// ArgInfo - There is an variable size array after the class in memory that
11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// holds the argument types.
11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getNumArgs() const { return NumArgs; }
11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  QualType getArgType(unsigned i) const {
11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    assert(i < NumArgs && "Invalid argument number!");
11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return arg_type_begin()[i];
11468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
11478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  bool isVariadic() const { return getSubClassData(); }
11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  unsigned getTypeQuals() const { return FunctionType::getTypeQuals(); }
11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  typedef const QualType *arg_type_iterator;
11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  arg_type_iterator arg_type_begin() const {
11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return reinterpret_cast<const QualType *>(this+1);
11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  arg_type_iterator arg_type_end() const { return arg_type_begin()+NumArgs; }
11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void getAsStringInternal(std::string &InnerString) const;
11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const Type *T) {
11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T->getTypeClass() == FunctionProto;
11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static bool classof(const FunctionTypeProto *) { return true; }
11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  void Profile(llvm::FoldingSetNodeID &ID);
11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static void Profile(llvm::FoldingSetNodeID &ID, QualType Result,
11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      arg_type_iterator ArgTys, unsigned NumArgs,
11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                      bool isVariadic, unsigned TypeQuals);
11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  virtual void EmitImpl(llvm::Serializer& S) const;
11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class Type;
11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass TypedefType : public Type {
11778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  TypedefDecl *Decl;
11788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectprotected:
11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  TypedefType(TypeClass tc, TypedefDecl *D, QualType can)
11808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    : Type(tc, can, can->isDependentType()), Decl(D) {
11818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    assert(!isa<TypedefType>(can) && "Invalid canonical type");
11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  }
11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  friend class ASTContext;  // ASTContext creates these.
11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectpublic:
11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  TypedefDecl *getDecl() const { return Decl; }
11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// potentially looking through *all* consequtive typedefs.  This returns the
11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// sum of the type qualifiers, so if you have:
11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ///   typedef const int A;
11928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  ///   typedef volatile A B;
11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  /// looking through the typedefs for B will give you "const volatile A".
1194  QualType LookThroughTypedefs() const;
1195
1196  virtual void getAsStringInternal(std::string &InnerString) const;
1197
1198  static bool classof(const Type *T) { return T->getTypeClass() == TypeName; }
1199  static bool classof(const TypedefType *) { return true; }
1200
1201protected:
1202  virtual void EmitImpl(llvm::Serializer& S) const;
1203  static Type* CreateImpl(ASTContext& Context,llvm::Deserializer& D);
1204  friend class Type;
1205};
1206
1207/// TypeOfExpr (GCC extension).
1208class TypeOfExpr : public Type {
1209  Expr *TOExpr;
1210  TypeOfExpr(Expr *E, QualType can);
1211  friend class ASTContext;  // ASTContext creates these.
1212public:
1213  Expr *getUnderlyingExpr() const { return TOExpr; }
1214
1215  virtual void getAsStringInternal(std::string &InnerString) const;
1216
1217  static bool classof(const Type *T) { return T->getTypeClass() == TypeOfExp; }
1218  static bool classof(const TypeOfExpr *) { return true; }
1219
1220protected:
1221  virtual void EmitImpl(llvm::Serializer& S) const;
1222  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
1223  friend class Type;
1224};
1225
1226/// TypeOfType (GCC extension).
1227class TypeOfType : public Type {
1228  QualType TOType;
1229  TypeOfType(QualType T, QualType can)
1230    : Type(TypeOfTyp, can, T->isDependentType()), TOType(T) {
1231    assert(!isa<TypedefType>(can) && "Invalid canonical type");
1232  }
1233  friend class ASTContext;  // ASTContext creates these.
1234public:
1235  QualType getUnderlyingType() const { return TOType; }
1236
1237  virtual void getAsStringInternal(std::string &InnerString) const;
1238
1239  static bool classof(const Type *T) { return T->getTypeClass() == TypeOfTyp; }
1240  static bool classof(const TypeOfType *) { return true; }
1241
1242protected:
1243  virtual void EmitImpl(llvm::Serializer& S) const;
1244  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
1245  friend class Type;
1246};
1247
1248class TagType : public Type {
1249  /// Stores the TagDecl associated with this type. The decl will
1250  /// point to the TagDecl that actually defines the entity (or is a
1251  /// definition in progress), if there is such a definition. The
1252  /// single-bit value will be non-zero when this tag is in the
1253  /// process of being defined.
1254  llvm::PointerIntPair<TagDecl *, 1> decl;
1255  friend class ASTContext;
1256  friend class TagDecl;
1257
1258protected:
1259  // FIXME: We'll need the user to pass in information about whether
1260  // this type is dependent or not, because we don't have enough
1261  // information to compute it here.
1262  TagType(TagDecl *D, QualType can)
1263    : Type(Tagged, can, /*Dependent=*/false), decl(D, 0) {}
1264
1265public:
1266  TagDecl *getDecl() const { return decl.getPointer(); }
1267
1268  /// @brief Determines whether this type is in the process of being
1269  /// defined.
1270  bool isBeingDefined() const { return decl.getInt(); }
1271  void setBeingDefined(bool Def) { decl.setInt(Def? 1 : 0); }
1272
1273  virtual void getAsStringInternal(std::string &InnerString) const;
1274
1275  static bool classof(const Type *T) { return T->getTypeClass() == Tagged; }
1276  static bool classof(const TagType *) { return true; }
1277
1278protected:
1279  virtual void EmitImpl(llvm::Serializer& S) const;
1280  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
1281  friend class Type;
1282};
1283
1284/// RecordType - This is a helper class that allows the use of isa/cast/dyncast
1285/// to detect TagType objects of structs/unions/classes.
1286class RecordType : public TagType {
1287protected:
1288  explicit RecordType(RecordDecl *D)
1289    : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { }
1290  friend class ASTContext;   // ASTContext creates these.
1291public:
1292
1293  RecordDecl *getDecl() const {
1294    return reinterpret_cast<RecordDecl*>(TagType::getDecl());
1295  }
1296
1297  // FIXME: This predicate is a helper to QualType/Type. It needs to
1298  // recursively check all fields for const-ness. If any field is declared
1299  // const, it needs to return false.
1300  bool hasConstFields() const { return false; }
1301
1302  // FIXME: RecordType needs to check when it is created that all fields are in
1303  // the same address space, and return that.
1304  unsigned getAddressSpace() const { return 0; }
1305
1306  static bool classof(const TagType *T);
1307  static bool classof(const Type *T) {
1308    return isa<TagType>(T) && classof(cast<TagType>(T));
1309  }
1310  static bool classof(const RecordType *) { return true; }
1311};
1312
1313/// CXXRecordType - This is a helper class that allows the use of
1314/// isa/cast/dyncast to detect TagType objects of C++ structs/unions/classes.
1315class CXXRecordType : public RecordType {
1316  explicit CXXRecordType(CXXRecordDecl *D)
1317    : RecordType(reinterpret_cast<RecordDecl*>(D)) { }
1318  friend class ASTContext;   // ASTContext creates these.
1319public:
1320
1321  CXXRecordDecl *getDecl() const {
1322    return reinterpret_cast<CXXRecordDecl*>(RecordType::getDecl());
1323  }
1324
1325  static bool classof(const TagType *T);
1326  static bool classof(const Type *T) {
1327    return isa<TagType>(T) && classof(cast<TagType>(T));
1328  }
1329  static bool classof(const CXXRecordType *) { return true; }
1330};
1331
1332/// EnumType - This is a helper class that allows the use of isa/cast/dyncast
1333/// to detect TagType objects of enums.
1334class EnumType : public TagType {
1335  explicit EnumType(EnumDecl *D)
1336    : TagType(reinterpret_cast<TagDecl*>(D), QualType()) { }
1337  friend class ASTContext;   // ASTContext creates these.
1338public:
1339
1340  EnumDecl *getDecl() const {
1341    return reinterpret_cast<EnumDecl*>(TagType::getDecl());
1342  }
1343
1344  static bool classof(const TagType *T);
1345  static bool classof(const Type *T) {
1346    return isa<TagType>(T) && classof(cast<TagType>(T));
1347  }
1348  static bool classof(const EnumType *) { return true; }
1349};
1350
1351class TemplateTypeParmType : public Type {
1352  TemplateTypeParmDecl *Decl;
1353
1354protected:
1355  TemplateTypeParmType(TemplateTypeParmDecl *D)
1356    : Type(TemplateTypeParm, QualType(this, 0), /*Dependent=*/true), Decl(D) { }
1357
1358  friend class ASTContext; // ASTContext creates these
1359
1360public:
1361  TemplateTypeParmDecl *getDecl() const { return Decl; }
1362
1363  virtual void getAsStringInternal(std::string &InnerString) const;
1364
1365  static bool classof(const Type *T) {
1366    return T->getTypeClass() == TemplateTypeParm;
1367  }
1368  static bool classof(const TemplateTypeParmType *T) { return true; }
1369
1370protected:
1371  virtual void EmitImpl(llvm::Serializer& S) const;
1372  static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
1373  friend class Type;
1374};
1375
1376/// ObjCInterfaceType - Interfaces are the core concept in Objective-C for
1377/// object oriented design.  They basically correspond to C++ classes.  There
1378/// are two kinds of interface types, normal interfaces like "NSString" and
1379/// qualified interfaces, which are qualified with a protocol list like
1380/// "NSString<NSCopyable, NSAmazing>".  Qualified interface types are instances
1381/// of ObjCQualifiedInterfaceType, which is a subclass of ObjCInterfaceType.
1382class ObjCInterfaceType : public Type {
1383  ObjCInterfaceDecl *Decl;
1384protected:
1385  ObjCInterfaceType(TypeClass tc, ObjCInterfaceDecl *D) :
1386    Type(tc, QualType(), /*Dependent=*/false), Decl(D) { }
1387  friend class ASTContext;  // ASTContext creates these.
1388public:
1389
1390  ObjCInterfaceDecl *getDecl() const { return Decl; }
1391
1392  /// qual_iterator and friends: this provides access to the (potentially empty)
1393  /// list of protocols qualifying this interface.  If this is an instance of
1394  /// ObjCQualifiedInterfaceType it returns the list, otherwise it returns an
1395  /// empty list if there are no qualifying protocols.
1396  typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
1397  inline qual_iterator qual_begin() const;
1398  inline qual_iterator qual_end() const;
1399  bool qual_empty() const { return getTypeClass() != ObjCQualifiedInterface; }
1400
1401  /// getNumProtocols - Return the number of qualifying protocols in this
1402  /// interface type, or 0 if there are none.
1403  inline unsigned getNumProtocols() const;
1404
1405  /// getProtocol - Return the specified qualifying protocol.
1406  inline ObjCProtocolDecl *getProtocol(unsigned i) const;
1407
1408
1409  virtual void getAsStringInternal(std::string &InnerString) const;
1410  static bool classof(const Type *T) {
1411    return T->getTypeClass() == ObjCInterface ||
1412           T->getTypeClass() == ObjCQualifiedInterface;
1413  }
1414  static bool classof(const ObjCInterfaceType *) { return true; }
1415};
1416
1417/// ObjCQualifiedInterfaceType - This class represents interface types
1418/// conforming to a list of protocols, such as INTF<Proto1, Proto2, Proto1>.
1419///
1420/// Duplicate protocols are removed and protocol list is canonicalized to be in
1421/// alphabetical order.
1422class ObjCQualifiedInterfaceType : public ObjCInterfaceType,
1423                                   public llvm::FoldingSetNode {
1424
1425  // List of protocols for this protocol conforming object type
1426  // List is sorted on protocol name. No protocol is enterred more than once.
1427  llvm::SmallVector<ObjCProtocolDecl*, 4> Protocols;
1428
1429  ObjCQualifiedInterfaceType(ObjCInterfaceDecl *D,
1430                             ObjCProtocolDecl **Protos, unsigned NumP) :
1431    ObjCInterfaceType(ObjCQualifiedInterface, D),
1432    Protocols(Protos, Protos+NumP) { }
1433  friend class ASTContext;  // ASTContext creates these.
1434public:
1435
1436  ObjCProtocolDecl *getProtocol(unsigned i) const {
1437    return Protocols[i];
1438  }
1439  unsigned getNumProtocols() const {
1440    return Protocols.size();
1441  }
1442
1443  qual_iterator qual_begin() const { return Protocols.begin(); }
1444  qual_iterator qual_end() const   { return Protocols.end(); }
1445
1446  virtual void getAsStringInternal(std::string &InnerString) const;
1447
1448  void Profile(llvm::FoldingSetNodeID &ID);
1449  static void Profile(llvm::FoldingSetNodeID &ID,
1450                      const ObjCInterfaceDecl *Decl,
1451                      ObjCProtocolDecl **protocols, unsigned NumProtocols);
1452
1453  static bool classof(const Type *T) {
1454    return T->getTypeClass() == ObjCQualifiedInterface;
1455  }
1456  static bool classof(const ObjCQualifiedInterfaceType *) { return true; }
1457};
1458
1459inline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_begin() const {
1460  if (const ObjCQualifiedInterfaceType *QIT =
1461         dyn_cast<ObjCQualifiedInterfaceType>(this))
1462    return QIT->qual_begin();
1463  return 0;
1464}
1465inline ObjCInterfaceType::qual_iterator ObjCInterfaceType::qual_end() const {
1466  if (const ObjCQualifiedInterfaceType *QIT =
1467         dyn_cast<ObjCQualifiedInterfaceType>(this))
1468    return QIT->qual_end();
1469  return 0;
1470}
1471
1472/// getNumProtocols - Return the number of qualifying protocols in this
1473/// interface type, or 0 if there are none.
1474inline unsigned ObjCInterfaceType::getNumProtocols() const {
1475  if (const ObjCQualifiedInterfaceType *QIT =
1476        dyn_cast<ObjCQualifiedInterfaceType>(this))
1477    return QIT->getNumProtocols();
1478  return 0;
1479}
1480
1481/// getProtocol - Return the specified qualifying protocol.
1482inline ObjCProtocolDecl *ObjCInterfaceType::getProtocol(unsigned i) const {
1483  return cast<ObjCQualifiedInterfaceType>(this)->getProtocol(i);
1484}
1485
1486
1487
1488/// ObjCQualifiedIdType - to represent id<protocol-list>.
1489///
1490/// Duplicate protocols are removed and protocol list is canonicalized to be in
1491/// alphabetical order.
1492class ObjCQualifiedIdType : public Type,
1493                            public llvm::FoldingSetNode {
1494  // List of protocols for this protocol conforming 'id' type
1495  // List is sorted on protocol name. No protocol is enterred more than once.
1496  llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols;
1497
1498  ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP)
1499    : Type(ObjCQualifiedId, QualType()/*these are always canonical*/,
1500           /*Dependent=*/false),
1501  Protocols(Protos, Protos+NumP) { }
1502  friend class ASTContext;  // ASTContext creates these.
1503public:
1504
1505  ObjCProtocolDecl *getProtocols(unsigned i) const {
1506    return Protocols[i];
1507  }
1508  unsigned getNumProtocols() const {
1509    return Protocols.size();
1510  }
1511  ObjCProtocolDecl **getReferencedProtocols() {
1512    return &Protocols[0];
1513  }
1514
1515  typedef llvm::SmallVector<ObjCProtocolDecl*, 8>::const_iterator qual_iterator;
1516  qual_iterator qual_begin() const { return Protocols.begin(); }
1517  qual_iterator qual_end() const   { return Protocols.end(); }
1518
1519  virtual void getAsStringInternal(std::string &InnerString) const;
1520
1521  void Profile(llvm::FoldingSetNodeID &ID);
1522  static void Profile(llvm::FoldingSetNodeID &ID,
1523                      ObjCProtocolDecl **protocols, unsigned NumProtocols);
1524
1525  static bool classof(const Type *T) {
1526    return T->getTypeClass() == ObjCQualifiedId;
1527  }
1528  static bool classof(const ObjCQualifiedIdType *) { return true; }
1529
1530};
1531
1532
1533// Inline function definitions.
1534
1535/// getUnqualifiedType - Return the type without any qualifiers.
1536inline QualType QualType::getUnqualifiedType() const {
1537  Type *TP = getTypePtr();
1538  if (const ASQualType *ASQT = dyn_cast<ASQualType>(TP))
1539    TP = ASQT->getBaseType();
1540  return QualType(TP, 0);
1541}
1542
1543/// getAddressSpace - Return the address space of this type.
1544inline unsigned QualType::getAddressSpace() const {
1545  QualType CT = getTypePtr()->getCanonicalTypeInternal();
1546  if (const ArrayType *AT = dyn_cast<ArrayType>(CT))
1547    return AT->getElementType().getAddressSpace();
1548  if (const RecordType *RT = dyn_cast<RecordType>(CT))
1549    return RT->getAddressSpace();
1550  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CT))
1551    return ASQT->getAddressSpace();
1552  return 0;
1553}
1554
1555/// isMoreQualifiedThan - Determine whether this type is more
1556/// qualified than the Other type. For example, "const volatile int"
1557/// is more qualified than "const int", "volatile int", and
1558/// "int". However, it is not more qualified than "const volatile
1559/// int".
1560inline bool QualType::isMoreQualifiedThan(QualType Other) const {
1561  // FIXME: Handle address spaces
1562  unsigned MyQuals = this->getCVRQualifiers();
1563  unsigned OtherQuals = Other.getCVRQualifiers();
1564  assert(this->getAddressSpace() == 0 && "Address space not checked");
1565  assert(Other.getAddressSpace() == 0 && "Address space not checked");
1566  return MyQuals != OtherQuals && (MyQuals | OtherQuals) == MyQuals;
1567}
1568
1569/// isAtLeastAsQualifiedAs - Determine whether this type is at last
1570/// as qualified as the Other type. For example, "const volatile
1571/// int" is at least as qualified as "const int", "volatile int",
1572/// "int", and "const volatile int".
1573inline bool QualType::isAtLeastAsQualifiedAs(QualType Other) const {
1574  // FIXME: Handle address spaces
1575  unsigned MyQuals = this->getCVRQualifiers();
1576  unsigned OtherQuals = Other.getCVRQualifiers();
1577  assert(this->getAddressSpace() == 0 && "Address space not checked");
1578  assert(Other.getAddressSpace() == 0 && "Address space not checked");
1579  return (MyQuals | OtherQuals) == MyQuals;
1580}
1581
1582/// getNonReferenceType - If Type is a reference type (e.g., const
1583/// int&), returns the type that the reference refers to ("const
1584/// int"). Otherwise, returns the type itself. This routine is used
1585/// throughout Sema to implement C++ 5p6:
1586///
1587///   If an expression initially has the type "reference to T" (8.3.2,
1588///   8.5.3), the type is adjusted to "T" prior to any further
1589///   analysis, the expression designates the object or function
1590///   denoted by the reference, and the expression is an lvalue.
1591inline QualType QualType::getNonReferenceType() const {
1592  if (const ReferenceType *RefType = (*this)->getAsReferenceType())
1593    return RefType->getPointeeType();
1594  else
1595    return *this;
1596}
1597
1598inline const TypedefType* Type::getAsTypedefType() const {
1599  return dyn_cast<TypedefType>(this);
1600}
1601inline const ObjCInterfaceType *Type::getAsPointerToObjCInterfaceType() const {
1602  if (const PointerType *PT = getAsPointerType())
1603    return PT->getPointeeType()->getAsObjCInterfaceType();
1604  return 0;
1605}
1606
1607// NOTE: All of these methods use "getUnqualifiedType" to strip off address
1608// space qualifiers if present.
1609inline bool Type::isFunctionType() const {
1610  return isa<FunctionType>(CanonicalType.getUnqualifiedType());
1611}
1612inline bool Type::isPointerType() const {
1613  return isa<PointerType>(CanonicalType.getUnqualifiedType());
1614}
1615inline bool Type::isBlockPointerType() const {
1616    return isa<BlockPointerType>(CanonicalType);
1617}
1618inline bool Type::isReferenceType() const {
1619  return isa<ReferenceType>(CanonicalType.getUnqualifiedType());
1620}
1621inline bool Type::isPointerLikeType() const {
1622  return isa<PointerLikeType>(CanonicalType.getUnqualifiedType());
1623}
1624inline bool Type::isFunctionPointerType() const {
1625  if (const PointerType* T = getAsPointerType())
1626    return T->getPointeeType()->isFunctionType();
1627  else
1628    return false;
1629}
1630inline bool Type::isMemberPointerType() const {
1631  return isa<MemberPointerType>(CanonicalType.getUnqualifiedType());
1632}
1633inline bool Type::isMemberFunctionPointerType() const {
1634  if (const MemberPointerType* T = getAsMemberPointerType())
1635    return T->getPointeeType()->isFunctionType();
1636  else
1637    return false;
1638}
1639inline bool Type::isArrayType() const {
1640  return isa<ArrayType>(CanonicalType.getUnqualifiedType());
1641}
1642inline bool Type::isConstantArrayType() const {
1643  return isa<ConstantArrayType>(CanonicalType.getUnqualifiedType());
1644}
1645inline bool Type::isIncompleteArrayType() const {
1646  return isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType());
1647}
1648inline bool Type::isVariableArrayType() const {
1649  return isa<VariableArrayType>(CanonicalType.getUnqualifiedType());
1650}
1651inline bool Type::isDependentSizedArrayType() const {
1652  return isa<DependentSizedArrayType>(CanonicalType.getUnqualifiedType());
1653}
1654inline bool Type::isRecordType() const {
1655  return isa<RecordType>(CanonicalType.getUnqualifiedType());
1656}
1657inline bool Type::isAnyComplexType() const {
1658  return isa<ComplexType>(CanonicalType.getUnqualifiedType());
1659}
1660inline bool Type::isVectorType() const {
1661  return isa<VectorType>(CanonicalType.getUnqualifiedType());
1662}
1663inline bool Type::isExtVectorType() const {
1664  return isa<ExtVectorType>(CanonicalType.getUnqualifiedType());
1665}
1666inline bool Type::isObjCInterfaceType() const {
1667  return isa<ObjCInterfaceType>(CanonicalType.getUnqualifiedType());
1668}
1669inline bool Type::isObjCQualifiedInterfaceType() const {
1670  return isa<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType());
1671}
1672inline bool Type::isObjCQualifiedIdType() const {
1673  return isa<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType());
1674}
1675inline bool Type::isTemplateTypeParmType() const {
1676  return isa<TemplateTypeParmType>(CanonicalType.getUnqualifiedType());
1677}
1678
1679inline bool Type::isOverloadType() const {
1680  if (const BuiltinType *BT = getAsBuiltinType())
1681    return BT->getKind() == BuiltinType::Overload;
1682  else
1683    return false;
1684}
1685
1686/// Insertion operator for diagnostics.  This allows sending QualType's into a
1687/// diagnostic with <<.
1688inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB,
1689                                           QualType T) {
1690  DB.AddTaggedVal(reinterpret_cast<intptr_t>(T.getAsOpaquePtr()),
1691                  Diagnostic::ak_qualtype);
1692  return DB;
1693}
1694
1695}  // end namespace clang
1696
1697#endif
1698