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