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