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