Type.cpp revision 4b05b1dee6cc65ae61d93dab7edff72710f24589
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
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Type.h"
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Decl.h"
16980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff#include "clang/AST/DeclObjC.h"
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/Expr.h"
18c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner#include "clang/Basic/IdentifierTable.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h"
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Support/Streams.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/ADT/StringExtras.h"
228d1a3b8ca1e5fcc4567b5a6f51d82be2e460de1cSteve Naroff#include <sstream>
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
254b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenekvoid Type::Destroy(ASTContext& C) { delete this; }
264b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek
274b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenekvoid FunctionTypeProto::Destroy(ASTContext& C) {
284b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek  // Destroy the object, but don't call delete.  These are malloc'd.
294b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek  this->~FunctionTypeProto();
304b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek  free(this);
314b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek}
324b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek
334b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenekvoid VariableArrayType::Destroy(ASTContext& C) {
344b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek  SizeExpr->Destroy(C);
354b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek  delete this;
364b05b1dee6cc65ae61d93dab7edff72710f24589Ted Kremenek}
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isVoidType - Helper method to determine if this is the 'void' type.
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isVoidType() const {
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() == BuiltinType::Void;
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isObjectType() const {
465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isa<FunctionType>(CanonicalType))
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else if (CanonicalType->isIncompleteType())
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isDerivedType() const {
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (CanonicalType->getTypeClass()) {
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Pointer:
57fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case VariableArray:
58fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  case ConstantArray:
59c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  case IncompleteArray:
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case FunctionProto:
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case FunctionNoProto:
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Reference:
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Tagged: {
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const TagType *TT = cast<TagType>(CanonicalType);
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    const Decl::Kind Kind = TT->getDecl()->getKind();
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return Kind == Decl::Struct || Kind == Decl::Union;
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7499dc91422144483c20d1c7381bc9ac634b646b04Chris Lattnerbool Type::isClassType() const {
7599dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType))
7699dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner    if (RT->getDecl()->getKind() == Decl::Class)
7799dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner      return true;
7899dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  return false;
7999dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner}
80c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isStructureType() const {
812de3b3a4aca5bb900b0b201bba1a44860e1a4b77Seo Sanghyeon  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType))
82c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner    if (RT->getDecl()->getKind() == Decl::Struct)
83c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return true;
84c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  return false;
85c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner}
86c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isUnionType() const {
872de3b3a4aca5bb900b0b201bba1a44860e1a4b77Seo Sanghyeon  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType))
88c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner    if (RT->getDecl()->getKind() == Decl::Union)
89c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return true;
90c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  return false;
91c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner}
92c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner
93c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerbool Type::isComplexType() const {
9402f62a9fedbc370fba081303399410a3afdde29fSteve Naroff  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
9502f62a9fedbc370fba081303399410a3afdde29fSteve Naroff    return CT->getElementType()->isFloatingType();
9602f62a9fedbc370fba081303399410a3afdde29fSteve Naroff  return false;
97c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner}
98c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner
994cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffbool Type::isComplexIntegerType() const {
1004cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // Check for GCC complex integer extension.
1014cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
1024cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    return CT->getElementType()->isIntegerType();
1034cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  return false;
1044cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff}
1054cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
1064cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffconst ComplexType *Type::getAsComplexIntegerType() const {
1074cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // Are we directly a complex type?
1084cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) {
1094cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    if (CTy->getElementType()->isIntegerType())
1104cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff      return CTy;
1114cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  }
1124cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // If the canonical form of this type isn't the right kind, reject it.
1134cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  const ComplexType *CTy = dyn_cast<ComplexType>(CanonicalType);
1144cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (!CTy || !CTy->getElementType()->isIntegerType())
1154cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    return 0;
1164cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
1174cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // If this is a typedef for a complex type, strip the typedef off without
1184cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // losing all typedef information.
1194cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  return getDesugaredType()->getAsComplexIntegerType();
1204cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff}
1214cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
122dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// getDesugaredType - Return the specified type with any "sugar" removed from
123dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// type type.  This takes off typedefs, typeof's etc.  If the outer level of
124dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// the type is already concrete, it returns it unmodified.  This is similar
125dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// to getting the canonical type, but it doesn't remove *all* typedefs.  For
126dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// example, it return "T*" as "T*", (not as "int*"), because the pointer is
127dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// concrete.
128dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattnerconst Type *Type::getDesugaredType() const {
129dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  if (const TypedefType *TDT = dyn_cast<TypedefType>(this))
130dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return TDT->LookThroughTypedefs().getTypePtr();
131dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  if (const TypeOfExpr *TOE = dyn_cast<TypeOfExpr>(this))
132dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return TOE->getUnderlyingExpr()->getType().getTypePtr();
133dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this))
134dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return TOT->getUnderlyingType().getTypePtr();
135dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return this;
136dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner}
137dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
138dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
13977878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroffconst BuiltinType *Type::getAsBuiltinType() const {
14077878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // If this is directly a builtin type, return it.
14177878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  if (const BuiltinType *BTy = dyn_cast<BuiltinType>(this))
14277878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff    return BTy;
143dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
144dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't a builtin type, reject it.
145ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<BuiltinType>(CanonicalType)) {
146ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
147ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<BuiltinType>(CanonicalType.getUnqualifiedType()))
148ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsBuiltinType();
149dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
150ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
151dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
15277878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // If this is a typedef for a builtin type, strip the typedef off without
15377878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // losing all typedef information.
154dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsBuiltinType();
15577878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff}
15677878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff
157c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst FunctionType *Type::getAsFunctionType() const {
1587064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a function type, return it.
1597064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  if (const FunctionType *FTy = dyn_cast<FunctionType>(this))
1607064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff    return FTy;
161ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
162dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
163ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<FunctionType>(CanonicalType)) {
164ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
165ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<FunctionType>(CanonicalType.getUnqualifiedType()))
166ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsFunctionType();
167dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
168ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
169dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
1707064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is a typedef for a function type, strip the typedef off without
1717064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // losing all typedef information.
172dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsFunctionType();
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattnerconst PointerLikeType *Type::getAsPointerLikeType() const {
176bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // If this is directly a pointer-like type, return it.
177bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (const PointerLikeType *PTy = dyn_cast<PointerLikeType>(this))
178bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    return PTy;
179bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner
180bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
181bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (!isa<PointerLikeType>(CanonicalType)) {
182bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    // Look through type qualifiers
183bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    if (isa<PointerLikeType>(CanonicalType.getUnqualifiedType()))
184bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner      return CanonicalType.getUnqualifiedType()->getAsPointerLikeType();
185bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    return 0;
186bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  }
187bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner
188bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // If this is a typedef for a pointer type, strip the typedef off without
189bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // losing all typedef information.
190bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  return getDesugaredType()->getAsPointerLikeType();
191bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner}
192bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner
193befee48ff2a1dab236c5700f00ecca1cfdcd5837Chris Lattnerconst PointerType *Type::getAsPointerType() const {
1947a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  // If this is directly a pointer type, return it.
1957a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  if (const PointerType *PTy = dyn_cast<PointerType>(this))
1967a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner    return PTy;
197a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
198dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
199ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<PointerType>(CanonicalType)) {
200ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
201ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<PointerType>(CanonicalType.getUnqualifiedType()))
202ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsPointerType();
203dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
204ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
205dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
206a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // If this is a typedef for a pointer type, strip the typedef off without
207a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // losing all typedef information.
208dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsPointerType();
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
211a1d9fdea79ba7bbd71862b9f9f78f5f117331fc7Chris Lattnerconst ReferenceType *Type::getAsReferenceType() const {
212ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  // If this is directly a reference type, return it.
213ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  if (const ReferenceType *RTy = dyn_cast<ReferenceType>(this))
214ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling    return RTy;
215ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling
216dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
217ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ReferenceType>(CanonicalType)) {
218ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
219ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ReferenceType>(CanonicalType.getUnqualifiedType()))
220ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsReferenceType();
221dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
222ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
223dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
224ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  // If this is a typedef for a reference type, strip the typedef off without
225ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  // losing all typedef information.
226dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsReferenceType();
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
229c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst ArrayType *Type::getAsArrayType() const {
230d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  // If this is directly an array type, return it.
231700204c74b455746752e851b25565ebf932f5340Steve Naroff  if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
232700204c74b455746752e851b25565ebf932f5340Steve Naroff    return ATy;
233700204c74b455746752e851b25565ebf932f5340Steve Naroff
234dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
235ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ArrayType>(CanonicalType)) {
236ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
237ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ArrayType>(CanonicalType.getUnqualifiedType()))
238ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsArrayType();
239dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
240ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
241dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
242700204c74b455746752e851b25565ebf932f5340Steve Naroff  // If this is a typedef for an array type, strip the typedef off without
243700204c74b455746752e851b25565ebf932f5340Steve Naroff  // losing all typedef information.
244dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsArrayType();
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
247d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffconst ConstantArrayType *Type::getAsConstantArrayType() const {
248d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  // If this is directly a constant array type, return it.
249d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  if (const ConstantArrayType *ATy = dyn_cast<ConstantArrayType>(this))
250d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff    return ATy;
251ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
252dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
253ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ConstantArrayType>(CanonicalType)) {
254ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
255ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()))
256ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsConstantArrayType();
257dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
258ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
259dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
260dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If this is a typedef for a constant array type, strip the typedef off
261dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // without losing all typedef information.
262dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsConstantArrayType();
263d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
264d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
265d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffconst VariableArrayType *Type::getAsVariableArrayType() const {
266d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  // If this is directly a variable array type, return it.
267d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  if (const VariableArrayType *ATy = dyn_cast<VariableArrayType>(this))
268d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff    return ATy;
269d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
270dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
271ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<VariableArrayType>(CanonicalType)) {
272ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
273ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<VariableArrayType>(CanonicalType.getUnqualifiedType()))
274ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsVariableArrayType();
275dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
276ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
277dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
278dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If this is a typedef for a variable array type, strip the typedef off
279dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // without losing all typedef information.
280dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsVariableArrayType();
281d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
282d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
283d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length
284d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// array types and types that contain variable array types in their
285d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// declarator
286d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffbool Type::isVariablyModifiedType() const {
287d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A VLA is a veriably modified type
288d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (getAsVariableArrayType())
289d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return true;
290d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
291d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // An array can contain a variably modified type
292d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (const ArrayType* AT = getAsArrayType())
293d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return AT->getElementType()->isVariablyModifiedType();
294d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
295d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A pointer can point to a variably modified type
296d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (const PointerType* PT = getAsPointerType())
297d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return PT->getPointeeType()->isVariablyModifiedType();
298d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
299d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A function can return a variably modified type
300d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // This one isn't completely obvious, but it follows from the
301d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // definition in C99 6.7.5p3. Because of this rule, it's
302d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // illegal to declare a function returning a variably modified type.
303d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (const FunctionType* FT = getAsFunctionType())
304d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return FT->getResultType()->isVariablyModifiedType();
305d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
306d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  return false;
307d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
308d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
3095c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroffbool Type::isIncompleteArrayType() const {
310c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return isa<IncompleteArrayType>(CanonicalType);
3115c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff}
3125c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff
313c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedmanconst IncompleteArrayType *Type::getAsIncompleteArrayType() const {
314c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If this is directly a variable array type, return it.
315c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  if (const IncompleteArrayType *ATy = dyn_cast<IncompleteArrayType>(this))
316c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return ATy;
317c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
318c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If the canonical form of this type isn't the right kind, reject it.
319c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  if (!isa<IncompleteArrayType>(CanonicalType)) {
320c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    // Look through type qualifiers
321c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    if (isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()))
322c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman      return CanonicalType.getUnqualifiedType()->getAsIncompleteArrayType();
323c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return 0;
3245c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff  }
325c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
326c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If this is a typedef for a variable array type, strip the typedef off
327c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // without losing all typedef information.
328c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return getDesugaredType()->getAsIncompleteArrayType();
3295c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff}
3305c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff
331c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsRecordType() const {
332dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff  // If this is directly a reference type, return it.
333dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff  if (const RecordType *RTy = dyn_cast<RecordType>(this))
334dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff    return RTy;
335dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff
336dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
337ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<RecordType>(CanonicalType)) {
338ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
339ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
340ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsRecordType();
341dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
342ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
343dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
344dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If this is a typedef for a record type, strip the typedef off without
345dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff  // losing all typedef information.
346dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsRecordType();
347dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff}
348dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff
349c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsStructureType() const {
3507064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a structure type, return it.
351c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(this)) {
352c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner    if (RT->getDecl()->getKind() == Decl::Struct)
353c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return RT;
3547064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  }
355dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
356dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
357c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
358dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    if (RT->getDecl()->getKind() != Decl::Struct)
359dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner      return 0;
360dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
361dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // If this is a typedef for a structure type, strip the typedef off without
362dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // losing all typedef information.
363dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return getDesugaredType()->getAsStructureType();
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
365ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  // Look through type qualifiers
366ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
367ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return CanonicalType.getUnqualifiedType()->getAsStructureType();
3687064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  return 0;
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
371c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsUnionType() const {
3727064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a union type, return it.
373c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(this)) {
374c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner    if (RT->getDecl()->getKind() == Decl::Union)
375c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return RT;
3767064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  }
377ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
378dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
379c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
380dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    if (RT->getDecl()->getKind() != Decl::Union)
381dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner      return 0;
382dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
383dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // If this is a typedef for a union type, strip the typedef off without
384dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // losing all typedef information.
385dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return getDesugaredType()->getAsUnionType();
3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
387ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
388ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  // Look through type qualifiers
389ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
390ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return CanonicalType.getUnqualifiedType()->getAsUnionType();
3917064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  return 0;
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
394c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerconst ComplexType *Type::getAsComplexType() const {
395c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // Are we directly a complex type?
396c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  if (const ComplexType *CTy = dyn_cast<ComplexType>(this))
397c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner    return CTy;
398c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner
399dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
400ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ComplexType>(CanonicalType)) {
401ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
402ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
403ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsComplexType();
404dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
405ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
406dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
407c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // If this is a typedef for a complex type, strip the typedef off without
408c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // losing all typedef information.
409dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsComplexType();
4107a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner}
4117a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner
412c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst VectorType *Type::getAsVectorType() const {
4137a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  // Are we directly a vector type?
4147a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  if (const VectorType *VTy = dyn_cast<VectorType>(this))
4157a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner    return VTy;
416a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
417dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
418ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<VectorType>(CanonicalType)) {
419ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
420ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<VectorType>(CanonicalType.getUnqualifiedType()))
421ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsVectorType();
422dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
423ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
424dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
425a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // If this is a typedef for a vector type, strip the typedef off without
426a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // losing all typedef information.
427dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsVectorType();
4287a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner}
4297a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner
430213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanconst ExtVectorType *Type::getAsExtVectorType() const {
4317064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // Are we directly an OpenCU vector type?
432213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (const ExtVectorType *VTy = dyn_cast<ExtVectorType>(this))
4337064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff    return VTy;
4347064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
435dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
436213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (!isa<ExtVectorType>(CanonicalType)) {
437ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
438213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    if (isa<ExtVectorType>(CanonicalType.getUnqualifiedType()))
439213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman      return CanonicalType.getUnqualifiedType()->getAsExtVectorType();
440dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
441ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
4427064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
443213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // If this is a typedef for an extended vector type, strip the typedef off
444213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // without losing all typedef information.
445213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  return getDesugaredType()->getAsExtVectorType();
4467064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff}
4477064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
448368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattnerconst ObjCInterfaceType *Type::getAsObjCInterfaceType() const {
449eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCInterfaceType's, just return the canonical
450eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
451eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  return dyn_cast<ObjCInterfaceType>(CanonicalType);
452368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner}
453368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
454368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattnerconst ObjCQualifiedInterfaceType *
455368eefa081d12f0a265ee90ee8ec61b54168d57dChris LattnerType::getAsObjCQualifiedInterfaceType() const {
456eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCQualifiedInterfaceType's, just return the canonical
457eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
458eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  return dyn_cast<ObjCQualifiedInterfaceType>(CanonicalType);
459eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner}
460eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner
461eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattnerconst ObjCQualifiedIdType *Type::getAsObjCQualifiedIdType() const {
462eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCQualifiedIdType's, just return the canonical
463eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
464eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  return dyn_cast<ObjCQualifiedIdType>(CanonicalType);
465368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner}
466368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
467368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIntegerType() const {
4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongLong;
4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
4735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TT->getDecl()->getKind() == Decl::Enum)
4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
475c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
476c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isIntegerType();
477ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
478ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isIntegerType();
4795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
48233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanianbool Type::isIntegralType() const {
48333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
48433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    return BT->getKind() >= BuiltinType::Bool &&
48533e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    BT->getKind() <= BuiltinType::LongLong;
48633e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
48733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    if (TT->getDecl()->getKind() == Decl::Enum)
48833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian      return true;
489ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
490ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isIntegralType();
49133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  return false;
49233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
49333e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
49413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isEnumeralType() const {
49513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
49613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return TT->getDecl()->getKind() == Decl::Enum;
497ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
498ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isEnumeralType();
49913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
50013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
50113b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
50213b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isBooleanType() const {
50313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
50413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return BT->getKind() == BuiltinType::Bool;
505ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
506ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isBooleanType();
50713b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
50813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
50913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
51013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isCharType() const {
51113b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
51213b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return BT->getKind() == BuiltinType::Char_U ||
51313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff           BT->getKind() == BuiltinType::UChar ||
514c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson           BT->getKind() == BuiltinType::Char_S ||
515c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson           BT->getKind() == BuiltinType::SChar;
516ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
517ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isCharType();
51813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
51913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
52013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
521d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isSignedIntegerType - Return true if this is an integer type that is
522d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
523d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// an enum decl which has a signed representation, or a vector of signed
524d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// integer element type.
5255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isSignedIntegerType() const {
5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
5275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Char_S &&
5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongLong;
5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
530d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
53137c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
53237c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->getIntegerType()->isSignedIntegerType();
533d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
534c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
535c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isSignedIntegerType();
536ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
537ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isSignedIntegerType();
5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
541d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isUnsignedIntegerType - Return true if this is an integer type that is
542d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum
543d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// decl which has an unsigned representation, or a vector of unsigned integer
544d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// element type.
5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isUnsignedIntegerType() const {
5465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
5475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::ULongLong;
5495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
550d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
55137c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
55237c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
553d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
554c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
555c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isUnsignedIntegerType();
556ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
557ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isUnsignedIntegerType();
5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isFloatingType() const {
5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Float &&
5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
566729a2131228cb7fcbc00bd8af36bc6f14d12317dChris Lattner    return CT->getElementType()->isFloatingType();
567c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
568c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isFloatingType();
569ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
570ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isFloatingType();
5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealFloatingType() const {
5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Float &&
5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
578c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
579c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isRealFloatingType();
580ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
581ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isRealFloatingType();
5825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealType() const {
5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
5885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
5895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
5905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return TT->getDecl()->getKind() == Decl::Enum;
591c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
592c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isRealType();
593ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
594ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isRealType();
5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isArithmeticType() const {
5995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() != BuiltinType::Void;
60137c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
60237c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2).
60337c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    // If a body isn't seen by the time we get here, return false.
60437c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->isDefinition();
605ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
606ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isArithmeticType();
6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType);
6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isScalarType() const {
6115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() != BuiltinType::Void;
6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TT->getDecl()->getKind() == Decl::Enum)
6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
618ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
619ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isScalarType();
620c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  return isa<PointerType>(CanonicalType) || isa<ComplexType>(CanonicalType) ||
621a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek         isa<ObjCQualifiedIdType>(CanonicalType);
6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isAggregateType() const {
6255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TT->getDecl()->getKind() == Decl::Struct)
6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
6285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
6295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
630ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
631ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isAggregateType();
632c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return isa<ArrayType>(CanonicalType);
6335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6359bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// isConstantSizeType - Return true if this is not a variable sized type,
6369bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// according to the rules of C99 6.7.5p3.  It is not legal to call this on
6379bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// incomplete types.
6383c2b3170041f69a92904e3bab9b6d654eaf260acEli Friedmanbool Type::isConstantSizeType() const {
639ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
6403c2b3170041f69a92904e3bab9b6d654eaf260acEli Friedman    return ASQT->getBaseType()->isConstantSizeType();
641d52a4578144ab2887912e52eabec58a857a44adbChris Lattner  assert(!isIncompleteType() && "This doesn't make sense for incomplete types");
6429bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner  // The VAT must have a size, as it is known to be complete.
6439bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner  return !isa<VariableArrayType>(CanonicalType);
6445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1)
6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - a type that can describe objects, but which lacks information needed to
6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// determine its size.
6495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIncompleteType() const {
6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (CanonicalType->getTypeClass()) {
6515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: return false;
652ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  case ASQual:
653ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return cast<ASQualType>(CanonicalType)->getBaseType()->isIncompleteType();
6545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Builtin:
6555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Void is the only incomplete builtin type.  Per C99 6.2.5p19, it can never
6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // be completed.
6575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return isVoidType();
6585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Tagged:
6595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // A tagged type (struct/union/enum/class) is incomplete if the decl is a
6605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // forward declaration, but not a full definition (C99 6.2.5p22).
6615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return !cast<TagType>(CanonicalType)->getDecl()->isDefinition();
662c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  case IncompleteArray:
6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // An array of unknown size is an incomplete type (C99 6.2.5p22).
664c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return true;
6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isPromotableIntegerType() const {
669ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
670ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isPromotableIntegerType();
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType);
6725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!BT) return false;
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (BT->getKind()) {
6745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Bool:
6755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Char_S:
6765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Char_U:
6775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::SChar:
6785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UChar:
6795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Short:
6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UShort:
6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *BuiltinType::getName() const {
6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (getKind()) {
6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown builtin type!");
6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Void:              return "void";
6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Bool:              return "_Bool";
6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Char_S:            return "char";
6935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Char_U:            return "char";
6945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case SChar:             return "signed char";
6955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Short:             return "short";
6965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Int:               return "int";
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Long:              return "long";
6985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case LongLong:          return "long long";
6995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UChar:             return "unsigned char";
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UShort:            return "unsigned short";
7015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UInt:              return "unsigned int";
7025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ULong:             return "unsigned long";
7035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ULongLong:         return "unsigned long long";
7045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Float:             return "float";
7055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Double:            return "double";
7065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case LongDouble:        return "long double";
7075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
711942cfd37297528918616d06cd6e4e8bd6e4915a2Chris Lattner                                arg_type_iterator ArgTys,
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                unsigned NumArgs, bool isVariadic) {
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ID.AddPointer(Result.getAsOpaquePtr());
7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0; i != NumArgs; ++i)
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID.AddPointer(ArgTys[i].getAsOpaquePtr());
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ID.AddInteger(isVariadic);
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID) {
720942cfd37297528918616d06cd6e4e8bd6e4915a2Chris Lattner  Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic());
7215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
723a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID,
7241ee0700c7dbe3554df09b4558e0b35a53d487ff2Chris Lattner                                         const ObjCInterfaceDecl *Decl,
725a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                                         ObjCProtocolDecl **protocols,
7264b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian                                         unsigned NumProtocols) {
7271ee0700c7dbe3554df09b4558e0b35a53d487ff2Chris Lattner  ID.AddPointer(Decl);
7284b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  for (unsigned i = 0; i != NumProtocols; i++)
7294b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    ID.AddPointer(protocols[i]);
7304b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
7314b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
732a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID) {
7331ee0700c7dbe3554df09b4558e0b35a53d487ff2Chris Lattner  Profile(ID, getDecl(), &Protocols[0], getNumProtocols());
7344b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
7354b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
736a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID,
737a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                                         ObjCProtocolDecl **protocols,
738c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian                                         unsigned NumProtocols) {
739c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  for (unsigned i = 0; i != NumProtocols; i++)
740c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    ID.AddPointer(protocols[i]);
741c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian}
742c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian
743a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID) {
744c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  Profile(ID, &Protocols[0], getNumProtocols());
745c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian}
746c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian
747a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
748a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// potentially looking through *all* consequtive typedefs.  This returns the
749a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// sum of the type qualifiers, so if you have:
750a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///   typedef const int A;
751a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///   typedef volatile A B;
752a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// looking through the typedefs for B will give you "const volatile A".
753a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///
754a2c7767ce7d8feb10253f4b650826a20f3324c6fChris LattnerQualType TypedefType::LookThroughTypedefs() const {
755a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // Usually, there is only a single level of typedefs, be fast in that case.
756a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  QualType FirstType = getDecl()->getUnderlyingType();
757a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  if (!isa<TypedefType>(FirstType))
758a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    return FirstType;
759a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
760a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // Otherwise, do the fully general loop.
761a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  unsigned TypeQuals = 0;
762a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  const TypedefType *TDT = this;
763a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  while (1) {
764a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    QualType CurType = TDT->getDecl()->getUnderlyingType();
765f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner
766f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner
767f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME:
768f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME: This is incorrect for ASQuals!
769f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME:
770f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    TypeQuals |= CurType.getCVRQualifiers();
771a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
772a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    TDT = dyn_cast<TypedefType>(CurType);
773a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    if (TDT == 0)
774a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner      return QualType(CurType.getTypePtr(), TypeQuals);
775a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  }
776a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner}
7775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7782daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool RecordType::classof(const TagType *TT) {
7792daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner  return isa<RecordDecl>(TT->getDecl());
7805edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner}
7815edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner
7822daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool EnumType::classof(const TagType *TT) {
7832daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner  return isa<EnumDecl>(TT->getDecl());
7845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
7885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Type Printing
7895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
7905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid QualType::dump(const char *msg) const {
79239caea961530bc95d19114ab546ebcdb229263c9Chris Lattner  std::string R = "identifier";
7935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getAsStringInternal(R);
7945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (msg)
7955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    fprintf(stderr, "%s: %s\n", msg, R.c_str());
7965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
7975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    fprintf(stderr, "%s\n", R.c_str());
7985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
8015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Note: funkiness to ensure we get a space only between quals.
8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool NonePrinted = true;
8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Const)
8045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "const", NonePrinted = false;
8055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Volatile)
8065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += (NonePrinted+" volatile"), NonePrinted = false;
8075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Restrict)
8085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += (NonePrinted+" restrict"), NonePrinted = false;
8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid QualType::getAsStringInternal(std::string &S) const {
8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isNull()) {
8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "NULL TYPE\n";
8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
8155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Print qualifiers as appropriate.
8183513e138cc75205b48d3078dfa4669355adb5714Gabor Greif  if (unsigned Tq = getCVRQualifiers()) {
8195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    std::string TQS;
8203513e138cc75205b48d3078dfa4669355adb5714Gabor Greif    AppendTypeQualList(TQS, Tq);
8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (!S.empty())
8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S = TQS + ' ' + S;
8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S = TQS;
8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getTypePtr()->getAsStringInternal(S);
8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid BuiltinType::getAsStringInternal(std::string &S) const {
8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (S.empty()) {
8325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = getName();
8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
8345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Prefix the basic type, e.g. 'int X'.
8355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = ' ' + S;
8365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = getName() + S;
8375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ComplexType::getAsStringInternal(std::string &S) const {
8415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ElementType->getAsStringInternal(S);
8425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = "_Complex " + S;
8435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
845ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lambvoid ASQualType::getAsStringInternal(std::string &S) const {
846ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
847ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  BaseType->getAsStringInternal(S);
848ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb}
849ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
8505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PointerType::getAsStringInternal(std::string &S) const {
8515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = '*' + S;
8525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Handle things like 'int (*A)[4];' correctly.
8545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this should include vectors, but vectors use attributes I guess.
855bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (isa<ArrayType>(getPointeeType()))
8565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = '(' + S + ')';
8575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
858bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  getPointeeType().getAsStringInternal(S);
8595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ReferenceType::getAsStringInternal(std::string &S) const {
8625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = '&' + S;
8635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Handle things like 'int (&A)[4];' correctly.
8655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this should include vectors, but vectors use attributes I guess.
866bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (isa<ArrayType>(getPointeeType()))
8675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = '(' + S + ')';
8685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
869bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  getPointeeType().getAsStringInternal(S);
8705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
872fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroffvoid ConstantArrayType::getAsStringInternal(std::string &S) const {
873fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  S += '[';
8746b91cd9af12fe1340e48e03e9b988d9888b4889fSteve Naroff  S += llvm::utostr(getSize().getZExtValue());
875fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  S += ']';
876fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
877fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  getElementType().getAsStringInternal(S);
878fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff}
879fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
880c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedmanvoid IncompleteArrayType::getAsStringInternal(std::string &S) const {
881c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  S += "[]";
882c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
883c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  getElementType().getAsStringInternal(S);
884c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman}
885c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
886fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroffvoid VariableArrayType::getAsStringInternal(std::string &S) const {
8875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += '[';
8885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
889c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  if (getIndexTypeQualifier()) {
890c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff    AppendTypeQualList(S, getIndexTypeQualifier());
8915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += ' ';
8925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
894c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  if (getSizeModifier() == Static)
8955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "static";
896c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  else if (getSizeModifier() == Star)
8975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += '*';
8985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
899fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  if (getSizeExpr()) {
900fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    std::ostringstream s;
901fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    getSizeExpr()->printPretty(s);
902fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    S += s.str();
903fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  }
9045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += ']';
9055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
906fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  getElementType().getAsStringInternal(S);
9075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid VectorType::getAsStringInternal(std::string &S) const {
9107ee261c8e71f363d86461f4d1a37e3def354c976Chris Lattner  S += " __attribute__((__vector_size__(";
911e107b5d1b3d3527b1f493ed5341e87614b36c376Chris Lattner  // FIXME: should multiply by element size somehow.
9125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += llvm::utostr_32(NumElements*4); // convert back to bytes.
913e107b5d1b3d3527b1f493ed5341e87614b36c376Chris Lattner  S += ")))";
9145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ElementType.getAsStringInternal(S);
9155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
917213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid ExtVectorType::getAsStringInternal(std::string &S) const {
918213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  S += " __attribute__((ext_vector_type(";
91931a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  S += llvm::utostr_32(NumElements);
92031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  S += ")))";
92131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  ElementType.getAsStringInternal(S);
92231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
92331a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff
924d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroffvoid TypeOfExpr::getAsStringInternal(std::string &InnerString) const {
925363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(e) X'.
926363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff    InnerString = ' ' + InnerString;
9278d1a3b8ca1e5fcc4567b5a6f51d82be2e460de1cSteve Naroff  std::ostringstream s;
9286000dace22f110d8768476989313e9d981d690d0Chris Lattner  getUnderlyingExpr()->printPretty(s);
9291bfd5cc29035e4bfccca855160109b07c5e85416Steve Naroff  InnerString = "typeof(" + s.str() + ")" + InnerString;
930d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
931d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
932363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroffvoid TypeOfType::getAsStringInternal(std::string &InnerString) const {
933363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(t) X'.
934363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff    InnerString = ' ' + InnerString;
935d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  std::string Tmp;
936d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  getUnderlyingType().getAsStringInternal(Tmp);
937363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  InnerString = "typeof(" + Tmp + ")" + InnerString;
938d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
939d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
9405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeNoProto::getAsStringInternal(std::string &S) const {
9415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If needed for precedence reasons, wrap the inner part in grouping parens.
9425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!S.empty())
9435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = "(" + S + ")";
9445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += "()";
9465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getResultType().getAsStringInternal(S);
9475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeProto::getAsStringInternal(std::string &S) const {
9505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If needed for precedence reasons, wrap the inner part in grouping parens.
9515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!S.empty())
9525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = "(" + S + ")";
9535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += "(";
9555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  std::string Tmp;
9565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
9575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) S += ", ";
9585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    getArgType(i).getAsStringInternal(Tmp);
9595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += Tmp;
9605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Tmp.clear();
9615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
9625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isVariadic()) {
9645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (getNumArgs())
9655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S += ", ";
9665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "...";
9675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else if (getNumArgs() == 0) {
9685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Do not emit int() if we have a proto, emit 'int(void)'.
9695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "void";
9705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
9715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += ")";
9735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getResultType().getAsStringInternal(S);
9745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid TypedefType::getAsStringInternal(std::string &InnerString) const {
9785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
9795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InnerString = ' ' + InnerString;
9805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InnerString = getDecl()->getIdentifier()->getName() + InnerString;
9815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
983a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCInterfaceType::getAsStringInternal(std::string &InnerString) const {
9843536b443bc50d58a79f14fca9b6842541a434854Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
9853536b443bc50d58a79f14fca9b6842541a434854Steve Naroff    InnerString = ' ' + InnerString;
9863536b443bc50d58a79f14fca9b6842541a434854Steve Naroff  InnerString = getDecl()->getIdentifier()->getName() + InnerString;
9873536b443bc50d58a79f14fca9b6842541a434854Steve Naroff}
9883536b443bc50d58a79f14fca9b6842541a434854Steve Naroff
989a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedInterfaceType::getAsStringInternal(
9904b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian                                  std::string &InnerString) const {
991dfbcce2b55ca8b45ce9d9c09c32e43c3bd73ac2aFariborz Jahanian  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
992dfbcce2b55ca8b45ce9d9c09c32e43c3bd73ac2aFariborz Jahanian    InnerString = ' ' + InnerString;
993a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  std::string ObjCQIString = getDecl()->getName();
994a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '<';
9954b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  int num = getNumProtocols();
9964b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  for (int i = 0; i < num; i++) {
997a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    ObjCQIString += getProtocols(i)->getName();
9984b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    if (i < num-1)
999a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ObjCQIString += ',';
10004b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  }
1001a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '>';
1002a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  InnerString = ObjCQIString + InnerString;
10034b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
10044b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
1005a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedIdType::getAsStringInternal(
1006c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian                                              std::string &InnerString) const {
1007c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
1008c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    InnerString = ' ' + InnerString;
1009a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  std::string ObjCQIString = "id";
1010a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '<';
1011c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  int num = getNumProtocols();
1012c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  for (int i = 0; i < num; i++) {
1013a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    ObjCQIString += getProtocols(i)->getName();
1014c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    if (i < num-1)
1015a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ObjCQIString += ',';
1016c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  }
1017a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '>';
1018a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  InnerString = ObjCQIString + InnerString;
1019c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian}
1020c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian
10215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid TagType::getAsStringInternal(std::string &InnerString) const {
10225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
10235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InnerString = ' ' + InnerString;
10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *Kind = getDecl()->getKindName();
10265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *ID;
10275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const IdentifierInfo *II = getDecl()->getIdentifier())
10285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID = II->getName();
10295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
10305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID = "<anonymous>";
10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InnerString = std::string(Kind) + " " + ID + InnerString;
10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1034