Type.cpp revision c15cb2af27514ecc879daba9aa01389c5203685d
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- Type.cpp - Type representation and manipulation ------------------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file implements type-related functionality.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes#include "clang/AST/ASTContext.h"
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Type.h"
1649aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis#include "clang/AST/DeclCXX.h"
17980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h"
18aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregor#include "clang/AST/DeclTemplate.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Expr.h"
20d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/StringExtras.h"
22bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor#include "llvm/Support/raw_ostream.h"
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
254bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattnerbool QualType::isConstant(ASTContext &Ctx) const {
26b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes  if (isConstQualified())
27b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes    return true;
28b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes
29b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes  if (getTypePtr()->isArrayType())
30b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes    return Ctx.getAsArrayType(*this)->getElementType().isConstant(Ctx);
31b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes
32b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes  return false;
33b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes}
34b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes
35566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenekvoid Type::Destroy(ASTContext& C) {
36566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenek  this->~Type();
373e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate(this);
384b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek}
394b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek
407e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregorvoid ConstantArrayWithExprType::Destroy(ASTContext& C) {
417e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // FIXME: destruction of SizeExpr commented out due to resource contention.
427e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // SizeExpr->Destroy(C);
437e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // See FIXME in SemaDecl.cpp:1536: if we were able to either steal
447e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // or clone the SizeExpr there, then here we could freely delete it.
457e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // Since we do not know how to steal or clone, we keep a pointer to
467e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // a shared resource, but we cannot free it.
477e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  // (There probably is a trivial solution ... for people knowing clang!).
487e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  this->~ConstantArrayWithExprType();
497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  C.Deallocate(this);
507e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor}
517e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
524b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenekvoid VariableArrayType::Destroy(ASTContext& C) {
53f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman  if (SizeExpr)
54f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman    SizeExpr->Destroy(C);
55566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenek  this->~VariableArrayType();
563e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate(this);
574b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek}
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
59898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorvoid DependentSizedArrayType::Destroy(ASTContext& C) {
60898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  SizeExpr->Destroy(C);
61566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenek  this->~DependentSizedArrayType();
623e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff  C.Deallocate(this);
63898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
64c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
659cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregorvoid DependentSizedExtVectorType::Destroy(ASTContext& C) {
669cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  if (SizeExpr)
679cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    SizeExpr->Destroy(C);
689cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  this->~DependentSizedExtVectorType();
699cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  C.Deallocate(this);
709cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor}
719cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
72c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// getArrayElementTypeNoTypeQual - If this is an array type, return the
73c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// element type of the array, potentially with type qualifiers missing.
74c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// This method should never be used when type qualifiers are meaningful.
75c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattnerconst Type *Type::getArrayElementTypeNoTypeQual() const {
76c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If this is directly an array type, return it.
77c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
78c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return ATy->getElementType().getTypePtr();
79c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
80c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
81c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (!isa<ArrayType>(CanonicalType)) {
82c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    // Look through type qualifiers
83c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    if (ArrayType *AT = dyn_cast<ArrayType>(CanonicalType.getUnqualifiedType()))
84c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner      return AT->getElementType().getTypePtr();
85c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return 0;
86c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  }
87c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
88c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // If this is a typedef for an array type, strip the typedef off without
89c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // losing all typedef information.
902fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<ArrayType>(getDesugaredType())->getElementType().getTypePtr();
912fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner}
922fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner
932fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// getDesugaredType - Return the specified type with any "sugar" removed from
942fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// the type.  This takes off typedefs, typeof's etc.  If the outer level of
952fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// the type is already concrete, it returns it unmodified.  This is similar
962fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// to getting the canonical type, but it doesn't remove *all* typedefs.  For
972fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
982fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// concrete.
99969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor///
100969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// \param ForDisplay When true, the desugaring is provided for
101969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// display purposes only. In this case, we apply more heuristics to
102969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// decide whether it is worth providing a desugared form of the type
103969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// or not.
104969c689d893a248eca4f049f5b89f747e66e4bffDouglas GregorQualType QualType::getDesugaredType(bool ForDisplay) const {
105969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor  return getTypePtr()->getDesugaredType(ForDisplay)
1062fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner     .getWithAdditionalQualifiers(getCVRQualifiers());
107c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner}
108c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
109c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// getDesugaredType - Return the specified type with any "sugar" removed from
110c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// type type.  This takes off typedefs, typeof's etc.  If the outer level of
111c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// the type is already concrete, it returns it unmodified.  This is similar
112c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// to getting the canonical type, but it doesn't remove *all* typedefs.  For
113c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// example, it return "T*" as "T*", (not as "int*"), because the pointer is
114c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// concrete.
115969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor///
116969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// \param ForDisplay When true, the desugaring is provided for
117969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// display purposes only. In this case, we apply more heuristics to
118969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// decide whether it is worth providing a desugared form of the type
119969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor/// or not.
120969c689d893a248eca4f049f5b89f747e66e4bffDouglas GregorQualType Type::getDesugaredType(bool ForDisplay) const {
121c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const TypedefType *TDT = dyn_cast<TypedefType>(this))
1222fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner    return TDT->LookThroughTypedefs().getDesugaredType();
12372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (const TypeOfExprType *TOE = dyn_cast<TypeOfExprType>(this))
1242fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner    return TOE->getUnderlyingExpr()->getType().getDesugaredType();
125c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this))
1262fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner    return TOT->getUnderlyingType().getDesugaredType();
127563a03b1338d31c2462def43253a722bc885d384Anders Carlsson  if (const DecltypeType *DTT = dyn_cast<DecltypeType>(this)) {
128563a03b1338d31c2462def43253a722bc885d384Anders Carlsson    if (!DTT->getUnderlyingType()->isDependentType())
129563a03b1338d31c2462def43253a722bc885d384Anders Carlsson      return DTT->getUnderlyingType().getDesugaredType();
130563a03b1338d31c2462def43253a722bc885d384Anders Carlsson  }
1317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  if (const TemplateSpecializationType *Spec
132c45c232440dfafedca1a3773b904fb42609b1b19Douglas Gregor        = dyn_cast<TemplateSpecializationType>(this)) {
133969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor    if (ForDisplay)
134969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor      return QualType(this, 0);
135969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor
136c45c232440dfafedca1a3773b904fb42609b1b19Douglas Gregor    QualType Canon = Spec->getCanonicalTypeInternal();
137c45c232440dfafedca1a3773b904fb42609b1b19Douglas Gregor    if (Canon->getAsTemplateSpecializationType())
138c45c232440dfafedca1a3773b904fb42609b1b19Douglas Gregor      return QualType(this, 0);
139c45c232440dfafedca1a3773b904fb42609b1b19Douglas Gregor    return Canon->getDesugaredType();
140c45c232440dfafedca1a3773b904fb42609b1b19Douglas Gregor  }
141969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor  if (const QualifiedNameType *QualName  = dyn_cast<QualifiedNameType>(this)) {
142969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor    if (ForDisplay) {
143969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor      // If desugaring the type that the qualified name is referring to
144969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor      // produces something interesting, that's our desugared type.
145969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor      QualType NamedType = QualName->getNamedType().getDesugaredType();
146969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor      if (NamedType != QualName->getNamedType())
147969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor        return NamedType;
148969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor    } else
149969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor      return QualName->getNamedType().getDesugaredType();
150969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor  }
1515cdf82164dd7c2b2320d6735c63ace4331e0716dDouglas Gregor
152969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor  return QualType(this, 0);
153c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner}
154c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isVoidType - Helper method to determine if this is the 'void' type.
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isVoidType() const {
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() == BuiltinType::Void;
159f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
1604bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattner    return AS->getBaseType()->isVoidType();
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isObjectType() const {
165bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor  if (isa<FunctionType>(CanonicalType) || isa<ReferenceType>(CanonicalType) ||
166bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor      isa<IncompleteArrayType>(CanonicalType) || isVoidType())
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
168f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
1694bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattner    return AS->getBaseType()->isObjectType();
170bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor  return true;
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isDerivedType() const {
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (CanonicalType->getTypeClass()) {
175f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  case ExtQual:
176f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return cast<ExtQualType>(CanonicalType)->getBaseType()->isDerivedType();
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Pointer:
178fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case VariableArray:
179fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case ConstantArray:
1807e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  case ConstantArrayWithExpr:
1817e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  case ConstantArrayWithoutExpr:
182c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  case IncompleteArray:
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case FunctionProto:
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case FunctionNoProto:
1857c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case LValueReference:
1867c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  case RValueReference:
18772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Record:
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
19499dc91422144483c20d1c7381bc9ac634b646b04Chris Lattnerbool Type::isClassType() const {
19535366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const RecordType *RT = getAsRecordType())
196f728a4a05df2455e1c6e62173ab720a92cd4a074Chris Lattner    return RT->getDecl()->isClass();
19799dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  return false;
19899dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner}
199c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isStructureType() const {
20035366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const RecordType *RT = getAsRecordType())
201f728a4a05df2455e1c6e62173ab720a92cd4a074Chris Lattner    return RT->getDecl()->isStruct();
202c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  return false;
203c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner}
2047154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroffbool Type::isVoidPointerType() const {
20535366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const PointerType *PT = getAsPointerType())
2067154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff    return PT->getPointeeType()->isVoidType();
2077154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff  return false;
2087154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff}
2097154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff
210c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isUnionType() const {
21135366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const RecordType *RT = getAsRecordType())
212f728a4a05df2455e1c6e62173ab720a92cd4a074Chris Lattner    return RT->getDecl()->isUnion();
213c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  return false;
214c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner}
215c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner
216c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerbool Type::isComplexType() const {
21702f62a9fedbc370fba081303399410a3afdde29fSteve Naroff  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
21802f62a9fedbc370fba081303399410a3afdde29fSteve Naroff    return CT->getElementType()->isFloatingType();
219f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
2204bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattner    return AS->getBaseType()->isComplexType();
22102f62a9fedbc370fba081303399410a3afdde29fSteve Naroff  return false;
222c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner}
223c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner
2244cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffbool Type::isComplexIntegerType() const {
2254cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // Check for GCC complex integer extension.
2264cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
2274cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    return CT->getElementType()->isIntegerType();
228f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
2294bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattner    return AS->getBaseType()->isComplexIntegerType();
2304cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  return false;
2314cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff}
2324cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
2334cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffconst ComplexType *Type::getAsComplexIntegerType() const {
2344cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // Are we directly a complex type?
2354cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) {
2364cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    if (CTy->getElementType()->isIntegerType())
2374cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff      return CTy;
2384bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattner    return 0;
2394cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  }
2404bbce9901f7296ab030c58f0877be0b042bd70d3Chris Lattner
2412a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  // If the canonical form of this type isn't what we want, reject it.
2422a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  if (!isa<ComplexType>(CanonicalType)) {
243f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    // Look through type qualifiers (e.g. ExtQualType's).
2442a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
2452a18dfe292cf3c406a769c3672080970ac586345Chris Lattner      return CanonicalType.getUnqualifiedType()->getAsComplexIntegerType();
2464cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    return 0;
2472a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  }
2482a18dfe292cf3c406a769c3672080970ac586345Chris Lattner
2494cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // If this is a typedef for a complex type, strip the typedef off without
2504cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // losing all typedef information.
2512fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<ComplexType>(getDesugaredType());
2524cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff}
2534cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
25477878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroffconst BuiltinType *Type::getAsBuiltinType() const {
25577878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // If this is directly a builtin type, return it.
25677878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  if (const BuiltinType *BTy = dyn_cast<BuiltinType>(this))
25777878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff    return BTy;
258dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
259dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't a builtin type, reject it.
260ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<BuiltinType>(CanonicalType)) {
261f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    // Look through type qualifiers (e.g. ExtQualType's).
262ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<BuiltinType>(CanonicalType.getUnqualifiedType()))
263ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsBuiltinType();
264dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
265ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
266dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
26777878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // If this is a typedef for a builtin type, strip the typedef off without
26877878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // losing all typedef information.
2692fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<BuiltinType>(getDesugaredType());
27077878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff}
27177878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff
272c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst FunctionType *Type::getAsFunctionType() const {
2737064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a function type, return it.
2747064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  if (const FunctionType *FTy = dyn_cast<FunctionType>(this))
2757064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff    return FTy;
276ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
277dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
278ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<FunctionType>(CanonicalType)) {
279ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
280ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<FunctionType>(CanonicalType.getUnqualifiedType()))
281ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsFunctionType();
282dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
283ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
284dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
2857064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is a typedef for a function type, strip the typedef off without
2867064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // losing all typedef information.
2872fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<FunctionType>(getDesugaredType());
2885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
29072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregorconst FunctionNoProtoType *Type::getAsFunctionNoProtoType() const {
29172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  return dyn_cast_or_null<FunctionNoProtoType>(getAsFunctionType());
292afa74448a07a16c3146accbe0ff03e9c8b0995e5Daniel Dunbar}
293afa74448a07a16c3146accbe0ff03e9c8b0995e5Daniel Dunbar
29472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregorconst FunctionProtoType *Type::getAsFunctionProtoType() const {
29572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  return dyn_cast_or_null<FunctionProtoType>(getAsFunctionType());
296b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner}
297b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner
29814108da7f7fc059772711e4ffee1322a27b152a7Steve NaroffQualType Type::getPointeeType() const {
29935366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const PointerType *PT = getAsPointerType())
30014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    return PT->getPointeeType();
30114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (const ObjCObjectPointerType *OPT = getAsObjCObjectPointerType())
30214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    return OPT->getPointeeType();
30335366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const BlockPointerType *BPT = getAsBlockPointerType())
30414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    return BPT->getPointeeType();
30514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  return QualType();
30614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff}
307b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner
308d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length
309d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// array types and types that contain variable array types in their
310d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// declarator
311d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffbool Type::isVariablyModifiedType() const {
312c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  // A VLA is a variably modified type.
313c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (isVariableArrayType())
314d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return true;
315d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
316d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // An array can contain a variably modified type
317c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner  if (const Type *T = getArrayElementTypeNoTypeQual())
318c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner    return T->isVariablyModifiedType();
319d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
320f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // A pointer can point to a variably modified type.
321f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // Also, C++ references and member pointers can point to a variably modified
322f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // type, where VLAs appear as an extension to C++, and should be treated
323f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // correctly.
32435366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const PointerType *PT = getAsPointerType())
325d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return PT->getPointeeType()->isVariablyModifiedType();
32635366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const ReferenceType *RT = getAsReferenceType())
32768694ada8f4d8f6c4b00ea5b900df96428b28fc8Daniel Dunbar    return RT->getPointeeType()->isVariablyModifiedType();
32835366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  if (const MemberPointerType *PT = getAsMemberPointerType())
3298edef7c31d27fc9d5d163660702a8a7730a0d19fSebastian Redl    return PT->getPointeeType()->isVariablyModifiedType();
330d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
331d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A function can return a variably modified type
332d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // This one isn't completely obvious, but it follows from the
333d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // definition in C99 6.7.5p3. Because of this rule, it's
334d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // illegal to declare a function returning a variably modified type.
3352a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  if (const FunctionType *FT = getAsFunctionType())
336d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return FT->getResultType()->isVariablyModifiedType();
337d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
338d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  return false;
339d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
340d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
34135366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst PointerType *Type::getAsPointerType() const {
34235366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<PointerType>();
34335366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
34435366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst BlockPointerType *Type::getAsBlockPointerType() const {
34535366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<BlockPointerType>();
34635366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
34735366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst ReferenceType *Type::getAsReferenceType() const {
34835366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<ReferenceType>();
34935366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
35035366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst LValueReferenceType *Type::getAsLValueReferenceType() const {
35135366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<LValueReferenceType>();
35235366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
35335366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst RValueReferenceType *Type::getAsRValueReferenceType() const {
35435366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<RValueReferenceType>();
35535366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
35635366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst MemberPointerType *Type::getAsMemberPointerType() const {
35735366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<MemberPointerType>();
35835366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
35935366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst TagType *Type::getAsTagType() const {
36035366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<TagType>();
36135366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
36235366a67baa970c287c714c957cf78a4131cf60dTed Kremenekconst RecordType *Type::getAsRecordType() const {
36335366a67baa970c287c714c957cf78a4131cf60dTed Kremenek  return getAs<RecordType>();
36435366a67baa970c287c714c957cf78a4131cf60dTed Kremenek}
365c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsStructureType() const {
3667064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a structure type, return it.
367c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(this)) {
36839ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isStruct())
369c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return RT;
3707064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  }
371dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
372dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
373c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
37439ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (!RT->getDecl()->isStruct())
375dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner      return 0;
376dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
377dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // If this is a typedef for a structure type, strip the typedef off without
378dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // losing all typedef information.
3792fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner    return cast<RecordType>(getDesugaredType());
3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
381ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  // Look through type qualifiers
382ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
383ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return CanonicalType.getUnqualifiedType()->getAsStructureType();
3847064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  return 0;
3855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
387c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsUnionType() const {
3887064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a union type, return it.
389c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(this)) {
39039ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isUnion())
391c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return RT;
3927064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  }
393ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
394dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
395c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
39639ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (!RT->getDecl()->isUnion())
397dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner      return 0;
398dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
399dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // If this is a typedef for a union type, strip the typedef off without
400dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // losing all typedef information.
4012fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner    return cast<RecordType>(getDesugaredType());
4025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
403ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
404ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  // Look through type qualifiers
405ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
406ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return CanonicalType.getUnqualifiedType()->getAsUnionType();
4077064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  return 0;
4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
410ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedmanconst EnumType *Type::getAsEnumType() const {
411ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  // Check the canonicalized unqualified type directly; the more complex
412ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  // version is unnecessary because there isn't any typedef information
413ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  // to preserve.
414ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  return dyn_cast<EnumType>(CanonicalType.getUnqualifiedType());
415ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
416ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
417c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerconst ComplexType *Type::getAsComplexType() const {
418c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // Are we directly a complex type?
419c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  if (const ComplexType *CTy = dyn_cast<ComplexType>(this))
420c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner    return CTy;
421c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner
422dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
423ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ComplexType>(CanonicalType)) {
424ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
425ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
426ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsComplexType();
427dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
428ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
429dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
430c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // If this is a typedef for a complex type, strip the typedef off without
431c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // losing all typedef information.
4322fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<ComplexType>(getDesugaredType());
4337a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner}
4347a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner
435c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst VectorType *Type::getAsVectorType() const {
4367a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  // Are we directly a vector type?
4377a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  if (const VectorType *VTy = dyn_cast<VectorType>(this))
4387a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner    return VTy;
439a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
440dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
441ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<VectorType>(CanonicalType)) {
442ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
443ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<VectorType>(CanonicalType.getUnqualifiedType()))
444ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsVectorType();
445dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
446ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
447dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
448a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // If this is a typedef for a vector type, strip the typedef off without
449a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // losing all typedef information.
4502fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<VectorType>(getDesugaredType());
4517a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner}
4527a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner
453213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanconst ExtVectorType *Type::getAsExtVectorType() const {
4547064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // Are we directly an OpenCU vector type?
455213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (const ExtVectorType *VTy = dyn_cast<ExtVectorType>(this))
4567064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff    return VTy;
4577064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
458dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
459213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (!isa<ExtVectorType>(CanonicalType)) {
460ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
461213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    if (isa<ExtVectorType>(CanonicalType.getUnqualifiedType()))
462213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman      return CanonicalType.getUnqualifiedType()->getAsExtVectorType();
463dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
464ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
4657064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
466213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // If this is a typedef for an extended vector type, strip the typedef off
467213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // without losing all typedef information.
4682fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner  return cast<ExtVectorType>(getDesugaredType());
4697064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff}
4707064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
471368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattnerconst ObjCInterfaceType *Type::getAsObjCInterfaceType() const {
472eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCInterfaceType's, just return the canonical
4732a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  // type pointer if it is the right class.  There is no typedef information to
4742a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  // return and these cannot be Address-space qualified.
475fb41ca86eeede2fce02933034cf8b6e5aea84b79Fariborz Jahanian  return dyn_cast<ObjCInterfaceType>(CanonicalType.getUnqualifiedType());
476368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner}
477368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
478c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffconst ObjCInterfaceType *Type::getAsObjCQualifiedInterfaceType() const {
479c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  // There is no sugar for ObjCInterfaceType's, just return the canonical
480c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  // type pointer if it is the right class.  There is no typedef information to
481c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  // return and these cannot be Address-space qualified.
482c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  if (const ObjCInterfaceType *OIT = getAsObjCInterfaceType())
483c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    if (OIT->getNumProtocols())
484c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff      return OIT;
485c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  return 0;
486c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff}
487c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff
488c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffbool Type::isObjCQualifiedInterfaceType() const {
489c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  return getAsObjCQualifiedIdType() != 0;
490c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff}
491c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff
492d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffconst ObjCObjectPointerType *Type::getAsObjCObjectPointerType() const {
493d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  // There is no sugar for ObjCObjectPointerType's, just return the
494d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  // canonical type pointer if it is the right class.
495d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  return dyn_cast<ObjCObjectPointerType>(CanonicalType.getUnqualifiedType());
496d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff}
497d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
498d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffconst ObjCObjectPointerType *Type::getAsObjCQualifiedIdType() const {
499eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCQualifiedIdType's, just return the canonical
500eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
501d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  if (const ObjCObjectPointerType *OPT = getAsObjCObjectPointerType()) {
502d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff    if (OPT->isObjCQualifiedIdType())
503d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff      return OPT;
504d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  }
505d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  return 0;
506368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner}
507368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
50814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroffconst ObjCObjectPointerType *Type::getAsObjCInterfacePointerType() const {
50914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (const ObjCObjectPointerType *OPT = getAsObjCObjectPointerType()) {
51014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    if (OPT->getInterfaceType())
51114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff      return OPT;
51214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  }
51314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  return 0;
51414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff}
51514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
51672c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregorconst TemplateTypeParmType *Type::getAsTemplateTypeParmType() const {
51772c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor  // There is no sugar for template type parameters, so just return
51872c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor  // the canonical type pointer if it is the right class.
5192a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  // FIXME: can these be address-space qualified?
52072c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor  return dyn_cast<TemplateTypeParmType>(CanonicalType);
52172c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor}
522368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
5237532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorconst TemplateSpecializationType *
5247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorType::getAsTemplateSpecializationType() const {
52555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  // There is no sugar for class template specialization types, so
52655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  // just return the canonical type pointer if it is the right class.
5277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  return dyn_cast<TemplateSpecializationType>(CanonicalType);
52855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
52955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIntegerType() const {
5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
5332df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner           BT->getKind() <= BuiltinType::Int128;
5345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
535834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    // Incomplete enum types are not treated as integer types.
5368e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor    // FIXME: In C++, enum types are never integer types.
537834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
539f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (isa<FixedWidthIntType>(CanonicalType))
540f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return true;
541c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
542c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isIntegerType();
543f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
544f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isIntegerType();
5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
54833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanianbool Type::isIntegralType() const {
54933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
55033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    return BT->getKind() >= BuiltinType::Bool &&
55133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    BT->getKind() <= BuiltinType::LongLong;
55233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
553834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
554834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner      return true;  // Complete enum types are integral.
5558e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor                    // FIXME: In C++, enum types are never integral.
556f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (isa<FixedWidthIntType>(CanonicalType))
557f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return true;
558f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
559f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isIntegralType();
56033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  return false;
56133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
56233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
56313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isEnumeralType() const {
56413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
56539ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    return TT->getDecl()->isEnum();
566f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
567f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isEnumeralType();
56813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
56913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
57013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
57113b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isBooleanType() const {
57213b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
57313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return BT->getKind() == BuiltinType::Bool;
574f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
575f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isBooleanType();
57613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
57713b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
57813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
57913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isCharType() const {
58013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
58113b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return BT->getKind() == BuiltinType::Char_U ||
58213b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff           BT->getKind() == BuiltinType::UChar ||
583c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson           BT->getKind() == BuiltinType::Char_S ||
584c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson           BT->getKind() == BuiltinType::SChar;
585f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
586f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isCharType();
58713b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
58813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
58913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
59077a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregorbool Type::isWideCharType() const {
59177a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
59277a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor    return BT->getKind() == BuiltinType::WChar;
593f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
594f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isWideCharType();
59577a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor  return false;
59677a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor}
59777a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor
598d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isSignedIntegerType - Return true if this is an integer type that is
599d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
600d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// an enum decl which has a signed representation, or a vector of signed
601d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// integer element type.
6025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isSignedIntegerType() const {
6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Char_S &&
6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongLong;
6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
607d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
60837c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
60937c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->getIntegerType()->isSignedIntegerType();
610d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
611f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (const FixedWidthIntType *FWIT =
612f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman          dyn_cast<FixedWidthIntType>(CanonicalType))
613f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return FWIT->isSigned();
614f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman
615c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
616c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isSignedIntegerType();
617f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
618f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isSignedIntegerType();
6195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
622d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isUnsignedIntegerType - Return true if this is an integer type that is
623d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum
624d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// decl which has an unsigned representation, or a vector of unsigned integer
625d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// element type.
6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isUnsignedIntegerType() const {
6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
6285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
6295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::ULongLong;
6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
631d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
63237c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
63337c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
634d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
635f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (const FixedWidthIntType *FWIT =
636f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman          dyn_cast<FixedWidthIntType>(CanonicalType))
637f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return !FWIT->isSigned();
638f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman
639c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
640c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isUnsignedIntegerType();
641f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
642f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isUnsignedIntegerType();
6435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
6445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isFloatingType() const {
6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Float &&
6495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
651729a2131228cb7fcbc00bd8af36bc6f14d12317dChris Lattner    return CT->getElementType()->isFloatingType();
652c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
653c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isFloatingType();
654f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
655f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isFloatingType();
6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
6575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealFloatingType() const {
6605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Float &&
6625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
663c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
664c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isRealFloatingType();
665f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
666f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isRealFloatingType();
6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealType() const {
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
6745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
675834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    return TT->getDecl()->isEnum() && TT->getDecl()->isDefinition();
676f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (isa<FixedWidthIntType>(CanonicalType))
677f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return true;
678c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
679c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isRealType();
680f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
681f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isRealType();
6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isArithmeticType() const {
6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
687a7fbf7282eadebaf1293d9f970b01fb57f4b0ae4Douglas Gregor    return BT->getKind() >= BuiltinType::Bool &&
688a7fbf7282eadebaf1293d9f970b01fb57f4b0ae4Douglas Gregor           BT->getKind() <= BuiltinType::LongDouble;
68937c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
69037c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2).
69137c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    // If a body isn't seen by the time we get here, return false.
69237c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->isDefinition();
693f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (isa<FixedWidthIntType>(CanonicalType))
694f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return true;
695f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
696f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isArithmeticType();
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType);
6985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isScalarType() const {
7015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
7025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() != BuiltinType::Void;
7035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
704834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    // Enums are scalar types, but only if they are defined.  Incomplete enums
705834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    // are not treated as scalar types.
706834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner    if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
7075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
7085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
710f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
711f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isScalarType();
712f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (isa<FixedWidthIntType>(CanonicalType))
713f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    return true;
7145618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  return isa<PointerType>(CanonicalType) ||
7155618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff         isa<BlockPointerType>(CanonicalType) ||
716f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl         isa<MemberPointerType>(CanonicalType) ||
7175618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff         isa<ComplexType>(CanonicalType) ||
718d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff         isa<ObjCObjectPointerType>(CanonicalType);
7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
721d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// \brief Determines whether the type is a C++ aggregate type or C
722d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// aggregate or union type.
723d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor///
724d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// An aggregate type is an array or a class type (struct, union, or
725d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// class) that has no user-declared constructors, no private or
726d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// protected non-static data members, no base classes, and no virtual
727d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// functions (C++ [dcl.init.aggr]p1). The notion of an aggregate type
728d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// subsumes the notion of C aggregates (C99 6.2.5p21) because it also
729d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// includes union types.
7305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isAggregateType() const {
731c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor  if (const RecordType *Record = dyn_cast<RecordType>(CanonicalType)) {
732c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor    if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(Record->getDecl()))
733c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor      return ClassDecl->isAggregate();
734c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor
735d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor    return true;
736c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor  }
737c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor
738f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
739f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isAggregateType();
740c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return isa<ArrayType>(CanonicalType);
7415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7439bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// isConstantSizeType - Return true if this is not a variable sized type,
7449bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// according to the rules of C99 6.7.5p3.  It is not legal to call this on
745898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// incomplete types or dependent types.
7463c2b3170041f69a92904e3bab9b6d654eaf260acEli Friedmanbool Type::isConstantSizeType() const {
747f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
748f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return EXTQT->getBaseType()->isConstantSizeType();
749d52a4578144ab2887912e52eabec58a857a44adbChris Lattner  assert(!isIncompleteType() && "This doesn't make sense for incomplete types");
750898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  assert(!isDependentType() && "This doesn't make sense for dependent types");
7519bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner  // The VAT must have a size, as it is known to be complete.
7529bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner  return !isa<VariableArrayType>(CanonicalType);
7535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1)
7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - a type that can describe objects, but which lacks information needed to
7575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// determine its size.
7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIncompleteType() const {
7595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (CanonicalType->getTypeClass()) {
7605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: return false;
761f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  case ExtQual:
762f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return cast<ExtQualType>(CanonicalType)->getBaseType()->isIncompleteType();
7635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Builtin:
7645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Void is the only incomplete builtin type.  Per C99 6.2.5p19, it can never
7655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // be completed.
7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return isVoidType();
76772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Record:
76872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Enum:
7695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // A tagged type (struct/union/enum/class) is incomplete if the decl is a
7705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // forward declaration, but not a full definition (C99 6.2.5p22).
7715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return !cast<TagType>(CanonicalType)->getDecl()->isDefinition();
772c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  case IncompleteArray:
7735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // An array of unknown size is an incomplete type (C99 6.2.5p22).
774c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return true;
7751efaa9594a81709a17658fd80ae7e783e1026407Chris Lattner  case ObjCInterface:
7761efaa9594a81709a17658fd80ae7e783e1026407Chris Lattner    // ObjC interfaces are incomplete if they are @class, not @interface.
7771efaa9594a81709a17658fd80ae7e783e1026407Chris Lattner    return cast<ObjCInterfaceType>(this)->getDecl()->isForwardDecl();
7785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
78164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10)
78264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlbool Type::isPODType() const {
78364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  // The compiler shouldn't query this for incomplete types, but the user might.
78464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  // We return false for that case.
78564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  if (isIncompleteType())
78664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return false;
78764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
78864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  switch (CanonicalType->getTypeClass()) {
78964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    // Everything not explicitly mentioned is not POD.
79064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  default: return false;
791f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian  case ExtQual:
792f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    return cast<ExtQualType>(CanonicalType)->getBaseType()->isPODType();
79364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case VariableArray:
79464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case ConstantArray:
79564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    // IncompleteArray is caught by isIncompleteType() above.
79664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return cast<ArrayType>(CanonicalType)->getElementType()->isPODType();
79764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
79864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case Builtin:
79964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case Complex:
80064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case Pointer:
801f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  case MemberPointer:
80264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case Vector:
80364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case ExtVector:
804d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  case ObjCObjectPointer:
80564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return true;
80664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
80772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Enum:
80872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    return true;
80972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor
81072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  case Record:
811c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor    if (CXXRecordDecl *ClassDecl
812c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor          = dyn_cast<CXXRecordDecl>(cast<RecordType>(CanonicalType)->getDecl()))
813c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor      return ClassDecl->isPOD();
814c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor
81564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    // C struct/union is POD.
81664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl    return true;
81764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
81864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl}
81964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isPromotableIntegerType() const {
8212a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  if (const BuiltinType *BT = getAsBuiltinType())
8222a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    switch (BT->getKind()) {
8232a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::Bool:
8242a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::Char_S:
8252a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::Char_U:
8262a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::SChar:
8272a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::UChar:
8282a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::Short:
8292a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    case BuiltinType::UShort:
8302a18dfe292cf3c406a769c3672080970ac586345Chris Lattner      return true;
8312a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    default:
8322a18dfe292cf3c406a769c3672080970ac586345Chris Lattner      return false;
8332a18dfe292cf3c406a769c3672080970ac586345Chris Lattner    }
8342a18dfe292cf3c406a769c3672080970ac586345Chris Lattner  return false;
8355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8376e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlbool Type::isNullPtrType() const {
8386e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  if (const BuiltinType *BT = getAsBuiltinType())
8396e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl    return BT->getKind() == BuiltinType::NullPtr;
8406e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  return false;
8416e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}
8426e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
84322b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedmanbool Type::isSpecifierType() const {
84422b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  // Note that this intentionally does not use the canonical type.
84522b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  switch (getTypeClass()) {
84622b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  case Builtin:
84722b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  case Record:
84822b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  case Enum:
84922b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  case Typedef:
850c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case Complex:
851c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case TypeOfExpr:
852c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case TypeOf:
853c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case TemplateTypeParm:
854c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case TemplateSpecialization:
855c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case QualifiedName:
856c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case Typename:
857c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman  case ObjCInterface:
858d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  case ObjCObjectPointer:
85922b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman    return true;
86022b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  default:
86122b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman    return false;
86222b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  }
86322b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman}
86422b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman
865e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattnerconst char *BuiltinType::getName(const LangOptions &LO) const {
8665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (getKind()) {
8675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown builtin type!");
8685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Void:              return "void";
869e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  case Bool:              return LO.Bool ? "bool" : "_Bool";
8705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Char_S:            return "char";
8715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Char_U:            return "char";
8725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case SChar:             return "signed char";
8735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Short:             return "short";
8745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Int:               return "int";
8755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Long:              return "long";
8765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case LongLong:          return "long long";
8772df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case Int128:            return "__int128_t";
8785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UChar:             return "unsigned char";
8795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UShort:            return "unsigned short";
8805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UInt:              return "unsigned int";
8815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ULong:             return "unsigned long";
8825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ULongLong:         return "unsigned long long";
8832df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner  case UInt128:           return "__uint128_t";
8845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Float:             return "float";
8855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Double:            return "double";
8865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case LongDouble:        return "long double";
88746713efe13c89f4ec9cd9546c7b598fe7186089bArgyrios Kyrtzidis  case WChar:             return "wchar_t";
888f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  case Char16:            return "char16_t";
889f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  case Char32:            return "char32_t";
8906e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  case NullPtr:           return "nullptr_t";
8918e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor  case Overload:          return "<overloaded function type>";
892898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  case Dependent:         return "<dependent type>";
8936a75cd9c1d54625fca7b5477ab9545bcdbd85ea4Anders Carlsson  case UndeducedAuto:     return "auto";
894de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  case ObjCId:            return "id";
895de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  case ObjCClass:         return "Class";
8965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
89972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregorvoid FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
900942cfd37297528918616d06cd6e4e8bd6e4915a2Chris Lattner                                arg_type_iterator ArgTys,
901971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis                                unsigned NumArgs, bool isVariadic,
902465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl                                unsigned TypeQuals, bool hasExceptionSpec,
903465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl                                bool anyExceptionSpec, unsigned NumExceptions,
904465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl                                exception_iterator Exs) {
9055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ID.AddPointer(Result.getAsOpaquePtr());
9065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0; i != NumArgs; ++i)
9075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID.AddPointer(ArgTys[i].getAsOpaquePtr());
9085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ID.AddInteger(isVariadic);
909971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis  ID.AddInteger(TypeQuals);
910465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  ID.AddInteger(hasExceptionSpec);
911465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  if (hasExceptionSpec) {
912465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    ID.AddInteger(anyExceptionSpec);
913465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl    for(unsigned i = 0; i != NumExceptions; ++i)
914465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl      ID.AddPointer(Exs[i].getAsOpaquePtr());
915465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl  }
9165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
91872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregorvoid FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID) {
919971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis  Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic(),
920465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl          getTypeQuals(), hasExceptionSpec(), hasAnyExceptionSpec(),
921465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl          getNumExceptions(), exception_begin());
9225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
924d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffvoid ObjCObjectPointerType::Profile(llvm::FoldingSetNodeID &ID,
92514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff                                    QualType OIT, ObjCProtocolDecl **protocols,
926d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff                                    unsigned NumProtocols) {
92714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  ID.AddPointer(OIT.getAsOpaquePtr());
9284b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  for (unsigned i = 0; i != NumProtocols; i++)
9294b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    ID.AddPointer(protocols[i]);
9304b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
9314b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
932d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffvoid ObjCObjectPointerType::Profile(llvm::FoldingSetNodeID &ID) {
93314108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (getNumProtocols())
93414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    Profile(ID, getPointeeType(), &Protocols[0], getNumProtocols());
93514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  else
93614108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    Profile(ID, getPointeeType(), 0, 0);
9374b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
9384b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
939a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
940a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// potentially looking through *all* consequtive typedefs.  This returns the
941a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// sum of the type qualifiers, so if you have:
942a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///   typedef const int A;
943a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///   typedef volatile A B;
944a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// looking through the typedefs for B will give you "const volatile A".
945a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///
946a2c7767ce7d8feb10253f4b650826a20f3324c6fChris LattnerQualType TypedefType::LookThroughTypedefs() const {
947a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // Usually, there is only a single level of typedefs, be fast in that case.
948a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  QualType FirstType = getDecl()->getUnderlyingType();
949a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  if (!isa<TypedefType>(FirstType))
950a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    return FirstType;
951a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
952a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // Otherwise, do the fully general loop.
953a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  unsigned TypeQuals = 0;
954a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  const TypedefType *TDT = this;
955a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  while (1) {
956a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    QualType CurType = TDT->getDecl()->getUnderlyingType();
957f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner
958f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner
959f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME:
960f11284ac87daa613bc7b30db9f54bd716d123222Fariborz Jahanian    /// FIXME: This is incorrect for ExtQuals!
961f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME:
962f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    TypeQuals |= CurType.getCVRQualifiers();
963a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
964a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    TDT = dyn_cast<TypedefType>(CurType);
965a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    if (TDT == 0)
966a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner      return QualType(CurType.getTypePtr(), TypeQuals);
967a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  }
968a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner}
9695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
97072564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorTypeOfExprType::TypeOfExprType(Expr *E, QualType can)
97172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  : Type(TypeOfExpr, can, E->isTypeDependent()), TOExpr(E) {
972898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
973898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
974563a03b1338d31c2462def43253a722bc885d384Anders CarlssonDecltypeType::DecltypeType(Expr *E, QualType underlyingType, QualType can)
975563a03b1338d31c2462def43253a722bc885d384Anders Carlsson  : Type(Decltype, can, E->isTypeDependent()), E(E),
976563a03b1338d31c2462def43253a722bc885d384Anders Carlsson  UnderlyingType(underlyingType) {
977395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson}
978395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
9797da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas GregorTagType::TagType(TypeClass TC, TagDecl *D, QualType can)
9807da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor  : Type(TC, can, D->isDependentType()), decl(D, 0) {}
9817da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor
9822daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool RecordType::classof(const TagType *TT) {
9832daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner  return isa<RecordDecl>(TT->getDecl());
9845edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner}
9855edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner
9862daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool EnumType::classof(const TagType *TT) {
9872daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner  return isa<EnumDecl>(TT->getDecl());
9885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
99040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregorbool
9917532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::
99240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas GregoranyDependentTemplateArguments(const TemplateArgument *Args, unsigned NumArgs) {
99340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  for (unsigned Idx = 0; Idx < NumArgs; ++Idx) {
99440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    switch (Args[Idx].getKind()) {
995d560d5025a0e5b1942d99d5f39005337b03a64c2Douglas Gregor    case TemplateArgument::Null:
996d560d5025a0e5b1942d99d5f39005337b03a64c2Douglas Gregor      assert(false && "Should not have a NULL template argument");
997d560d5025a0e5b1942d99d5f39005337b03a64c2Douglas Gregor      break;
998d560d5025a0e5b1942d99d5f39005337b03a64c2Douglas Gregor
99940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Type:
100040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      if (Args[Idx].getAsType()->isDependentType())
100140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor        return true;
100240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
100340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
100440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Declaration:
100540808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Integral:
100640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      // Never dependent
100740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
100840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
100940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Expression:
101040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      if (Args[Idx].getAsExpr()->isTypeDependent() ||
101140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor          Args[Idx].getAsExpr()->isValueDependent())
101240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor        return true;
101340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
1014d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson
1015d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson    case TemplateArgument::Pack:
1016d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson      assert(0 && "FIXME: Implement!");
1017d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson      break;
101855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    }
101955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  }
102040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
102140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  return false;
102255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
102355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
10247532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::
10257532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType(TemplateName T, const TemplateArgument *Args,
10267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                           unsigned NumArgs, QualType Canon)
10277532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  : Type(TemplateSpecialization,
102840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor         Canon.isNull()? QualType(this, 0) : Canon,
10297532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor         T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)),
103040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    Template(T), NumArgs(NumArgs)
103155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor{
103240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  assert((!Canon.isNull() ||
10337532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor          T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)) &&
103440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor         "No canonical type for non-dependent class template specialization");
103555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
103640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  TemplateArgument *TemplateArgs
103740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    = reinterpret_cast<TemplateArgument *>(this + 1);
103855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  for (unsigned Arg = 0; Arg < NumArgs; ++Arg)
103940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    new (&TemplateArgs[Arg]) TemplateArgument(Args[Arg]);
104055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
104155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
10427532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorvoid TemplateSpecializationType::Destroy(ASTContext& C) {
1043ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor  for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1044ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor    // FIXME: Not all expressions get cloned, so we can't yet perform
1045ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor    // this destruction.
1046ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor    //    if (Expr *E = getArg(Arg).getAsExpr())
1047ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor    //      E->Destroy(C);
1048ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor  }
104940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor}
105040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
10517532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::iterator
10527532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::end() const {
105340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  return begin() + getNumArgs();
10545908e9f25bc9a334c99c095e0b1e6a515445be2dDouglas Gregor}
10555908e9f25bc9a334c99c095e0b1e6a515445be2dDouglas Gregor
105640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregorconst TemplateArgument &
10577532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::getArg(unsigned Idx) const {
105840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  assert(Idx < getNumArgs() && "Template argument out of range");
105940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  return getArgs()[Idx];
106055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
106155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
106240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregorvoid
10637532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
10647532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                    TemplateName T,
10657532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                    const TemplateArgument *Args,
10667532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor                                    unsigned NumArgs) {
10677532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  T.Profile(ID);
106840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor  for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
106940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    Args[Idx].Profile(ID);
107055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
107197e0179f1ae545e07d9f5e7c1d2ef5c5bab06676Anders Carlsson
10725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
10735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Type Printing
10745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
10755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid QualType::dump(const char *msg) const {
107739caea961530bc95d19114ab546ebcdb229263c9Chris Lattner  std::string R = "identifier";
1078e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LangOptions LO;
1079e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  getAsStringInternal(R, PrintingPolicy(LO));
10805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (msg)
10815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    fprintf(stderr, "%s: %s\n", msg, R.c_str());
10825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
10835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    fprintf(stderr, "%s\n", R.c_str());
10845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1085c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattnervoid QualType::dump() const {
1086c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner  dump("");
1087c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner}
1088c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner
1089c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattnervoid Type::dump() const {
1090c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner  std::string S = "identifier";
1091e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LangOptions LO;
1092e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  getAsStringInternal(S, PrintingPolicy(LO));
1093c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner  fprintf(stderr, "%s\n", S.c_str());
1094c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner}
1095c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner
1096c36d405a02fab41f6c45cb2bc750d64949742903Chris Lattner
10975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
10995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Note: funkiness to ensure we get a space only between quals.
11005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool NonePrinted = true;
11015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Const)
11025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "const", NonePrinted = false;
11035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Volatile)
11045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += (NonePrinted+" volatile"), NonePrinted = false;
11055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Restrict)
11065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += (NonePrinted+" restrict"), NonePrinted = false;
11075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1109d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorstd::string QualType::getAsString() const {
1110d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  std::string S;
1111e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  LangOptions LO;
1112e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  getAsStringInternal(S, PrintingPolicy(LO));
1113d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  return S;
1114d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor}
1115d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
1116d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid
1117d249e1d1f1498b81314459ceda19d6ff25c278adDouglas GregorQualType::getAsStringInternal(std::string &S,
1118d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                              const PrintingPolicy &Policy) const {
11195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isNull()) {
112061366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor    S += "NULL TYPE";
11215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
11225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
112322b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman
112442f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  if (Policy.SuppressSpecifiers && getTypePtr()->isSpecifierType())
112522b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman    return;
112622b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman
11275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Print qualifiers as appropriate.
11283513e138cc75205b48d3078dfa4669355adb5714Gabor Greif  if (unsigned Tq = getCVRQualifiers()) {
11295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    std::string TQS;
11303513e138cc75205b48d3078dfa4669355adb5714Gabor Greif    AppendTypeQualList(TQS, Tq);
11315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (!S.empty())
11325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S = TQS + ' ' + S;
11335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
11345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S = TQS;
11355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
11365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1137d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getTypePtr()->getAsStringInternal(S, Policy);
11385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1140d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid BuiltinType::getAsStringInternal(std::string &S,
1141d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                      const PrintingPolicy &Policy) const {
11425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (S.empty()) {
1143e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner    S = getName(Policy.LangOpts);
11445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
11455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Prefix the basic type, e.g. 'int X'.
11465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = ' ' + S;
1147e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner    S = getName(Policy.LangOpts) + S;
11485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
11495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1151d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid FixedWidthIntType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1152f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  // FIXME: Once we get bitwidth attribute, write as
1153f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  // "int __attribute__((bitwidth(x)))".
1154f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  std::string prefix = "__clang_fixedwidth";
1155f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  prefix += llvm::utostr_32(Width);
1156f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  prefix += (char)(Signed ? 'S' : 'U');
1157f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  if (S.empty()) {
1158f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    S = prefix;
1159f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  } else {
1160f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    // Prefix the basic type, e.g. 'int X'.
1161f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman    S = prefix + S;
1162f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman  }
1163f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman}
1164f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman
1165f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman
1166d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid ComplexType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1167d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ElementType->getAsStringInternal(S, Policy);
11685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = "_Complex " + S;
11695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1171d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid ExtQualType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
11723b6b83b8311ecdfa43cbb37ccc38c107d3b8d88bChris Lattner  bool NeedsSpace = false;
11734886a4204ff2b20bc226ce70d837de5fcd4a79abFariborz Jahanian  if (AddressSpace) {
117459d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian    S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
11753b6b83b8311ecdfa43cbb37ccc38c107d3b8d88bChris Lattner    NeedsSpace = true;
117659d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian  }
1177d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian  if (GCAttrType != QualType::GCNone) {
11783b6b83b8311ecdfa43cbb37ccc38c107d3b8d88bChris Lattner    if (NeedsSpace)
117959d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian      S += ' ';
118059d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian    S += "__attribute__((objc_gc(";
1181d33d9c0cc0cfdcd0b10f35a6acdfb25da4a64f19Fariborz Jahanian    if (GCAttrType == QualType::Weak)
118259d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian      S += "weak";
118359d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian    else
118459d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian      S += "strong";
118559d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian    S += ")))";
118659d16d1402d76a298ab7fc5f362e9d3dfd744aa5Fariborz Jahanian  }
1187d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  BaseType->getAsStringInternal(S, Policy);
1188ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb}
1189ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
1190d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid PointerType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
11915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = '*' + S;
11925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
11935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Handle things like 'int (*A)[4];' correctly.
11945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this should include vectors, but vectors use attributes I guess.
1195bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (isa<ArrayType>(getPointeeType()))
11965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = '(' + S + ')';
11975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1198d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getPointeeType().getAsStringInternal(S, Policy);
11995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
12005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1201d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid BlockPointerType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
12025618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff  S = '^' + S;
1203d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  PointeeType.getAsStringInternal(S, Policy);
12045618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff}
12055618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff
1206d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid LValueReferenceType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
12075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = '&' + S;
12087c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
12095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Handle things like 'int (&A)[4];' correctly.
12105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this should include vectors, but vectors use attributes I guess.
1211bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (isa<ArrayType>(getPointeeType()))
12125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = '(' + S + ')';
12137c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
1214d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getPointeeType().getAsStringInternal(S, Policy);
12157c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl}
12167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
1217d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid RValueReferenceType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
12187c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  S = "&&" + S;
12197c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
12207c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // Handle things like 'int (&&A)[4];' correctly.
12217c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // FIXME: this should include vectors, but vectors use attributes I guess.
12227c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  if (isa<ArrayType>(getPointeeType()))
12237c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl    S = '(' + S + ')';
12247c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl
1225d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getPointeeType().getAsStringInternal(S, Policy);
12265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
12275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1228d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid MemberPointerType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1229f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  std::string C;
1230d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  Class->getAsStringInternal(C, Policy);
1231f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  C += "::*";
1232f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  S = C + S;
1233f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
12347c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl  // Handle things like 'int (Cls::*A)[4];' correctly.
1235f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  // FIXME: this should include vectors, but vectors use attributes I guess.
1236f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl  if (isa<ArrayType>(getPointeeType()))
1237f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl    S = '(' + S + ')';
1238f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
1239d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getPointeeType().getAsStringInternal(S, Policy);
1240f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl}
1241f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl
1242d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid ConstantArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1243fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  S += '[';
12446b91cd9af12fe1340e48e03e9b988d9888b4889fSteve Naroff  S += llvm::utostr(getSize().getZExtValue());
1245fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  S += ']';
1246fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
1247d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getElementType().getAsStringInternal(S, Policy);
1248fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff}
1249fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
12507e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregorvoid ConstantArrayWithExprType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
12517e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  if (Policy.ConstantArraySizeAsWritten) {
12527e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    std::string SStr;
12537e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    llvm::raw_string_ostream s(SStr);
12547e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    getSizeExpr()->printPretty(s, 0, Policy);
12557e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    S += '[';
12567e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    S += s.str();
12577e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    S += ']';
12587e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    getElementType().getAsStringInternal(S, Policy);
12597e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  }
12607e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  else
12617e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    ConstantArrayType::getAsStringInternal(S, Policy);
12627e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor}
12637e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
12647e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregorvoid ConstantArrayWithoutExprType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
12657e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  if (Policy.ConstantArraySizeAsWritten) {
12667e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    S += "[]";
12677e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    getElementType().getAsStringInternal(S, Policy);
12687e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  }
12697e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor  else
12707e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    ConstantArrayType::getAsStringInternal(S, Policy);
12717e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor}
12727e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
1273d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid IncompleteArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1274c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  S += "[]";
1275c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
1276d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getElementType().getAsStringInternal(S, Policy);
1277c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman}
1278c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
1279d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid VariableArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
12805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += '[';
12815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1282c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  if (getIndexTypeQualifier()) {
1283c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff    AppendTypeQualList(S, getIndexTypeQualifier());
12845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += ' ';
12855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
12865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1287c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  if (getSizeModifier() == Static)
12885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "static";
1289c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  else if (getSizeModifier() == Star)
12905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += '*';
12915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1292fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  if (getSizeExpr()) {
1293a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    std::string SStr;
1294a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    llvm::raw_string_ostream s(SStr);
1295d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    getSizeExpr()->printPretty(s, 0, Policy);
1296fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    S += s.str();
1297fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  }
12985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += ']';
12995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1300d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getElementType().getAsStringInternal(S, Policy);
13015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
13025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1303d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid DependentSizedArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1304898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  S += '[';
1305898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1306898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  if (getIndexTypeQualifier()) {
1307898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    AppendTypeQualList(S, getIndexTypeQualifier());
1308898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    S += ' ';
1309898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  }
1310898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1311898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  if (getSizeModifier() == Static)
1312898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    S += "static";
1313898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  else if (getSizeModifier() == Star)
1314898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    S += '*';
1315898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1316898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  if (getSizeExpr()) {
1317898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    std::string SStr;
1318898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    llvm::raw_string_ostream s(SStr);
1319d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    getSizeExpr()->printPretty(s, 0, Policy);
1320898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor    S += s.str();
1321898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  }
1322898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor  S += ']';
1323898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
1324d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getElementType().getAsStringInternal(S, Policy);
1325898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor}
1326898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor
13279cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregorvoid DependentSizedExtVectorType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
13289cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  getElementType().getAsStringInternal(S, Policy);
13299cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
1330f6ddb737cb882ffbf0b75a9abd50b930cc2b9068Douglas Gregor  S += " __attribute__((ext_vector_type(";
13319cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  if (getSizeExpr()) {
13329cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    std::string SStr;
13339cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    llvm::raw_string_ostream s(SStr);
13349cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    getSizeExpr()->printPretty(s, 0, Policy);
13359cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor    S += s.str();
13369cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  }
13379cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor  S += ")))";
13389cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor}
13399cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor
1340d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid VectorType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
13415620b50f8f81854b2a6fea16c69ff1853f8f4d9bDaniel Dunbar  // FIXME: We prefer to print the size directly here, but have no way
13425620b50f8f81854b2a6fea16c69ff1853f8f4d9bDaniel Dunbar  // to get the size of the type.
13437ee261c8e71f363d86461f4d1a37e3def354c976Chris Lattner  S += " __attribute__((__vector_size__(";
13445620b50f8f81854b2a6fea16c69ff1853f8f4d9bDaniel Dunbar  S += llvm::utostr_32(NumElements); // convert back to bytes.
13455620b50f8f81854b2a6fea16c69ff1853f8f4d9bDaniel Dunbar  S += " * sizeof(" + ElementType.getAsString() + "))))";
1346d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ElementType.getAsStringInternal(S, Policy);
13475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
13485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1349d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid ExtVectorType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1350213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  S += " __attribute__((ext_vector_type(";
135131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  S += llvm::utostr_32(NumElements);
135231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  S += ")))";
1353d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  ElementType.getAsStringInternal(S, Policy);
135431a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
135531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff
1356d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid TypeOfExprType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1357363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(e) X'.
1358363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff    InnerString = ' ' + InnerString;
1359a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek  std::string Str;
1360a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek  llvm::raw_string_ostream s(Str);
1361d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getUnderlyingExpr()->printPretty(s, 0, Policy);
13626409625011e4a11ff07956ff46a44d6ca4473992Argyrios Kyrtzidis  InnerString = "typeof " + s.str() + InnerString;
1363d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
1364d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
1365d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid TypeOfType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1366363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(t) X'.
1367363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff    InnerString = ' ' + InnerString;
1368d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  std::string Tmp;
1369d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getUnderlyingType().getAsStringInternal(Tmp, Policy);
1370363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  InnerString = "typeof(" + Tmp + ")" + InnerString;
1371d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
1372d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
1373395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssonvoid DecltypeType::getAsStringInternal(std::string &InnerString,
1374395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson                                       const PrintingPolicy &Policy) const {
1375395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  if (!InnerString.empty())    // Prefix the basic type, e.g. 'decltype(t) X'.
1376395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    InnerString = ' ' + InnerString;
1377395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  std::string Str;
1378395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  llvm::raw_string_ostream s(Str);
1379395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  getUnderlyingExpr()->printPretty(s, 0, Policy);
1380395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  InnerString = "decltype(" + s.str() + ")" + InnerString;
1381395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson}
1382395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson
1383d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid FunctionNoProtoType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
13845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If needed for precedence reasons, wrap the inner part in grouping parens.
13855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!S.empty())
13865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = "(" + S + ")";
13875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
13885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += "()";
1389d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getResultType().getAsStringInternal(S, Policy);
13905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
13915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1392d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid FunctionProtoType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
13935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If needed for precedence reasons, wrap the inner part in grouping parens.
13945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!S.empty())
13955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = "(" + S + ")";
13965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
13975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += "(";
13985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  std::string Tmp;
139922b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman  PrintingPolicy ParamPolicy(Policy);
140042f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  ParamPolicy.SuppressSpecifiers = false;
14015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
14025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) S += ", ";
140322b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman    getArgType(i).getAsStringInternal(Tmp, ParamPolicy);
14045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += Tmp;
14055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Tmp.clear();
14065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
14075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isVariadic()) {
14095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (getNumArgs())
14105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S += ", ";
14115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "...";
1412e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  } else if (getNumArgs() == 0 && !Policy.LangOpts.CPlusPlus) {
14135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Do not emit int() if we have a proto, emit 'int(void)'.
14145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "void";
14155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
14165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += ")";
1418d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  getResultType().getAsStringInternal(S, Policy);
14195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
14205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
14215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1422d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid TypedefType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
14235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
14245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InnerString = ' ' + InnerString;
14255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InnerString = getDecl()->getIdentifier()->getName() + InnerString;
14265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
14275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1428d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid TemplateTypeParmType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
142972c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor  if (!InnerString.empty())    // Prefix the basic type, e.g. 'parmname X'.
143072c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor    InnerString = ' ' + InnerString;
1431fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor
1432fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  if (!Name)
1433fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    InnerString = "type-parameter-" + llvm::utostr_32(Depth) + '-' +
1434fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor      llvm::utostr_32(Index) + InnerString;
1435fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor  else
1436fab9d67cebb87be968e7ae31a3b549a5279b5d51Douglas Gregor    InnerString = Name->getName() + InnerString;
143772c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor}
143872c3f314d92d65c050ee1c07b7753623c044d6c7Douglas Gregor
1439d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorstd::string
1440d249e1d1f1498b81314459ceda19d6ff25c278adDouglas GregorTemplateSpecializationType::PrintTemplateArgumentList(
1441d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                  const TemplateArgument *Args,
1442d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                  unsigned NumArgs,
1443d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                  const PrintingPolicy &Policy) {
144498137534e612c274ba270af99d73429043957e53Douglas Gregor  std::string SpecString;
144555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  SpecString += '<';
144655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
144755f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    if (Arg)
144855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor      SpecString += ", ";
144955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
145055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    // Print the argument into a string.
145155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    std::string ArgString;
145298137534e612c274ba270af99d73429043957e53Douglas Gregor    switch (Args[Arg].getKind()) {
145338999462749c22d49d1e1707206aaa4997636f4cDouglas Gregor    case TemplateArgument::Null:
145438999462749c22d49d1e1707206aaa4997636f4cDouglas Gregor      assert(false && "Null template argument");
145538999462749c22d49d1e1707206aaa4997636f4cDouglas Gregor      break;
145638999462749c22d49d1e1707206aaa4997636f4cDouglas Gregor
145740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Type:
1458d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      Args[Arg].getAsType().getAsStringInternal(ArgString, Policy);
145940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
146040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
146140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Declaration:
146298137534e612c274ba270af99d73429043957e53Douglas Gregor      ArgString = cast<NamedDecl>(Args[Arg].getAsDecl())->getNameAsString();
146340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
146440808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
146540808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Integral:
146698137534e612c274ba270af99d73429043957e53Douglas Gregor      ArgString = Args[Arg].getAsIntegral()->toString(10, true);
146740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
146840808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor
146940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    case TemplateArgument::Expression: {
147055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor      llvm::raw_string_ostream s(ArgString);
1471d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      Args[Arg].getAsExpr()->printPretty(s, 0, Policy);
147240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor      break;
147340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor    }
1474d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson    case TemplateArgument::Pack:
1475d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson      assert(0 && "FIXME: Implement!");
1476d01b1da213aeb71fd40ff7fb78a194613cc1ece7Anders Carlsson      break;
147755f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    }
147855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
147955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    // If this is the first argument and its string representation
148055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    // begins with the global scope specifier ('::foo'), add a space
148155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    // to avoid printing the diagraph '<:'.
148255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    if (!Arg && !ArgString.empty() && ArgString[0] == ':')
148355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor      SpecString += ' ';
148455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
148555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    SpecString += ArgString;
148655f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  }
148755f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
148855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  // If the last character of our string is '>', add another space to
148955f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  // keep the two '>''s separate tokens. We don't *have* to do this in
149055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  // C++0x, but it's still good hygiene.
149155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  if (SpecString[SpecString.size() - 1] == '>')
149255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    SpecString += ' ';
149355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
149455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  SpecString += '>';
149555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
149698137534e612c274ba270af99d73429043957e53Douglas Gregor  return SpecString;
149798137534e612c274ba270af99d73429043957e53Douglas Gregor}
149898137534e612c274ba270af99d73429043957e53Douglas Gregor
149998137534e612c274ba270af99d73429043957e53Douglas Gregorvoid
15007532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::
1501d249e1d1f1498b81314459ceda19d6ff25c278adDouglas GregorgetAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
15027532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  std::string SpecString;
15037532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
15047532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  {
15057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor    llvm::raw_string_ostream OS(SpecString);
1506d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    Template.print(OS, Policy);
15077532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor  }
15087532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
1509d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  SpecString += PrintTemplateArgumentList(getArgs(), getNumArgs(), Policy);
151055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  if (InnerString.empty())
151155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    InnerString.swap(SpecString);
151255f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor  else
151355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor    InnerString = SpecString + ' ' + InnerString;
151455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor}
151555f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor
1516d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid QualifiedNameType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1517e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  std::string MyString;
1518e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
1519bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  {
1520bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor    llvm::raw_string_ostream OS(MyString);
1521d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    NNS->print(OS, Policy);
1522e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  }
1523e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
1524e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  std::string TypeStr;
1525d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  PrintingPolicy InnerPolicy(Policy);
1526d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  InnerPolicy.SuppressTagKind = true;
1527d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  NamedType.getAsStringInternal(TypeStr, InnerPolicy);
1528e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
1529e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  MyString += TypeStr;
1530e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  if (InnerString.empty())
1531d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    InnerString.swap(MyString);
1532d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  else
1533d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    InnerString = MyString + ' ' + InnerString;
1534d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
1535d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
1536d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid TypenameType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1537d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  std::string MyString;
1538d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
1539d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  {
1540d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    llvm::raw_string_ostream OS(MyString);
1541d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor    OS << "typename ";
1542d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    NNS->print(OS, Policy);
15431734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor
15441734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor    if (const IdentifierInfo *Ident = getIdentifier())
15451734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor      OS << Ident->getName();
15461734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor    else if (const TemplateSpecializationType *Spec = getTemplateId()) {
1547d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      Spec->getTemplateName().print(OS, Policy, true);
15481734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor      OS << TemplateSpecializationType::PrintTemplateArgumentList(
1549d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                               Spec->getArgs(),
1550d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                            Spec->getNumArgs(),
1551d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                               Policy);
15521734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor    }
1553d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  }
1554d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor
1555d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor  if (InnerString.empty())
1556e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor    InnerString.swap(MyString);
1557e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor  else
1558e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor    InnerString = MyString + ' ' + InnerString;
1559e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor}
1560e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
1561c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid ObjCInterfaceType::Profile(llvm::FoldingSetNodeID &ID,
1562c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff                                         const ObjCInterfaceDecl *Decl,
1563c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff                                         ObjCProtocolDecl **protocols,
1564c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff                                         unsigned NumProtocols) {
1565c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  ID.AddPointer(Decl);
1566c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  for (unsigned i = 0; i != NumProtocols; i++)
1567c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    ID.AddPointer(protocols[i]);
1568c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff}
1569c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff
1570c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid ObjCInterfaceType::Profile(llvm::FoldingSetNodeID &ID) {
1571c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  if (getNumProtocols())
1572c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    Profile(ID, getDecl(), &Protocols[0], getNumProtocols());
1573c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  else
1574c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    Profile(ID, getDecl(), 0, 0);
1575c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff}
1576c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff
1577c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid ObjCInterfaceType::getAsStringInternal(std::string &InnerString,
1578c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff                                           const PrintingPolicy &Policy) const {
15793536b443bc50d58a79f14fca9b6842541a434854Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
15803536b443bc50d58a79f14fca9b6842541a434854Steve Naroff    InnerString = ' ' + InnerString;
1581c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff
1582c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  std::string ObjCQIString = getDecl()->getNameAsString();
1583c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  if (getNumProtocols()) {
1584c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    ObjCQIString += '<';
1585c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    bool isFirst = true;
1586c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) {
1587c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff      if (isFirst)
1588c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff        isFirst = false;
1589c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff      else
1590c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff        ObjCQIString += ',';
1591c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff      ObjCQIString += (*I)->getNameAsString();
1592c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    }
1593c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff    ObjCQIString += '>';
1594c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  }
1595c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff  InnerString = ObjCQIString + InnerString;
15963536b443bc50d58a79f14fca9b6842541a434854Steve Naroff}
15973536b443bc50d58a79f14fca9b6842541a434854Steve Naroff
1598d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffvoid ObjCObjectPointerType::getAsStringInternal(std::string &InnerString,
1599d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff                                                const PrintingPolicy &Policy) const {
1600de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  std::string ObjCQIString;
1601de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff
1602de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  if (isObjCIdType() || isObjCQualifiedIdType())
1603de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    ObjCQIString = "id";
1604de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  else if (isObjCClassType())
1605de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    ObjCQIString = "Class";
1606de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff  else
1607de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff    ObjCQIString = getInterfaceDecl()->getNameAsString();
1608d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
1609d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  if (!qual_empty()) {
1610d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff    ObjCQIString += '<';
1611d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff    for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) {
1612d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff      ObjCQIString += (*I)->getNameAsString();
1613d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff      if (I+1 != E)
1614d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff        ObjCQIString += ',';
1615d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff    }
1616d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff    ObjCQIString += '>';
1617d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  }
161814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  if (!isObjCIdType() && !isObjCQualifiedIdType())
161914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    ObjCQIString += " *"; // Don't forget the implicit pointer.
162014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff  else if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
162114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff    InnerString = ' ' + InnerString;
162214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff
1623d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff  InnerString = ObjCQIString + InnerString;
1624d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff}
1625d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff
1626d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregorvoid TagType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
162742f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  if (Policy.SuppressTag)
162842f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman    return;
162942f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman
16305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
16315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InnerString = ' ' + InnerString;
16325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1633d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  const char *Kind = Policy.SuppressTagKind? 0 : getDecl()->getKindName();
16345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *ID;
16355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const IdentifierInfo *II = getDecl()->getIdentifier())
16365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID = II->getName();
16374e16d0478407b556c819b5836a3564a9fdee8d5fDouglas Gregor  else if (TypedefDecl *Typedef = getDecl()->getTypedefForAnonDecl()) {
16384e16d0478407b556c819b5836a3564a9fdee8d5fDouglas Gregor    Kind = 0;
16394e16d0478407b556c819b5836a3564a9fdee8d5fDouglas Gregor    assert(Typedef->getIdentifier() && "Typedef without identifier?");
16404e16d0478407b556c819b5836a3564a9fdee8d5fDouglas Gregor    ID = Typedef->getIdentifier()->getName();
16414e16d0478407b556c819b5836a3564a9fdee8d5fDouglas Gregor  } else
16425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID = "<anonymous>";
16435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
164498137534e612c274ba270af99d73429043957e53Douglas Gregor  // If this is a class template specialization, print the template
164598137534e612c274ba270af99d73429043957e53Douglas Gregor  // arguments.
164698137534e612c274ba270af99d73429043957e53Douglas Gregor  if (ClassTemplateSpecializationDecl *Spec
164798137534e612c274ba270af99d73429043957e53Douglas Gregor        = dyn_cast<ClassTemplateSpecializationDecl>(getDecl())) {
16487e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
16497e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    std::string TemplateArgsStr
16507532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor      = TemplateSpecializationType::PrintTemplateArgumentList(
16517e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                            TemplateArgs.getFlatArgumentList(),
1652d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                            TemplateArgs.flat_size(),
1653d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                                              Policy);
16547e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor    InnerString = TemplateArgsStr + InnerString;
165598137534e612c274ba270af99d73429043957e53Douglas Gregor  }
165698137534e612c274ba270af99d73429043957e53Douglas Gregor
165724c46b3133b03e254877a680f92f035e56058a39Douglas Gregor  if (Kind) {
165824c46b3133b03e254877a680f92f035e56058a39Douglas Gregor    // Compute the full nested-name-specifier for this type. In C,
165924c46b3133b03e254877a680f92f035e56058a39Douglas Gregor    // this will always be empty.
166024c46b3133b03e254877a680f92f035e56058a39Douglas Gregor    std::string ContextStr;
166124c46b3133b03e254877a680f92f035e56058a39Douglas Gregor    for (DeclContext *DC = getDecl()->getDeclContext();
166224c46b3133b03e254877a680f92f035e56058a39Douglas Gregor         !DC->isTranslationUnit(); DC = DC->getParent()) {
166324c46b3133b03e254877a680f92f035e56058a39Douglas Gregor      std::string MyPart;
166424c46b3133b03e254877a680f92f035e56058a39Douglas Gregor      if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
166524c46b3133b03e254877a680f92f035e56058a39Douglas Gregor        if (NS->getIdentifier())
166624c46b3133b03e254877a680f92f035e56058a39Douglas Gregor          MyPart = NS->getNameAsString();
166724c46b3133b03e254877a680f92f035e56058a39Douglas Gregor      } else if (ClassTemplateSpecializationDecl *Spec
166824c46b3133b03e254877a680f92f035e56058a39Douglas Gregor                   = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
16697e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor        const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
16707e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor        std::string TemplateArgsStr
16717532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor          = TemplateSpecializationType::PrintTemplateArgumentList(
16727e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor                                           TemplateArgs.getFlatArgumentList(),
1673d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                           TemplateArgs.flat_size(),
1674d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                                           Policy);
16757e06390f8a60440d6fc5f0e633acdc2edd8ee924Douglas Gregor        MyPart = Spec->getIdentifier()->getName() + TemplateArgsStr;
167624c46b3133b03e254877a680f92f035e56058a39Douglas Gregor      } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
167724c46b3133b03e254877a680f92f035e56058a39Douglas Gregor        if (TypedefDecl *Typedef = Tag->getTypedefForAnonDecl())
167824c46b3133b03e254877a680f92f035e56058a39Douglas Gregor          MyPart = Typedef->getIdentifier()->getName();
167924c46b3133b03e254877a680f92f035e56058a39Douglas Gregor        else if (Tag->getIdentifier())
168024c46b3133b03e254877a680f92f035e56058a39Douglas Gregor          MyPart = Tag->getIdentifier()->getName();
168124c46b3133b03e254877a680f92f035e56058a39Douglas Gregor      }
168224c46b3133b03e254877a680f92f035e56058a39Douglas Gregor
168324c46b3133b03e254877a680f92f035e56058a39Douglas Gregor      if (!MyPart.empty())
168424c46b3133b03e254877a680f92f035e56058a39Douglas Gregor        ContextStr = MyPart + "::" + ContextStr;
168524c46b3133b03e254877a680f92f035e56058a39Douglas Gregor    }
168624c46b3133b03e254877a680f92f035e56058a39Douglas Gregor
168724c46b3133b03e254877a680f92f035e56058a39Douglas Gregor    InnerString = std::string(Kind) + " " + ContextStr + ID + InnerString;
168824c46b3133b03e254877a680f92f035e56058a39Douglas Gregor  } else
16894e16d0478407b556c819b5836a3564a9fdee8d5fDouglas Gregor    InnerString = ID + InnerString;
16905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1691