Type.cpp revision cdce6d17be572ae49417022357906ce04b54137d
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);
6639ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    return !TT->getDecl()->isEnum();
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7399dc91422144483c20d1c7381bc9ac634b646b04Chris Lattnerbool Type::isClassType() const {
7499dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType))
7539ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isClass())
7699dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner      return true;
7799dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  return false;
7899dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner}
79c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isStructureType() const {
802de3b3a4aca5bb900b0b201bba1a44860e1a4b77Seo Sanghyeon  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType))
8139ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isStruct())
82c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return true;
83c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  return false;
84c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner}
85c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerbool Type::isUnionType() const {
862de3b3a4aca5bb900b0b201bba1a44860e1a4b77Seo Sanghyeon  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType))
8739ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isUnion())
88c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return true;
89c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  return false;
90c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner}
91c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner
92c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerbool Type::isComplexType() const {
9302f62a9fedbc370fba081303399410a3afdde29fSteve Naroff  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
9402f62a9fedbc370fba081303399410a3afdde29fSteve Naroff    return CT->getElementType()->isFloatingType();
9502f62a9fedbc370fba081303399410a3afdde29fSteve Naroff  return false;
96c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner}
97c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner
984cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffbool Type::isComplexIntegerType() const {
994cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // Check for GCC complex integer extension.
1004cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
1014cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    return CT->getElementType()->isIntegerType();
1024cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  return false;
1034cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff}
1044cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
1054cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroffconst ComplexType *Type::getAsComplexIntegerType() const {
1064cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // Are we directly a complex type?
1074cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) {
1084cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    if (CTy->getElementType()->isIntegerType())
1094cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff      return CTy;
1104cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  }
1114cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // If the canonical form of this type isn't the right kind, reject it.
1124cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  const ComplexType *CTy = dyn_cast<ComplexType>(CanonicalType);
1134cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  if (!CTy || !CTy->getElementType()->isIntegerType())
1144cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff    return 0;
1154cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
1164cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // If this is a typedef for a complex type, strip the typedef off without
1174cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  // losing all typedef information.
1184cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff  return getDesugaredType()->getAsComplexIntegerType();
1194cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff}
1204cdec1c3ca80124024a787ce32833fd5b20cbb15Steve Naroff
121dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// getDesugaredType - Return the specified type with any "sugar" removed from
122dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// type type.  This takes off typedefs, typeof's etc.  If the outer level of
123dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// the type is already concrete, it returns it unmodified.  This is similar
124dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// to getting the canonical type, but it doesn't remove *all* typedefs.  For
125dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// example, it return "T*" as "T*", (not as "int*"), because the pointer is
126dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner/// concrete.
127dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattnerconst Type *Type::getDesugaredType() const {
128dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  if (const TypedefType *TDT = dyn_cast<TypedefType>(this))
129dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return TDT->LookThroughTypedefs().getTypePtr();
130dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  if (const TypeOfExpr *TOE = dyn_cast<TypeOfExpr>(this))
131dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return TOE->getUnderlyingExpr()->getType().getTypePtr();
132dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this))
133dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return TOT->getUnderlyingType().getTypePtr();
134dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return this;
135dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner}
136dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
137dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
13877878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroffconst BuiltinType *Type::getAsBuiltinType() const {
13977878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // If this is directly a builtin type, return it.
14077878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  if (const BuiltinType *BTy = dyn_cast<BuiltinType>(this))
14177878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff    return BTy;
142dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
143dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't a builtin type, reject it.
144ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<BuiltinType>(CanonicalType)) {
145ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
146ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<BuiltinType>(CanonicalType.getUnqualifiedType()))
147ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsBuiltinType();
148dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
149ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
150dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
15177878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // If this is a typedef for a builtin type, strip the typedef off without
15277878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff  // losing all typedef information.
153dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsBuiltinType();
15477878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff}
15577878cc5aa6ad01fc0c91bac1a61819dbf3bf691Steve Naroff
156c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst FunctionType *Type::getAsFunctionType() const {
1577064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a function type, return it.
1587064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  if (const FunctionType *FTy = dyn_cast<FunctionType>(this))
1597064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff    return FTy;
160ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
161dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
162ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<FunctionType>(CanonicalType)) {
163ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
164ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<FunctionType>(CanonicalType.getUnqualifiedType()))
165ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsFunctionType();
166dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
167ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
168dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
1697064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is a typedef for a function type, strip the typedef off without
1707064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // losing all typedef information.
171dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsFunctionType();
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
174bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattnerconst PointerLikeType *Type::getAsPointerLikeType() const {
175bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // If this is directly a pointer-like type, return it.
176bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (const PointerLikeType *PTy = dyn_cast<PointerLikeType>(this))
177bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    return PTy;
178bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner
179bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
180bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (!isa<PointerLikeType>(CanonicalType)) {
181bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    // Look through type qualifiers
182bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    if (isa<PointerLikeType>(CanonicalType.getUnqualifiedType()))
183bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner      return CanonicalType.getUnqualifiedType()->getAsPointerLikeType();
184bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner    return 0;
185bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  }
186bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner
187bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // If this is a typedef for a pointer type, strip the typedef off without
188bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  // losing all typedef information.
189bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  return getDesugaredType()->getAsPointerLikeType();
190bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner}
191bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner
192befee48ff2a1dab236c5700f00ecca1cfdcd5837Chris Lattnerconst PointerType *Type::getAsPointerType() const {
1937a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  // If this is directly a pointer type, return it.
1947a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  if (const PointerType *PTy = dyn_cast<PointerType>(this))
1957a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner    return PTy;
196a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
197dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
198ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<PointerType>(CanonicalType)) {
199ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
200ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<PointerType>(CanonicalType.getUnqualifiedType()))
201ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsPointerType();
202dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
203ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
204dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
205a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // If this is a typedef for a pointer type, strip the typedef off without
206a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // losing all typedef information.
207dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsPointerType();
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
210a1d9fdea79ba7bbd71862b9f9f78f5f117331fc7Chris Lattnerconst ReferenceType *Type::getAsReferenceType() const {
211ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  // If this is directly a reference type, return it.
212ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  if (const ReferenceType *RTy = dyn_cast<ReferenceType>(this))
213ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling    return RTy;
214ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling
215dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
216ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ReferenceType>(CanonicalType)) {
217ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
218ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ReferenceType>(CanonicalType.getUnqualifiedType()))
219ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsReferenceType();
220dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
221ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
222dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
223ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  // If this is a typedef for a reference type, strip the typedef off without
224ea5e79f930bcab2087646d1cb4fc1fe9dcf986a1Bill Wendling  // losing all typedef information.
225dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsReferenceType();
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
228c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst ArrayType *Type::getAsArrayType() const {
229d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  // If this is directly an array type, return it.
230700204c74b455746752e851b25565ebf932f5340Steve Naroff  if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
231700204c74b455746752e851b25565ebf932f5340Steve Naroff    return ATy;
232700204c74b455746752e851b25565ebf932f5340Steve Naroff
233dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
234ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ArrayType>(CanonicalType)) {
235ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
236ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ArrayType>(CanonicalType.getUnqualifiedType()))
237ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsArrayType();
238dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
239ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
240dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
241700204c74b455746752e851b25565ebf932f5340Steve Naroff  // If this is a typedef for an array type, strip the typedef off without
242700204c74b455746752e851b25565ebf932f5340Steve Naroff  // losing all typedef information.
243dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsArrayType();
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
246d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffconst ConstantArrayType *Type::getAsConstantArrayType() const {
247d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  // If this is directly a constant array type, return it.
248d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  if (const ConstantArrayType *ATy = dyn_cast<ConstantArrayType>(this))
249d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff    return ATy;
250ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
251dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
252ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ConstantArrayType>(CanonicalType)) {
253ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
254ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ConstantArrayType>(CanonicalType.getUnqualifiedType()))
255ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsConstantArrayType();
256dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
257ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
258dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
259dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If this is a typedef for a constant array type, strip the typedef off
260dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // without losing all typedef information.
261dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsConstantArrayType();
262d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
263d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
264d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffconst VariableArrayType *Type::getAsVariableArrayType() const {
265d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  // If this is directly a variable array type, return it.
266d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  if (const VariableArrayType *ATy = dyn_cast<VariableArrayType>(this))
267d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff    return ATy;
268d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
269dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
270ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<VariableArrayType>(CanonicalType)) {
271ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
272ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<VariableArrayType>(CanonicalType.getUnqualifiedType()))
273ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsVariableArrayType();
274dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
275ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
276dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
277dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If this is a typedef for a variable array type, strip the typedef off
278dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // without losing all typedef information.
279dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsVariableArrayType();
280d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
281d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
282d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length
283d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// array types and types that contain variable array types in their
284d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman/// declarator
285d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroffbool Type::isVariablyModifiedType() const {
286d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A VLA is a veriably modified type
287d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (getAsVariableArrayType())
288d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return true;
289d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
290d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // An array can contain a variably modified type
291d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (const ArrayType* AT = getAsArrayType())
292d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return AT->getElementType()->isVariablyModifiedType();
293d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
294d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A pointer can point to a variably modified type
295d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (const PointerType* PT = getAsPointerType())
296d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return PT->getPointeeType()->isVariablyModifiedType();
297d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
298d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // A function can return a variably modified type
299d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // This one isn't completely obvious, but it follows from the
300d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // definition in C99 6.7.5p3. Because of this rule, it's
301d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  // illegal to declare a function returning a variably modified type.
302d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman  if (const FunctionType* FT = getAsFunctionType())
303d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman    return FT->getResultType()->isVariablyModifiedType();
304d3f2f79fedfef7cae818c55a1f3d7a8f5992e5a0Eli Friedman
305d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff  return false;
306d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff}
307d7444aac1af1c2c1d5e5b7467ecf6006ee2d8abeSteve Naroff
3085c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroffbool Type::isIncompleteArrayType() const {
309c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return isa<IncompleteArrayType>(CanonicalType);
3105c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff}
3115c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff
312c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedmanconst IncompleteArrayType *Type::getAsIncompleteArrayType() const {
313c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If this is directly a variable array type, return it.
314c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  if (const IncompleteArrayType *ATy = dyn_cast<IncompleteArrayType>(this))
315c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return ATy;
316c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
317c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If the canonical form of this type isn't the right kind, reject it.
318c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  if (!isa<IncompleteArrayType>(CanonicalType)) {
319c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    // Look through type qualifiers
320c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    if (isa<IncompleteArrayType>(CanonicalType.getUnqualifiedType()))
321c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman      return CanonicalType.getUnqualifiedType()->getAsIncompleteArrayType();
322c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return 0;
3235c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff  }
324c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
325c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // If this is a typedef for a variable array type, strip the typedef off
326c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  // without losing all typedef information.
327c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return getDesugaredType()->getAsIncompleteArrayType();
3285c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff}
3295c06a69a3ef19cc6dbeed7f2acb9de28b66c45d4Steve Naroff
330c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsRecordType() const {
331dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff  // If this is directly a reference type, return it.
332dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff  if (const RecordType *RTy = dyn_cast<RecordType>(this))
333dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff    return RTy;
334dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff
335dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
336ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<RecordType>(CanonicalType)) {
337ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
338ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
339ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsRecordType();
340dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
341ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
342dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
343dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If this is a typedef for a record type, strip the typedef off without
344dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff  // losing all typedef information.
345dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsRecordType();
346dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff}
347dfa6aae5a119a527e537c35566ba3272fd8c5d74Steve Naroff
348c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsStructureType() const {
3497064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a structure type, return it.
350c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(this)) {
35139ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isStruct())
352c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return RT;
3537064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  }
354dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
355dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
356c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
35739ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (!RT->getDecl()->isStruct())
358dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner      return 0;
359dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
360dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // If this is a typedef for a structure type, strip the typedef off without
361dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // losing all typedef information.
362dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return getDesugaredType()->getAsStructureType();
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
364ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  // Look through type qualifiers
365ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
366ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return CanonicalType.getUnqualifiedType()->getAsStructureType();
3677064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  return 0;
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
370c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst RecordType *Type::getAsUnionType() const {
3717064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // If this is directly a union type, return it.
372c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(this)) {
37339ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (RT->getDecl()->isUnion())
374c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner      return RT;
3757064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  }
376ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
377dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
378c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattner  if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
37939ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (!RT->getDecl()->isUnion())
380dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner      return 0;
381dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
382dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // If this is a typedef for a union type, strip the typedef off without
383dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    // losing all typedef information.
384dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return getDesugaredType()->getAsUnionType();
3855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
386ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
387ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  // Look through type qualifiers
388ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
389ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return CanonicalType.getUnqualifiedType()->getAsUnionType();
3907064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  return 0;
3915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
393ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedmanconst EnumType *Type::getAsEnumType() const {
394ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  // Check the canonicalized unqualified type directly; the more complex
395ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  // version is unnecessary because there isn't any typedef information
396ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  // to preserve.
397ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman  return dyn_cast<EnumType>(CanonicalType.getUnqualifiedType());
398ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman}
399ad74a758189180b8ab8faea648e4766c3bfd7fcbEli Friedman
400c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattnerconst ComplexType *Type::getAsComplexType() const {
401c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // Are we directly a complex type?
402c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  if (const ComplexType *CTy = dyn_cast<ComplexType>(this))
403c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner    return CTy;
404c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner
405dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
406ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<ComplexType>(CanonicalType)) {
407ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
408ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
409ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsComplexType();
410dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
411ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
412dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
413c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // If this is a typedef for a complex type, strip the typedef off without
414c6fb90a7246c2d5d3233e70107bf9d8c7c9e535bChris Lattner  // losing all typedef information.
415dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsComplexType();
4167a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner}
4177a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner
418c8629630ce3e7f0da231bf10a4b39240caaac68aChris Lattnerconst VectorType *Type::getAsVectorType() const {
4197a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  // Are we directly a vector type?
4207a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner  if (const VectorType *VTy = dyn_cast<VectorType>(this))
4217a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner    return VTy;
422a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
423dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
424ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (!isa<VectorType>(CanonicalType)) {
425ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
426ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    if (isa<VectorType>(CanonicalType.getUnqualifiedType()))
427ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb      return CanonicalType.getUnqualifiedType()->getAsVectorType();
428dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
429ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
430dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner
431a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // If this is a typedef for a vector type, strip the typedef off without
432a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // losing all typedef information.
433dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  return getDesugaredType()->getAsVectorType();
4347a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner}
4357a2e047c602d6ba28d6c434c990d4b9f7ef8c694Chris Lattner
436213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanconst ExtVectorType *Type::getAsExtVectorType() const {
4377064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff  // Are we directly an OpenCU vector type?
438213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (const ExtVectorType *VTy = dyn_cast<ExtVectorType>(this))
4397064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff    return VTy;
4407064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
441dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner  // If the canonical form of this type isn't the right kind, reject it.
442213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  if (!isa<ExtVectorType>(CanonicalType)) {
443ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    // Look through type qualifiers
444213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    if (isa<ExtVectorType>(CanonicalType.getUnqualifiedType()))
445213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman      return CanonicalType.getUnqualifiedType()->getAsExtVectorType();
446dea6146deede4b89a1757d46cd92ebf158659c25Chris Lattner    return 0;
447ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  }
4487064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
449213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // If this is a typedef for an extended vector type, strip the typedef off
450213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  // without losing all typedef information.
451213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  return getDesugaredType()->getAsExtVectorType();
4527064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff}
4537064f5c95bbdb17680d0ea658d4090898c2592d3Steve Naroff
454368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattnerconst ObjCInterfaceType *Type::getAsObjCInterfaceType() const {
455eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCInterfaceType's, just return the canonical
456eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
457eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  return dyn_cast<ObjCInterfaceType>(CanonicalType);
458368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner}
459368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
460368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattnerconst ObjCQualifiedInterfaceType *
461368eefa081d12f0a265ee90ee8ec61b54168d57dChris LattnerType::getAsObjCQualifiedInterfaceType() const {
462eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCQualifiedInterfaceType's, just return the canonical
463eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
464eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  return dyn_cast<ObjCQualifiedInterfaceType>(CanonicalType);
465eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner}
466eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner
467eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattnerconst ObjCQualifiedIdType *Type::getAsObjCQualifiedIdType() const {
468eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // There is no sugar for ObjCQualifiedIdType's, just return the canonical
469eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  // type pointer if it is the right class.
470eca7be6b7ebd93682eeaab2c71d59f2995dacdccChris Lattner  return dyn_cast<ObjCQualifiedIdType>(CanonicalType);
471368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner}
472368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
473368eefa081d12f0a265ee90ee8ec61b54168d57dChris Lattner
4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIntegerType() const {
4755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
4765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
4775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongLong;
4785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
47939ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (TT->getDecl()->isEnum())
4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
481c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
482c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isIntegerType();
483ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
484ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isIntegerType();
4855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
4865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
48833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanianbool Type::isIntegralType() const {
48933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
49033e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    return BT->getKind() >= BuiltinType::Bool &&
49133e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian    BT->getKind() <= BuiltinType::LongLong;
49233e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
49339ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (TT->getDecl()->isEnum())
49433e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian      return true;
495ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
496ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isIntegralType();
49733e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian  return false;
49833e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian}
49933e1d64ab5cd5d27f8530ccd056191fe2c9f3f2eFariborz Jahanian
50013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isEnumeralType() const {
50113b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
50239ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    return TT->getDecl()->isEnum();
503ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
504ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isEnumeralType();
50513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
50613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
50713b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
50813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isBooleanType() const {
50913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
51013b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return BT->getKind() == BuiltinType::Bool;
511ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
512ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isBooleanType();
51313b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
51413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
51513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
51613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroffbool Type::isCharType() const {
51713b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
51813b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff    return BT->getKind() == BuiltinType::Char_U ||
51913b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff           BT->getKind() == BuiltinType::UChar ||
520c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson           BT->getKind() == BuiltinType::Char_S ||
521c67ad5f299bb2c09e4567def8ff0d34bd15a42fdAnders Carlsson           BT->getKind() == BuiltinType::SChar;
522ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
523ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isCharType();
52413b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff  return false;
52513b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff}
52613b7c5ff42d6077a8d59e2c9ec9e7fedd0150ae6Steve Naroff
527d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isSignedIntegerType - Return true if this is an integer type that is
528d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
529d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// an enum decl which has a signed representation, or a vector of signed
530d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// integer element type.
5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isSignedIntegerType() const {
5325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
5335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Char_S &&
5345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongLong;
5355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
536d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
53737c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
53837c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->getIntegerType()->isSignedIntegerType();
539d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
540c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
541c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isSignedIntegerType();
542ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
543ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isSignedIntegerType();
5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
547d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// isUnsignedIntegerType - Return true if this is an integer type that is
548d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum
549d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// decl which has an unsigned representation, or a vector of unsigned integer
550d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner/// element type.
5515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isUnsignedIntegerType() const {
5525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
5535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::ULongLong;
5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
556d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
55737c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
55837c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
559d5bbce4382622feb4ca5978c4bb8fcceb7aaec00Chris Lattner
560c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
561c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isUnsignedIntegerType();
562ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
563ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isUnsignedIntegerType();
5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isFloatingType() const {
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Float &&
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
572729a2131228cb7fcbc00bd8af36bc6f14d12317dChris Lattner    return CT->getElementType()->isFloatingType();
573c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
574c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isFloatingType();
575ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
576ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isFloatingType();
5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealFloatingType() const {
5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Float &&
5835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
584c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
585c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isRealFloatingType();
586ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
587ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isRealFloatingType();
5885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isRealType() const {
5925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
5935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() >= BuiltinType::Bool &&
5945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           BT->getKind() <= BuiltinType::LongDouble;
5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
59639ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    return TT->getDecl()->isEnum();
597c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
598c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff    return VT->getElementType()->isRealType();
599ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
600ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isRealType();
6015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
6025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isArithmeticType() const {
6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() != BuiltinType::Void;
60737c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner  if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
60837c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2).
60937c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    // If a body isn't seen by the time we get here, return false.
61037c1b78a20a09b0456aa5caa15e159027010ca22Chris Lattner    return ET->getDecl()->isDefinition();
611ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
612ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isArithmeticType();
6135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType);
6145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isScalarType() const {
6175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
6185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return BT->getKind() != BuiltinType::Void;
6195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
62039ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (TT->getDecl()->isEnum())
6215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
624ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
625ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isScalarType();
626c63b96ad706e054a1390dd2ab53af9f05d33bbb1Steve Naroff  return isa<PointerType>(CanonicalType) || isa<ComplexType>(CanonicalType) ||
627a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek         isa<ObjCQualifiedIdType>(CanonicalType);
6285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isAggregateType() const {
6315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
63239ba4aeca296b1c9f04bde7d9d3cbbf129f1abd3Argyrios Kyrtzidis    if (TT->getDecl()->isStruct())
6335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return true;
6345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
6355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
636ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
637ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isAggregateType();
638c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  return isa<ArrayType>(CanonicalType);
6395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6419bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// isConstantSizeType - Return true if this is not a variable sized type,
6429bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// according to the rules of C99 6.7.5p3.  It is not legal to call this on
6439bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner/// incomplete types.
6443c2b3170041f69a92904e3bab9b6d654eaf260acEli Friedmanbool Type::isConstantSizeType() const {
645ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
6463c2b3170041f69a92904e3bab9b6d654eaf260acEli Friedman    return ASQT->getBaseType()->isConstantSizeType();
647d52a4578144ab2887912e52eabec58a857a44adbChris Lattner  assert(!isIncompleteType() && "This doesn't make sense for incomplete types");
6489bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner  // The VAT must have a size, as it is known to be complete.
6499bfa73c5ab7bf4b0e749d04f29da6884e8d5bd9fChris Lattner  return !isa<VariableArrayType>(CanonicalType);
6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1)
6535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// - a type that can describe objects, but which lacks information needed to
6545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// determine its size.
6555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isIncompleteType() const {
6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (CanonicalType->getTypeClass()) {
6575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: return false;
658ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  case ASQual:
659ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return cast<ASQualType>(CanonicalType)->getBaseType()->isIncompleteType();
6605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Builtin:
6615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Void is the only incomplete builtin type.  Per C99 6.2.5p19, it can never
6625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // be completed.
6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return isVoidType();
6645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Tagged:
6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // A tagged type (struct/union/enum/class) is incomplete if the decl is a
6665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // forward declaration, but not a full definition (C99 6.2.5p22).
6675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return !cast<TagType>(CanonicalType)->getDecl()->isDefinition();
668c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  case IncompleteArray:
6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // An array of unknown size is an incomplete type (C99 6.2.5p22).
670c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman    return true;
6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool Type::isPromotableIntegerType() const {
675ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  if (const ASQualType *ASQT = dyn_cast<ASQualType>(CanonicalType))
676ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb    return ASQT->getBaseType()->isPromotableIntegerType();
6775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType);
6785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!BT) return false;
6795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (BT->getKind()) {
6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Bool:
6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Char_S:
6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Char_U:
6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::SChar:
6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UChar:
6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Short:
6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UShort:
6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default:
6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return false;
6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
6935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *BuiltinType::getName() const {
6945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (getKind()) {
6955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unknown builtin type!");
6965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Void:              return "void";
6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Bool:              return "_Bool";
6985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Char_S:            return "char";
6995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Char_U:            return "char";
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case SChar:             return "signed char";
7015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Short:             return "short";
7025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Int:               return "int";
7035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Long:              return "long";
7045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case LongLong:          return "long long";
7055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UChar:             return "unsigned char";
7065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UShort:            return "unsigned short";
7075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case UInt:              return "unsigned int";
7085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ULong:             return "unsigned long";
7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case ULongLong:         return "unsigned long long";
7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Float:             return "float";
7115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case Double:            return "double";
7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case LongDouble:        return "long double";
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
717942cfd37297528918616d06cd6e4e8bd6e4915a2Chris Lattner                                arg_type_iterator ArgTys,
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                unsigned NumArgs, bool isVariadic) {
7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ID.AddPointer(Result.getAsOpaquePtr());
7205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0; i != NumArgs; ++i)
7215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID.AddPointer(ArgTys[i].getAsOpaquePtr());
7225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ID.AddInteger(isVariadic);
7235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID) {
726942cfd37297528918616d06cd6e4e8bd6e4915a2Chris Lattner  Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic());
7275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
729a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID,
7301ee0700c7dbe3554df09b4558e0b35a53d487ff2Chris Lattner                                         const ObjCInterfaceDecl *Decl,
731a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                                         ObjCProtocolDecl **protocols,
7324b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian                                         unsigned NumProtocols) {
7331ee0700c7dbe3554df09b4558e0b35a53d487ff2Chris Lattner  ID.AddPointer(Decl);
7344b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  for (unsigned i = 0; i != NumProtocols; i++)
7354b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian    ID.AddPointer(protocols[i]);
7364b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
7374b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
738a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID) {
7391ee0700c7dbe3554df09b4558e0b35a53d487ff2Chris Lattner  Profile(ID, getDecl(), &Protocols[0], getNumProtocols());
7404b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
7414b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
742a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID,
743a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek                                         ObjCProtocolDecl **protocols,
744c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian                                         unsigned NumProtocols) {
745c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  for (unsigned i = 0; i != NumProtocols; i++)
746c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    ID.AddPointer(protocols[i]);
747c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian}
748c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian
749a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID) {
750c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  Profile(ID, &Protocols[0], getNumProtocols());
751c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian}
752c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian
753a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
754a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// potentially looking through *all* consequtive typedefs.  This returns the
755a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// sum of the type qualifiers, so if you have:
756a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///   typedef const int A;
757a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///   typedef volatile A B;
758a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner/// looking through the typedefs for B will give you "const volatile A".
759a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner///
760a2c7767ce7d8feb10253f4b650826a20f3324c6fChris LattnerQualType TypedefType::LookThroughTypedefs() const {
761a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // Usually, there is only a single level of typedefs, be fast in that case.
762a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  QualType FirstType = getDecl()->getUnderlyingType();
763a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  if (!isa<TypedefType>(FirstType))
764a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    return FirstType;
765a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
766a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  // Otherwise, do the fully general loop.
767a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  unsigned TypeQuals = 0;
768a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  const TypedefType *TDT = this;
769a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  while (1) {
770a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    QualType CurType = TDT->getDecl()->getUnderlyingType();
771f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner
772f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner
773f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME:
774f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME: This is incorrect for ASQuals!
775f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    /// FIXME:
776f46699ce225811d8d9dbab9d00189a0e54469457Chris Lattner    TypeQuals |= CurType.getCVRQualifiers();
777a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner
778a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    TDT = dyn_cast<TypedefType>(CurType);
779a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner    if (TDT == 0)
780a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner      return QualType(CurType.getTypePtr(), TypeQuals);
781a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner  }
782a2c7767ce7d8feb10253f4b650826a20f3324c6fChris Lattner}
7835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7842daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool RecordType::classof(const TagType *TT) {
7852daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner  return isa<RecordDecl>(TT->getDecl());
7865edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner}
7875edb8bfe8472e7d7bf6a82386394ef27359eb846Chris Lattner
7882daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattnerbool EnumType::classof(const TagType *TT) {
7892daa5df1b53f7ef745d724771384409f6f5df5c1Chris Lattner  return isa<EnumDecl>(TT->getDecl());
7905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
7945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Type Printing
7955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
7965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid QualType::dump(const char *msg) const {
79839caea961530bc95d19114ab546ebcdb229263c9Chris Lattner  std::string R = "identifier";
7995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getAsStringInternal(R);
8005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (msg)
8015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    fprintf(stderr, "%s: %s\n", msg, R.c_str());
8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    fprintf(stderr, "%s\n", R.c_str());
8045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerstatic void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
8075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Note: funkiness to ensure we get a space only between quals.
8085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool NonePrinted = true;
8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Const)
8105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "const", NonePrinted = false;
8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Volatile)
8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += (NonePrinted+" volatile"), NonePrinted = false;
8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQuals & QualType::Restrict)
8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += (NonePrinted+" restrict"), NonePrinted = false;
8155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid QualType::getAsStringInternal(std::string &S) const {
8185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isNull()) {
8195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "NULL TYPE\n";
8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Print qualifiers as appropriate.
8243513e138cc75205b48d3078dfa4669355adb5714Gabor Greif  if (unsigned Tq = getCVRQualifiers()) {
8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    std::string TQS;
8263513e138cc75205b48d3078dfa4669355adb5714Gabor Greif    AppendTypeQualList(TQS, Tq);
8275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (!S.empty())
8285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S = TQS + ' ' + S;
8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S = TQS;
8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getTypePtr()->getAsStringInternal(S);
8345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid BuiltinType::getAsStringInternal(std::string &S) const {
8375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (S.empty()) {
8385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = getName();
8395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
8405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Prefix the basic type, e.g. 'int X'.
8415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = ' ' + S;
8425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = getName() + S;
8435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ComplexType::getAsStringInternal(std::string &S) const {
8475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ElementType->getAsStringInternal(S);
8485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = "_Complex " + S;
8495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
851ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lambvoid ASQualType::getAsStringInternal(std::string &S) const {
852ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
853ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb  BaseType->getAsStringInternal(S);
854ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb}
855ebb97e98c03f8d7034bd3748a10e35f39a95c289Christopher Lamb
8565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid PointerType::getAsStringInternal(std::string &S) const {
8575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = '*' + S;
8585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Handle things like 'int (*A)[4];' correctly.
8605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this should include vectors, but vectors use attributes I guess.
861bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (isa<ArrayType>(getPointeeType()))
8625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = '(' + S + ')';
8635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
864bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  getPointeeType().getAsStringInternal(S);
8655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid ReferenceType::getAsStringInternal(std::string &S) const {
8685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S = '&' + S;
8695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Handle things like 'int (&A)[4];' correctly.
8715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this should include vectors, but vectors use attributes I guess.
872bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  if (isa<ArrayType>(getPointeeType()))
8735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = '(' + S + ')';
8745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
875bdcd637c29ec1540f912ea6860c88b910e78c329Chris Lattner  getPointeeType().getAsStringInternal(S);
8765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
878fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroffvoid ConstantArrayType::getAsStringInternal(std::string &S) const {
879fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  S += '[';
8806b91cd9af12fe1340e48e03e9b988d9888b4889fSteve Naroff  S += llvm::utostr(getSize().getZExtValue());
881fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  S += ']';
882fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
883fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  getElementType().getAsStringInternal(S);
884fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff}
885fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff
886c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedmanvoid IncompleteArrayType::getAsStringInternal(std::string &S) const {
887c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  S += "[]";
888c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
889c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman  getElementType().getAsStringInternal(S);
890c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman}
891c5773c4b8ce1ed6ed5c7112c9020c954a47dce96Eli Friedman
892fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroffvoid VariableArrayType::getAsStringInternal(std::string &S) const {
8935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += '[';
8945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
895c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  if (getIndexTypeQualifier()) {
896c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff    AppendTypeQualList(S, getIndexTypeQualifier());
8975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += ' ';
8985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
8995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
900c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  if (getSizeModifier() == Static)
9015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "static";
902c9406125e2cac9208098655ac8058c095c2c3a65Steve Naroff  else if (getSizeModifier() == Star)
9035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += '*';
9045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
905fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  if (getSizeExpr()) {
906fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    std::ostringstream s;
907fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    getSizeExpr()->printPretty(s);
908fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff    S += s.str();
909fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  }
9105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += ']';
9115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
912fb22d96692c5240fb8d611290dbf7eeed3759c73Steve Naroff  getElementType().getAsStringInternal(S);
9135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid VectorType::getAsStringInternal(std::string &S) const {
9167ee261c8e71f363d86461f4d1a37e3def354c976Chris Lattner  S += " __attribute__((__vector_size__(";
917e107b5d1b3d3527b1f493ed5341e87614b36c376Chris Lattner  // FIXME: should multiply by element size somehow.
9185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += llvm::utostr_32(NumElements*4); // convert back to bytes.
919e107b5d1b3d3527b1f493ed5341e87614b36c376Chris Lattner  S += ")))";
9205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ElementType.getAsStringInternal(S);
9215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
923213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid ExtVectorType::getAsStringInternal(std::string &S) const {
924213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman  S += " __attribute__((ext_vector_type(";
92531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  S += llvm::utostr_32(NumElements);
92631a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  S += ")))";
92731a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  ElementType.getAsStringInternal(S);
92831a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
92931a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff
930d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroffvoid TypeOfExpr::getAsStringInternal(std::string &InnerString) const {
931363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(e) X'.
932363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff    InnerString = ' ' + InnerString;
9338d1a3b8ca1e5fcc4567b5a6f51d82be2e460de1cSteve Naroff  std::ostringstream s;
9346000dace22f110d8768476989313e9d981d690d0Chris Lattner  getUnderlyingExpr()->printPretty(s);
9351bfd5cc29035e4bfccca855160109b07c5e85416Steve Naroff  InnerString = "typeof(" + s.str() + ")" + InnerString;
936d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
937d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
938363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroffvoid TypeOfType::getAsStringInternal(std::string &InnerString) const {
939363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(t) X'.
940363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff    InnerString = ' ' + InnerString;
941d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  std::string Tmp;
942d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  getUnderlyingType().getAsStringInternal(Tmp);
943363bcff47df2fda3cfcfcd994b7888157df58c43Steve Naroff  InnerString = "typeof(" + Tmp + ")" + InnerString;
944d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff}
945d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff
9465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeNoProto::getAsStringInternal(std::string &S) const {
9475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If needed for precedence reasons, wrap the inner part in grouping parens.
9485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!S.empty())
9495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = "(" + S + ")";
9505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += "()";
9525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getResultType().getAsStringInternal(S);
9535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid FunctionTypeProto::getAsStringInternal(std::string &S) const {
9565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // If needed for precedence reasons, wrap the inner part in grouping parens.
9575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!S.empty())
9585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S = "(" + S + ")";
9595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += "(";
9615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  std::string Tmp;
9625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
9635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) S += ", ";
9645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    getArgType(i).getAsStringInternal(Tmp);
9655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += Tmp;
9665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Tmp.clear();
9675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
9685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (isVariadic()) {
9705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (getNumArgs())
9715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      S += ", ";
9725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "...";
9735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else if (getNumArgs() == 0) {
9745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Do not emit int() if we have a proto, emit 'int(void)'.
9755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    S += "void";
9765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
9775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  S += ")";
9795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  getResultType().getAsStringInternal(S);
9805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid TypedefType::getAsStringInternal(std::string &InnerString) const {
9845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
9855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InnerString = ' ' + InnerString;
9865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InnerString = getDecl()->getIdentifier()->getName() + InnerString;
9875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
989a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCInterfaceType::getAsStringInternal(std::string &InnerString) const {
9903536b443bc50d58a79f14fca9b6842541a434854Steve Naroff  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
9913536b443bc50d58a79f14fca9b6842541a434854Steve Naroff    InnerString = ' ' + InnerString;
9923536b443bc50d58a79f14fca9b6842541a434854Steve Naroff  InnerString = getDecl()->getIdentifier()->getName() + InnerString;
9933536b443bc50d58a79f14fca9b6842541a434854Steve Naroff}
9943536b443bc50d58a79f14fca9b6842541a434854Steve Naroff
995a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedInterfaceType::getAsStringInternal(
9964b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian                                  std::string &InnerString) const {
997dfbcce2b55ca8b45ce9d9c09c32e43c3bd73ac2aFariborz Jahanian  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
998dfbcce2b55ca8b45ce9d9c09c32e43c3bd73ac2aFariborz Jahanian    InnerString = ' ' + InnerString;
999a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  std::string ObjCQIString = getDecl()->getName();
1000a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '<';
1001cdce6d17be572ae49417022357906ce04b54137dChris Lattner  bool isFirst = true;
1002cdce6d17be572ae49417022357906ce04b54137dChris Lattner  for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) {
1003cdce6d17be572ae49417022357906ce04b54137dChris Lattner    if (isFirst)
1004cdce6d17be572ae49417022357906ce04b54137dChris Lattner      isFirst = false;
1005cdce6d17be572ae49417022357906ce04b54137dChris Lattner    else
1006a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ObjCQIString += ',';
1007cdce6d17be572ae49417022357906ce04b54137dChris Lattner    ObjCQIString += (*I)->getName();
10084b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian  }
1009a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '>';
1010a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  InnerString = ObjCQIString + InnerString;
10114b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian}
10124b6c9051c6522894978c9ba6a819a659d102db36Fariborz Jahanian
1013a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid ObjCQualifiedIdType::getAsStringInternal(
1014c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian                                              std::string &InnerString) const {
1015c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
1016c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    InnerString = ' ' + InnerString;
1017a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  std::string ObjCQIString = "id";
1018a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '<';
1019c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  int num = getNumProtocols();
1020c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  for (int i = 0; i < num; i++) {
1021a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek    ObjCQIString += getProtocols(i)->getName();
1022c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian    if (i < num-1)
1023a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek      ObjCQIString += ',';
1024c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian  }
1025a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  ObjCQIString += '>';
1026a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek  InnerString = ObjCQIString + InnerString;
1027c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian}
1028c569249ca0ab755ac79d8cbbfcb2bcae19743624Fariborz Jahanian
10295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid TagType::getAsStringInternal(std::string &InnerString) const {
10305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    InnerString = ' ' + InnerString;
10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *Kind = getDecl()->getKindName();
10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  const char *ID;
10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (const IdentifierInfo *II = getDecl()->getIdentifier())
10365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID = II->getName();
10375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  else
10385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ID = "<anonymous>";
10395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  InnerString = std::string(Kind) + " " + ID + InnerString;
10415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1042