blob: 065b626930bc53ba140f2e165540b15327830633 [file] [log] [blame]
Chris Lattner4b009652007-07-25 00:24:17 +00001//===--- Type.cpp - Type representation and manipulation ------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner959e5be2007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner4b009652007-07-25 00:24:17 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements type-related functionality.
11//
12//===----------------------------------------------------------------------===//
13
Nuno Lopesa7bbf562008-09-01 11:33:04 +000014#include "clang/AST/ASTContext.h"
Chris Lattner4b009652007-07-25 00:24:17 +000015#include "clang/AST/Type.h"
Argiris Kirtzidisea29d1e2008-08-07 20:55:28 +000016#include "clang/AST/DeclCXX.h"
Steve Naroff3fafa102007-10-01 19:00:59 +000017#include "clang/AST/DeclObjC.h"
Douglas Gregor279272e2009-02-04 19:02:06 +000018#include "clang/AST/DeclTemplate.h"
Chris Lattner4b009652007-07-25 00:24:17 +000019#include "clang/AST/Expr.h"
Chris Lattner4b009652007-07-25 00:24:17 +000020#include "llvm/ADT/StringExtras.h"
Ted Kremenekbb7a3d92008-09-18 23:09:54 +000021
Chris Lattner4b009652007-07-25 00:24:17 +000022using namespace clang;
23
Chris Lattner976692a2009-01-12 00:10:42 +000024bool QualType::isConstant(ASTContext &Ctx) const {
Nuno Lopesa7bbf562008-09-01 11:33:04 +000025 if (isConstQualified())
26 return true;
27
28 if (getTypePtr()->isArrayType())
29 return Ctx.getAsArrayType(*this)->getElementType().isConstant(Ctx);
30
31 return false;
32}
33
Ted Kremenekc70e7d02009-01-19 21:31:22 +000034void Type::Destroy(ASTContext& C) {
35 this->~Type();
Steve Naroff5abb0282009-01-27 21:25:57 +000036 C.Deallocate(this);
Ted Kremenekdb4d5972008-05-21 16:38:54 +000037}
38
39void VariableArrayType::Destroy(ASTContext& C) {
40 SizeExpr->Destroy(C);
Ted Kremenekc70e7d02009-01-19 21:31:22 +000041 this->~VariableArrayType();
Steve Naroff5abb0282009-01-27 21:25:57 +000042 C.Deallocate(this);
Ted Kremenekdb4d5972008-05-21 16:38:54 +000043}
Chris Lattner4b009652007-07-25 00:24:17 +000044
Douglas Gregor1b21c7f2008-12-05 23:32:09 +000045void DependentSizedArrayType::Destroy(ASTContext& C) {
46 SizeExpr->Destroy(C);
Ted Kremenekc70e7d02009-01-19 21:31:22 +000047 this->~DependentSizedArrayType();
Steve Naroff5abb0282009-01-27 21:25:57 +000048 C.Deallocate(this);
Douglas Gregor1b21c7f2008-12-05 23:32:09 +000049}
Chris Lattnera1923f62008-08-04 07:31:14 +000050
51/// getArrayElementTypeNoTypeQual - If this is an array type, return the
52/// element type of the array, potentially with type qualifiers missing.
53/// This method should never be used when type qualifiers are meaningful.
54const Type *Type::getArrayElementTypeNoTypeQual() const {
55 // If this is directly an array type, return it.
56 if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
57 return ATy->getElementType().getTypePtr();
58
59 // If the canonical form of this type isn't the right kind, reject it.
60 if (!isa<ArrayType>(CanonicalType)) {
61 // Look through type qualifiers
62 if (ArrayType *AT = dyn_cast<ArrayType>(CanonicalType.getUnqualifiedType()))
63 return AT->getElementType().getTypePtr();
64 return 0;
65 }
66
67 // If this is a typedef for an array type, strip the typedef off without
68 // losing all typedef information.
69 return getDesugaredType()->getArrayElementTypeNoTypeQual();
70}
71
72/// getDesugaredType - Return the specified type with any "sugar" removed from
73/// type type. This takes off typedefs, typeof's etc. If the outer level of
74/// the type is already concrete, it returns it unmodified. This is similar
75/// to getting the canonical type, but it doesn't remove *all* typedefs. For
76/// example, it return "T*" as "T*", (not as "int*"), because the pointer is
77/// concrete.
78QualType Type::getDesugaredType() const {
79 if (const TypedefType *TDT = dyn_cast<TypedefType>(this))
80 return TDT->LookThroughTypedefs();
81 if (const TypeOfExpr *TOE = dyn_cast<TypeOfExpr>(this))
82 return TOE->getUnderlyingExpr()->getType();
83 if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this))
84 return TOT->getUnderlyingType();
Douglas Gregore819caf2009-02-12 00:15:05 +000085 if (const ClassTemplateSpecializationType *Spec
86 = dyn_cast<ClassTemplateSpecializationType>(this))
87 return Spec->getCanonicalTypeInternal();
88
Chris Lattnera1923f62008-08-04 07:31:14 +000089 // FIXME: remove this cast.
90 return QualType(const_cast<Type*>(this), 0);
91}
92
Chris Lattner4b009652007-07-25 00:24:17 +000093/// isVoidType - Helper method to determine if this is the 'void' type.
94bool Type::isVoidType() const {
95 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
96 return BT->getKind() == BuiltinType::Void;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +000097 if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
Chris Lattner976692a2009-01-12 00:10:42 +000098 return AS->getBaseType()->isVoidType();
Chris Lattner4b009652007-07-25 00:24:17 +000099 return false;
100}
101
102bool Type::isObjectType() const {
Sebastian Redl3b7ec4b2009-02-09 18:24:27 +0000103 if (isa<FunctionType>(CanonicalType) || isa<ReferenceType>(CanonicalType))
Chris Lattner4b009652007-07-25 00:24:17 +0000104 return false;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000105 if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
Chris Lattner976692a2009-01-12 00:10:42 +0000106 return AS->getBaseType()->isObjectType();
107 return !CanonicalType->isIncompleteType();
Chris Lattner4b009652007-07-25 00:24:17 +0000108}
109
110bool Type::isDerivedType() const {
111 switch (CanonicalType->getTypeClass()) {
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000112 case ExtQual:
113 return cast<ExtQualType>(CanonicalType)->getBaseType()->isDerivedType();
Chris Lattner4b009652007-07-25 00:24:17 +0000114 case Pointer:
Steve Naroff83c13012007-08-30 01:06:46 +0000115 case VariableArray:
116 case ConstantArray:
Eli Friedman8ff07782008-02-15 18:16:39 +0000117 case IncompleteArray:
Chris Lattner4b009652007-07-25 00:24:17 +0000118 case FunctionProto:
119 case FunctionNoProto:
120 case Reference:
121 return true;
Chris Lattner976692a2009-01-12 00:10:42 +0000122 case Tagged:
123 return !cast<TagType>(CanonicalType)->getDecl()->isEnum();
Chris Lattner4b009652007-07-25 00:24:17 +0000124 default:
125 return false;
126 }
127}
128
Chris Lattner2e78db32008-04-13 18:59:07 +0000129bool Type::isClassType() const {
Chris Lattner25de19e2009-01-11 23:59:49 +0000130 if (const RecordType *RT = getAsRecordType())
131 return RT->getDecl()->isClass();
Chris Lattner2e78db32008-04-13 18:59:07 +0000132 return false;
133}
Chris Lattnere35a1042007-07-31 19:29:30 +0000134bool Type::isStructureType() const {
Chris Lattner25de19e2009-01-11 23:59:49 +0000135 if (const RecordType *RT = getAsRecordType())
136 return RT->getDecl()->isStruct();
Chris Lattnere35a1042007-07-31 19:29:30 +0000137 return false;
138}
139bool Type::isUnionType() const {
Chris Lattner25de19e2009-01-11 23:59:49 +0000140 if (const RecordType *RT = getAsRecordType())
141 return RT->getDecl()->isUnion();
Chris Lattnere35a1042007-07-31 19:29:30 +0000142 return false;
143}
Chris Lattnere35a1042007-07-31 19:29:30 +0000144
Chris Lattner7a85fa12007-08-21 16:54:08 +0000145bool Type::isComplexType() const {
Steve Naroff43001212008-01-15 19:36:10 +0000146 if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
147 return CT->getElementType()->isFloatingType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000148 if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
Chris Lattner976692a2009-01-12 00:10:42 +0000149 return AS->getBaseType()->isComplexType();
Steve Naroff43001212008-01-15 19:36:10 +0000150 return false;
Chris Lattner7a85fa12007-08-21 16:54:08 +0000151}
152
Steve Naroff36e35e62008-01-15 01:41:59 +0000153bool Type::isComplexIntegerType() const {
154 // Check for GCC complex integer extension.
155 if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
156 return CT->getElementType()->isIntegerType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000157 if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
Chris Lattner976692a2009-01-12 00:10:42 +0000158 return AS->getBaseType()->isComplexIntegerType();
Steve Naroff36e35e62008-01-15 01:41:59 +0000159 return false;
160}
161
162const ComplexType *Type::getAsComplexIntegerType() const {
163 // Are we directly a complex type?
164 if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) {
165 if (CTy->getElementType()->isIntegerType())
166 return CTy;
Chris Lattner976692a2009-01-12 00:10:42 +0000167 return 0;
Steve Naroff36e35e62008-01-15 01:41:59 +0000168 }
Chris Lattner976692a2009-01-12 00:10:42 +0000169
Chris Lattner0f29fa12009-01-12 00:21:19 +0000170 // If the canonical form of this type isn't what we want, reject it.
171 if (!isa<ComplexType>(CanonicalType)) {
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000172 // Look through type qualifiers (e.g. ExtQualType's).
Chris Lattner0f29fa12009-01-12 00:21:19 +0000173 if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
174 return CanonicalType.getUnqualifiedType()->getAsComplexIntegerType();
Steve Naroff36e35e62008-01-15 01:41:59 +0000175 return 0;
Chris Lattner0f29fa12009-01-12 00:21:19 +0000176 }
177
Steve Naroff36e35e62008-01-15 01:41:59 +0000178 // If this is a typedef for a complex type, strip the typedef off without
179 // losing all typedef information.
180 return getDesugaredType()->getAsComplexIntegerType();
181}
182
Steve Naroffc33c0602007-08-27 04:08:11 +0000183const BuiltinType *Type::getAsBuiltinType() const {
184 // If this is directly a builtin type, return it.
185 if (const BuiltinType *BTy = dyn_cast<BuiltinType>(this))
186 return BTy;
Chris Lattner2afc72b2007-10-29 03:41:11 +0000187
188 // If the canonical form of this type isn't a builtin type, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000189 if (!isa<BuiltinType>(CanonicalType)) {
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000190 // Look through type qualifiers (e.g. ExtQualType's).
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000191 if (isa<BuiltinType>(CanonicalType.getUnqualifiedType()))
192 return CanonicalType.getUnqualifiedType()->getAsBuiltinType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000193 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000194 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000195
Steve Naroffc33c0602007-08-27 04:08:11 +0000196 // If this is a typedef for a builtin type, strip the typedef off without
197 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000198 return getDesugaredType()->getAsBuiltinType();
Steve Naroffc33c0602007-08-27 04:08:11 +0000199}
200
Chris Lattnere35a1042007-07-31 19:29:30 +0000201const FunctionType *Type::getAsFunctionType() const {
Steve Naroff806b3192007-07-26 18:32:01 +0000202 // If this is directly a function type, return it.
203 if (const FunctionType *FTy = dyn_cast<FunctionType>(this))
204 return FTy;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000205
Chris Lattner2afc72b2007-10-29 03:41:11 +0000206 // If the canonical form of this type isn't the right kind, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000207 if (!isa<FunctionType>(CanonicalType)) {
208 // Look through type qualifiers
209 if (isa<FunctionType>(CanonicalType.getUnqualifiedType()))
210 return CanonicalType.getUnqualifiedType()->getAsFunctionType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000211 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000212 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000213
Steve Naroff806b3192007-07-26 18:32:01 +0000214 // If this is a typedef for a function type, strip the typedef off without
215 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000216 return getDesugaredType()->getAsFunctionType();
Chris Lattner4b009652007-07-25 00:24:17 +0000217}
218
Daniel Dunbar11a31c92009-02-19 07:11:26 +0000219const FunctionTypeNoProto *Type::getAsFunctionTypeNoProto() const {
220 return dyn_cast_or_null<FunctionTypeNoProto>(getAsFunctionType());
221}
222
Chris Lattnerd5a56aa2008-07-26 22:17:49 +0000223const FunctionTypeProto *Type::getAsFunctionTypeProto() const {
224 return dyn_cast_or_null<FunctionTypeProto>(getAsFunctionType());
225}
226
227
Chris Lattnercfac88d2008-04-02 17:35:06 +0000228const PointerLikeType *Type::getAsPointerLikeType() const {
229 // If this is directly a pointer-like type, return it.
230 if (const PointerLikeType *PTy = dyn_cast<PointerLikeType>(this))
231 return PTy;
232
233 // If the canonical form of this type isn't the right kind, reject it.
234 if (!isa<PointerLikeType>(CanonicalType)) {
235 // Look through type qualifiers
236 if (isa<PointerLikeType>(CanonicalType.getUnqualifiedType()))
237 return CanonicalType.getUnqualifiedType()->getAsPointerLikeType();
238 return 0;
239 }
240
241 // If this is a typedef for a pointer type, strip the typedef off without
242 // losing all typedef information.
243 return getDesugaredType()->getAsPointerLikeType();
244}
245
Chris Lattner7931f4a2007-07-31 16:53:04 +0000246const PointerType *Type::getAsPointerType() const {
Chris Lattner4b009652007-07-25 00:24:17 +0000247 // If this is directly a pointer type, return it.
248 if (const PointerType *PTy = dyn_cast<PointerType>(this))
249 return PTy;
250
Chris Lattner2afc72b2007-10-29 03:41:11 +0000251 // If the canonical form of this type isn't the right kind, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000252 if (!isa<PointerType>(CanonicalType)) {
253 // Look through type qualifiers
254 if (isa<PointerType>(CanonicalType.getUnqualifiedType()))
255 return CanonicalType.getUnqualifiedType()->getAsPointerType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000256 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000257 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000258
Chris Lattner4b009652007-07-25 00:24:17 +0000259 // If this is a typedef for a pointer type, strip the typedef off without
260 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000261 return getDesugaredType()->getAsPointerType();
Chris Lattner4b009652007-07-25 00:24:17 +0000262}
263
Steve Naroff7aa54752008-08-27 16:04:49 +0000264const BlockPointerType *Type::getAsBlockPointerType() const {
265 // If this is directly a block pointer type, return it.
266 if (const BlockPointerType *PTy = dyn_cast<BlockPointerType>(this))
267 return PTy;
268
269 // If the canonical form of this type isn't the right kind, reject it.
Chris Lattner0f29fa12009-01-12 00:21:19 +0000270 if (!isa<BlockPointerType>(CanonicalType)) {
271 // Look through type qualifiers
272 if (isa<BlockPointerType>(CanonicalType.getUnqualifiedType()))
273 return CanonicalType.getUnqualifiedType()->getAsBlockPointerType();
Steve Naroff7aa54752008-08-27 16:04:49 +0000274 return 0;
Chris Lattner0f29fa12009-01-12 00:21:19 +0000275 }
Steve Naroff7aa54752008-08-27 16:04:49 +0000276
277 // If this is a typedef for a block pointer type, strip the typedef off
278 // without losing all typedef information.
279 return getDesugaredType()->getAsBlockPointerType();
280}
281
Chris Lattnerf0c4a0a2007-07-31 16:56:34 +0000282const ReferenceType *Type::getAsReferenceType() const {
Chris Lattner4b009652007-07-25 00:24:17 +0000283 // If this is directly a reference type, return it.
284 if (const ReferenceType *RTy = dyn_cast<ReferenceType>(this))
285 return RTy;
286
Chris Lattner2afc72b2007-10-29 03:41:11 +0000287 // If the canonical form of this type isn't the right kind, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000288 if (!isa<ReferenceType>(CanonicalType)) {
289 // Look through type qualifiers
290 if (isa<ReferenceType>(CanonicalType.getUnqualifiedType()))
291 return CanonicalType.getUnqualifiedType()->getAsReferenceType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000292 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000293 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000294
Chris Lattner4b009652007-07-25 00:24:17 +0000295 // If this is a typedef for a reference type, strip the typedef off without
296 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000297 return getDesugaredType()->getAsReferenceType();
Chris Lattner4b009652007-07-25 00:24:17 +0000298}
299
Sebastian Redl75555032009-01-24 21:16:55 +0000300const MemberPointerType *Type::getAsMemberPointerType() const {
301 // If this is directly a member pointer type, return it.
302 if (const MemberPointerType *MTy = dyn_cast<MemberPointerType>(this))
303 return MTy;
304
305 // If the canonical form of this type isn't the right kind, reject it.
306 if (!isa<MemberPointerType>(CanonicalType)) {
307 // Look through type qualifiers
308 if (isa<MemberPointerType>(CanonicalType.getUnqualifiedType()))
309 return CanonicalType.getUnqualifiedType()->getAsMemberPointerType();
310 return 0;
311 }
312
313 // If this is a typedef for a member pointer type, strip the typedef off
314 // without losing all typedef information.
315 return getDesugaredType()->getAsMemberPointerType();
316}
317
Eli Friedman043e42a2008-02-17 00:59:11 +0000318/// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length
319/// array types and types that contain variable array types in their
320/// declarator
Steve Naroff5eb879b2007-08-31 17:20:07 +0000321bool Type::isVariablyModifiedType() const {
Chris Lattnera1923f62008-08-04 07:31:14 +0000322 // A VLA is a variably modified type.
323 if (isVariableArrayType())
Eli Friedman043e42a2008-02-17 00:59:11 +0000324 return true;
325
326 // An array can contain a variably modified type
Chris Lattnera1923f62008-08-04 07:31:14 +0000327 if (const Type *T = getArrayElementTypeNoTypeQual())
328 return T->isVariablyModifiedType();
Eli Friedman043e42a2008-02-17 00:59:11 +0000329
Sebastian Redl75555032009-01-24 21:16:55 +0000330 // A pointer can point to a variably modified type.
331 // Also, C++ references and member pointers can point to a variably modified
332 // type, where VLAs appear as an extension to C++, and should be treated
333 // correctly.
334 if (const PointerLikeType *PT = getAsPointerLikeType())
Eli Friedman043e42a2008-02-17 00:59:11 +0000335 return PT->getPointeeType()->isVariablyModifiedType();
Sebastian Redl18cffee2009-01-24 23:29:36 +0000336 if (const MemberPointerType *PT = getAsMemberPointerType())
337 return PT->getPointeeType()->isVariablyModifiedType();
Eli Friedman043e42a2008-02-17 00:59:11 +0000338
339 // A function can return a variably modified type
340 // This one isn't completely obvious, but it follows from the
341 // definition in C99 6.7.5p3. Because of this rule, it's
342 // illegal to declare a function returning a variably modified type.
Chris Lattner0f29fa12009-01-12 00:21:19 +0000343 if (const FunctionType *FT = getAsFunctionType())
Eli Friedman043e42a2008-02-17 00:59:11 +0000344 return FT->getResultType()->isVariablyModifiedType();
345
Steve Naroff5eb879b2007-08-31 17:20:07 +0000346 return false;
347}
348
Chris Lattnere35a1042007-07-31 19:29:30 +0000349const RecordType *Type::getAsRecordType() const {
Steve Naroff2cb66382007-07-26 03:11:44 +0000350 // If this is directly a reference type, return it.
351 if (const RecordType *RTy = dyn_cast<RecordType>(this))
352 return RTy;
353
Chris Lattner2afc72b2007-10-29 03:41:11 +0000354 // If the canonical form of this type isn't the right kind, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000355 if (!isa<RecordType>(CanonicalType)) {
356 // Look through type qualifiers
357 if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
358 return CanonicalType.getUnqualifiedType()->getAsRecordType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000359 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000360 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000361
362 // If this is a typedef for a record type, strip the typedef off without
Steve Naroff2cb66382007-07-26 03:11:44 +0000363 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000364 return getDesugaredType()->getAsRecordType();
Steve Naroff2cb66382007-07-26 03:11:44 +0000365}
366
Chris Lattnere35a1042007-07-31 19:29:30 +0000367const RecordType *Type::getAsStructureType() const {
Steve Naroff806b3192007-07-26 18:32:01 +0000368 // If this is directly a structure type, return it.
Chris Lattnere35a1042007-07-31 19:29:30 +0000369 if (const RecordType *RT = dyn_cast<RecordType>(this)) {
Argiris Kirtzidisc6cc7d52008-06-09 23:19:58 +0000370 if (RT->getDecl()->isStruct())
Chris Lattnere35a1042007-07-31 19:29:30 +0000371 return RT;
Steve Naroff806b3192007-07-26 18:32:01 +0000372 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000373
374 // If the canonical form of this type isn't the right kind, reject it.
Chris Lattnere35a1042007-07-31 19:29:30 +0000375 if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
Argiris Kirtzidisc6cc7d52008-06-09 23:19:58 +0000376 if (!RT->getDecl()->isStruct())
Chris Lattner2afc72b2007-10-29 03:41:11 +0000377 return 0;
378
379 // If this is a typedef for a structure type, strip the typedef off without
380 // losing all typedef information.
381 return getDesugaredType()->getAsStructureType();
Chris Lattner4b009652007-07-25 00:24:17 +0000382 }
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000383 // Look through type qualifiers
384 if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
385 return CanonicalType.getUnqualifiedType()->getAsStructureType();
Steve Naroff806b3192007-07-26 18:32:01 +0000386 return 0;
Chris Lattner4b009652007-07-25 00:24:17 +0000387}
388
Chris Lattnere35a1042007-07-31 19:29:30 +0000389const RecordType *Type::getAsUnionType() const {
Steve Naroff806b3192007-07-26 18:32:01 +0000390 // If this is directly a union type, return it.
Chris Lattnere35a1042007-07-31 19:29:30 +0000391 if (const RecordType *RT = dyn_cast<RecordType>(this)) {
Argiris Kirtzidisc6cc7d52008-06-09 23:19:58 +0000392 if (RT->getDecl()->isUnion())
Chris Lattnere35a1042007-07-31 19:29:30 +0000393 return RT;
Steve Naroff806b3192007-07-26 18:32:01 +0000394 }
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000395
Chris Lattner2afc72b2007-10-29 03:41:11 +0000396 // If the canonical form of this type isn't the right kind, reject it.
Chris Lattnere35a1042007-07-31 19:29:30 +0000397 if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
Argiris Kirtzidisc6cc7d52008-06-09 23:19:58 +0000398 if (!RT->getDecl()->isUnion())
Chris Lattner2afc72b2007-10-29 03:41:11 +0000399 return 0;
400
401 // If this is a typedef for a union type, strip the typedef off without
402 // losing all typedef information.
403 return getDesugaredType()->getAsUnionType();
Chris Lattner4b009652007-07-25 00:24:17 +0000404 }
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000405
406 // Look through type qualifiers
407 if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
408 return CanonicalType.getUnqualifiedType()->getAsUnionType();
Steve Naroff806b3192007-07-26 18:32:01 +0000409 return 0;
Chris Lattner4b009652007-07-25 00:24:17 +0000410}
411
Eli Friedman0832dbc2008-06-28 06:23:08 +0000412const EnumType *Type::getAsEnumType() const {
413 // Check the canonicalized unqualified type directly; the more complex
414 // version is unnecessary because there isn't any typedef information
415 // to preserve.
416 return dyn_cast<EnumType>(CanonicalType.getUnqualifiedType());
417}
418
Chris Lattner7a85fa12007-08-21 16:54:08 +0000419const ComplexType *Type::getAsComplexType() const {
420 // Are we directly a complex type?
421 if (const ComplexType *CTy = dyn_cast<ComplexType>(this))
422 return CTy;
423
Chris Lattner2afc72b2007-10-29 03:41:11 +0000424 // If the canonical form of this type isn't the right kind, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000425 if (!isa<ComplexType>(CanonicalType)) {
426 // Look through type qualifiers
427 if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
428 return CanonicalType.getUnqualifiedType()->getAsComplexType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000429 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000430 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000431
Chris Lattner7a85fa12007-08-21 16:54:08 +0000432 // If this is a typedef for a complex type, strip the typedef off without
433 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000434 return getDesugaredType()->getAsComplexType();
Chris Lattner4b009652007-07-25 00:24:17 +0000435}
436
Chris Lattnere35a1042007-07-31 19:29:30 +0000437const VectorType *Type::getAsVectorType() const {
Chris Lattner4b009652007-07-25 00:24:17 +0000438 // Are we directly a vector type?
439 if (const VectorType *VTy = dyn_cast<VectorType>(this))
440 return VTy;
441
Chris Lattner2afc72b2007-10-29 03:41:11 +0000442 // If the canonical form of this type isn't the right kind, reject it.
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000443 if (!isa<VectorType>(CanonicalType)) {
444 // Look through type qualifiers
445 if (isa<VectorType>(CanonicalType.getUnqualifiedType()))
446 return CanonicalType.getUnqualifiedType()->getAsVectorType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000447 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000448 }
Chris Lattner2afc72b2007-10-29 03:41:11 +0000449
Chris Lattner4b009652007-07-25 00:24:17 +0000450 // If this is a typedef for a vector type, strip the typedef off without
451 // losing all typedef information.
Chris Lattner2afc72b2007-10-29 03:41:11 +0000452 return getDesugaredType()->getAsVectorType();
Chris Lattner4b009652007-07-25 00:24:17 +0000453}
454
Nate Begemanaf6ed502008-04-18 23:10:10 +0000455const ExtVectorType *Type::getAsExtVectorType() const {
Steve Naroff806b3192007-07-26 18:32:01 +0000456 // Are we directly an OpenCU vector type?
Nate Begemanaf6ed502008-04-18 23:10:10 +0000457 if (const ExtVectorType *VTy = dyn_cast<ExtVectorType>(this))
Steve Naroff806b3192007-07-26 18:32:01 +0000458 return VTy;
459
Chris Lattner2afc72b2007-10-29 03:41:11 +0000460 // If the canonical form of this type isn't the right kind, reject it.
Nate Begemanaf6ed502008-04-18 23:10:10 +0000461 if (!isa<ExtVectorType>(CanonicalType)) {
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000462 // Look through type qualifiers
Nate Begemanaf6ed502008-04-18 23:10:10 +0000463 if (isa<ExtVectorType>(CanonicalType.getUnqualifiedType()))
464 return CanonicalType.getUnqualifiedType()->getAsExtVectorType();
Chris Lattner2afc72b2007-10-29 03:41:11 +0000465 return 0;
Christopher Lamb2a72bb32008-02-04 02:31:56 +0000466 }
Steve Naroff806b3192007-07-26 18:32:01 +0000467
Nate Begemanaf6ed502008-04-18 23:10:10 +0000468 // If this is a typedef for an extended vector type, strip the typedef off
469 // without losing all typedef information.
470 return getDesugaredType()->getAsExtVectorType();
Steve Naroff806b3192007-07-26 18:32:01 +0000471}
472
Chris Lattnerb06cf30b2008-04-07 00:27:04 +0000473const ObjCInterfaceType *Type::getAsObjCInterfaceType() const {
Chris Lattnerfe1f4032008-04-07 05:30:13 +0000474 // There is no sugar for ObjCInterfaceType's, just return the canonical
Chris Lattner0f29fa12009-01-12 00:21:19 +0000475 // type pointer if it is the right class. There is no typedef information to
476 // return and these cannot be Address-space qualified.
Chris Lattnerfe1f4032008-04-07 05:30:13 +0000477 return dyn_cast<ObjCInterfaceType>(CanonicalType);
Chris Lattnerb06cf30b2008-04-07 00:27:04 +0000478}
479
480const ObjCQualifiedInterfaceType *
481Type::getAsObjCQualifiedInterfaceType() const {
Chris Lattner0f29fa12009-01-12 00:21:19 +0000482 // There is no sugar for ObjCQualifiedInterfaceType's, just return the
483 // canonical type pointer if it is the right class.
Chris Lattnerfe1f4032008-04-07 05:30:13 +0000484 return dyn_cast<ObjCQualifiedInterfaceType>(CanonicalType);
485}
486
487const ObjCQualifiedIdType *Type::getAsObjCQualifiedIdType() const {
488 // There is no sugar for ObjCQualifiedIdType's, just return the canonical
489 // type pointer if it is the right class.
490 return dyn_cast<ObjCQualifiedIdType>(CanonicalType);
Chris Lattnerb06cf30b2008-04-07 00:27:04 +0000491}
492
Douglas Gregordd861062008-12-05 18:15:24 +0000493const TemplateTypeParmType *Type::getAsTemplateTypeParmType() const {
494 // There is no sugar for template type parameters, so just return
495 // the canonical type pointer if it is the right class.
Chris Lattner0f29fa12009-01-12 00:21:19 +0000496 // FIXME: can these be address-space qualified?
Douglas Gregordd861062008-12-05 18:15:24 +0000497 return dyn_cast<TemplateTypeParmType>(CanonicalType);
498}
Chris Lattnerb06cf30b2008-04-07 00:27:04 +0000499
Douglas Gregor8e458f42009-02-09 18:46:07 +0000500const ClassTemplateSpecializationType *
501Type::getClassTemplateSpecializationType() const {
502 // There is no sugar for class template specialization types, so
503 // just return the canonical type pointer if it is the right class.
504 return dyn_cast<ClassTemplateSpecializationType>(CanonicalType);
505}
506
507
Chris Lattner4b009652007-07-25 00:24:17 +0000508bool Type::isIntegerType() const {
509 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
510 return BT->getKind() >= BuiltinType::Bool &&
511 BT->getKind() <= BuiltinType::LongLong;
512 if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
Chris Lattnere02e4402008-07-25 23:18:17 +0000513 // Incomplete enum types are not treated as integer types.
Douglas Gregord2baafd2008-10-21 16:13:35 +0000514 // FIXME: In C++, enum types are never integer types.
Chris Lattnere02e4402008-07-25 23:18:17 +0000515 if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
Chris Lattner4b009652007-07-25 00:24:17 +0000516 return true;
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000517 if (isa<FixedWidthIntType>(CanonicalType))
518 return true;
Chris Lattner4b009652007-07-25 00:24:17 +0000519 if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
520 return VT->getElementType()->isIntegerType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000521 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
522 return EXTQT->getBaseType()->isIntegerType();
Chris Lattner4b009652007-07-25 00:24:17 +0000523 return false;
524}
525
Fariborz Jahanianc81f3162007-10-29 22:57:28 +0000526bool Type::isIntegralType() const {
527 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
528 return BT->getKind() >= BuiltinType::Bool &&
529 BT->getKind() <= BuiltinType::LongLong;
530 if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
Chris Lattnere02e4402008-07-25 23:18:17 +0000531 if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
532 return true; // Complete enum types are integral.
Douglas Gregord2baafd2008-10-21 16:13:35 +0000533 // FIXME: In C++, enum types are never integral.
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000534 if (isa<FixedWidthIntType>(CanonicalType))
535 return true;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000536 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
537 return EXTQT->getBaseType()->isIntegralType();
Fariborz Jahanianc81f3162007-10-29 22:57:28 +0000538 return false;
539}
540
Steve Naroff8d3b1702007-08-08 22:15:55 +0000541bool Type::isEnumeralType() const {
542 if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
Argiris Kirtzidisc6cc7d52008-06-09 23:19:58 +0000543 return TT->getDecl()->isEnum();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000544 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
545 return EXTQT->getBaseType()->isEnumeralType();
Steve Naroff8d3b1702007-08-08 22:15:55 +0000546 return false;
547}
548
549bool Type::isBooleanType() const {
550 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
551 return BT->getKind() == BuiltinType::Bool;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000552 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
553 return EXTQT->getBaseType()->isBooleanType();
Steve Naroff8d3b1702007-08-08 22:15:55 +0000554 return false;
555}
556
557bool Type::isCharType() const {
558 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
559 return BT->getKind() == BuiltinType::Char_U ||
560 BT->getKind() == BuiltinType::UChar ||
Anders Carlsson25baae42007-10-29 02:52:18 +0000561 BT->getKind() == BuiltinType::Char_S ||
562 BT->getKind() == BuiltinType::SChar;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000563 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
564 return EXTQT->getBaseType()->isCharType();
Steve Naroff8d3b1702007-08-08 22:15:55 +0000565 return false;
566}
567
Douglas Gregor1815b3b2008-09-12 00:47:35 +0000568bool Type::isWideCharType() const {
569 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
570 return BT->getKind() == BuiltinType::WChar;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000571 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
572 return EXTQT->getBaseType()->isWideCharType();
Douglas Gregor1815b3b2008-09-12 00:47:35 +0000573 return false;
574}
575
Chris Lattnerbbe686b2007-08-29 17:48:46 +0000576/// isSignedIntegerType - Return true if this is an integer type that is
577/// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
578/// an enum decl which has a signed representation, or a vector of signed
579/// integer element type.
Chris Lattner4b009652007-07-25 00:24:17 +0000580bool Type::isSignedIntegerType() const {
581 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
582 return BT->getKind() >= BuiltinType::Char_S &&
583 BT->getKind() <= BuiltinType::LongLong;
584 }
Chris Lattnerbbe686b2007-08-29 17:48:46 +0000585
Chris Lattnerb89a74c2008-04-06 22:29:16 +0000586 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
587 return ET->getDecl()->getIntegerType()->isSignedIntegerType();
Chris Lattnerbbe686b2007-08-29 17:48:46 +0000588
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000589 if (const FixedWidthIntType *FWIT =
590 dyn_cast<FixedWidthIntType>(CanonicalType))
591 return FWIT->isSigned();
592
Chris Lattner4b009652007-07-25 00:24:17 +0000593 if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
594 return VT->getElementType()->isSignedIntegerType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000595 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
596 return EXTQT->getBaseType()->isSignedIntegerType();
Chris Lattner4b009652007-07-25 00:24:17 +0000597 return false;
598}
599
Chris Lattnerbbe686b2007-08-29 17:48:46 +0000600/// isUnsignedIntegerType - Return true if this is an integer type that is
601/// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum
602/// decl which has an unsigned representation, or a vector of unsigned integer
603/// element type.
Chris Lattner4b009652007-07-25 00:24:17 +0000604bool Type::isUnsignedIntegerType() const {
605 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
606 return BT->getKind() >= BuiltinType::Bool &&
607 BT->getKind() <= BuiltinType::ULongLong;
608 }
Chris Lattnerbbe686b2007-08-29 17:48:46 +0000609
Chris Lattnerb89a74c2008-04-06 22:29:16 +0000610 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
611 return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
Chris Lattnerbbe686b2007-08-29 17:48:46 +0000612
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000613 if (const FixedWidthIntType *FWIT =
614 dyn_cast<FixedWidthIntType>(CanonicalType))
615 return !FWIT->isSigned();
616
Chris Lattner4b009652007-07-25 00:24:17 +0000617 if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
618 return VT->getElementType()->isUnsignedIntegerType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000619 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
620 return EXTQT->getBaseType()->isUnsignedIntegerType();
Chris Lattner4b009652007-07-25 00:24:17 +0000621 return false;
622}
623
624bool Type::isFloatingType() const {
625 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
626 return BT->getKind() >= BuiltinType::Float &&
627 BT->getKind() <= BuiltinType::LongDouble;
628 if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
Chris Lattner96614352007-08-30 06:19:11 +0000629 return CT->getElementType()->isFloatingType();
Chris Lattner4b009652007-07-25 00:24:17 +0000630 if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
631 return VT->getElementType()->isFloatingType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000632 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
633 return EXTQT->getBaseType()->isFloatingType();
Chris Lattner4b009652007-07-25 00:24:17 +0000634 return false;
635}
636
637bool Type::isRealFloatingType() const {
638 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
639 return BT->getKind() >= BuiltinType::Float &&
640 BT->getKind() <= BuiltinType::LongDouble;
641 if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
642 return VT->getElementType()->isRealFloatingType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000643 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
644 return EXTQT->getBaseType()->isRealFloatingType();
Chris Lattner4b009652007-07-25 00:24:17 +0000645 return false;
646}
647
648bool Type::isRealType() const {
649 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
650 return BT->getKind() >= BuiltinType::Bool &&
651 BT->getKind() <= BuiltinType::LongDouble;
652 if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
Chris Lattnere02e4402008-07-25 23:18:17 +0000653 return TT->getDecl()->isEnum() && TT->getDecl()->isDefinition();
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000654 if (isa<FixedWidthIntType>(CanonicalType))
655 return true;
Chris Lattner4b009652007-07-25 00:24:17 +0000656 if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
657 return VT->getElementType()->isRealType();
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000658 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
659 return EXTQT->getBaseType()->isRealType();
Chris Lattner4b009652007-07-25 00:24:17 +0000660 return false;
661}
662
663bool Type::isArithmeticType() const {
664 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
Douglas Gregorea5bd342008-10-30 13:47:07 +0000665 return BT->getKind() >= BuiltinType::Bool &&
666 BT->getKind() <= BuiltinType::LongDouble;
Chris Lattnerb89a74c2008-04-06 22:29:16 +0000667 if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
668 // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2).
669 // If a body isn't seen by the time we get here, return false.
670 return ET->getDecl()->isDefinition();
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000671 if (isa<FixedWidthIntType>(CanonicalType))
672 return true;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000673 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
674 return EXTQT->getBaseType()->isArithmeticType();
Chris Lattner4b009652007-07-25 00:24:17 +0000675 return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType);
676}
677
678bool Type::isScalarType() const {
679 if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
680 return BT->getKind() != BuiltinType::Void;
681 if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
Chris Lattnere02e4402008-07-25 23:18:17 +0000682 // Enums are scalar types, but only if they are defined. Incomplete enums
683 // are not treated as scalar types.
684 if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
Chris Lattner4b009652007-07-25 00:24:17 +0000685 return true;
686 return false;
687 }
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000688 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
689 return EXTQT->getBaseType()->isScalarType();
Eli Friedmanff3fcdf2009-02-13 02:31:07 +0000690 if (isa<FixedWidthIntType>(CanonicalType))
691 return true;
Steve Naroff7aa54752008-08-27 16:04:49 +0000692 return isa<PointerType>(CanonicalType) ||
693 isa<BlockPointerType>(CanonicalType) ||
Sebastian Redl75555032009-01-24 21:16:55 +0000694 isa<MemberPointerType>(CanonicalType) ||
Steve Naroff7aa54752008-08-27 16:04:49 +0000695 isa<ComplexType>(CanonicalType) ||
Steve Naroffd305a862009-02-21 21:17:01 +0000696 isa<ObjCQualifiedIdType>(CanonicalType) ||
697 isa<ObjCQualifiedClassType>(CanonicalType);
Chris Lattner4b009652007-07-25 00:24:17 +0000698}
699
Douglas Gregore7ef5002009-01-30 17:31:00 +0000700/// \brief Determines whether the type is a C++ aggregate type or C
701/// aggregate or union type.
702///
703/// An aggregate type is an array or a class type (struct, union, or
704/// class) that has no user-declared constructors, no private or
705/// protected non-static data members, no base classes, and no virtual
706/// functions (C++ [dcl.init.aggr]p1). The notion of an aggregate type
707/// subsumes the notion of C aggregates (C99 6.2.5p21) because it also
708/// includes union types.
Chris Lattner4b009652007-07-25 00:24:17 +0000709bool Type::isAggregateType() const {
Douglas Gregore7ef5002009-01-30 17:31:00 +0000710 if (const CXXRecordType *CXXClassType = dyn_cast<CXXRecordType>(CanonicalType))
711 return CXXClassType->getDecl()->isAggregate();
712 if (isa<RecordType>(CanonicalType))
713 return true;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000714 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
715 return EXTQT->getBaseType()->isAggregateType();
Eli Friedman8ff07782008-02-15 18:16:39 +0000716 return isa<ArrayType>(CanonicalType);
Chris Lattner4b009652007-07-25 00:24:17 +0000717}
718
Chris Lattner0448b4f2007-12-18 07:18:16 +0000719/// isConstantSizeType - Return true if this is not a variable sized type,
720/// according to the rules of C99 6.7.5p3. It is not legal to call this on
Douglas Gregor1b21c7f2008-12-05 23:32:09 +0000721/// incomplete types or dependent types.
Eli Friedman62f67fd2008-02-15 12:20:59 +0000722bool Type::isConstantSizeType() const {
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000723 if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
724 return EXTQT->getBaseType()->isConstantSizeType();
Chris Lattnerd34599a2007-12-18 07:03:30 +0000725 assert(!isIncompleteType() && "This doesn't make sense for incomplete types");
Douglas Gregor1b21c7f2008-12-05 23:32:09 +0000726 assert(!isDependentType() && "This doesn't make sense for dependent types");
Chris Lattner0448b4f2007-12-18 07:18:16 +0000727 // The VAT must have a size, as it is known to be complete.
728 return !isa<VariableArrayType>(CanonicalType);
Chris Lattner4b009652007-07-25 00:24:17 +0000729}
730
731/// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1)
732/// - a type that can describe objects, but which lacks information needed to
733/// determine its size.
734bool Type::isIncompleteType() const {
735 switch (CanonicalType->getTypeClass()) {
736 default: return false;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000737 case ExtQual:
738 return cast<ExtQualType>(CanonicalType)->getBaseType()->isIncompleteType();
Chris Lattner4b009652007-07-25 00:24:17 +0000739 case Builtin:
740 // Void is the only incomplete builtin type. Per C99 6.2.5p19, it can never
741 // be completed.
742 return isVoidType();
743 case Tagged:
744 // A tagged type (struct/union/enum/class) is incomplete if the decl is a
745 // forward declaration, but not a full definition (C99 6.2.5p22).
746 return !cast<TagType>(CanonicalType)->getDecl()->isDefinition();
Eli Friedman8ff07782008-02-15 18:16:39 +0000747 case IncompleteArray:
Chris Lattner4b009652007-07-25 00:24:17 +0000748 // An array of unknown size is an incomplete type (C99 6.2.5p22).
Eli Friedman8ff07782008-02-15 18:16:39 +0000749 return true;
Chris Lattner4b009652007-07-25 00:24:17 +0000750 }
751}
752
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000753/// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10)
754bool Type::isPODType() const {
755 // The compiler shouldn't query this for incomplete types, but the user might.
756 // We return false for that case.
757 if (isIncompleteType())
758 return false;
759
760 switch (CanonicalType->getTypeClass()) {
761 // Everything not explicitly mentioned is not POD.
762 default: return false;
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000763 case ExtQual:
764 return cast<ExtQualType>(CanonicalType)->getBaseType()->isPODType();
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000765 case VariableArray:
766 case ConstantArray:
767 // IncompleteArray is caught by isIncompleteType() above.
768 return cast<ArrayType>(CanonicalType)->getElementType()->isPODType();
769
770 case Builtin:
771 case Complex:
772 case Pointer:
Sebastian Redl75555032009-01-24 21:16:55 +0000773 case MemberPointer:
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000774 case Vector:
775 case ExtVector:
Anders Carlsson25cff832009-02-09 21:53:01 +0000776 case ObjCQualifiedId:
Sebastian Redl39c0f6f2009-01-05 20:52:13 +0000777 return true;
778
779 case Tagged:
780 if (isEnumeralType())
781 return true;
782 if (CXXRecordDecl *RDecl = dyn_cast<CXXRecordDecl>(
783 cast<TagType>(CanonicalType)->getDecl()))
784 return RDecl->isPOD();
785 // C struct/union is POD.
786 return true;
787 }
788}
789
Chris Lattner4b009652007-07-25 00:24:17 +0000790bool Type::isPromotableIntegerType() const {
Chris Lattner0f29fa12009-01-12 00:21:19 +0000791 if (const BuiltinType *BT = getAsBuiltinType())
792 switch (BT->getKind()) {
793 case BuiltinType::Bool:
794 case BuiltinType::Char_S:
795 case BuiltinType::Char_U:
796 case BuiltinType::SChar:
797 case BuiltinType::UChar:
798 case BuiltinType::Short:
799 case BuiltinType::UShort:
800 return true;
801 default:
802 return false;
803 }
804 return false;
Chris Lattner4b009652007-07-25 00:24:17 +0000805}
806
807const char *BuiltinType::getName() const {
808 switch (getKind()) {
809 default: assert(0 && "Unknown builtin type!");
810 case Void: return "void";
811 case Bool: return "_Bool";
812 case Char_S: return "char";
813 case Char_U: return "char";
814 case SChar: return "signed char";
815 case Short: return "short";
816 case Int: return "int";
817 case Long: return "long";
818 case LongLong: return "long long";
819 case UChar: return "unsigned char";
820 case UShort: return "unsigned short";
821 case UInt: return "unsigned int";
822 case ULong: return "unsigned long";
823 case ULongLong: return "unsigned long long";
824 case Float: return "float";
825 case Double: return "double";
826 case LongDouble: return "long double";
Argiris Kirtzidis1f9e2102008-08-09 17:11:33 +0000827 case WChar: return "wchar_t";
Douglas Gregord2baafd2008-10-21 16:13:35 +0000828 case Overload: return "<overloaded function type>";
Douglas Gregor1b21c7f2008-12-05 23:32:09 +0000829 case Dependent: return "<dependent type>";
Chris Lattner4b009652007-07-25 00:24:17 +0000830 }
831}
832
833void FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
834 arg_type_iterator ArgTys,
Argiris Kirtzidis4b269b42008-10-24 21:46:40 +0000835 unsigned NumArgs, bool isVariadic,
836 unsigned TypeQuals) {
Chris Lattner4b009652007-07-25 00:24:17 +0000837 ID.AddPointer(Result.getAsOpaquePtr());
838 for (unsigned i = 0; i != NumArgs; ++i)
839 ID.AddPointer(ArgTys[i].getAsOpaquePtr());
840 ID.AddInteger(isVariadic);
Argiris Kirtzidis4b269b42008-10-24 21:46:40 +0000841 ID.AddInteger(TypeQuals);
Chris Lattner4b009652007-07-25 00:24:17 +0000842}
843
844void FunctionTypeProto::Profile(llvm::FoldingSetNodeID &ID) {
Argiris Kirtzidis4b269b42008-10-24 21:46:40 +0000845 Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic(),
846 getTypeQuals());
Chris Lattner4b009652007-07-25 00:24:17 +0000847}
848
Ted Kremenek42730c52008-01-07 19:49:32 +0000849void ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID,
Chris Lattnerfd5690f2008-04-07 06:37:47 +0000850 const ObjCInterfaceDecl *Decl,
Ted Kremenek42730c52008-01-07 19:49:32 +0000851 ObjCProtocolDecl **protocols,
Fariborz Jahanian91193f62007-10-11 00:55:41 +0000852 unsigned NumProtocols) {
Chris Lattnerfd5690f2008-04-07 06:37:47 +0000853 ID.AddPointer(Decl);
Fariborz Jahanian91193f62007-10-11 00:55:41 +0000854 for (unsigned i = 0; i != NumProtocols; i++)
855 ID.AddPointer(protocols[i]);
856}
857
Ted Kremenek42730c52008-01-07 19:49:32 +0000858void ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID) {
Chris Lattnerfd5690f2008-04-07 06:37:47 +0000859 Profile(ID, getDecl(), &Protocols[0], getNumProtocols());
Fariborz Jahanian91193f62007-10-11 00:55:41 +0000860}
861
Ted Kremenek42730c52008-01-07 19:49:32 +0000862void ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID,
Chris Lattner4a68fe02008-07-26 00:46:50 +0000863 ObjCProtocolDecl **protocols,
864 unsigned NumProtocols) {
Fariborz Jahaniane76e8412007-12-17 21:03:50 +0000865 for (unsigned i = 0; i != NumProtocols; i++)
866 ID.AddPointer(protocols[i]);
867}
868
Ted Kremenek42730c52008-01-07 19:49:32 +0000869void ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID) {
Fariborz Jahaniane76e8412007-12-17 21:03:50 +0000870 Profile(ID, &Protocols[0], getNumProtocols());
871}
872
Steve Naroff262a5dd2009-02-21 20:17:11 +0000873void ObjCQualifiedClassType::Profile(llvm::FoldingSetNodeID &ID,
874 ObjCProtocolDecl **protocols,
875 unsigned NumProtocols) {
876 for (unsigned i = 0; i != NumProtocols; i++)
877 ID.AddPointer(protocols[i]);
878}
879
880void ObjCQualifiedClassType::Profile(llvm::FoldingSetNodeID &ID) {
881 Profile(ID, &Protocols[0], getNumProtocols());
882}
883
Chris Lattner4b009652007-07-25 00:24:17 +0000884/// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
885/// potentially looking through *all* consequtive typedefs. This returns the
886/// sum of the type qualifiers, so if you have:
887/// typedef const int A;
888/// typedef volatile A B;
889/// looking through the typedefs for B will give you "const volatile A".
890///
891QualType TypedefType::LookThroughTypedefs() const {
892 // Usually, there is only a single level of typedefs, be fast in that case.
893 QualType FirstType = getDecl()->getUnderlyingType();
894 if (!isa<TypedefType>(FirstType))
895 return FirstType;
896
897 // Otherwise, do the fully general loop.
898 unsigned TypeQuals = 0;
899 const TypedefType *TDT = this;
900 while (1) {
901 QualType CurType = TDT->getDecl()->getUnderlyingType();
Chris Lattner35fef522008-02-20 20:55:12 +0000902
903
904 /// FIXME:
Fariborz Jahanianb60352a2009-02-17 18:27:45 +0000905 /// FIXME: This is incorrect for ExtQuals!
Chris Lattner35fef522008-02-20 20:55:12 +0000906 /// FIXME:
907 TypeQuals |= CurType.getCVRQualifiers();
Chris Lattner4b009652007-07-25 00:24:17 +0000908
909 TDT = dyn_cast<TypedefType>(CurType);
910 if (TDT == 0)
911 return QualType(CurType.getTypePtr(), TypeQuals);
912 }
913}
914
Douglas Gregor1b21c7f2008-12-05 23:32:09 +0000915TypeOfExpr::TypeOfExpr(Expr *E, QualType can)
916 : Type(TypeOfExp, can, E->isTypeDependent()), TOExpr(E) {
917 assert(!isa<TypedefType>(can) && "Invalid canonical type");
918}
919
Chris Lattnereae0eaa2008-04-06 22:04:54 +0000920bool RecordType::classof(const TagType *TT) {
921 return isa<RecordDecl>(TT->getDecl());
Chris Lattner4b009652007-07-25 00:24:17 +0000922}
923
Argiris Kirtzidisea29d1e2008-08-07 20:55:28 +0000924bool CXXRecordType::classof(const TagType *TT) {
925 return isa<CXXRecordDecl>(TT->getDecl());
926}
927
Chris Lattnereae0eaa2008-04-06 22:04:54 +0000928bool EnumType::classof(const TagType *TT) {
929 return isa<EnumDecl>(TT->getDecl());
Chris Lattner1baaf132008-04-06 21:58:47 +0000930}
931
Douglas Gregor8e458f42009-02-09 18:46:07 +0000932void
933ClassTemplateSpecializationType::
934packBooleanValues(unsigned NumArgs, bool *Values, uintptr_t *Words) {
Douglas Gregore3c19c32009-02-11 04:02:22 +0000935 const unsigned BitsPerWord = sizeof(uintptr_t) * 8;
Douglas Gregor8e458f42009-02-09 18:46:07 +0000936
937 for (unsigned PW = 0, NumPackedWords = getNumPackedWords(NumArgs), Arg = 0;
938 PW != NumPackedWords; ++PW) {
939 uintptr_t Word = 0;
940 for (unsigned Bit = 0; Bit < BitsPerWord && Arg < NumArgs; ++Bit, ++Arg) {
941 Word <<= 1;
942 Word |= Values[Arg];
943 }
944 Words[PW] = Word;
945 }
946}
947
948ClassTemplateSpecializationType::
949ClassTemplateSpecializationType(TemplateDecl *T, unsigned NumArgs,
950 uintptr_t *Args, bool *ArgIsType,
951 QualType Canon)
952 : Type(ClassTemplateSpecialization, Canon, /*FIXME:Dependent=*/false),
953 Template(T), NumArgs(NumArgs)
954{
955 uintptr_t *Data = reinterpret_cast<uintptr_t *>(this + 1);
956
957 // Pack the argument-is-type values into the words just after the
958 // class template specialization type.
959 packBooleanValues(NumArgs, ArgIsType, Data);
960
961 // Copy the template arguments after the packed words.
962 Data += getNumPackedWords(NumArgs);
963 for (unsigned Arg = 0; Arg < NumArgs; ++Arg)
964 Data[Arg] = Args[Arg];
965}
966
Douglas Gregor6f37b582009-02-09 19:34:22 +0000967void ClassTemplateSpecializationType::Destroy(ASTContext& C) {
968 for (unsigned Arg = 0; Arg < NumArgs; ++Arg)
969 if (!isArgType(Arg))
970 getArgAsExpr(Arg)->Destroy(C);
971}
972
Douglas Gregor8e458f42009-02-09 18:46:07 +0000973uintptr_t
974ClassTemplateSpecializationType::getArgAsOpaqueValue(unsigned Arg) const {
975 const uintptr_t *Data = reinterpret_cast<const uintptr_t *>(this + 1);
976 Data += getNumPackedWords(NumArgs);
977 return Data[Arg];
978}
979
980bool ClassTemplateSpecializationType::isArgType(unsigned Arg) const {
Douglas Gregore3c19c32009-02-11 04:02:22 +0000981 const unsigned BitsPerWord = sizeof(uintptr_t) * 8;
Douglas Gregor8e458f42009-02-09 18:46:07 +0000982 const uintptr_t *Data = reinterpret_cast<const uintptr_t *>(this + 1);
983 Data += Arg / BitsPerWord;
Douglas Gregor35d81bb2009-02-09 23:23:08 +0000984 return (*Data >> ((NumArgs - Arg) % BitsPerWord - 1)) & 0x01;
Douglas Gregor8e458f42009-02-09 18:46:07 +0000985}
Anders Carlsson0dd0e372008-12-21 00:16:32 +0000986
Chris Lattner4b009652007-07-25 00:24:17 +0000987//===----------------------------------------------------------------------===//
988// Type Printing
989//===----------------------------------------------------------------------===//
990
991void QualType::dump(const char *msg) const {
Chris Lattnera92a2b62007-12-06 04:20:07 +0000992 std::string R = "identifier";
Chris Lattner4b009652007-07-25 00:24:17 +0000993 getAsStringInternal(R);
994 if (msg)
995 fprintf(stderr, "%s: %s\n", msg, R.c_str());
996 else
997 fprintf(stderr, "%s\n", R.c_str());
998}
Chris Lattnera55e3212008-07-27 00:48:22 +0000999void QualType::dump() const {
1000 dump("");
1001}
1002
1003void Type::dump() const {
1004 std::string S = "identifier";
1005 getAsStringInternal(S);
1006 fprintf(stderr, "%s\n", S.c_str());
1007}
1008
1009
Chris Lattner4b009652007-07-25 00:24:17 +00001010
1011static void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
1012 // Note: funkiness to ensure we get a space only between quals.
1013 bool NonePrinted = true;
1014 if (TypeQuals & QualType::Const)
1015 S += "const", NonePrinted = false;
1016 if (TypeQuals & QualType::Volatile)
1017 S += (NonePrinted+" volatile"), NonePrinted = false;
1018 if (TypeQuals & QualType::Restrict)
1019 S += (NonePrinted+" restrict"), NonePrinted = false;
1020}
1021
1022void QualType::getAsStringInternal(std::string &S) const {
1023 if (isNull()) {
Douglas Gregor62ae25a2008-12-24 00:01:03 +00001024 S += "NULL TYPE";
Chris Lattner4b009652007-07-25 00:24:17 +00001025 return;
1026 }
1027
1028 // Print qualifiers as appropriate.
Gabor Greife85f79b2008-02-21 17:40:55 +00001029 if (unsigned Tq = getCVRQualifiers()) {
Chris Lattner4b009652007-07-25 00:24:17 +00001030 std::string TQS;
Gabor Greife85f79b2008-02-21 17:40:55 +00001031 AppendTypeQualList(TQS, Tq);
Chris Lattner4b009652007-07-25 00:24:17 +00001032 if (!S.empty())
1033 S = TQS + ' ' + S;
1034 else
1035 S = TQS;
1036 }
1037
1038 getTypePtr()->getAsStringInternal(S);
1039}
1040
1041void BuiltinType::getAsStringInternal(std::string &S) const {
1042 if (S.empty()) {
1043 S = getName();
1044 } else {
1045 // Prefix the basic type, e.g. 'int X'.
1046 S = ' ' + S;
1047 S = getName() + S;
1048 }
1049}
1050
Eli Friedmanff3fcdf2009-02-13 02:31:07 +00001051void FixedWidthIntType::getAsStringInternal(std::string &S) const {
1052 // FIXME: Once we get bitwidth attribute, write as
1053 // "int __attribute__((bitwidth(x)))".
1054 std::string prefix = "__clang_fixedwidth";
1055 prefix += llvm::utostr_32(Width);
1056 prefix += (char)(Signed ? 'S' : 'U');
1057 if (S.empty()) {
1058 S = prefix;
1059 } else {
1060 // Prefix the basic type, e.g. 'int X'.
1061 S = prefix + S;
1062 }
1063}
1064
1065
Chris Lattner4b009652007-07-25 00:24:17 +00001066void ComplexType::getAsStringInternal(std::string &S) const {
1067 ElementType->getAsStringInternal(S);
1068 S = "_Complex " + S;
1069}
1070
Fariborz Jahanianb60352a2009-02-17 18:27:45 +00001071void ExtQualType::getAsStringInternal(std::string &S) const {
Chris Lattnerd9b85c32009-02-18 22:58:38 +00001072 bool NeedsSpace = false;
Fariborz Jahanian1e124fe2009-02-17 21:45:36 +00001073 if (AddressSpace) {
Fariborz Jahaniandae66ed2009-02-17 20:16:45 +00001074 S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
Chris Lattnerd9b85c32009-02-18 22:58:38 +00001075 NeedsSpace = true;
Fariborz Jahaniandae66ed2009-02-17 20:16:45 +00001076 }
Fariborz Jahanianaf238092009-02-18 05:09:49 +00001077 if (GCAttrType != QualType::GCNone) {
Chris Lattnerd9b85c32009-02-18 22:58:38 +00001078 if (NeedsSpace)
Fariborz Jahaniandae66ed2009-02-17 20:16:45 +00001079 S += ' ';
1080 S += "__attribute__((objc_gc(";
Fariborz Jahanianaf238092009-02-18 05:09:49 +00001081 if (GCAttrType == QualType::Weak)
Fariborz Jahaniandae66ed2009-02-17 20:16:45 +00001082 S += "weak";
1083 else
1084 S += "strong";
1085 S += ")))";
1086 }
Christopher Lamb2a72bb32008-02-04 02:31:56 +00001087 BaseType->getAsStringInternal(S);
1088}
1089
Chris Lattner4b009652007-07-25 00:24:17 +00001090void PointerType::getAsStringInternal(std::string &S) const {
1091 S = '*' + S;
1092
1093 // Handle things like 'int (*A)[4];' correctly.
1094 // FIXME: this should include vectors, but vectors use attributes I guess.
Chris Lattnercfac88d2008-04-02 17:35:06 +00001095 if (isa<ArrayType>(getPointeeType()))
Chris Lattner4b009652007-07-25 00:24:17 +00001096 S = '(' + S + ')';
1097
Chris Lattnercfac88d2008-04-02 17:35:06 +00001098 getPointeeType().getAsStringInternal(S);
Chris Lattner4b009652007-07-25 00:24:17 +00001099}
1100
Steve Naroff7aa54752008-08-27 16:04:49 +00001101void BlockPointerType::getAsStringInternal(std::string &S) const {
1102 S = '^' + S;
1103 PointeeType.getAsStringInternal(S);
1104}
1105
Chris Lattner4b009652007-07-25 00:24:17 +00001106void ReferenceType::getAsStringInternal(std::string &S) const {
1107 S = '&' + S;
1108
1109 // Handle things like 'int (&A)[4];' correctly.
1110 // FIXME: this should include vectors, but vectors use attributes I guess.
Chris Lattnercfac88d2008-04-02 17:35:06 +00001111 if (isa<ArrayType>(getPointeeType()))
Chris Lattner4b009652007-07-25 00:24:17 +00001112 S = '(' + S + ')';
1113
Chris Lattnercfac88d2008-04-02 17:35:06 +00001114 getPointeeType().getAsStringInternal(S);
Chris Lattner4b009652007-07-25 00:24:17 +00001115}
1116
Sebastian Redl75555032009-01-24 21:16:55 +00001117void MemberPointerType::getAsStringInternal(std::string &S) const {
1118 std::string C;
1119 Class->getAsStringInternal(C);
1120 C += "::*";
1121 S = C + S;
1122
1123 // Handle things like 'int (&A)[4];' correctly.
1124 // FIXME: this should include vectors, but vectors use attributes I guess.
1125 if (isa<ArrayType>(getPointeeType()))
1126 S = '(' + S + ')';
1127
1128 getPointeeType().getAsStringInternal(S);
1129}
1130
Steve Naroff83c13012007-08-30 01:06:46 +00001131void ConstantArrayType::getAsStringInternal(std::string &S) const {
1132 S += '[';
Steve Naroff6dfe7612007-08-30 18:45:57 +00001133 S += llvm::utostr(getSize().getZExtValue());
Steve Naroff83c13012007-08-30 01:06:46 +00001134 S += ']';
1135
1136 getElementType().getAsStringInternal(S);
1137}
1138
Eli Friedman8ff07782008-02-15 18:16:39 +00001139void IncompleteArrayType::getAsStringInternal(std::string &S) const {
1140 S += "[]";
1141
1142 getElementType().getAsStringInternal(S);
1143}
1144
Steve Naroff83c13012007-08-30 01:06:46 +00001145void VariableArrayType::getAsStringInternal(std::string &S) const {
Chris Lattner4b009652007-07-25 00:24:17 +00001146 S += '[';
1147
Steve Naroff24c9b982007-08-30 18:10:14 +00001148 if (getIndexTypeQualifier()) {
1149 AppendTypeQualList(S, getIndexTypeQualifier());
Chris Lattner4b009652007-07-25 00:24:17 +00001150 S += ' ';
1151 }
1152
Steve Naroff24c9b982007-08-30 18:10:14 +00001153 if (getSizeModifier() == Static)
Chris Lattner4b009652007-07-25 00:24:17 +00001154 S += "static";
Steve Naroff24c9b982007-08-30 18:10:14 +00001155 else if (getSizeModifier() == Star)
Chris Lattner4b009652007-07-25 00:24:17 +00001156 S += '*';
1157
Steve Naroff83c13012007-08-30 01:06:46 +00001158 if (getSizeExpr()) {
Ted Kremenek7b6f67b2008-09-13 05:16:45 +00001159 std::string SStr;
1160 llvm::raw_string_ostream s(SStr);
Steve Naroff83c13012007-08-30 01:06:46 +00001161 getSizeExpr()->printPretty(s);
1162 S += s.str();
1163 }
Chris Lattner4b009652007-07-25 00:24:17 +00001164 S += ']';
1165
Steve Naroff83c13012007-08-30 01:06:46 +00001166 getElementType().getAsStringInternal(S);
Chris Lattner4b009652007-07-25 00:24:17 +00001167}
1168
Douglas Gregor1b21c7f2008-12-05 23:32:09 +00001169void DependentSizedArrayType::getAsStringInternal(std::string &S) const {
1170 S += '[';
1171
1172 if (getIndexTypeQualifier()) {
1173 AppendTypeQualList(S, getIndexTypeQualifier());
1174 S += ' ';
1175 }
1176
1177 if (getSizeModifier() == Static)
1178 S += "static";
1179 else if (getSizeModifier() == Star)
1180 S += '*';
1181
1182 if (getSizeExpr()) {
1183 std::string SStr;
1184 llvm::raw_string_ostream s(SStr);
1185 getSizeExpr()->printPretty(s);
1186 S += s.str();
1187 }
1188 S += ']';
1189
1190 getElementType().getAsStringInternal(S);
1191}
1192
Chris Lattner4b009652007-07-25 00:24:17 +00001193void VectorType::getAsStringInternal(std::string &S) const {
Daniel Dunbarce4a6792008-10-05 05:43:11 +00001194 // FIXME: We prefer to print the size directly here, but have no way
1195 // to get the size of the type.
Chris Lattnerc4856a62007-11-27 07:28:18 +00001196 S += " __attribute__((__vector_size__(";
Daniel Dunbarce4a6792008-10-05 05:43:11 +00001197 S += llvm::utostr_32(NumElements); // convert back to bytes.
1198 S += " * sizeof(" + ElementType.getAsString() + "))))";
Chris Lattner07e928e2009-02-19 23:42:29 +00001199 ElementType.getAsStringInternal(S);
Chris Lattner4b009652007-07-25 00:24:17 +00001200}
1201
Nate Begemanaf6ed502008-04-18 23:10:10 +00001202void ExtVectorType::getAsStringInternal(std::string &S) const {
1203 S += " __attribute__((ext_vector_type(";
Steve Naroffc11705f2007-07-28 23:10:27 +00001204 S += llvm::utostr_32(NumElements);
1205 S += ")))";
1206 ElementType.getAsStringInternal(S);
1207}
1208
Steve Naroff7cbb1462007-07-31 12:34:36 +00001209void TypeOfExpr::getAsStringInternal(std::string &InnerString) const {
Steve Naroff5b528922007-08-01 23:45:51 +00001210 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typeof(e) X'.
1211 InnerString = ' ' + InnerString;
Ted Kremenek7b6f67b2008-09-13 05:16:45 +00001212 std::string Str;
1213 llvm::raw_string_ostream s(Str);
Chris Lattner95578782007-08-08 22:51:59 +00001214 getUnderlyingExpr()->printPretty(s);
Steve Naroff6e8227b2007-08-05 03:24:45 +00001215 InnerString = "typeof(" + s.str() + ")" + InnerString;
Steve Naroff7cbb1462007-07-31 12:34:36 +00001216}
1217
Steve Naroff5b528922007-08-01 23:45:51 +00001218void TypeOfType::getAsStringInternal(std::string &InnerString) const {
1219 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typeof(t) X'.
1220 InnerString = ' ' + InnerString;
Steve Naroff7cbb1462007-07-31 12:34:36 +00001221 std::string Tmp;
1222 getUnderlyingType().getAsStringInternal(Tmp);
Steve Naroff5b528922007-08-01 23:45:51 +00001223 InnerString = "typeof(" + Tmp + ")" + InnerString;
Steve Naroff7cbb1462007-07-31 12:34:36 +00001224}
1225
Chris Lattner4b009652007-07-25 00:24:17 +00001226void FunctionTypeNoProto::getAsStringInternal(std::string &S) const {
1227 // If needed for precedence reasons, wrap the inner part in grouping parens.
1228 if (!S.empty())
1229 S = "(" + S + ")";
1230
1231 S += "()";
1232 getResultType().getAsStringInternal(S);
1233}
1234
1235void FunctionTypeProto::getAsStringInternal(std::string &S) const {
1236 // If needed for precedence reasons, wrap the inner part in grouping parens.
1237 if (!S.empty())
1238 S = "(" + S + ")";
1239
1240 S += "(";
1241 std::string Tmp;
1242 for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
1243 if (i) S += ", ";
1244 getArgType(i).getAsStringInternal(Tmp);
1245 S += Tmp;
1246 Tmp.clear();
1247 }
1248
1249 if (isVariadic()) {
1250 if (getNumArgs())
1251 S += ", ";
1252 S += "...";
1253 } else if (getNumArgs() == 0) {
1254 // Do not emit int() if we have a proto, emit 'int(void)'.
1255 S += "void";
1256 }
1257
1258 S += ")";
1259 getResultType().getAsStringInternal(S);
1260}
1261
1262
1263void TypedefType::getAsStringInternal(std::string &InnerString) const {
1264 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1265 InnerString = ' ' + InnerString;
1266 InnerString = getDecl()->getIdentifier()->getName() + InnerString;
1267}
1268
Douglas Gregordd861062008-12-05 18:15:24 +00001269void TemplateTypeParmType::getAsStringInternal(std::string &InnerString) const {
1270 if (!InnerString.empty()) // Prefix the basic type, e.g. 'parmname X'.
1271 InnerString = ' ' + InnerString;
Douglas Gregora4918772009-02-05 23:33:38 +00001272
1273 if (!Name)
1274 InnerString = "type-parameter-" + llvm::utostr_32(Depth) + '-' +
1275 llvm::utostr_32(Index) + InnerString;
1276 else
1277 InnerString = Name->getName() + InnerString;
Douglas Gregordd861062008-12-05 18:15:24 +00001278}
1279
Douglas Gregor8e458f42009-02-09 18:46:07 +00001280void
1281ClassTemplateSpecializationType::
1282getAsStringInternal(std::string &InnerString) const {
1283 std::string SpecString = Template->getNameAsString();
1284 SpecString += '<';
1285 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1286 if (Arg)
1287 SpecString += ", ";
1288
1289 // Print the argument into a string.
1290 std::string ArgString;
1291 if (isArgType(Arg))
1292 getArgAsType(Arg).getAsStringInternal(ArgString);
1293 else {
1294 llvm::raw_string_ostream s(ArgString);
1295 getArgAsExpr(Arg)->printPretty(s);
1296 }
1297
1298 // If this is the first argument and its string representation
1299 // begins with the global scope specifier ('::foo'), add a space
1300 // to avoid printing the diagraph '<:'.
1301 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1302 SpecString += ' ';
1303
1304 SpecString += ArgString;
1305 }
1306
1307 // If the last character of our string is '>', add another space to
1308 // keep the two '>''s separate tokens. We don't *have* to do this in
1309 // C++0x, but it's still good hygiene.
1310 if (SpecString[SpecString.size() - 1] == '>')
1311 SpecString += ' ';
1312
1313 SpecString += '>';
1314
1315 if (InnerString.empty())
1316 InnerString.swap(SpecString);
1317 else
1318 InnerString = SpecString + ' ' + InnerString;
1319}
1320
Ted Kremenek42730c52008-01-07 19:49:32 +00001321void ObjCInterfaceType::getAsStringInternal(std::string &InnerString) const {
Steve Naroff81f1bba2007-09-06 21:24:23 +00001322 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1323 InnerString = ' ' + InnerString;
1324 InnerString = getDecl()->getIdentifier()->getName() + InnerString;
1325}
1326
Ted Kremenek42730c52008-01-07 19:49:32 +00001327void ObjCQualifiedInterfaceType::getAsStringInternal(
Fariborz Jahanian91193f62007-10-11 00:55:41 +00001328 std::string &InnerString) const {
Fariborz Jahanian84a34f52007-10-11 18:08:47 +00001329 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1330 InnerString = ' ' + InnerString;
Chris Lattner6c5ec622008-11-24 04:00:27 +00001331 std::string ObjCQIString = getDecl()->getNameAsString();
Ted Kremenek42730c52008-01-07 19:49:32 +00001332 ObjCQIString += '<';
Chris Lattnera006ffc2008-07-21 05:19:23 +00001333 bool isFirst = true;
1334 for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) {
1335 if (isFirst)
1336 isFirst = false;
1337 else
Ted Kremenek42730c52008-01-07 19:49:32 +00001338 ObjCQIString += ',';
Chris Lattner6c5ec622008-11-24 04:00:27 +00001339 ObjCQIString += (*I)->getNameAsString();
Fariborz Jahanian91193f62007-10-11 00:55:41 +00001340 }
Ted Kremenek42730c52008-01-07 19:49:32 +00001341 ObjCQIString += '>';
1342 InnerString = ObjCQIString + InnerString;
Fariborz Jahanian91193f62007-10-11 00:55:41 +00001343}
1344
Chris Lattner4b639c02008-07-25 23:07:18 +00001345void ObjCQualifiedIdType::getAsStringInternal(std::string &InnerString) const {
Fariborz Jahaniane76e8412007-12-17 21:03:50 +00001346 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1347 InnerString = ' ' + InnerString;
Ted Kremenek42730c52008-01-07 19:49:32 +00001348 std::string ObjCQIString = "id";
1349 ObjCQIString += '<';
Fariborz Jahaniane76e8412007-12-17 21:03:50 +00001350 int num = getNumProtocols();
1351 for (int i = 0; i < num; i++) {
Chris Lattner6c5ec622008-11-24 04:00:27 +00001352 ObjCQIString += getProtocols(i)->getNameAsString();
Fariborz Jahaniane76e8412007-12-17 21:03:50 +00001353 if (i < num-1)
Ted Kremenek42730c52008-01-07 19:49:32 +00001354 ObjCQIString += ',';
Fariborz Jahaniane76e8412007-12-17 21:03:50 +00001355 }
Ted Kremenek42730c52008-01-07 19:49:32 +00001356 ObjCQIString += '>';
1357 InnerString = ObjCQIString + InnerString;
Fariborz Jahaniane76e8412007-12-17 21:03:50 +00001358}
1359
Steve Naroff262a5dd2009-02-21 20:17:11 +00001360void ObjCQualifiedClassType::getAsStringInternal(std::string &InnerString) const
1361{
1362 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1363 InnerString = ' ' + InnerString;
1364 std::string ObjCQIString = "Class";
1365 ObjCQIString += '<';
1366 int num = getNumProtocols();
1367 for (int i = 0; i < num; i++) {
1368 ObjCQIString += getProtocols(i)->getNameAsString();
1369 if (i < num-1)
1370 ObjCQIString += ',';
1371 }
1372 ObjCQIString += '>';
1373 InnerString = ObjCQIString + InnerString;
1374}
1375
Chris Lattner4b009652007-07-25 00:24:17 +00001376void TagType::getAsStringInternal(std::string &InnerString) const {
1377 if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1378 InnerString = ' ' + InnerString;
1379
1380 const char *Kind = getDecl()->getKindName();
1381 const char *ID;
1382 if (const IdentifierInfo *II = getDecl()->getIdentifier())
1383 ID = II->getName();
1384 else
1385 ID = "<anonymous>";
1386
1387 InnerString = std::string(Kind) + " " + ID + InnerString;
1388}