Type.cpp revision df667e71b1daadeacb230cf94fc717843f1a138a
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===--- Type.cpp - Type representation and manipulation ------------------===// 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// The LLVM Compiler Infrastructure 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file is distributed under the University of Illinois Open Source 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// License. See LICENSE.TXT for details. 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// This file implements type-related functionality. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/AST/ASTContext.h" 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/AST/Type.h" 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/AST/DeclCXX.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/AST/DeclObjC.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/AST/DeclTemplate.h" 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "clang/AST/Expr.h" 207fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine#include "llvm/ADT/StringExtras.h" 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectusing namespace clang; 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool QualType::isConstant(ASTContext &Ctx) const { 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isConstQualified()) 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 2734f2974ce7ec7c71beb47b5daf9089d5c8c40c79David 'Digit' Turner 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getTypePtr()->isArrayType()) 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return Ctx.getAsArrayType(*this)->getElementType().isConstant(Ctx); 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid Type::Destroy(ASTContext& C) { 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this->~Type(); 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project C.Deallocate(this); 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid VariableArrayType::Destroy(ASTContext& C) { 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SizeExpr->Destroy(C); 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this->~VariableArrayType(); 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project C.Deallocate(this); 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid DependentSizedArrayType::Destroy(ASTContext& C) { 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SizeExpr->Destroy(C); 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project this->~DependentSizedArrayType(); 489877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project C.Deallocate(this); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 50c5b127050f2dbed015d6b01703a33062d6910d4aDavid 'Digit' Turner 519877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Project/// getArrayElementTypeNoTypeQual - If this is an array type, return the 52318e4f294c181df33cf2541763904565b29bcccbDavid 'Digit' Turner/// element type of the array, potentially with type qualifiers missing. 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// This method should never be used when type qualifiers are meaningful. 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst Type *Type::getArrayElementTypeNoTypeQual() const { 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly an array type, return it. 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ArrayType *ATy = dyn_cast<ArrayType>(this)) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ATy->getElementType().getTypePtr(); 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<ArrayType>(CanonicalType)) { 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (ArrayType *AT = dyn_cast<ArrayType>(CanonicalType.getUnqualifiedType())) 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return AT->getElementType().getTypePtr(); 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 660119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine 67055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner // If this is a typedef for an array type, strip the typedef off without 680119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine // losing all typedef information. 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getArrayElementTypeNoTypeQual(); 70055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner} 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// getDesugaredType - Return the specified type with any "sugar" removed from 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// type type. This takes off typedefs, typeof's etc. If the outer level of 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// the type is already concrete, it returns it unmodified. This is similar 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// to getting the canonical type, but it doesn't remove *all* typedefs. For 76a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner/// example, it return "T*" as "T*", (not as "int*"), because the pointer is 77a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner/// concrete. 78a383d02cb57dd7dadd382654175e51354073a139David 'Digit' TurnerQualType Type::getDesugaredType() const { 79a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner if (const TypedefType *TDT = dyn_cast<TypedefType>(this)) 80a383d02cb57dd7dadd382654175e51354073a139David 'Digit' Turner return TDT->LookThroughTypedefs(); 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TypeOfExprType *TOE = dyn_cast<TypeOfExprType>(this)) 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return TOE->getUnderlyingExpr()->getType(); 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this)) 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return TOT->getUnderlyingType(); 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ClassTemplateSpecializationType *Spec 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project = dyn_cast<ClassTemplateSpecializationType>(this)) 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return Spec->getCanonicalTypeInternal(); 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: remove this cast. 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return QualType(const_cast<Type*>(this), 0); 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isVoidType - Helper method to determine if this is the 'void' type. 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isVoidType() const { 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() == BuiltinType::Void; 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType)) 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return AS->getBaseType()->isVoidType(); 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isObjectType() const { 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FunctionType>(CanonicalType) || isa<ReferenceType>(CanonicalType)) 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType)) 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return AS->getBaseType()->isObjectType(); 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return !CanonicalType->isIncompleteType(); 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isDerivedType() const { 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (CanonicalType->getTypeClass()) { 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ExtQual: 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return cast<ExtQualType>(CanonicalType)->getBaseType()->isDerivedType(); 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Pointer: 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case VariableArray: 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ConstantArray: 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IncompleteArray: 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case FunctionProto: 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case FunctionNoProto: 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Reference: 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Record: 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isClassType() const { 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = getAsRecordType()) 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RT->getDecl()->isClass(); 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isStructureType() const { 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = getAsRecordType()) 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RT->getDecl()->isStruct(); 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isUnionType() const { 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = getAsRecordType()) 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RT->getDecl()->isUnion(); 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isComplexType() const { 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType)) 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CT->getElementType()->isFloatingType(); 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType)) 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return AS->getBaseType()->isComplexType(); 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isComplexIntegerType() const { 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Check for GCC complex integer extension. 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType)) 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CT->getElementType()->isIntegerType(); 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType)) 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return AS->getBaseType()->isComplexIntegerType(); 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ComplexType *Type::getAsComplexIntegerType() const { 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Are we directly a complex type? 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) { 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (CTy->getElementType()->isIntegerType()) 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CTy; 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't what we want, reject it. 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<ComplexType>(CanonicalType)) { 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers (e.g. ExtQualType's). 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<ComplexType>(CanonicalType.getUnqualifiedType())) 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsComplexIntegerType(); 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a complex type, strip the typedef off without 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsComplexIntegerType(); 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst BuiltinType *Type::getAsBuiltinType() const { 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a builtin type, return it. 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BTy = dyn_cast<BuiltinType>(this)) 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BTy; 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't a builtin type, reject it. 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<BuiltinType>(CanonicalType)) { 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers (e.g. ExtQualType's). 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<BuiltinType>(CanonicalType.getUnqualifiedType())) 19120894ae3fa98f82da925fbeb72e616eef509758aDavid 'Digit' Turner return CanonicalType.getUnqualifiedType()->getAsBuiltinType(); 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a builtin type, strip the typedef off without 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsBuiltinType(); 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst FunctionType *Type::getAsFunctionType() const { 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a function type, return it. 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const FunctionType *FTy = dyn_cast<FunctionType>(this)) 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FTy; 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<FunctionType>(CanonicalType)) { 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FunctionType>(CanonicalType.getUnqualifiedType())) 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsFunctionType(); 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 212cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 213cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner // If this is a typedef for a function type, strip the typedef off without 214cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner // losing all typedef information. 215cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return getDesugaredType()->getAsFunctionType(); 216cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 217cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 218cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerconst FunctionNoProtoType *Type::getAsFunctionNoProtoType() const { 219cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return dyn_cast_or_null<FunctionNoProtoType>(getAsFunctionType()); 220cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 221cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 222cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerconst FunctionProtoType *Type::getAsFunctionProtoType() const { 223cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return dyn_cast_or_null<FunctionProtoType>(getAsFunctionType()); 224cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 225cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 226cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 227cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnerconst PointerType *Type::getAsPointerType() const { 228cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner // If this is directly a pointer type, return it. 229cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (const PointerType *PTy = dyn_cast<PointerType>(this)) 230cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner return PTy; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<PointerType>(CanonicalType)) { 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<PointerType>(CanonicalType.getUnqualifiedType())) 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsPointerType(); 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a pointer type, strip the typedef off without 2410119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine // losing all typedef information. 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsPointerType(); 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst BlockPointerType *Type::getAsBlockPointerType() const { 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a block pointer type, return it. 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BlockPointerType *PTy = dyn_cast<BlockPointerType>(this)) 2480119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine return PTy; 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // If the canonical form of this type isn't the right kind, reject it. 251055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner if (!isa<BlockPointerType>(CanonicalType)) { 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<BlockPointerType>(CanonicalType.getUnqualifiedType())) 2545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return CanonicalType.getUnqualifiedType()->getAsBlockPointerType(); 2555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return 0; 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 2585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner // If this is a typedef for a block pointer type, strip the typedef off 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // without losing all typedef information. 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsBlockPointerType(); 261055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner} 262055ae42d36d9d78a7920f66ee2df485d81d24264David 'Digit' Turner 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ReferenceType *Type::getAsReferenceType() const { 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a reference type, return it. 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ReferenceType *RTy = dyn_cast<ReferenceType>(this)) 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RTy; 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<ReferenceType>(CanonicalType)) { 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<ReferenceType>(CanonicalType.getUnqualifiedType())) 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsReferenceType(); 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a reference type, strip the typedef off without 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsReferenceType(); 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst MemberPointerType *Type::getAsMemberPointerType() const { 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a member pointer type, return it. 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const MemberPointerType *MTy = dyn_cast<MemberPointerType>(this)) 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return MTy; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<MemberPointerType>(CanonicalType)) { 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<MemberPointerType>(CanonicalType.getUnqualifiedType())) 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsMemberPointerType(); 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a member pointer type, strip the typedef off 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // without losing all typedef information. 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsMemberPointerType(); 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// array types and types that contain variable array types in their 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// declarator 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isVariablyModifiedType() const { 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // A VLA is a variably modified type. 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isVariableArrayType()) 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // An array can contain a variably modified type 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const Type *T = getArrayElementTypeNoTypeQual()) 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return T->isVariablyModifiedType(); 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // A pointer can point to a variably modified type. 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Also, C++ references and member pointers can point to a variably modified 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // type, where VLAs appear as an extension to C++, and should be treated 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // correctly. 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const PointerType *PT = getAsPointerType()) 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return PT->getPointeeType()->isVariablyModifiedType(); 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ReferenceType *RT = getAsReferenceType()) 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RT->getPointeeType()->isVariablyModifiedType(); 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const MemberPointerType *PT = getAsMemberPointerType()) 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return PT->getPointeeType()->isVariablyModifiedType(); 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // A function can return a variably modified type 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // This one isn't completely obvious, but it follows from the 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // definition in C99 6.7.5p3. Because of this rule, it's 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // illegal to declare a function returning a variably modified type. 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const FunctionType *FT = getAsFunctionType()) 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FT->getResultType()->isVariablyModifiedType(); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst RecordType *Type::getAsRecordType() const { 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a record type, return it. 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RTy = dyn_cast<RecordType>(this)) 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RTy; 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<RecordType>(CanonicalType)) { 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<RecordType>(CanonicalType.getUnqualifiedType())) 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsRecordType(); 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a record type, strip the typedef off without 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsRecordType(); 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst TagType *Type::getAsTagType() const { 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a tag type, return it. 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TagType *TagTy = dyn_cast<TagType>(this)) 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return TagTy; 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<TagType>(CanonicalType)) { 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<TagType>(CanonicalType.getUnqualifiedType())) 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsTagType(); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a tag type, strip the typedef off without 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsTagType(); 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst RecordType *Type::getAsStructureType() const { 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a structure type, return it. 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = dyn_cast<RecordType>(this)) { 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (RT->getDecl()->isStruct()) 3725389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine return RT; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) { 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!RT->getDecl()->isStruct()) 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a structure type, strip the typedef off without 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsStructureType(); 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<RecordType>(CanonicalType.getUnqualifiedType())) 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsStructureType(); 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst RecordType *Type::getAsUnionType() const { 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is directly a union type, return it. 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = dyn_cast<RecordType>(this)) { 3935389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine if (RT->getDecl()->isUnion()) 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return RT; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) { 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!RT->getDecl()->isUnion()) 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a union type, strip the typedef off without 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsUnionType(); 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<RecordType>(CanonicalType.getUnqualifiedType())) 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsUnionType(); 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst EnumType *Type::getAsEnumType() const { 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Check the canonicalized unqualified type directly; the more complex 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // version is unnecessary because there isn't any typedef information 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // to preserve. 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return dyn_cast<EnumType>(CanonicalType.getUnqualifiedType()); 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ComplexType *Type::getAsComplexType() const { 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Are we directly a complex type? 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CTy; 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<ComplexType>(CanonicalType)) { 4279085a28c14f369d231dbae099a690689179f428avchtchetkine // Look through type qualifiers 4280119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine if (isa<ComplexType>(CanonicalType.getUnqualifiedType())) 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsComplexType(); 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4330119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine // If this is a typedef for a complex type, strip the typedef off without 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsComplexType(); 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst VectorType *Type::getAsVectorType() const { 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Are we directly a vector type? 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VTy = dyn_cast<VectorType>(this)) 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VTy; 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<VectorType>(CanonicalType)) { 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<VectorType>(CanonicalType.getUnqualifiedType())) 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsVectorType(); 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for a vector type, strip the typedef off without 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // losing all typedef information. 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsVectorType(); 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ExtVectorType *Type::getAsExtVectorType() const { 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Are we directly an OpenCU vector type? 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtVectorType *VTy = dyn_cast<ExtVectorType>(this)) 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VTy; 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If the canonical form of this type isn't the right kind, reject it. 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<ExtVectorType>(CanonicalType)) { 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Look through type qualifiers 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<ExtVectorType>(CanonicalType.getUnqualifiedType())) 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CanonicalType.getUnqualifiedType()->getAsExtVectorType(); 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is a typedef for an extended vector type, strip the typedef off 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // without losing all typedef information. 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getDesugaredType()->getAsExtVectorType(); 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ObjCInterfaceType *Type::getAsObjCInterfaceType() const { 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // There is no sugar for ObjCInterfaceType's, just return the canonical 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // type pointer if it is the right class. There is no typedef information to 4770119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine // return and these cannot be Address-space qualified. 4780119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine return dyn_cast<ObjCInterfaceType>(CanonicalType.getUnqualifiedType()); 4790119362f0d74ca74f3ea743f6e0e527a9edcc474Vladimir Chtchetkine} 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ObjCQualifiedInterfaceType * 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectType::getAsObjCQualifiedInterfaceType() const { 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // There is no sugar for ObjCQualifiedInterfaceType's, just return the 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // canonical type pointer if it is the right class. 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return dyn_cast<ObjCQualifiedInterfaceType>(CanonicalType.getUnqualifiedType()); 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ObjCQualifiedIdType *Type::getAsObjCQualifiedIdType() const { 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // There is no sugar for ObjCQualifiedIdType's, just return the canonical 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // type pointer if it is the right class. 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return dyn_cast<ObjCQualifiedIdType>(CanonicalType.getUnqualifiedType()); 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst TemplateTypeParmType *Type::getAsTemplateTypeParmType() const { 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // There is no sugar for template type parameters, so just return 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // the canonical type pointer if it is the right class. 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: can these be address-space qualified? 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return dyn_cast<TemplateTypeParmType>(CanonicalType); 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst ClassTemplateSpecializationType * 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectType::getClassTemplateSpecializationType() const { 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // There is no sugar for class template specialization types, so 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // just return the canonical type pointer if it is the right class. 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return dyn_cast<ClassTemplateSpecializationType>(CanonicalType); 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isIntegerType() const { 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Bool && 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongLong; 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Incomplete enum types are not treated as integer types. 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: In C++, enum types are never integer types. 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FixedWidthIntType>(CanonicalType)) 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VT->getElementType()->isIntegerType(); 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isIntegerType(); 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isIntegralType() const { 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Bool && 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongLong; 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; // Complete enum types are integral. 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: In C++, enum types are never integral. 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FixedWidthIntType>(CanonicalType)) 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isIntegralType(); 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isEnumeralType() const { 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return TT->getDecl()->isEnum(); 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isEnumeralType(); 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isBooleanType() const { 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() == BuiltinType::Bool; 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isBooleanType(); 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isCharType() const { 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() == BuiltinType::Char_U || 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() == BuiltinType::UChar || 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() == BuiltinType::Char_S || 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() == BuiltinType::SChar; 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isCharType(); 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isWideCharType() const { 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() == BuiltinType::WChar; 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isWideCharType(); 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isSignedIntegerType - Return true if this is an integer type that is 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..], 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// an enum decl which has a signed representation, or a vector of signed 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// integer element type. 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isSignedIntegerType() const { 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) { 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Char_S && 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongLong; 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ET->getDecl()->getIntegerType()->isSignedIntegerType(); 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const FixedWidthIntType *FWIT = 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dyn_cast<FixedWidthIntType>(CanonicalType)) 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FWIT->isSigned(); 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VT->getElementType()->isSignedIntegerType(); 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isSignedIntegerType(); 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isUnsignedIntegerType - Return true if this is an integer type that is 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// decl which has an unsigned representation, or a vector of unsigned integer 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// element type. 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isUnsignedIntegerType() const { 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) { 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Bool && 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::ULongLong; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ET->getDecl()->getIntegerType()->isUnsignedIntegerType(); 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const FixedWidthIntType *FWIT = 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dyn_cast<FixedWidthIntType>(CanonicalType)) 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return !FWIT->isSigned(); 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VT->getElementType()->isUnsignedIntegerType(); 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isUnsignedIntegerType(); 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isFloatingType() const { 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Float && 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongDouble; 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType)) 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return CT->getElementType()->isFloatingType(); 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VT->getElementType()->isFloatingType(); 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isFloatingType(); 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isRealFloatingType() const { 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Float && 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongDouble; 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VT->getElementType()->isRealFloatingType(); 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isRealFloatingType(); 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isRealType() const { 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Bool && 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongDouble; 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return TT->getDecl()->isEnum() && TT->getDecl()->isDefinition(); 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FixedWidthIntType>(CanonicalType)) 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType)) 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return VT->getElementType()->isRealType(); 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isRealType(); 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isArithmeticType() const { 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() >= BuiltinType::Bool && 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BT->getKind() <= BuiltinType::LongDouble; 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType)) 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2). 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If a body isn't seen by the time we get here, return false. 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ET->getDecl()->isDefinition(); 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FixedWidthIntType>(CanonicalType)) 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isArithmeticType(); 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType); 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isScalarType() const { 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return BT->getKind() != BuiltinType::Void; 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) { 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Enums are scalar types, but only if they are defined. Incomplete enums 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // are not treated as scalar types. 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition()) 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isScalarType(); 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<FixedWidthIntType>(CanonicalType)) 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return isa<PointerType>(CanonicalType) || 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project isa<BlockPointerType>(CanonicalType) || 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project isa<MemberPointerType>(CanonicalType) || 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project isa<ComplexType>(CanonicalType) || 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project isa<ObjCQualifiedIdType>(CanonicalType) || 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project isa<ObjCQualifiedClassType>(CanonicalType); 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// \brief Determines whether the type is a C++ aggregate type or C 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// aggregate or union type. 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// An aggregate type is an array or a class type (struct, union, or 7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// class) that has no user-declared constructors, no private or 7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// protected non-static data members, no base classes, and no virtual 7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// functions (C++ [dcl.init.aggr]p1). The notion of an aggregate type 7088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// subsumes the notion of C aggregates (C99 6.2.5p21) because it also 7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// includes union types. 7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isAggregateType() const { 7118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const RecordType *Record = dyn_cast<RecordType>(CanonicalType)) { 7128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(Record->getDecl())) 7138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ClassDecl->isAggregate(); 7148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 7168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isAggregateType(); 7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return isa<ArrayType>(CanonicalType); 7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isConstantSizeType - Return true if this is not a variable sized type, 7248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// according to the rules of C99 6.7.5p3. It is not legal to call this on 7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// incomplete types or dependent types. 7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isConstantSizeType() const { 7278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType)) 7288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return EXTQT->getBaseType()->isConstantSizeType(); 7298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert(!isIncompleteType() && "This doesn't make sense for incomplete types"); 7308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert(!isDependentType() && "This doesn't make sense for dependent types"); 7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // The VAT must have a size, as it is known to be complete. 7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return !isa<VariableArrayType>(CanonicalType); 7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1) 7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// - a type that can describe objects, but which lacks information needed to 7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// determine its size. 7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isIncompleteType() const { 7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (CanonicalType->getTypeClass()) { 7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return false; 7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ExtQual: 7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return cast<ExtQualType>(CanonicalType)->getBaseType()->isIncompleteType(); 7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Builtin: 7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Void is the only incomplete builtin type. Per C99 6.2.5p19, it can never 7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // be completed. 7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return isVoidType(); 7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Record: 7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Enum: 7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // A tagged type (struct/union/enum/class) is incomplete if the decl is a 7508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // forward declaration, but not a full definition (C99 6.2.5p22). 7518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return !cast<TagType>(CanonicalType)->getDecl()->isDefinition(); 7528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case IncompleteArray: 7538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // An array of unknown size is an incomplete type (C99 6.2.5p22). 7548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 7558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10) 7598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isPODType() const { 7608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // The compiler shouldn't query this for incomplete types, but the user might. 7618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // We return false for that case. 7628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isIncompleteType()) 7638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 7648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (CanonicalType->getTypeClass()) { 7668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Everything not explicitly mentioned is not POD. 7678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return false; 7688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ExtQual: 7698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return cast<ExtQualType>(CanonicalType)->getBaseType()->isPODType(); 7708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case VariableArray: 7718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ConstantArray: 7728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // IncompleteArray is caught by isIncompleteType() above. 7738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return cast<ArrayType>(CanonicalType)->getElementType()->isPODType(); 7748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Builtin: 7768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Complex: 7778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Pointer: 7788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case MemberPointer: 7798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Vector: 7808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ExtVector: 7818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case ObjCQualifiedId: 7828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 7838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Enum: 7858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 7868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Record: 7888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (CXXRecordDecl *ClassDecl 7898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project = dyn_cast<CXXRecordDecl>(cast<RecordType>(CanonicalType)->getDecl())) 7908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ClassDecl->isPOD(); 7918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // C struct/union is POD. 7938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 7948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 7968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool Type::isPromotableIntegerType() const { 7988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (const BuiltinType *BT = getAsBuiltinType()) 7998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (BT->getKind()) { 8008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case BuiltinType::Bool: 8018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case BuiltinType::Char_S: 8028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case BuiltinType::Char_U: 8038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case BuiltinType::SChar: 8048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case BuiltinType::UChar: 8055389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case BuiltinType::Short: 8065389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine case BuiltinType::UShort: 8078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 8088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 8098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 8108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 8118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 8128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char *BuiltinType::getName() const { 8158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (getKind()) { 8168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: assert(0 && "Unknown builtin type!"); 8178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Void: return "void"; 8188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Bool: return "_Bool"; 8198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case Char_S: return "char"; 820cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Char_U: return "char"; 821cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case SChar: return "signed char"; 822cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Short: return "short"; 823cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Int: return "int"; 824cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Long: return "long"; 825cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case LongLong: return "long long"; 826cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case UChar: return "unsigned char"; 827cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case UShort: return "unsigned short"; 828cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case UInt: return "unsigned int"; 829cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case ULong: return "unsigned long"; 830cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case ULongLong: return "unsigned long long"; 831cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Float: return "float"; 832cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Double: return "double"; 833cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case LongDouble: return "long double"; 834cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case WChar: return "wchar_t"; 835cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Overload: return "<overloaded function type>"; 836cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner case Dependent: return "<dependent type>"; 837cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 838cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 839cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 840cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result, 841cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner arg_type_iterator ArgTys, 842def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner unsigned NumArgs, bool isVariadic, 843def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner unsigned TypeQuals) { 844cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ID.AddPointer(Result.getAsOpaquePtr()); 845cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner for (unsigned i = 0; i != NumArgs; ++i) 846cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ID.AddPointer(ArgTys[i].getAsOpaquePtr()); 847cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ID.AddInteger(isVariadic); 848cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ID.AddInteger(TypeQuals); 8498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID) { 8528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic(), 8538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getTypeQuals()); 8548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID, 8578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const ObjCInterfaceDecl *Decl, 8588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ObjCProtocolDecl **protocols, 8598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumProtocols) { 8608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(Decl); 8618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned i = 0; i != NumProtocols; i++) 8628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(protocols[i]); 8638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 864cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 865cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID) { 86649dcc4de79c93de65c20706b798353be1e840915David 'Digit' Turner Profile(ID, getDecl(), &Protocols[0], getNumProtocols()); 8678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 869cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID, 8708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ObjCProtocolDecl **protocols, 8718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumProtocols) { 8728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned i = 0; i != NumProtocols; i++) 8738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(protocols[i]); 8748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID) { 8778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Profile(ID, &Protocols[0], getNumProtocols()); 8788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 8798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to 8818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// potentially looking through *all* consequtive typedefs. This returns the 8828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// sum of the type qualifiers, so if you have: 8838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// typedef const int A; 8848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// typedef volatile A B; 8858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// looking through the typedefs for B will give you "const volatile A". 8868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/// 8878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectQualType TypedefType::LookThroughTypedefs() const { 8888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Usually, there is only a single level of typedefs, be fast in that case. 8898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType FirstType = getDecl()->getUnderlyingType(); 8908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!isa<TypedefType>(FirstType)) 8918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return FirstType; 8928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Otherwise, do the fully general loop. 8948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned TypeQuals = 0; 8958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const TypedefType *TDT = this; 8968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (1) { 8978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QualType CurType = TDT->getDecl()->getUnderlyingType(); 8988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 8998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// FIXME: 9018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// FIXME: This is incorrect for ExtQuals! 9028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /// FIXME: 9038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TypeQuals |= CurType.getCVRQualifiers(); 9048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TDT = dyn_cast<TypedefType>(CurType); 9068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TDT == 0) 9078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return QualType(CurType.getTypePtr(), TypeQuals); 9088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectTypeOfExprType::TypeOfExprType(Expr *E, QualType can) 9128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(TypeOfExpr, can, E->isTypeDependent()), TOExpr(E) { 9138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert(!isa<TypedefType>(can) && "Invalid canonical type"); 9148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool RecordType::classof(const TagType *TT) { 9178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return isa<RecordDecl>(TT->getDecl()); 9188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool EnumType::classof(const TagType *TT) { 9218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return isa<EnumDecl>(TT->getDecl()); 9228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectbool 9258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType:: 9268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectanyDependentTemplateArguments(const TemplateArgument *Args, unsigned NumArgs) { 9278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned Idx = 0; Idx < NumArgs; ++Idx) { 9288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (Args[Idx].getKind()) { 9298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TemplateArgument::Type: 9308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (Args[Idx].getAsType()->isDependentType()) 9319085a28c14f369d231dbae099a690689179f428avchtchetkine return true; 9329085a28c14f369d231dbae099a690689179f428avchtchetkine break; 9339085a28c14f369d231dbae099a690689179f428avchtchetkine 9348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TemplateArgument::Declaration: 9358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TemplateArgument::Integral: 9368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Never dependent 9378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case TemplateArgument::Expression: 9408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (Args[Idx].getAsExpr()->isTypeDependent() || 9418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Args[Idx].getAsExpr()->isValueDependent()) 9428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return true; 9438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 9448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 9468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return false; 9488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType:: 9518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType(TemplateDecl *T, const TemplateArgument *Args, 9528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumArgs, QualType Canon) 9538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project : Type(ClassTemplateSpecialization, 9548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Canon.isNull()? QualType(this, 0) : Canon, 9558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /*FIXME: Check for dependent template */ 9568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project anyDependentTemplateArguments(Args, NumArgs)), 9578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Template(T), NumArgs(NumArgs) 9588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 9598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert((!Canon.isNull() || 9608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project anyDependentTemplateArguments(Args, NumArgs)) && 9618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project "No canonical type for non-dependent class template specialization"); 9628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TemplateArgument *TemplateArgs 9648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project = reinterpret_cast<TemplateArgument *>(this + 1); 9658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 9668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project new (&TemplateArgs[Arg]) TemplateArgument(Args[Arg]); 9678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ClassTemplateSpecializationType::Destroy(ASTContext& C) { 9708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned Arg = 0; Arg < NumArgs; ++Arg) 9718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (Expr *E = getArg(Arg).getAsExpr()) 9728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project E->Destroy(C); 9738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType::iterator 9768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType::end() const { 9778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return begin() + getNumArgs(); 9788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst TemplateArgument & 9818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType::getArg(unsigned Idx) const { 9828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project assert(Idx < getNumArgs() && "Template argument out of range"); 9838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return getArgs()[Idx]; 9848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 9878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectClassTemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID, 9888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project TemplateDecl *T, 9898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const TemplateArgument *Args, 9908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumArgs) { 9918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ID.AddPointer(T); 9928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned Idx = 0; Idx < NumArgs; ++Idx) 9948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Args[Idx].Profile(ID); 9958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 9968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 9978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 9988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// Type Printing 9998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//===----------------------------------------------------------------------===// 10008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid QualType::dump(const char *msg) const { 10028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string R = "identifier"; 10038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getAsStringInternal(R); 10048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (msg) 10058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "%s: %s\n", msg, R.c_str()); 10068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 10078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "%s\n", R.c_str()); 10088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid QualType::dump() const { 10108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dump(""); 10118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid Type::dump() const { 10148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string S = "identifier"; 10158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getAsStringInternal(S); 10168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fprintf(stderr, "%s\n", S.c_str()); 10178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10219877e2e3e3c2df64de306b48f80a4f5d0b028d95The Android Open Source Projectstatic void AppendTypeQualList(std::string &S, unsigned TypeQuals) { 10228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Note: funkiness to ensure we get a space only between quals. 10238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool NonePrinted = true; 10248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TypeQuals & QualType::Const) 10258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "const", NonePrinted = false; 10268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TypeQuals & QualType::Volatile) 10278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += (NonePrinted+" volatile"), NonePrinted = false; 10288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (TypeQuals & QualType::Restrict) 10298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += (NonePrinted+" restrict"), NonePrinted = false; 10308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid QualType::getAsStringInternal(std::string &S) const { 10338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isNull()) { 10348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "NULL TYPE"; 10358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 10368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Print qualifiers as appropriate. 10398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (unsigned Tq = getCVRQualifiers()) { 10408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string TQS; 10418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AppendTypeQualList(TQS, Tq); 10428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!S.empty()) 10438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = TQS + ' ' + S; 10445389aa19033153c09556d1362a8b8a56abccb8f5Vladimir Chtchetkine else 10458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = TQS; 10468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getTypePtr()->getAsStringInternal(S); 10498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid BuiltinType::getAsStringInternal(std::string &S) const { 10528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (S.empty()) { 10538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = getName(); 10548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 10558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Prefix the basic type, e.g. 'int X'. 10568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = ' ' + S; 10578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = getName() + S; 10588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid FixedWidthIntType::getAsStringInternal(std::string &S) const { 10628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: Once we get bitwidth attribute, write as 10638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // "int __attribute__((bitwidth(x)))". 10648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string prefix = "__clang_fixedwidth"; 10658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project prefix += llvm::utostr_32(Width); 10668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project prefix += (char)(Signed ? 'S' : 'U'); 10678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (S.empty()) { 10688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = prefix; 10698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 10708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Prefix the basic type, e.g. 'int X'. 10718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = prefix + S; 10728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ComplexType::getAsStringInternal(std::string &S) const { 10778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ElementType->getAsStringInternal(S); 10788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = "_Complex " + S; 10798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 10818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ExtQualType::getAsStringInternal(std::string &S) const { 10828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bool NeedsSpace = false; 10838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (AddressSpace) { 10848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S; 10858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project NeedsSpace = true; 10868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (GCAttrType != QualType::GCNone) { 10888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (NeedsSpace) 10898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ' '; 10908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "__attribute__((objc_gc("; 10918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (GCAttrType == QualType::Weak) 10928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "weak"; 10938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 10948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "strong"; 10958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ")))"; 10968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 10978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project BaseType->getAsStringInternal(S); 10988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 10998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid PointerType::getAsStringInternal(std::string &S) const { 11018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = '*' + S; 11028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Handle things like 'int (*A)[4];' correctly. 11048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: this should include vectors, but vectors use attributes I guess. 11058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<ArrayType>(getPointeeType())) 11068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = '(' + S + ')'; 11078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getPointeeType().getAsStringInternal(S); 11098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid BlockPointerType::getAsStringInternal(std::string &S) const { 11128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = '^' + S; 11138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project PointeeType.getAsStringInternal(S); 11148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ReferenceType::getAsStringInternal(std::string &S) const { 11178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = '&' + S; 11188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Handle things like 'int (&A)[4];' correctly. 11208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: this should include vectors, but vectors use attributes I guess. 11218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<ArrayType>(getPointeeType())) 11228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = '(' + S + ')'; 11238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getPointeeType().getAsStringInternal(S); 11258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid MemberPointerType::getAsStringInternal(std::string &S) const { 11288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string C; 11298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Class->getAsStringInternal(C); 11308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project C += "::*"; 11318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = C + S; 11328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Handle things like 'int (&A)[4];' correctly. 11348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: this should include vectors, but vectors use attributes I guess. 11358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isa<ArrayType>(getPointeeType())) 11368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = '(' + S + ')'; 11378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getPointeeType().getAsStringInternal(S); 11398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ConstantArrayType::getAsStringInternal(std::string &S) const { 11428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += '['; 11438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += llvm::utostr(getSize().getZExtValue()); 11448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ']'; 11458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1146b58c44e55548129243185ef5927bd3abb5903044David Turner getElementType().getAsStringInternal(S); 1147b58c44e55548129243185ef5927bd3abb5903044David Turner} 1148b58c44e55548129243185ef5927bd3abb5903044David Turner 11498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid IncompleteArrayType::getAsStringInternal(std::string &S) const { 11508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "[]"; 11518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getElementType().getAsStringInternal(S); 11538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 11548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid VariableArrayType::getAsStringInternal(std::string &S) const { 11568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += '['; 11578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getIndexTypeQualifier()) { 11598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AppendTypeQualList(S, getIndexTypeQualifier()); 11608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ' '; 11618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getSizeModifier() == Static) 11648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "static"; 11658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (getSizeModifier() == Star) 11668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += '*'; 11678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getSizeExpr()) { 11698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string SStr; 11708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::raw_string_ostream s(SStr); 11718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getSizeExpr()->printPretty(s); 11728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += s.str(); 11738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ']'; 11758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getElementType().getAsStringInternal(S); 1177cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 1178cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 11798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid DependentSizedArrayType::getAsStringInternal(std::string &S) const { 1180cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner S += '['; 1181cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 11828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getIndexTypeQualifier()) { 11838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AppendTypeQualList(S, getIndexTypeQualifier()); 11848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ' '; 11858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 11878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getSizeModifier() == Static) 11888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "static"; 11898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else if (getSizeModifier() == Star) 11908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += '*'; 11918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1192cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (getSizeExpr()) { 11938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string SStr; 11948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::raw_string_ostream s(SStr); 11958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getSizeExpr()->printPretty(s); 11968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += s.str(); 11978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 11988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ']'; 11998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getElementType().getAsStringInternal(S); 12018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid VectorType::getAsStringInternal(std::string &S) const { 12048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // FIXME: We prefer to print the size directly here, but have no way 12058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // to get the size of the type. 12068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += " __attribute__((__vector_size__("; 12078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += llvm::utostr_32(NumElements); // convert back to bytes. 12088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += " * sizeof(" + ElementType.getAsString() + "))))"; 12098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ElementType.getAsStringInternal(S); 12108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid ExtVectorType::getAsStringInternal(std::string &S) const { 12138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += " __attribute__((ext_vector_type("; 12148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += llvm::utostr_32(NumElements); 12158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ")))"; 12168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ElementType.getAsStringInternal(S); 12178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid TypeOfExprType::getAsStringInternal(std::string &InnerString) const { 12208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!InnerString.empty()) // Prefix the basic type, e.g. 'typeof(e) X'. 12218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = ' ' + InnerString; 12228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string Str; 12238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::raw_string_ostream s(Str); 12248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getUnderlyingExpr()->printPretty(s); 122540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie InnerString = "typeof(" + s.str() + ")" + InnerString; 122640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie} 122740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 122840beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnievoid TypeOfType::getAsStringInternal(std::string &InnerString) const { 122940beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie if (!InnerString.empty()) // Prefix the basic type, e.g. 'typeof(t) X'. 123040beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie InnerString = ' ' + InnerString; 123140beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie std::string Tmp; 123240beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie getUnderlyingType().getAsStringInternal(Tmp); 123340beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie InnerString = "typeof(" + Tmp + ")" + InnerString; 123440beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie} 123540beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie 123640beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnievoid FunctionNoProtoType::getAsStringInternal(std::string &S) const { 123740beab42ecdc4e2a79714b54c401feb0fb33b6d0Dries Harnie // If needed for precedence reasons, wrap the inner part in grouping parens. 12388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!S.empty()) 12398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = "(" + S + ")"; 12408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "()"; 12428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getResultType().getAsStringInternal(S); 12438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid FunctionProtoType::getAsStringInternal(std::string &S) const { 12468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If needed for precedence reasons, wrap the inner part in grouping parens. 12478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!S.empty()) 12488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S = "(" + S + ")"; 12498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "("; 12518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string Tmp; 12528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned i = 0, e = getNumArgs(); i != e; ++i) { 12538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (i) S += ", "; 12548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getArgType(i).getAsStringInternal(Tmp); 12558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += Tmp; 12568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Tmp.clear(); 12578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (isVariadic()) { 12608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (getNumArgs()) 12618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ", "; 12628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "..."; 12638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (getNumArgs() == 0) { 12648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // Do not emit int() if we have a proto, emit 'int(void)'. 12658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += "void"; 12668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 12678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project S += ")"; 12698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project getResultType().getAsStringInternal(S); 1270cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 12718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid TypedefType::getAsStringInternal(std::string &InnerString) const { 12748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'. 12758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = ' ' + InnerString; 12768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = getDecl()->getIdentifier()->getName() + InnerString; 12778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid TemplateTypeParmType::getAsStringInternal(std::string &InnerString) const { 12808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!InnerString.empty()) // Prefix the basic type, e.g. 'parmname X'. 12818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = ' ' + InnerString; 12828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!Name) 12848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = "type-parameter-" + llvm::utostr_32(Depth) + '-' + 12858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project llvm::utostr_32(Index) + InnerString; 12868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 12878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = Name->getName() + InnerString; 12888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 12898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 12908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstd::string ClassTemplateSpecializationType::PrintTemplateArgumentList( 12918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const TemplateArgument *Args, 12928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project unsigned NumArgs) { 12938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project std::string SpecString; 12948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SpecString += '<'; 12958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (unsigned Arg = 0; Arg < NumArgs; ++Arg) { 1296238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner if (Arg) 1297238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner SpecString += ", "; 1298238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1299238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner // Print the argument into a string. 1300238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner std::string ArgString; 1301238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner switch (Args[Arg].getKind()) { 1302238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner case TemplateArgument::Type: 1303238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner Args[Arg].getAsType().getAsStringInternal(ArgString); 1304238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner break; 1305238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1306238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner case TemplateArgument::Declaration: 1307238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner ArgString = cast<NamedDecl>(Args[Arg].getAsDecl())->getNameAsString(); 1308238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner break; 1309238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1310238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner case TemplateArgument::Integral: 1311238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner ArgString = Args[Arg].getAsIntegral()->toString(10, true); 1312238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner break; 1313238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 1314238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner case TemplateArgument::Expression: { 1315238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner llvm::raw_string_ostream s(ArgString); 1316238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner Args[Arg].getAsExpr()->printPretty(s); 1317238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner break; 1318238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 1319238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner } 1320238b4b0ef1a01afa66ef267dae4a96401ad386dbDavid 'Digit' Turner 13218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project // If this is the first argument and its string representation 1322b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine // begins with the global scope specifier ('::foo'), add a space 1323b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine // to avoid printing the diagraph '<:'. 1324b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (!Arg && !ArgString.empty() && ArgString[0] == ':') 1325b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine SpecString += ' '; 1326b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1327b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine SpecString += ArgString; 1328b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine } 1329b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1330b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine // If the last character of our string is '>', add another space to 1331b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine // keep the two '>''s separate tokens. We don't *have* to do this in 1332b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine // C++0x, but it's still good hygiene. 1333b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine if (SpecString[SpecString.size() - 1] == '>') 1334b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine SpecString += ' '; 1335b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1336b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine SpecString += '>'; 1337b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1338b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine return SpecString; 1339b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine} 1340b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine 1341b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkinevoid 1342b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir ChtchetkineClassTemplateSpecializationType:: 1343b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir ChtchetkinegetAsStringInternal(std::string &InnerString) const { 1344b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine std::string SpecString = Template->getNameAsString(); 1345b2438402d16ee4a0bb4b077d0ad0ef1d82b2a08cVladimir Chtchetkine SpecString += PrintTemplateArgumentList(getArgs(), getNumArgs()); 13467fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine if (InnerString.empty()) 13477fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine InnerString.swap(SpecString); 13487fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine else 13497fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine InnerString = SpecString + ' ' + InnerString; 13507fbf49776a98847a5f95325646f7eb5ff787423fVladimir Chtchetkine} 13518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1352cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid ObjCInterfaceType::getAsStringInternal(std::string &InnerString) const { 13538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'. 1354b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project InnerString = ' ' + InnerString; 1355b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project InnerString = getDecl()->getIdentifier()->getName() + InnerString; 1356cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 1357cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1358cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid ObjCQualifiedInterfaceType::getAsStringInternal( 1359b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project std::string &InnerString) const { 1360cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'. 1361b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project InnerString = ' ' + InnerString; 1362b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project std::string ObjCQIString = getDecl()->getNameAsString(); 1363b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project ObjCQIString += '<'; 1364cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner bool isFirst = true; 1365b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) { 1366cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (isFirst) 1367b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project isFirst = false; 1368b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project else 1369cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += ','; 1370cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += (*I)->getNameAsString(); 1371cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1372cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += '>'; 1373cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner InnerString = ObjCQIString + InnerString; 1374cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 1375cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1376cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid ObjCQualifiedIdType::getAsStringInternal(std::string &InnerString) const { 1377cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'. 1378cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner InnerString = ' ' + InnerString; 1379cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner std::string ObjCQIString = "id"; 1380cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += '<'; 1381cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner int num = getNumProtocols(); 1382def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner for (int i = 0; i < num; i++) { 1383cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += getProtocols(i)->getNameAsString(); 1384cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (i < num-1) 1385cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += ','; 1386cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1387cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ObjCQIString += '>'; 1388cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner InnerString = ObjCQIString + InnerString; 1389cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 1390cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1391cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turnervoid TagType::getAsStringInternal(std::string &InnerString) const { 1392065242de51ba1e18387ce22a99eb091a859990f7David 'Digit' Turner if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'. 1393cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner InnerString = ' ' + InnerString; 1394cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1395cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char *Kind = getDecl()->getKindName(); 1396cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner const char *ID; 1397cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (const IdentifierInfo *II = getDecl()->getIdentifier()) 1398def0e542c9cc004a7b83ff965103c34097c0960bDavid 'Digit' Turner ID = II->getName(); 1399cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner else if (TypedefDecl *Typedef = getDecl()->getTypedefForAnonDecl()) { 1400cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner Kind = 0; 1401cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner assert(Typedef->getIdentifier() && "Typedef without identifier?"); 1402cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ID = Typedef->getIdentifier()->getName(); 1403cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } else 1404cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner ID = "<anonymous>"; 1405cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner 1406cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner // If this is a class template specialization, print the template 1407cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner // arguments. 1408cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner if (ClassTemplateSpecializationDecl *Spec 1409cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner = dyn_cast<ClassTemplateSpecializationDecl>(getDecl())) { 1410cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner std::string TemplateArgs 1411cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner = ClassTemplateSpecializationType::PrintTemplateArgumentList( 1412cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner Spec->getTemplateArgs(), 1413cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner Spec->getNumTemplateArgs()); 1414cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner InnerString = TemplateArgs + InnerString; 1415cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner } 1416b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project 1417b3ee93a038ab992ffdda9f232befdea6ea713b24The Android Open Source Project if (Kind) 14188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = std::string(Kind) + " " + ID + InnerString; 14198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 14208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project InnerString = ID + InnerString; 1421cd059b15f2c7df69f4a087bd66900eb172e41d1cDavid 'Digit' Turner} 14228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project