Type.cpp revision 425ef72306d4ff6b3698b744353e5f0e56b4b884
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 25f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregor#ifndef NDEBUG 26f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregorllvm::Statistic clang::objc_type_checks = 27f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregor { "clang", "Number of checks for Objective-C type nodes", 0, 0 }; 28f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregorllvm::Statistic clang::cxx_type_checks = 29f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregor { "clang", "Number of checks for C++ type nodes", 0, 0 }; 30f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregor#endif 31f540305c5d834ad9412b41805b81a74249b7c5afDouglas Gregor 32bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCallbool QualType::isConstant(QualType T, ASTContext &Ctx) { 33bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall if (T.isConstQualified()) 34b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes return true; 35b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes 36bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall if (const ArrayType *AT = Ctx.getAsArrayType(T)) 37bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return AT->getElementType().isConstant(Ctx); 38b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes 39b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes return false; 40b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes} 41b381aac9bae6d608c72267dd0ed08ec6369e94e4Nuno Lopes 42566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenekvoid Type::Destroy(ASTContext& C) { 43566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenek this->~Type(); 443e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(this); 454b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek} 464b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek 474b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenekvoid VariableArrayType::Destroy(ASTContext& C) { 48f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman if (SizeExpr) 49f91f5c8a66ffd812f61819836529f8ad437f7e2bEli Friedman SizeExpr->Destroy(C); 50566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenek this->~VariableArrayType(); 513e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(this); 524b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek} 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 54898574e7496ba8fd76290079d3a9d06954992734Douglas Gregorvoid DependentSizedArrayType::Destroy(ASTContext& C) { 55e7f38406a38f453e83000a1e52a5ec0aada66e51Argyrios Kyrtzidis // FIXME: Resource contention like in ConstantArrayWithExprType ? 56e7f38406a38f453e83000a1e52a5ec0aada66e51Argyrios Kyrtzidis // May crash, depending on platform or a particular build. 57e7f38406a38f453e83000a1e52a5ec0aada66e51Argyrios Kyrtzidis // SizeExpr->Destroy(C); 58566c2ba743065ec090f5154d5c30cf593aa12a6eTed Kremenek this->~DependentSizedArrayType(); 593e9704981d7691fdd44913bf1786e8d760d8a627Steve Naroff C.Deallocate(this); 60898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} 61c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid DependentSizedArrayType::Profile(llvm::FoldingSetNodeID &ID, 6304d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor ASTContext &Context, 6404d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor QualType ET, 6504d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor ArraySizeModifier SizeMod, 6604d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor unsigned TypeQuals, 6704d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor Expr *E) { 6804d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor ID.AddPointer(ET.getAsOpaquePtr()); 6904d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor ID.AddInteger(SizeMod); 7004d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor ID.AddInteger(TypeQuals); 7104d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor E->Profile(ID, Context, true); 7204d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor} 7304d4beee4b86af20a9e4457023d3925cab8f9908Douglas Gregor 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDependentSizedExtVectorType::Profile(llvm::FoldingSetNodeID &ID, 762ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor ASTContext &Context, 772ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor QualType ElementType, Expr *SizeExpr) { 782ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor ID.AddPointer(ElementType.getAsOpaquePtr()); 792ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor SizeExpr->Profile(ID, Context, true); 802ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor} 812ec09f1dc123e1942ed756e8ee4fef86451eac9eDouglas Gregor 829cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregorvoid DependentSizedExtVectorType::Destroy(ASTContext& C) { 83bd1099efde211cbb63fce3feee4ebcc6bac58781Douglas Gregor // FIXME: Deallocate size expression, once we're cloning properly. 84bd1099efde211cbb63fce3feee4ebcc6bac58781Douglas Gregor// if (SizeExpr) 85bd1099efde211cbb63fce3feee4ebcc6bac58781Douglas Gregor// SizeExpr->Destroy(C); 869cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor this->~DependentSizedExtVectorType(); 879cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor C.Deallocate(this); 889cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor} 899cdda0cf8528e3d595be9bfa002f0450074beb4dDouglas Gregor 90c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// getArrayElementTypeNoTypeQual - If this is an array type, return the 91c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// element type of the array, potentially with type qualifiers missing. 92c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner/// This method should never be used when type qualifiers are meaningful. 93c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattnerconst Type *Type::getArrayElementTypeNoTypeQual() const { 94c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If this is directly an array type, return it. 95c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const ArrayType *ATy = dyn_cast<ArrayType>(this)) 96c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return ATy->getElementType().getTypePtr(); 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If the canonical form of this type isn't the right kind, reject it. 990953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (!isa<ArrayType>(CanonicalType)) 100c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return 0; 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 102c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // If this is a typedef for an array type, strip the typedef off without 103c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // losing all typedef information. 104bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return cast<ArrayType>(getUnqualifiedDesugaredType()) 105bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall ->getElementType().getTypePtr(); 1062fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner} 1072fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner 108fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// \brief Retrieve the unqualified variant of the given type, removing as 109fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// little sugar as possible. 110fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// 111fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// This routine looks through various kinds of sugar to find the 112fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// least-desuraged type that is unqualified. For example, given: 113fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// 114fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// \code 115fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// typedef int Integer; 116fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// typedef const Integer CInteger; 117fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// typedef CInteger DifferenceType; 118fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// \endcode 119fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// 120fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// Executing \c getUnqualifiedTypeSlow() on the type \c DifferenceType will 121fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor/// desugar until we hit the type \c Integer, which has no qualifiers on it. 122fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas GregorQualType QualType::getUnqualifiedTypeSlow() const { 123fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor QualType Cur = *this; 124fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor while (true) { 125fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor if (!Cur.hasQualifiers()) 126fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor return Cur; 127fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor 128fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor const Type *CurTy = Cur.getTypePtr(); 129fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor switch (CurTy->getTypeClass()) { 130fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor#define ABSTRACT_TYPE(Class, Parent) 131fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor#define TYPE(Class, Parent) \ 132fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor case Type::Class: { \ 133fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor const Class##Type *Ty = cast<Class##Type>(CurTy); \ 134fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor if (!Ty->isSugared()) \ 135fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor return Cur.getLocalUnqualifiedType(); \ 136fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor Cur = Ty->desugar(); \ 137fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor break; \ 138fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor } 139fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor#include "clang/AST/TypeNodes.def" 140fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor } 141fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor } 142fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor 143fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor return Cur.getUnqualifiedType(); 144fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor} 145fa1a06e80706846fa15e0bd44671bdc3dfc53d84Douglas Gregor 1462fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// getDesugaredType - Return the specified type with any "sugar" removed from 1472fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// the type. This takes off typedefs, typeof's etc. If the outer level of 1482fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// the type is already concrete, it returns it unmodified. This is similar 1492fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// to getting the canonical type, but it doesn't remove *all* typedefs. For 1502fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// example, it returns "T*" as "T*", (not as "int*"), because the pointer is 1512fa8c2598c2615da4639b4e42e9079647bd3aea4Chris Lattner/// concrete. 152bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCallQualType QualType::getDesugaredType(QualType T) { 1530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Qs; 154c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 155bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall QualType Cur = T; 156bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall while (true) { 157bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall const Type *CurTy = Qs.strip(Cur); 158bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall switch (CurTy->getTypeClass()) { 159bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall#define ABSTRACT_TYPE(Class, Parent) 160bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall#define TYPE(Class, Parent) \ 161bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall case Type::Class: { \ 162bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall const Class##Type *Ty = cast<Class##Type>(CurTy); \ 163bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall if (!Ty->isSugared()) \ 164bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return Qs.apply(Cur); \ 165bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall Cur = Ty->desugar(); \ 166bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall break; \ 167bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall } 168bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall#include "clang/AST/TypeNodes.def" 169bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall } 170969c689d893a248eca4f049f5b89f747e66e4bffDouglas Gregor } 171bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall} 1725cdf82164dd7c2b2320d6735c63ace4331e0716dDouglas Gregor 173bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall/// getUnqualifiedDesugaredType - Pull any qualifiers and syntactic 174bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall/// sugar off the given type. This should produce an object of the 175bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall/// same dynamic type as the canonical type. 176bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCallconst Type *Type::getUnqualifiedDesugaredType() const { 177bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall const Type *Cur = this; 178bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall 179bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall while (true) { 180bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall switch (Cur->getTypeClass()) { 181bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall#define ABSTRACT_TYPE(Class, Parent) 182bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall#define TYPE(Class, Parent) \ 183bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall case Class: { \ 184bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall const Class##Type *Ty = cast<Class##Type>(Cur); \ 185bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall if (!Ty->isSugared()) return Cur; \ 186bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall Cur = Ty->desugar().getTypePtr(); \ 187bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall break; \ 188bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall } 189bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall#include "clang/AST/TypeNodes.def" 190bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall } 191bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall } 192c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner} 193c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isVoidType - Helper method to determine if this is the 'void' type. 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isVoidType() const { 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() == BuiltinType::Void; 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isObjectType() const { 202bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor if (isa<FunctionType>(CanonicalType) || isa<ReferenceType>(CanonicalType) || 203bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor isa<IncompleteArrayType>(CanonicalType) || isVoidType()) 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 205bad0e656c3732e3539a9cd6525de721d7e47408bDouglas Gregor return true; 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isDerivedType() const { 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (CanonicalType->getTypeClass()) { 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Pointer: 211fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case VariableArray: 212fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff case ConstantArray: 213c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman case IncompleteArray: 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case FunctionProto: 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case FunctionNoProto: 2167c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case LValueReference: 2177c80bd64032e610c0dbd74fc0ef6ea334447f2fdSebastian Redl case RValueReference: 21872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Record: 2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: 2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 22599dc91422144483c20d1c7381bc9ac634b646b04Chris Lattnerbool Type::isClassType() const { 2266217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RT = getAs<RecordType>()) 227f728a4a05df2455e1c6e62173ab720a92cd4a074Chris Lattner return RT->getDecl()->isClass(); 22899dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner return false; 22999dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner} 230c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isStructureType() const { 2316217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RT = getAs<RecordType>()) 232f728a4a05df2455e1c6e62173ab720a92cd4a074Chris Lattner return RT->getDecl()->isStruct(); 233c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner return false; 234c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner} 2357154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroffbool Type::isVoidPointerType() const { 2366217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = getAs<PointerType>()) 2377154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff return PT->getPointeeType()->isVoidType(); 2387154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff return false; 2397154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff} 2407154a77e7c1f23418342d3b72836ab504aa7821eSteve Naroff 241c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isUnionType() const { 2426217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RT = getAs<RecordType>()) 243f728a4a05df2455e1c6e62173ab720a92cd4a074Chris Lattner return RT->getDecl()->isUnion(); 244c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner return false; 245c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner} 246c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner 247c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerbool Type::isComplexType() const { 24802f62a9fedbc370fba081303399410a3afdde29fSteve Naroff if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType)) 24902f62a9fedbc370fba081303399410a3afdde29fSteve Naroff return CT->getElementType()->isFloatingType(); 25002f62a9fedbc370fba081303399410a3afdde29fSteve Naroff return false; 251c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner} 252c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner 2534cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffbool Type::isComplexIntegerType() const { 2544cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff // Check for GCC complex integer extension. 2550953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getAsComplexIntegerType(); 2564cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff} 2574cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff 2584cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffconst ComplexType *Type::getAsComplexIntegerType() const { 2590953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (const ComplexType *Complex = getAs<ComplexType>()) 2600953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (Complex->getElementType()->isIntegerType()) 2610953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return Complex; 2620953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return 0; 2634cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff} 2644cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff 26514108da7f7fc059772711e4ffee1322a27b152a7Steve NaroffQualType Type::getPointeeType() const { 2666217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = getAs<PointerType>()) 26714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return PT->getPointeeType(); 268183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) 26914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return OPT->getPointeeType(); 2706217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const BlockPointerType *BPT = getAs<BlockPointerType>()) 27114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return BPT->getPointeeType(); 2729c21289a866b677d21ed3d5ecfdfd5ced5a55410Mike Stump if (const ReferenceType *RT = getAs<ReferenceType>()) 2739c21289a866b677d21ed3d5ecfdfd5ced5a55410Mike Stump return RT->getPointeeType(); 27414108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return QualType(); 27514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff} 276b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner 277d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length 278d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// array types and types that contain variable array types in their 279d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// declarator 280d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffbool Type::isVariablyModifiedType() const { 281c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner // A VLA is a variably modified type. 282c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (isVariableArrayType()) 283d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman return true; 284d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman 285d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman // An array can contain a variably modified type 286c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner if (const Type *T = getArrayElementTypeNoTypeQual()) 287c63a1f276f7b324fd9a4be82098b1c8f7bf30733Chris Lattner return T->isVariablyModifiedType(); 288d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman 289f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // A pointer can point to a variably modified type. 290f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // Also, C++ references and member pointers can point to a variably modified 291f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // type, where VLAs appear as an extension to C++, and should be treated 292f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl // correctly. 2936217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = getAs<PointerType>()) 294d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman return PT->getPointeeType()->isVariablyModifiedType(); 2956217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const ReferenceType *RT = getAs<ReferenceType>()) 29668694ada8f4d8f6c4b00ea5b900df96428b28fc8Daniel Dunbar return RT->getPointeeType()->isVariablyModifiedType(); 2976217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const MemberPointerType *PT = getAs<MemberPointerType>()) 2988edef7c31d27fc9d5d163660702a8a7730a0d19fSebastian Redl return PT->getPointeeType()->isVariablyModifiedType(); 299d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman 300d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman // A function can return a variably modified type 301d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman // This one isn't completely obvious, but it follows from the 302d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman // definition in C99 6.7.5p3. Because of this rule, it's 303d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman // illegal to declare a function returning a variably modified type. 304183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const FunctionType *FT = getAs<FunctionType>()) 305d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman return FT->getResultType()->isVariablyModifiedType(); 306d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman 307d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff return false; 308d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff} 309d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff 310c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsStructureType() const { 3117064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff // If this is directly a structure type, return it. 312c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(this)) { 31339ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (RT->getDecl()->isStruct()) 314c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner return RT; 3157064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff } 316dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner 317dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner // If the canonical form of this type isn't the right kind, reject it. 318c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) { 31939ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (!RT->getDecl()->isStruct()) 320dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner return 0; 3211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 322dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner // If this is a typedef for a structure type, strip the typedef off without 323dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner // losing all typedef information. 324bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return cast<RecordType>(getUnqualifiedDesugaredType()); 3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3267064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff return 0; 3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpconst RecordType *Type::getAsUnionType() const { 3307064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff // If this is directly a union type, return it. 331c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(this)) { 33239ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (RT->getDecl()->isUnion()) 333c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner return RT; 3347064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff } 3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner // If the canonical form of this type isn't the right kind, reject it. 337c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) { 33839ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis if (!RT->getDecl()->isUnion()) 339dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner return 0; 340dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner 341dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner // If this is a typedef for a union type, strip the typedef off without 342dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner // losing all typedef information. 343bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return cast<RecordType>(getUnqualifiedDesugaredType()); 3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3467064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff return 0; 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 349fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas GregorObjCInterfaceType::ObjCInterfaceType(QualType Canonical, 35071842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek ObjCInterfaceDecl *D, 35171842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek ObjCProtocolDecl **Protos, unsigned NumP) : 35271842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek Type(ObjCInterface, Canonical, /*Dependent=*/false), 353fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor Decl(D), NumProtocols(NumP) 35471842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek{ 355fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor if (NumProtocols) 356fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor memcpy(reinterpret_cast<ObjCProtocolDecl**>(this + 1), Protos, 357fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor NumProtocols * sizeof(*Protos)); 35871842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek} 35971842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek 36071842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenekvoid ObjCInterfaceType::Destroy(ASTContext& C) { 36171842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek this->~ObjCInterfaceType(); 36271842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek C.Deallocate(this); 36371842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek} 36471842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek 365c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffconst ObjCInterfaceType *Type::getAsObjCQualifiedInterfaceType() const { 366c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff // There is no sugar for ObjCInterfaceType's, just return the canonical 367c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff // type pointer if it is the right class. There is no typedef information to 368c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff // return and these cannot be Address-space qualified. 369183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCInterfaceType *OIT = getAs<ObjCInterfaceType>()) 370c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff if (OIT->getNumProtocols()) 371c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff return OIT; 372c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff return 0; 373c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff} 374c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff 375c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffbool Type::isObjCQualifiedInterfaceType() const { 376e61ad0b7063fcd97204b1cce5558685144267eb6Steve Naroff return getAsObjCQualifiedInterfaceType() != 0; 377c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff} 378c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff 379fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas GregorObjCObjectPointerType::ObjCObjectPointerType(QualType Canonical, QualType T, 38071842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek ObjCProtocolDecl **Protos, 38171842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek unsigned NumP) : 38271842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek Type(ObjCObjectPointer, Canonical, /*Dependent=*/false), 383fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor PointeeType(T), NumProtocols(NumP) 38471842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek{ 385fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor if (NumProtocols) 386fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor memcpy(reinterpret_cast<ObjCProtocolDecl **>(this + 1), Protos, 387fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor NumProtocols * sizeof(*Protos)); 38871842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek} 38971842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek 39071842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenekvoid ObjCObjectPointerType::Destroy(ASTContext& C) { 39171842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek this->~ObjCObjectPointerType(); 39271842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek C.Deallocate(this); 39371842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek} 39471842cc07aafdebc9b180322ebb46f530beca5d6Ted Kremenek 395d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffconst ObjCObjectPointerType *Type::getAsObjCQualifiedIdType() const { 396eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner // There is no sugar for ObjCQualifiedIdType's, just return the canonical 397eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner // type pointer if it is the right class. 398183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) { 399d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff if (OPT->isObjCQualifiedIdType()) 400d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff return OPT; 401d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff } 402d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff return 0; 403368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner} 404368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner 40514108da7f7fc059772711e4ffee1322a27b152a7Steve Naroffconst ObjCObjectPointerType *Type::getAsObjCInterfacePointerType() const { 406183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const ObjCObjectPointerType *OPT = getAs<ObjCObjectPointerType>()) { 40714108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff if (OPT->getInterfaceType()) 40814108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return OPT; 40914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff } 41014108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff return 0; 41114108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff} 41214108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff 413a91d6a6619a91d0ca7102d8ab5678d855f04d850Fariborz Jahanianconst CXXRecordDecl *Type::getCXXRecordDeclForPointerType() const { 4146217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const PointerType *PT = getAs<PointerType>()) 4156217b80b7a1379b74cced1c076338262c3c980b3Ted Kremenek if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>()) 416a91d6a6619a91d0ca7102d8ab5678d855f04d850Fariborz Jahanian return dyn_cast<CXXRecordDecl>(RT->getDecl()); 417a91d6a6619a91d0ca7102d8ab5678d855f04d850Fariborz Jahanian return 0; 418a91d6a6619a91d0ca7102d8ab5678d855f04d850Fariborz Jahanian} 419a91d6a6619a91d0ca7102d8ab5678d855f04d850Fariborz Jahanian 4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIntegerType() const { 4215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 4225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() >= BuiltinType::Bool && 4232df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner BT->getKind() <= BuiltinType::Int128; 4245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 425834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner // Incomplete enum types are not treated as integer types. 4268e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor // FIXME: In C++, enum types are never integer types. 427834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) 4285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 429c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 430c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff return VT->getElementType()->isIntegerType(); 4315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 4325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 43433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanianbool Type::isIntegralType() const { 43533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 43633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian return BT->getKind() >= BuiltinType::Bool && 437f5f7d864f5067d1ea4bff7fcf41b53a43b7b48baAnders Carlsson BT->getKind() <= BuiltinType::Int128; 43833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 439834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) 440834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner return true; // Complete enum types are integral. 4418e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor // FIXME: In C++, enum types are never integral. 44233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian return false; 44333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian} 44433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian 44513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isEnumeralType() const { 44613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 44739ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis return TT->getDecl()->isEnum(); 44813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff return false; 44913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff} 45013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff 45113b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isBooleanType() const { 45213b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 45313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff return BT->getKind() == BuiltinType::Bool; 45413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff return false; 45513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff} 45613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff 45713b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isCharType() const { 45813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 45913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff return BT->getKind() == BuiltinType::Char_U || 46013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff BT->getKind() == BuiltinType::UChar || 461c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson BT->getKind() == BuiltinType::Char_S || 462c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson BT->getKind() == BuiltinType::SChar; 46313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff return false; 46413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff} 46513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff 46677a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregorbool Type::isWideCharType() const { 46777a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 46877a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor return BT->getKind() == BuiltinType::WChar; 46977a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor return false; 47077a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor} 47177a52233f7c0f162672652051bfe78b65ad4f789Douglas Gregor 47220093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// \brief Determine whether this type is any of the built-in character 47320093b4bf698f292c664676987541d5103b65b15Douglas Gregor/// types. 47420093b4bf698f292c664676987541d5103b65b15Douglas Gregorbool Type::isAnyCharacterType() const { 47520093b4bf698f292c664676987541d5103b65b15Douglas Gregor if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 47620093b4bf698f292c664676987541d5103b65b15Douglas Gregor return (BT->getKind() >= BuiltinType::Char_U && 47720093b4bf698f292c664676987541d5103b65b15Douglas Gregor BT->getKind() <= BuiltinType::Char32) || 47820093b4bf698f292c664676987541d5103b65b15Douglas Gregor (BT->getKind() >= BuiltinType::Char_S && 47920093b4bf698f292c664676987541d5103b65b15Douglas Gregor BT->getKind() <= BuiltinType::WChar); 48020093b4bf698f292c664676987541d5103b65b15Douglas Gregor 48120093b4bf698f292c664676987541d5103b65b15Douglas Gregor return false; 48220093b4bf698f292c664676987541d5103b65b15Douglas Gregor} 48320093b4bf698f292c664676987541d5103b65b15Douglas Gregor 484d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isSignedIntegerType - Return true if this is an integer type that is 485d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 486d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// an enum decl which has a signed representation, or a vector of signed 487d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// integer element type. 4885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isSignedIntegerType() const { 4895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) { 4905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() >= BuiltinType::Char_S && 491f5f7d864f5067d1ea4bff7fcf41b53a43b7b48baAnders Carlsson BT->getKind() <= BuiltinType::Int128; 4925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49437c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 49537c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner return ET->getDecl()->getIntegerType()->isSignedIntegerType(); 4961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 497c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 498c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff return VT->getElementType()->isSignedIntegerType(); 4995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 502d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isUnsignedIntegerType - Return true if this is an integer type that is 503d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 504d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// decl which has an unsigned representation, or a vector of unsigned integer 505d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// element type. 5065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isUnsignedIntegerType() const { 5075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) { 5085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() >= BuiltinType::Bool && 5091c03ca30ae962199ef702324b48550f6af7fdc32Anders Carlsson BT->getKind() <= BuiltinType::UInt128; 5105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 511d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner 51237c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 51337c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); 514d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner 515c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 516c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff return VT->getElementType()->isUnsignedIntegerType(); 5175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isFloatingType() const { 5215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() >= BuiltinType::Float && 5235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer BT->getKind() <= BuiltinType::LongDouble; 5245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType)) 525729a2131228cb7fcbc00bd8af36bc6f14d12317dChris Lattner return CT->getElementType()->isFloatingType(); 526c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 527c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff return VT->getElementType()->isFloatingType(); 5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealFloatingType() const { 5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 533680523a91dd3351389667c8de17121ba7ae82673John McCall return BT->isFloatingPoint(); 534c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 535c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff return VT->getElementType()->isRealFloatingType(); 5365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealType() const { 5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() >= BuiltinType::Bool && 5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer BT->getKind() <= BuiltinType::LongDouble; 5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 544834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner return TT->getDecl()->isEnum() && TT->getDecl()->isDefinition(); 545c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 546c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff return VT->getElementType()->isRealType(); 5475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isArithmeticType() const { 5515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 552a7fbf7282eadebaf1293d9f970b01fb57f4b0ae4Douglas Gregor return BT->getKind() >= BuiltinType::Bool && 553a7fbf7282eadebaf1293d9f970b01fb57f4b0ae4Douglas Gregor BT->getKind() <= BuiltinType::LongDouble; 55437c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 55537c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2). 55637c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner // If a body isn't seen by the time we get here, return false. 55737c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner return ET->getDecl()->isDefinition(); 5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType); 5595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isScalarType() const { 5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return BT->getKind() != BuiltinType::Void; 5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) { 565834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner // Enums are scalar types, but only if they are defined. Incomplete enums 566834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner // are not treated as scalar types. 567834a72ac74cf4ff07ba6215545dba3db578f8a07Chris Lattner if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) 5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return true; 5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 5715618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff return isa<PointerType>(CanonicalType) || 5725618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff isa<BlockPointerType>(CanonicalType) || 573f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl isa<MemberPointerType>(CanonicalType) || 5745618bd4a52c45fbbb605e3ba885663b2164db8a3Steve Naroff isa<ComplexType>(CanonicalType) || 575d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff isa<ObjCObjectPointerType>(CanonicalType); 5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 578d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// \brief Determines whether the type is a C++ aggregate type or C 579d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// aggregate or union type. 580d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// 581d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// An aggregate type is an array or a class type (struct, union, or 582d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// class) that has no user-declared constructors, no private or 583d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// protected non-static data members, no base classes, and no virtual 584d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// functions (C++ [dcl.init.aggr]p1). The notion of an aggregate type 585d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// subsumes the notion of C aggregates (C99 6.2.5p21) because it also 586d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor/// includes union types. 5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isAggregateType() const { 588c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor if (const RecordType *Record = dyn_cast<RecordType>(CanonicalType)) { 589c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(Record->getDecl())) 590c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor return ClassDecl->isAggregate(); 591c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor 592d7eb846aaf5ee4a8d22c3cd0796d1e7229d46013Douglas Gregor return true; 593c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor } 594c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor 595c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return isa<ArrayType>(CanonicalType); 5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5989bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// isConstantSizeType - Return true if this is not a variable sized type, 5999bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// according to the rules of C99 6.7.5p3. It is not legal to call this on 600898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor/// incomplete types or dependent types. 6013c2b3170041f69a92904e3bab9b6d654eaf260acEli Friedmanbool Type::isConstantSizeType() const { 602d52a4578144ab2887912e52eabec58a857a44adbChris Lattner assert(!isIncompleteType() && "This doesn't make sense for incomplete types"); 603898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor assert(!isDependentType() && "This doesn't make sense for dependent types"); 6049bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner // The VAT must have a size, as it is known to be complete. 6059bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner return !isa<VariableArrayType>(CanonicalType); 6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1) 6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - a type that can describe objects, but which lacks information needed to 6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// determine its size. 6111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool Type::isIncompleteType() const { 6121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump switch (CanonicalType->getTypeClass()) { 6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: return false; 6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Builtin: 6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Void is the only incomplete builtin type. Per C99 6.2.5p19, it can never 6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // be completed. 6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return isVoidType(); 61872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Record: 61972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Enum: 6205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // A tagged type (struct/union/enum/class) is incomplete if the decl is a 6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // forward declaration, but not a full definition (C99 6.2.5p22). 6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return !cast<TagType>(CanonicalType)->getDecl()->isDefinition(); 623923d56d436f750bc1f29db50e641078725558a1bSebastian Redl case ConstantArray: 624923d56d436f750bc1f29db50e641078725558a1bSebastian Redl // An array is incomplete if its element type is incomplete 625923d56d436f750bc1f29db50e641078725558a1bSebastian Redl // (C++ [dcl.array]p1). 626923d56d436f750bc1f29db50e641078725558a1bSebastian Redl // We don't handle variable arrays (they're not allowed in C++) or 627923d56d436f750bc1f29db50e641078725558a1bSebastian Redl // dependent-sized arrays (dependent types are never treated as incomplete). 628923d56d436f750bc1f29db50e641078725558a1bSebastian Redl return cast<ArrayType>(CanonicalType)->getElementType()->isIncompleteType(); 629c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman case IncompleteArray: 6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // An array of unknown size is an incomplete type (C99 6.2.5p22). 631c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman return true; 6321efaa9594a81709a17658fd80ae7e783e1026407Chris Lattner case ObjCInterface: 6331efaa9594a81709a17658fd80ae7e783e1026407Chris Lattner // ObjC interfaces are incomplete if they are @class, not @interface. 6341efaa9594a81709a17658fd80ae7e783e1026407Chris Lattner return cast<ObjCInterfaceType>(this)->getDecl()->isForwardDecl(); 6355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 63864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl/// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10) 63964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlbool Type::isPODType() const { 64064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl // The compiler shouldn't query this for incomplete types, but the user might. 64164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl // We return false for that case. 64264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl if (isIncompleteType()) 64364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl return false; 64464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 64564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl switch (CanonicalType->getTypeClass()) { 64664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl // Everything not explicitly mentioned is not POD. 64764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl default: return false; 64864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case VariableArray: 64964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case ConstantArray: 65064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl // IncompleteArray is caught by isIncompleteType() above. 65164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl return cast<ArrayType>(CanonicalType)->getElementType()->isPODType(); 65264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 65364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case Builtin: 65464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case Complex: 65564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case Pointer: 656f30208ad5b334e93582e846a2a0c92f38a607b8aSebastian Redl case MemberPointer: 65764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case Vector: 65864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case ExtVector: 659d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff case ObjCObjectPointer: 6602263f822c31d0855ca8c48bfd9624322bf776f0bFariborz Jahanian case BlockPointer: 66164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl return true; 66264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 66372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Enum: 66472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor return true; 66572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor 66672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor case Record: 6671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (CXXRecordDecl *ClassDecl 668c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor = dyn_cast<CXXRecordDecl>(cast<RecordType>(CanonicalType)->getDecl())) 669c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor return ClassDecl->isPOD(); 670c1efaecf0373f1a55c5ef4c234357cf726fc0600Douglas Gregor 67164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl // C struct/union is POD. 67264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl return true; 67364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 67464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 67564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 676ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redlbool Type::isLiteralType() const { 677ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl if (isIncompleteType()) 678ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl return false; 679ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl 680ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // C++0x [basic.types]p10: 681ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // A type is a literal type if it is: 682ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl switch (CanonicalType->getTypeClass()) { 683ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // We're whitelisting 684ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl default: return false; 685ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl 686ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // -- a scalar type 687ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case Builtin: 688ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case Complex: 689ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case Pointer: 690ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case MemberPointer: 691ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case Vector: 692ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case ExtVector: 693ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case ObjCObjectPointer: 694ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case Enum: 695ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl return true; 696ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl 697ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // -- a class type with ... 698ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case Record: 699ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // FIXME: Do the tests 700ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl return false; 701ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl 702ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // -- an array of literal type 703ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // Extension: variable arrays cannot be literal types, since they're 704ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl // runtime-sized. 705ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl case ConstantArray: 706ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl return cast<ArrayType>(CanonicalType)->getElementType()->isLiteralType(); 707ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl } 708ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl} 709ccf43505dbc47da041c06125f90b3bd3ac7eac97Sebastian Redl 7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isPromotableIntegerType() const { 711183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = getAs<BuiltinType>()) 7122a18dfe292cf3c406a769c3672080970ac586345Chris Lattner switch (BT->getKind()) { 7132a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::Bool: 7142a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::Char_S: 7152a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::Char_U: 7162a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::SChar: 7172a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::UChar: 7182a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::Short: 7192a18dfe292cf3c406a769c3672080970ac586345Chris Lattner case BuiltinType::UShort: 7202a18dfe292cf3c406a769c3672080970ac586345Chris Lattner return true; 7211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump default: 7222a18dfe292cf3c406a769c3672080970ac586345Chris Lattner return false; 7232a18dfe292cf3c406a769c3672080970ac586345Chris Lattner } 724aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 725aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // Enumerated types are promotable to their compatible integer types 726aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor // (C99 6.3.1.1) a.k.a. its underlying type (C++ [conv.prom]p2). 727aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (const EnumType *ET = getAs<EnumType>()){ 728aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor if (this->isDependentType() || ET->getDecl()->getPromotionType().isNull()) 729aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor return false; 730aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 731aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor const BuiltinType *BT 732aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor = ET->getDecl()->getPromotionType()->getAs<BuiltinType>(); 733aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor return BT->getKind() == BuiltinType::Int 734aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor || BT->getKind() == BuiltinType::UInt; 735aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor } 736aa74a1e49f7c4b89539830290f76fe2c3e97187fDouglas Gregor 7372a18dfe292cf3c406a769c3672080970ac586345Chris Lattner return false; 7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 7406e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlbool Type::isNullPtrType() const { 741183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall if (const BuiltinType *BT = getAs<BuiltinType>()) 7426e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl return BT->getKind() == BuiltinType::NullPtr; 7436e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl return false; 7446e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 7456e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 74622b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedmanbool Type::isSpecifierType() const { 74722b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman // Note that this intentionally does not use the canonical type. 74822b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman switch (getTypeClass()) { 74922b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman case Builtin: 75022b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman case Record: 75122b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman case Enum: 75222b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman case Typedef: 753c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case Complex: 754c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case TypeOfExpr: 755c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case TypeOf: 756c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case TemplateTypeParm: 75749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall case SubstTemplateTypeParm: 758c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case TemplateSpecialization: 759c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case QualifiedName: 760c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case Typename: 761c8f2c61f4f667c2bc3e4e74b274fa397a4232393Eli Friedman case ObjCInterface: 762d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff case ObjCObjectPointer: 7637c67395283dae28408138176cafec00c42987459Douglas Gregor case Elaborated: 76422b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman return true; 76522b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman default: 76622b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman return false; 76722b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman } 76822b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman} 76922b61e937dcd8ba2e14764c367f975a392ec7da0Eli Friedman 770cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidisconst char *Type::getTypeClassName() const { 771cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis switch (TC) { 772cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis default: assert(0 && "Type class not in TypeNodes.def!"); 773cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis#define ABSTRACT_TYPE(Derived, Base) 774cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis#define TYPE(Derived, Base) case Derived: return #Derived; 775cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis#include "clang/AST/TypeNodes.def" 776cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis } 777cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis} 778cd01f17358dc8ef19338c0e2321138dd0a6160d9Argyrios Kyrtzidis 779e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattnerconst char *BuiltinType::getName(const LangOptions &LO) const { 7805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (getKind()) { 7815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unknown builtin type!"); 7825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Void: return "void"; 783e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner case Bool: return LO.Bool ? "bool" : "_Bool"; 7845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Char_S: return "char"; 7855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Char_U: return "char"; 7865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case SChar: return "signed char"; 7875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Short: return "short"; 7885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Int: return "int"; 7895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Long: return "long"; 7905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LongLong: return "long long"; 7912df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case Int128: return "__int128_t"; 7925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UChar: return "unsigned char"; 7935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UShort: return "unsigned short"; 7945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case UInt: return "unsigned int"; 7955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ULong: return "unsigned long"; 7965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case ULongLong: return "unsigned long long"; 7972df9ced9fd1e8c7d7b38443db07e0e811de22571Chris Lattner case UInt128: return "__uint128_t"; 7985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Float: return "float"; 7995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case Double: return "double"; 8005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case LongDouble: return "long double"; 80146713efe13c89f4ec9cd9546c7b598fe7186089bArgyrios Kyrtzidis case WChar: return "wchar_t"; 802f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case Char16: return "char16_t"; 803f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case Char32: return "char32_t"; 8046e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl case NullPtr: return "nullptr_t"; 8058e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor case Overload: return "<overloaded function type>"; 806898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor case Dependent: return "<dependent type>"; 8076a75cd9c1d54625fca7b5477ab9545bcdbd85ea4Anders Carlsson case UndeducedAuto: return "auto"; 808de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff case ObjCId: return "id"; 809de2e22d33afec98324a66a358dfe0951b3c7259aSteve Naroff case ObjCClass: return "Class"; 81004765ac135e0c4e6b78651c2a287d80a32b2b8b9Fariborz Jahanian case ObjCSel: return "SEL"; 8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 81404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCallllvm::StringRef FunctionType::getNameForCallConv(CallingConv CC) { 81504a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall switch (CC) { 81604a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall case CC_Default: llvm_unreachable("no name for default cc"); 81704a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall default: return ""; 81804a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall 81904a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall case CC_C: return "cdecl"; 82004a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall case CC_X86StdCall: return "stdcall"; 82104a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall case CC_X86FastCall: return "fastcall"; 82204a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall } 82304a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall} 82404a67a6aa3dfdc92d57f7f8d93ba397348c868a4John McCall 82572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregorvoid FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result, 826942cfd37297528918616d06cd6e4e8bd6e4915a2Chris Lattner arg_type_iterator ArgTys, 827971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis unsigned NumArgs, bool isVariadic, 828465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl unsigned TypeQuals, bool hasExceptionSpec, 829465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl bool anyExceptionSpec, unsigned NumExceptions, 830264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola exception_iterator Exs, 831264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola const FunctionType::ExtInfo &Info) { 8325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ID.AddPointer(Result.getAsOpaquePtr()); 8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0; i != NumArgs; ++i) 8345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ID.AddPointer(ArgTys[i].getAsOpaquePtr()); 8355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer ID.AddInteger(isVariadic); 836971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis ID.AddInteger(TypeQuals); 837465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl ID.AddInteger(hasExceptionSpec); 838465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl if (hasExceptionSpec) { 839465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl ID.AddInteger(anyExceptionSpec); 8401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (unsigned i = 0; i != NumExceptions; ++i) 841465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl ID.AddPointer(Exs[i].getAsOpaquePtr()); 842465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl } 843264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola ID.AddInteger(Info.getNoReturn()); 844425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola ID.AddInteger(Info.getRegParm()); 845264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola ID.AddInteger(Info.getCC()); 8465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 84872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregorvoid FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID) { 849971c4fae6092976338b755af1d47dac07c8f16e3Argyrios Kyrtzidis Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic(), 850465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl getTypeQuals(), hasExceptionSpec(), hasAnyExceptionSpec(), 851264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola getNumExceptions(), exception_begin(), 852264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola getExtInfo()); 8535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 855d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffvoid ObjCObjectPointerType::Profile(llvm::FoldingSetNodeID &ID, 856fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor QualType OIT, 857fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor ObjCProtocolDecl * const *protocols, 858d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff unsigned NumProtocols) { 85914108da7f7fc059772711e4ffee1322a27b152a7Steve Naroff ID.AddPointer(OIT.getAsOpaquePtr()); 8604b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian for (unsigned i = 0; i != NumProtocols; i++) 8614b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian ID.AddPointer(protocols[i]); 8624b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian} 8634b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian 864d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffvoid ObjCObjectPointerType::Profile(llvm::FoldingSetNodeID &ID) { 865fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor Profile(ID, getPointeeType(), qual_begin(), getNumProtocols()); 8664b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian} 8674b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian 868a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 869a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// potentially looking through *all* consequtive typedefs. This returns the 870a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// sum of the type qualifiers, so if you have: 871a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// typedef const int A; 872a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// typedef volatile A B; 873a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// looking through the typedefs for B will give you "const volatile A". 874a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// 875a2c7767ce7d8feb10253f4b650826a20f3324c6fChris LattnerQualType TypedefType::LookThroughTypedefs() const { 876a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner // Usually, there is only a single level of typedefs, be fast in that case. 877a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner QualType FirstType = getDecl()->getUnderlyingType(); 878a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner if (!isa<TypedefType>(FirstType)) 879a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner return FirstType; 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 881a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner // Otherwise, do the fully general loop. 8820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Qs; 8831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8840953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualType CurType; 8850953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const TypedefType *TDT = this; 8860953e767ff7817f97b3ab20896b229891eeff45bJohn McCall do { 8870953e767ff7817f97b3ab20896b229891eeff45bJohn McCall CurType = TDT->getDecl()->getUnderlyingType(); 8880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall TDT = dyn_cast<TypedefType>(Qs.strip(CurType)); 8890953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } while (TDT); 8901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return Qs.apply(CurType); 892a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner} 8935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 894bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCallQualType TypedefType::desugar() const { 895bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return getDecl()->getUnderlyingType(); 896bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall} 897bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall 89872564e73277e29f6db3305d1f27ba408abb7ed88Douglas GregorTypeOfExprType::TypeOfExprType(Expr *E, QualType can) 89972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor : Type(TypeOfExpr, can, E->isTypeDependent()), TOExpr(E) { 900898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor} 901898574e7496ba8fd76290079d3a9d06954992734Douglas Gregor 902bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCallQualType TypeOfExprType::desugar() const { 903bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall return getUnderlyingExpr()->getType(); 904bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall} 905bf1cc05907ceb2081e8158b26f3d3f48b31caad3John McCall 9061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid DependentTypeOfExprType::Profile(llvm::FoldingSetNodeID &ID, 907b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor ASTContext &Context, Expr *E) { 908b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor E->Profile(ID, Context, true); 909b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor} 910b197572cf1cd70a817a1f546478cb2cb9112c48eDouglas Gregor 911563a03b1338d31c2462def43253a722bc885d384Anders CarlssonDecltypeType::DecltypeType(Expr *E, QualType underlyingType, QualType can) 9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Type(Decltype, can, E->isTypeDependent()), E(E), 913563a03b1338d31c2462def43253a722bc885d384Anders Carlsson UnderlyingType(underlyingType) { 914395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson} 915395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson 9169d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas GregorDependentDecltypeType::DependentDecltypeType(ASTContext &Context, Expr *E) 9179d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor : DecltypeType(E, Context.DependentTy), Context(Context) { } 9189d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor 9191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID, 9209d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor ASTContext &Context, Expr *E) { 9219d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor E->Profile(ID, Context, true); 9229d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor} 9239d702ae1cd5cfa19d884cbef77e1df99395138bbDouglas Gregor 92419c8576b7328f4dc2d07682f5da552875c1912efJohn McCallTagType::TagType(TypeClass TC, const TagDecl *D, QualType can) 92519c8576b7328f4dc2d07682f5da552875c1912efJohn McCall : Type(TC, can, D->isDependentType()), 92619c8576b7328f4dc2d07682f5da552875c1912efJohn McCall decl(const_cast<TagDecl*>(D), 0) {} 9277da97d0f31e1ec16998d3de2cfd2e88fe3736673Douglas Gregor 9282daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool RecordType::classof(const TagType *TT) { 9292daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner return isa<RecordDecl>(TT->getDecl()); 9305edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner} 9315edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner 9322daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool EnumType::classof(const TagType *TT) { 9332daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner return isa<EnumDecl>(TT->getDecl()); 9345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 9355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 936833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallstatic bool isDependent(const TemplateArgument &Arg) { 937833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall switch (Arg.getKind()) { 938833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Null: 939833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall assert(false && "Should not have a NULL template argument"); 940833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 941833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 942833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Type: 943833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return Arg.getAsType()->isDependentType(); 944833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 945788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor case TemplateArgument::Template: 946788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor return Arg.getAsTemplate().isDependent(); 947788cd06cf8e868a67158aafec5de3a1f408d14f3Douglas Gregor 948833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Declaration: 949833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Integral: 950833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall // Never dependent 951833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 952833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 953833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Expression: 954833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return (Arg.getAsExpr()->isTypeDependent() || 955833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall Arg.getAsExpr()->isValueDependent()); 956833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 957833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall case TemplateArgument::Pack: 958833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall assert(0 && "FIXME: Implement!"); 959833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 96055f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor } 96140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor 96240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor return false; 96355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 96455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 965833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TemplateSpecializationType:: 966d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallanyDependentTemplateArguments(const TemplateArgumentListInfo &Args) { 967d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall return anyDependentTemplateArguments(Args.getArgumentArray(), Args.size()); 968d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall} 969d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCall 970d5532b6cfff2977e0c59fa6ead7f7973984a620dJohn McCallbool TemplateSpecializationType:: 971833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallanyDependentTemplateArguments(const TemplateArgumentLoc *Args, unsigned N) { 972833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0; i != N; ++i) 973833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (isDependent(Args[i].getArgument())) 974833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 975833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 976833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 977833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 978833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallbool TemplateSpecializationType:: 979833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallanyDependentTemplateArguments(const TemplateArgument *Args, unsigned N) { 980833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (unsigned i = 0; i != N; ++i) 981833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall if (isDependent(Args[i])) 982833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return true; 983833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall return false; 984833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall} 985833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall 9867532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType:: 9871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateSpecializationType(ASTContext &Context, TemplateName T, 988828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor const TemplateArgument *Args, 9897532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor unsigned NumArgs, QualType Canon) 9901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump : Type(TemplateSpecialization, 99140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor Canon.isNull()? QualType(this, 0) : Canon, 9927532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)), 993828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor Context(Context), 9941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Template(T), NumArgs(NumArgs) { 9951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((!Canon.isNull() || 9967532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)) && 99740808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor "No canonical type for non-dependent class template specialization"); 99855f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 9991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateArgument *TemplateArgs 100040808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor = reinterpret_cast<TemplateArgument *>(this + 1); 100155f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 100240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor new (&TemplateArgs[Arg]) TemplateArgument(Args[Arg]); 100355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 100455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 10057532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregorvoid TemplateSpecializationType::Destroy(ASTContext& C) { 1006ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor for (unsigned Arg = 0; Arg < NumArgs; ++Arg) { 1007ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor // FIXME: Not all expressions get cloned, so we can't yet perform 1008ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor // this destruction. 1009ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor // if (Expr *E = getArg(Arg).getAsExpr()) 1010ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor // E->Destroy(C); 1011ba49817c5b9f502602672861cf369fd0e53966e8Douglas Gregor } 101240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor} 101340808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor 10147532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::iterator 10157532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::end() const { 101640808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor return begin() + getNumArgs(); 10175908e9f25bc9a334c99c095e0b1e6a515445be2dDouglas Gregor} 10185908e9f25bc9a334c99c095e0b1e6a515445be2dDouglas Gregor 101940808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregorconst TemplateArgument & 10207532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas GregorTemplateSpecializationType::getArg(unsigned Idx) const { 102140808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor assert(Idx < getNumArgs() && "Template argument out of range"); 102240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor return getArgs()[Idx]; 102355f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 102455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor 10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 10261eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, 10271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName T, 10281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const TemplateArgument *Args, 1029828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor unsigned NumArgs, 1030828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor ASTContext &Context) { 10317532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor T.Profile(ID); 103240808ce6ac04b102c3b56244a635d6b98eed6d97Douglas Gregor for (unsigned Idx = 0; Idx < NumArgs; ++Idx) 1033828e226ab7ed08b3eb766549e9d3306432137460Douglas Gregor Args[Idx].Profile(ID, Context); 103455f6b14230c94272efbbcdd89a92224c8db9f225Douglas Gregor} 103597e0179f1ae545e07d9f5e7c1d2ef5c5bab06676Anders Carlsson 10360953e767ff7817f97b3ab20896b229891eeff45bJohn McCallQualType QualifierCollector::apply(QualType QT) const { 10370953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (!hasNonFastQualifiers()) 10380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QT.withFastQualifiers(getFastQualifiers()); 10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(Context && "extended qualifiers but no context!"); 10410953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return Context->getQualifiedType(QT, *this); 10425e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor} 10435e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor 10440953e767ff7817f97b3ab20896b229891eeff45bJohn McCallQualType QualifierCollector::apply(const Type *T) const { 10450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (!hasNonFastQualifiers()) 10460953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return QualType(T, getFastQualifiers()); 10470953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 10480953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(Context && "extended qualifiers but no context!"); 10490953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return Context->getQualifiedType(T, *this); 10505e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor} 10515e03f9ea8174ae588c5e69ec6b5ef4c68f8fd766Douglas Gregor 1052c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid ObjCInterfaceType::Profile(llvm::FoldingSetNodeID &ID, 1053c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff const ObjCInterfaceDecl *Decl, 1054fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor ObjCProtocolDecl * const *protocols, 1055c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff unsigned NumProtocols) { 1056c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff ID.AddPointer(Decl); 1057c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff for (unsigned i = 0; i != NumProtocols; i++) 1058c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff ID.AddPointer(protocols[i]); 1059c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff} 1060c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff 1061c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid ObjCInterfaceType::Profile(llvm::FoldingSetNodeID &ID) { 1062fd6a0887a099256c35a5b23e9afd517ffe95fa0aDouglas Gregor Profile(ID, getDecl(), qual_begin(), getNumProtocols()); 1063c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff} 10640b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 10650b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage Type::getLinkage() const { 10660b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // C++ [basic.link]p8: 10670b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // Names not covered by these rules have no linkage. 10680b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor if (this != CanonicalType.getTypePtr()) 10690b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return CanonicalType->getLinkage(); 10700b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 10710b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return NoLinkage; 10720b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 10730b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 10740b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage BuiltinType::getLinkage() const { 10750b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // C++ [basic.link]p8: 10760b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // A type is said to have linkage if and only if: 10770b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // - it is a fundamental type (3.9.1); or 10780b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return ExternalLinkage; 10790b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 10800b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 10810b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage TagType::getLinkage() const { 10820b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // C++ [basic.link]p8: 10830b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // - it is a class or enumeration type that is named (or has a name for 10840b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // linkage purposes (7.1.3)) and the name has linkage; or 10850b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor // - it is a specialization of a class template (14); or 10860b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return getDecl()->getLinkage(); 10870b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 10880b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 10890b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// C++ [basic.link]p8: 10900b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// - it is a compound type (3.9.2) other than a class or enumeration, 10910b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor// compounded exclusively from types that have linkage; or 10920b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage ComplexType::getLinkage() const { 10930b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return ElementType->getLinkage(); 10940b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 10950b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 10960b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage PointerType::getLinkage() const { 10970b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return PointeeType->getLinkage(); 10980b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 10990b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11000b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage BlockPointerType::getLinkage() const { 11010b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return PointeeType->getLinkage(); 11020b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11030b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11040b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage ReferenceType::getLinkage() const { 11050b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return PointeeType->getLinkage(); 11060b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11070b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11080b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage MemberPointerType::getLinkage() const { 11090b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return minLinkage(Class->getLinkage(), PointeeType->getLinkage()); 11100b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11110b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11120b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage ArrayType::getLinkage() const { 11130b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return ElementType->getLinkage(); 11140b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11150b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11160b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage VectorType::getLinkage() const { 11170b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return ElementType->getLinkage(); 11180b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11190b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11200b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage FunctionNoProtoType::getLinkage() const { 11210b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return getResultType()->getLinkage(); 11220b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11230b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11240b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage FunctionProtoType::getLinkage() const { 11250b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor Linkage L = getResultType()->getLinkage(); 11260b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor for (arg_type_iterator A = arg_type_begin(), AEnd = arg_type_end(); 11270b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor A != AEnd; ++A) 11280b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor L = minLinkage(L, (*A)->getLinkage()); 11290b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11300b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return L; 11310b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11320b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11330b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage ObjCInterfaceType::getLinkage() const { 11340b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return ExternalLinkage; 11350b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 11360b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor 11370b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas GregorLinkage ObjCObjectPointerType::getLinkage() const { 11380b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor return ExternalLinkage; 11390b6bc8bd7a1d2a7d7478d13d78cff94cacad61fcDouglas Gregor} 1140