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