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