xref: /llvm-project-15.0.7/clang/lib/AST/Type.cpp (revision bbabd39c)
1 //===--- Type.cpp - Type representation and manipulation ------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file implements type-related functionality.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Type.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/DeclTemplate.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/PrettyPrinter.h"
21 #include "llvm/ADT/StringExtras.h"
22 #include "llvm/Support/raw_ostream.h"
23 using namespace clang;
24 
25 bool QualType::isConstant(ASTContext &Ctx) const {
26   if (isConstQualified())
27     return true;
28 
29   if (getTypePtr()->isArrayType())
30     return Ctx.getAsArrayType(*this)->getElementType().isConstant(Ctx);
31 
32   return false;
33 }
34 
35 void Type::Destroy(ASTContext& C) {
36   this->~Type();
37   C.Deallocate(this);
38 }
39 
40 void ConstantArrayWithExprType::Destroy(ASTContext& C) {
41   // FIXME: destruction of SizeExpr commented out due to resource contention.
42   // SizeExpr->Destroy(C);
43   // See FIXME in SemaDecl.cpp:1536: if we were able to either steal
44   // or clone the SizeExpr there, then here we could freely delete it.
45   // Since we do not know how to steal or clone, we keep a pointer to
46   // a shared resource, but we cannot free it.
47   // (There probably is a trivial solution ... for people knowing clang!).
48   this->~ConstantArrayWithExprType();
49   C.Deallocate(this);
50 }
51 
52 void VariableArrayType::Destroy(ASTContext& C) {
53   if (SizeExpr)
54     SizeExpr->Destroy(C);
55   this->~VariableArrayType();
56   C.Deallocate(this);
57 }
58 
59 void DependentSizedArrayType::Destroy(ASTContext& C) {
60   // FIXME: Resource contention like in ConstantArrayWithExprType ?
61   // May crash, depending on platform or a particular build.
62   // SizeExpr->Destroy(C);
63   this->~DependentSizedArrayType();
64   C.Deallocate(this);
65 }
66 
67 void DependentSizedArrayType::Profile(llvm::FoldingSetNodeID &ID,
68                                       ASTContext &Context,
69                                       QualType ET,
70                                       ArraySizeModifier SizeMod,
71                                       unsigned TypeQuals,
72                                       Expr *E) {
73   ID.AddPointer(ET.getAsOpaquePtr());
74   ID.AddInteger(SizeMod);
75   ID.AddInteger(TypeQuals);
76   E->Profile(ID, Context, true);
77 }
78 
79 void
80 DependentSizedExtVectorType::Profile(llvm::FoldingSetNodeID &ID,
81                                      ASTContext &Context,
82                                      QualType ElementType, Expr *SizeExpr) {
83   ID.AddPointer(ElementType.getAsOpaquePtr());
84   SizeExpr->Profile(ID, Context, true);
85 }
86 
87 void DependentSizedExtVectorType::Destroy(ASTContext& C) {
88   // FIXME: Deallocate size expression, once we're cloning properly.
89 //  if (SizeExpr)
90 //    SizeExpr->Destroy(C);
91   this->~DependentSizedExtVectorType();
92   C.Deallocate(this);
93 }
94 
95 /// getArrayElementTypeNoTypeQual - If this is an array type, return the
96 /// element type of the array, potentially with type qualifiers missing.
97 /// This method should never be used when type qualifiers are meaningful.
98 const Type *Type::getArrayElementTypeNoTypeQual() const {
99   // If this is directly an array type, return it.
100   if (const ArrayType *ATy = dyn_cast<ArrayType>(this))
101     return ATy->getElementType().getTypePtr();
102 
103   // If the canonical form of this type isn't the right kind, reject it.
104   if (!isa<ArrayType>(CanonicalType)) {
105     // Look through type qualifiers
106     if (ArrayType *AT = dyn_cast<ArrayType>(CanonicalType.getUnqualifiedType()))
107       return AT->getElementType().getTypePtr();
108     return 0;
109   }
110 
111   // If this is a typedef for an array type, strip the typedef off without
112   // losing all typedef information.
113   return cast<ArrayType>(getDesugaredType())->getElementType().getTypePtr();
114 }
115 
116 /// getDesugaredType - Return the specified type with any "sugar" removed from
117 /// the type.  This takes off typedefs, typeof's etc.  If the outer level of
118 /// the type is already concrete, it returns it unmodified.  This is similar
119 /// to getting the canonical type, but it doesn't remove *all* typedefs.  For
120 /// example, it returns "T*" as "T*", (not as "int*"), because the pointer is
121 /// concrete.
122 ///
123 /// \param ForDisplay When true, the desugaring is provided for
124 /// display purposes only. In this case, we apply more heuristics to
125 /// decide whether it is worth providing a desugared form of the type
126 /// or not.
127 QualType QualType::getDesugaredType(bool ForDisplay) const {
128   return getTypePtr()->getDesugaredType(ForDisplay)
129      .getWithAdditionalQualifiers(getCVRQualifiers());
130 }
131 
132 /// getDesugaredType - Return the specified type with any "sugar" removed from
133 /// type type.  This takes off typedefs, typeof's etc.  If the outer level of
134 /// the type is already concrete, it returns it unmodified.  This is similar
135 /// to getting the canonical type, but it doesn't remove *all* typedefs.  For
136 /// example, it return "T*" as "T*", (not as "int*"), because the pointer is
137 /// concrete.
138 ///
139 /// \param ForDisplay When true, the desugaring is provided for
140 /// display purposes only. In this case, we apply more heuristics to
141 /// decide whether it is worth providing a desugared form of the type
142 /// or not.
143 QualType Type::getDesugaredType(bool ForDisplay) const {
144   if (const TypedefType *TDT = dyn_cast<TypedefType>(this))
145     return TDT->LookThroughTypedefs().getDesugaredType();
146   if (const TypeOfExprType *TOE = dyn_cast<TypeOfExprType>(this))
147     return TOE->getUnderlyingExpr()->getType().getDesugaredType();
148   if (const TypeOfType *TOT = dyn_cast<TypeOfType>(this))
149     return TOT->getUnderlyingType().getDesugaredType();
150   if (const DecltypeType *DTT = dyn_cast<DecltypeType>(this)) {
151     if (!DTT->getUnderlyingType()->isDependentType())
152       return DTT->getUnderlyingType().getDesugaredType();
153   }
154   if (const TemplateSpecializationType *Spec
155         = dyn_cast<TemplateSpecializationType>(this)) {
156     if (ForDisplay)
157       return QualType(this, 0);
158 
159     QualType Canon = Spec->getCanonicalTypeInternal();
160     if (Canon->getAsTemplateSpecializationType())
161       return QualType(this, 0);
162     return Canon->getDesugaredType();
163   }
164   if (const QualifiedNameType *QualName  = dyn_cast<QualifiedNameType>(this)) {
165     if (ForDisplay) {
166       // If desugaring the type that the qualified name is referring to
167       // produces something interesting, that's our desugared type.
168       QualType NamedType = QualName->getNamedType().getDesugaredType();
169       if (NamedType != QualName->getNamedType())
170         return NamedType;
171     } else
172       return QualName->getNamedType().getDesugaredType();
173   }
174 
175   return QualType(this, 0);
176 }
177 
178 /// isVoidType - Helper method to determine if this is the 'void' type.
179 bool Type::isVoidType() const {
180   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
181     return BT->getKind() == BuiltinType::Void;
182   if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
183     return AS->getBaseType()->isVoidType();
184   return false;
185 }
186 
187 bool Type::isObjectType() const {
188   if (isa<FunctionType>(CanonicalType) || isa<ReferenceType>(CanonicalType) ||
189       isa<IncompleteArrayType>(CanonicalType) || isVoidType())
190     return false;
191   if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
192     return AS->getBaseType()->isObjectType();
193   return true;
194 }
195 
196 bool Type::isDerivedType() const {
197   switch (CanonicalType->getTypeClass()) {
198   case ExtQual:
199     return cast<ExtQualType>(CanonicalType)->getBaseType()->isDerivedType();
200   case Pointer:
201   case VariableArray:
202   case ConstantArray:
203   case ConstantArrayWithExpr:
204   case ConstantArrayWithoutExpr:
205   case IncompleteArray:
206   case FunctionProto:
207   case FunctionNoProto:
208   case LValueReference:
209   case RValueReference:
210   case Record:
211     return true;
212   default:
213     return false;
214   }
215 }
216 
217 bool Type::isClassType() const {
218   if (const RecordType *RT = getAs<RecordType>())
219     return RT->getDecl()->isClass();
220   return false;
221 }
222 bool Type::isStructureType() const {
223   if (const RecordType *RT = getAs<RecordType>())
224     return RT->getDecl()->isStruct();
225   return false;
226 }
227 bool Type::isVoidPointerType() const {
228   if (const PointerType *PT = getAs<PointerType>())
229     return PT->getPointeeType()->isVoidType();
230   return false;
231 }
232 
233 bool Type::isUnionType() const {
234   if (const RecordType *RT = getAs<RecordType>())
235     return RT->getDecl()->isUnion();
236   return false;
237 }
238 
239 bool Type::isComplexType() const {
240   if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
241     return CT->getElementType()->isFloatingType();
242   if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
243     return AS->getBaseType()->isComplexType();
244   return false;
245 }
246 
247 bool Type::isComplexIntegerType() const {
248   // Check for GCC complex integer extension.
249   if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
250     return CT->getElementType()->isIntegerType();
251   if (const ExtQualType *AS = dyn_cast<ExtQualType>(CanonicalType))
252     return AS->getBaseType()->isComplexIntegerType();
253   return false;
254 }
255 
256 const ComplexType *Type::getAsComplexIntegerType() const {
257   // Are we directly a complex type?
258   if (const ComplexType *CTy = dyn_cast<ComplexType>(this)) {
259     if (CTy->getElementType()->isIntegerType())
260       return CTy;
261     return 0;
262   }
263 
264   // If the canonical form of this type isn't what we want, reject it.
265   if (!isa<ComplexType>(CanonicalType)) {
266     // Look through type qualifiers (e.g. ExtQualType's).
267     if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
268       return CanonicalType.getUnqualifiedType()->getAsComplexIntegerType();
269     return 0;
270   }
271 
272   // If this is a typedef for a complex type, strip the typedef off without
273   // losing all typedef information.
274   return cast<ComplexType>(getDesugaredType());
275 }
276 
277 const BuiltinType *Type::getAsBuiltinType() const {
278   // If this is directly a builtin type, return it.
279   if (const BuiltinType *BTy = dyn_cast<BuiltinType>(this))
280     return BTy;
281 
282   // If the canonical form of this type isn't a builtin type, reject it.
283   if (!isa<BuiltinType>(CanonicalType)) {
284     // Look through type qualifiers (e.g. ExtQualType's).
285     if (isa<BuiltinType>(CanonicalType.getUnqualifiedType()))
286       return CanonicalType.getUnqualifiedType()->getAsBuiltinType();
287     return 0;
288   }
289 
290   // If this is a typedef for a builtin type, strip the typedef off without
291   // losing all typedef information.
292   return cast<BuiltinType>(getDesugaredType());
293 }
294 
295 const FunctionType *Type::getAsFunctionType() const {
296   // If this is directly a function type, return it.
297   if (const FunctionType *FTy = dyn_cast<FunctionType>(this))
298     return FTy;
299 
300   // If the canonical form of this type isn't the right kind, reject it.
301   if (!isa<FunctionType>(CanonicalType)) {
302     // Look through type qualifiers
303     if (isa<FunctionType>(CanonicalType.getUnqualifiedType()))
304       return CanonicalType.getUnqualifiedType()->getAsFunctionType();
305     return 0;
306   }
307 
308   // If this is a typedef for a function type, strip the typedef off without
309   // losing all typedef information.
310   return cast<FunctionType>(getDesugaredType());
311 }
312 
313 const FunctionNoProtoType *Type::getAsFunctionNoProtoType() const {
314   return dyn_cast_or_null<FunctionNoProtoType>(getAsFunctionType());
315 }
316 
317 const FunctionProtoType *Type::getAsFunctionProtoType() const {
318   return dyn_cast_or_null<FunctionProtoType>(getAsFunctionType());
319 }
320 
321 QualType Type::getPointeeType() const {
322   if (const PointerType *PT = getAs<PointerType>())
323     return PT->getPointeeType();
324   if (const ObjCObjectPointerType *OPT = getAsObjCObjectPointerType())
325     return OPT->getPointeeType();
326   if (const BlockPointerType *BPT = getAs<BlockPointerType>())
327     return BPT->getPointeeType();
328   return QualType();
329 }
330 
331 /// isVariablyModifiedType (C99 6.7.5p3) - Return true for variable length
332 /// array types and types that contain variable array types in their
333 /// declarator
334 bool Type::isVariablyModifiedType() const {
335   // A VLA is a variably modified type.
336   if (isVariableArrayType())
337     return true;
338 
339   // An array can contain a variably modified type
340   if (const Type *T = getArrayElementTypeNoTypeQual())
341     return T->isVariablyModifiedType();
342 
343   // A pointer can point to a variably modified type.
344   // Also, C++ references and member pointers can point to a variably modified
345   // type, where VLAs appear as an extension to C++, and should be treated
346   // correctly.
347   if (const PointerType *PT = getAs<PointerType>())
348     return PT->getPointeeType()->isVariablyModifiedType();
349   if (const ReferenceType *RT = getAs<ReferenceType>())
350     return RT->getPointeeType()->isVariablyModifiedType();
351   if (const MemberPointerType *PT = getAs<MemberPointerType>())
352     return PT->getPointeeType()->isVariablyModifiedType();
353 
354   // A function can return a variably modified type
355   // This one isn't completely obvious, but it follows from the
356   // definition in C99 6.7.5p3. Because of this rule, it's
357   // illegal to declare a function returning a variably modified type.
358   if (const FunctionType *FT = getAsFunctionType())
359     return FT->getResultType()->isVariablyModifiedType();
360 
361   return false;
362 }
363 
364 const RecordType *Type::getAsStructureType() const {
365   // If this is directly a structure type, return it.
366   if (const RecordType *RT = dyn_cast<RecordType>(this)) {
367     if (RT->getDecl()->isStruct())
368       return RT;
369   }
370 
371   // If the canonical form of this type isn't the right kind, reject it.
372   if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
373     if (!RT->getDecl()->isStruct())
374       return 0;
375 
376     // If this is a typedef for a structure type, strip the typedef off without
377     // losing all typedef information.
378     return cast<RecordType>(getDesugaredType());
379   }
380   // Look through type qualifiers
381   if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
382     return CanonicalType.getUnqualifiedType()->getAsStructureType();
383   return 0;
384 }
385 
386 const RecordType *Type::getAsUnionType() const {
387   // If this is directly a union type, return it.
388   if (const RecordType *RT = dyn_cast<RecordType>(this)) {
389     if (RT->getDecl()->isUnion())
390       return RT;
391   }
392 
393   // If the canonical form of this type isn't the right kind, reject it.
394   if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) {
395     if (!RT->getDecl()->isUnion())
396       return 0;
397 
398     // If this is a typedef for a union type, strip the typedef off without
399     // losing all typedef information.
400     return cast<RecordType>(getDesugaredType());
401   }
402 
403   // Look through type qualifiers
404   if (isa<RecordType>(CanonicalType.getUnqualifiedType()))
405     return CanonicalType.getUnqualifiedType()->getAsUnionType();
406   return 0;
407 }
408 
409 const EnumType *Type::getAsEnumType() const {
410   // Check the canonicalized unqualified type directly; the more complex
411   // version is unnecessary because there isn't any typedef information
412   // to preserve.
413   return dyn_cast<EnumType>(CanonicalType.getUnqualifiedType());
414 }
415 
416 const ComplexType *Type::getAsComplexType() const {
417   // Are we directly a complex type?
418   if (const ComplexType *CTy = dyn_cast<ComplexType>(this))
419     return CTy;
420 
421   // If the canonical form of this type isn't the right kind, reject it.
422   if (!isa<ComplexType>(CanonicalType)) {
423     // Look through type qualifiers
424     if (isa<ComplexType>(CanonicalType.getUnqualifiedType()))
425       return CanonicalType.getUnqualifiedType()->getAsComplexType();
426     return 0;
427   }
428 
429   // If this is a typedef for a complex type, strip the typedef off without
430   // losing all typedef information.
431   return cast<ComplexType>(getDesugaredType());
432 }
433 
434 const VectorType *Type::getAsVectorType() const {
435   // Are we directly a vector type?
436   if (const VectorType *VTy = dyn_cast<VectorType>(this))
437     return VTy;
438 
439   // If the canonical form of this type isn't the right kind, reject it.
440   if (!isa<VectorType>(CanonicalType)) {
441     // Look through type qualifiers
442     if (isa<VectorType>(CanonicalType.getUnqualifiedType()))
443       return CanonicalType.getUnqualifiedType()->getAsVectorType();
444     return 0;
445   }
446 
447   // If this is a typedef for a vector type, strip the typedef off without
448   // losing all typedef information.
449   return cast<VectorType>(getDesugaredType());
450 }
451 
452 const ExtVectorType *Type::getAsExtVectorType() const {
453   // Are we directly an OpenCU vector type?
454   if (const ExtVectorType *VTy = dyn_cast<ExtVectorType>(this))
455     return VTy;
456 
457   // If the canonical form of this type isn't the right kind, reject it.
458   if (!isa<ExtVectorType>(CanonicalType)) {
459     // Look through type qualifiers
460     if (isa<ExtVectorType>(CanonicalType.getUnqualifiedType()))
461       return CanonicalType.getUnqualifiedType()->getAsExtVectorType();
462     return 0;
463   }
464 
465   // If this is a typedef for an extended vector type, strip the typedef off
466   // without losing all typedef information.
467   return cast<ExtVectorType>(getDesugaredType());
468 }
469 
470 const ObjCInterfaceType *Type::getAsObjCInterfaceType() const {
471   // There is no sugar for ObjCInterfaceType's, just return the canonical
472   // type pointer if it is the right class.  There is no typedef information to
473   // return and these cannot be Address-space qualified.
474   return dyn_cast<ObjCInterfaceType>(CanonicalType.getUnqualifiedType());
475 }
476 
477 const ObjCInterfaceType *Type::getAsObjCQualifiedInterfaceType() const {
478   // There is no sugar for ObjCInterfaceType's, just return the canonical
479   // type pointer if it is the right class.  There is no typedef information to
480   // return and these cannot be Address-space qualified.
481   if (const ObjCInterfaceType *OIT = getAsObjCInterfaceType())
482     if (OIT->getNumProtocols())
483       return OIT;
484   return 0;
485 }
486 
487 bool Type::isObjCQualifiedInterfaceType() const {
488   return getAsObjCQualifiedInterfaceType() != 0;
489 }
490 
491 const ObjCObjectPointerType *Type::getAsObjCObjectPointerType() const {
492   // There is no sugar for ObjCObjectPointerType's, just return the
493   // canonical type pointer if it is the right class.
494   return dyn_cast<ObjCObjectPointerType>(CanonicalType.getUnqualifiedType());
495 }
496 
497 const ObjCObjectPointerType *Type::getAsObjCQualifiedIdType() const {
498   // There is no sugar for ObjCQualifiedIdType's, just return the canonical
499   // type pointer if it is the right class.
500   if (const ObjCObjectPointerType *OPT = getAsObjCObjectPointerType()) {
501     if (OPT->isObjCQualifiedIdType())
502       return OPT;
503   }
504   return 0;
505 }
506 
507 const ObjCObjectPointerType *Type::getAsObjCInterfacePointerType() const {
508   if (const ObjCObjectPointerType *OPT = getAsObjCObjectPointerType()) {
509     if (OPT->getInterfaceType())
510       return OPT;
511   }
512   return 0;
513 }
514 
515 const TemplateTypeParmType *Type::getAsTemplateTypeParmType() const {
516   // There is no sugar for template type parameters, so just return
517   // the canonical type pointer if it is the right class.
518   // FIXME: can these be address-space qualified?
519   return dyn_cast<TemplateTypeParmType>(CanonicalType);
520 }
521 
522 const CXXRecordDecl *Type::getCXXRecordDeclForPointerType() const {
523   if (const PointerType *PT = getAs<PointerType>())
524     if (const RecordType *RT = PT->getPointeeType()->getAs<RecordType>())
525       return dyn_cast<CXXRecordDecl>(RT->getDecl());
526   return 0;
527 }
528 
529 const TemplateSpecializationType *
530 Type::getAsTemplateSpecializationType() const {
531   // There is no sugar for class template specialization types, so
532   // just return the canonical type pointer if it is the right class.
533   return dyn_cast<TemplateSpecializationType>(CanonicalType);
534 }
535 
536 bool Type::isIntegerType() const {
537   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
538     return BT->getKind() >= BuiltinType::Bool &&
539            BT->getKind() <= BuiltinType::Int128;
540   if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
541     // Incomplete enum types are not treated as integer types.
542     // FIXME: In C++, enum types are never integer types.
543     if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
544       return true;
545   if (isa<FixedWidthIntType>(CanonicalType))
546     return true;
547   if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
548     return VT->getElementType()->isIntegerType();
549   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
550     return EXTQT->getBaseType()->isIntegerType();
551   return false;
552 }
553 
554 bool Type::isIntegralType() const {
555   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
556     return BT->getKind() >= BuiltinType::Bool &&
557     BT->getKind() <= BuiltinType::LongLong;
558   if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
559     if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
560       return true;  // Complete enum types are integral.
561                     // FIXME: In C++, enum types are never integral.
562   if (isa<FixedWidthIntType>(CanonicalType))
563     return true;
564   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
565     return EXTQT->getBaseType()->isIntegralType();
566   return false;
567 }
568 
569 bool Type::isEnumeralType() const {
570   if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
571     return TT->getDecl()->isEnum();
572   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
573     return EXTQT->getBaseType()->isEnumeralType();
574   return false;
575 }
576 
577 bool Type::isBooleanType() const {
578   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
579     return BT->getKind() == BuiltinType::Bool;
580   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
581     return EXTQT->getBaseType()->isBooleanType();
582   return false;
583 }
584 
585 bool Type::isCharType() const {
586   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
587     return BT->getKind() == BuiltinType::Char_U ||
588            BT->getKind() == BuiltinType::UChar ||
589            BT->getKind() == BuiltinType::Char_S ||
590            BT->getKind() == BuiltinType::SChar;
591   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
592     return EXTQT->getBaseType()->isCharType();
593   return false;
594 }
595 
596 bool Type::isWideCharType() const {
597   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
598     return BT->getKind() == BuiltinType::WChar;
599   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
600     return EXTQT->getBaseType()->isWideCharType();
601   return false;
602 }
603 
604 /// isSignedIntegerType - Return true if this is an integer type that is
605 /// signed, according to C99 6.2.5p4 [char, signed char, short, int, long..],
606 /// an enum decl which has a signed representation, or a vector of signed
607 /// integer element type.
608 bool Type::isSignedIntegerType() const {
609   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
610     return BT->getKind() >= BuiltinType::Char_S &&
611            BT->getKind() <= BuiltinType::LongLong;
612   }
613 
614   if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
615     return ET->getDecl()->getIntegerType()->isSignedIntegerType();
616 
617   if (const FixedWidthIntType *FWIT =
618           dyn_cast<FixedWidthIntType>(CanonicalType))
619     return FWIT->isSigned();
620 
621   if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
622     return VT->getElementType()->isSignedIntegerType();
623   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
624     return EXTQT->getBaseType()->isSignedIntegerType();
625   return false;
626 }
627 
628 /// isUnsignedIntegerType - Return true if this is an integer type that is
629 /// unsigned, according to C99 6.2.5p6 [which returns true for _Bool], an enum
630 /// decl which has an unsigned representation, or a vector of unsigned integer
631 /// element type.
632 bool Type::isUnsignedIntegerType() const {
633   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType)) {
634     return BT->getKind() >= BuiltinType::Bool &&
635            BT->getKind() <= BuiltinType::ULongLong;
636   }
637 
638   if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
639     return ET->getDecl()->getIntegerType()->isUnsignedIntegerType();
640 
641   if (const FixedWidthIntType *FWIT =
642           dyn_cast<FixedWidthIntType>(CanonicalType))
643     return !FWIT->isSigned();
644 
645   if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
646     return VT->getElementType()->isUnsignedIntegerType();
647   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
648     return EXTQT->getBaseType()->isUnsignedIntegerType();
649   return false;
650 }
651 
652 bool Type::isFloatingType() const {
653   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
654     return BT->getKind() >= BuiltinType::Float &&
655            BT->getKind() <= BuiltinType::LongDouble;
656   if (const ComplexType *CT = dyn_cast<ComplexType>(CanonicalType))
657     return CT->getElementType()->isFloatingType();
658   if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
659     return VT->getElementType()->isFloatingType();
660   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
661     return EXTQT->getBaseType()->isFloatingType();
662   return false;
663 }
664 
665 bool Type::isRealFloatingType() const {
666   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
667     return BT->getKind() >= BuiltinType::Float &&
668            BT->getKind() <= BuiltinType::LongDouble;
669   if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
670     return VT->getElementType()->isRealFloatingType();
671   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
672     return EXTQT->getBaseType()->isRealFloatingType();
673   return false;
674 }
675 
676 bool Type::isRealType() const {
677   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
678     return BT->getKind() >= BuiltinType::Bool &&
679            BT->getKind() <= BuiltinType::LongDouble;
680   if (const TagType *TT = dyn_cast<TagType>(CanonicalType))
681     return TT->getDecl()->isEnum() && TT->getDecl()->isDefinition();
682   if (isa<FixedWidthIntType>(CanonicalType))
683     return true;
684   if (const VectorType *VT = dyn_cast<VectorType>(CanonicalType))
685     return VT->getElementType()->isRealType();
686   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
687     return EXTQT->getBaseType()->isRealType();
688   return false;
689 }
690 
691 bool Type::isArithmeticType() const {
692   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
693     return BT->getKind() >= BuiltinType::Bool &&
694            BT->getKind() <= BuiltinType::LongDouble;
695   if (const EnumType *ET = dyn_cast<EnumType>(CanonicalType))
696     // GCC allows forward declaration of enum types (forbid by C99 6.7.2.3p2).
697     // If a body isn't seen by the time we get here, return false.
698     return ET->getDecl()->isDefinition();
699   if (isa<FixedWidthIntType>(CanonicalType))
700     return true;
701   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
702     return EXTQT->getBaseType()->isArithmeticType();
703   return isa<ComplexType>(CanonicalType) || isa<VectorType>(CanonicalType);
704 }
705 
706 bool Type::isScalarType() const {
707   if (const BuiltinType *BT = dyn_cast<BuiltinType>(CanonicalType))
708     return BT->getKind() != BuiltinType::Void;
709   if (const TagType *TT = dyn_cast<TagType>(CanonicalType)) {
710     // Enums are scalar types, but only if they are defined.  Incomplete enums
711     // are not treated as scalar types.
712     if (TT->getDecl()->isEnum() && TT->getDecl()->isDefinition())
713       return true;
714     return false;
715   }
716   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
717     return EXTQT->getBaseType()->isScalarType();
718   if (isa<FixedWidthIntType>(CanonicalType))
719     return true;
720   return isa<PointerType>(CanonicalType) ||
721          isa<BlockPointerType>(CanonicalType) ||
722          isa<MemberPointerType>(CanonicalType) ||
723          isa<ComplexType>(CanonicalType) ||
724          isa<ObjCObjectPointerType>(CanonicalType);
725 }
726 
727 /// \brief Determines whether the type is a C++ aggregate type or C
728 /// aggregate or union type.
729 ///
730 /// An aggregate type is an array or a class type (struct, union, or
731 /// class) that has no user-declared constructors, no private or
732 /// protected non-static data members, no base classes, and no virtual
733 /// functions (C++ [dcl.init.aggr]p1). The notion of an aggregate type
734 /// subsumes the notion of C aggregates (C99 6.2.5p21) because it also
735 /// includes union types.
736 bool Type::isAggregateType() const {
737   if (const RecordType *Record = dyn_cast<RecordType>(CanonicalType)) {
738     if (CXXRecordDecl *ClassDecl = dyn_cast<CXXRecordDecl>(Record->getDecl()))
739       return ClassDecl->isAggregate();
740 
741     return true;
742   }
743 
744   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
745     return EXTQT->getBaseType()->isAggregateType();
746   return isa<ArrayType>(CanonicalType);
747 }
748 
749 /// isConstantSizeType - Return true if this is not a variable sized type,
750 /// according to the rules of C99 6.7.5p3.  It is not legal to call this on
751 /// incomplete types or dependent types.
752 bool Type::isConstantSizeType() const {
753   if (const ExtQualType *EXTQT = dyn_cast<ExtQualType>(CanonicalType))
754     return EXTQT->getBaseType()->isConstantSizeType();
755   assert(!isIncompleteType() && "This doesn't make sense for incomplete types");
756   assert(!isDependentType() && "This doesn't make sense for dependent types");
757   // The VAT must have a size, as it is known to be complete.
758   return !isa<VariableArrayType>(CanonicalType);
759 }
760 
761 /// isIncompleteType - Return true if this is an incomplete type (C99 6.2.5p1)
762 /// - a type that can describe objects, but which lacks information needed to
763 /// determine its size.
764 bool Type::isIncompleteType() const {
765   switch (CanonicalType->getTypeClass()) {
766   default: return false;
767   case ExtQual:
768     return cast<ExtQualType>(CanonicalType)->getBaseType()->isIncompleteType();
769   case Builtin:
770     // Void is the only incomplete builtin type.  Per C99 6.2.5p19, it can never
771     // be completed.
772     return isVoidType();
773   case Record:
774   case Enum:
775     // A tagged type (struct/union/enum/class) is incomplete if the decl is a
776     // forward declaration, but not a full definition (C99 6.2.5p22).
777     return !cast<TagType>(CanonicalType)->getDecl()->isDefinition();
778   case IncompleteArray:
779     // An array of unknown size is an incomplete type (C99 6.2.5p22).
780     return true;
781   case ObjCInterface:
782     // ObjC interfaces are incomplete if they are @class, not @interface.
783     return cast<ObjCInterfaceType>(this)->getDecl()->isForwardDecl();
784   }
785 }
786 
787 /// isPODType - Return true if this is a plain-old-data type (C++ 3.9p10)
788 bool Type::isPODType() const {
789   // The compiler shouldn't query this for incomplete types, but the user might.
790   // We return false for that case.
791   if (isIncompleteType())
792     return false;
793 
794   switch (CanonicalType->getTypeClass()) {
795     // Everything not explicitly mentioned is not POD.
796   default: return false;
797   case ExtQual:
798     return cast<ExtQualType>(CanonicalType)->getBaseType()->isPODType();
799   case VariableArray:
800   case ConstantArray:
801     // IncompleteArray is caught by isIncompleteType() above.
802     return cast<ArrayType>(CanonicalType)->getElementType()->isPODType();
803 
804   case Builtin:
805   case Complex:
806   case Pointer:
807   case MemberPointer:
808   case Vector:
809   case ExtVector:
810   case ObjCObjectPointer:
811     return true;
812 
813   case Enum:
814     return true;
815 
816   case Record:
817     if (CXXRecordDecl *ClassDecl
818           = dyn_cast<CXXRecordDecl>(cast<RecordType>(CanonicalType)->getDecl()))
819       return ClassDecl->isPOD();
820 
821     // C struct/union is POD.
822     return true;
823   }
824 }
825 
826 bool Type::isPromotableIntegerType() const {
827   if (const BuiltinType *BT = getAsBuiltinType())
828     switch (BT->getKind()) {
829     case BuiltinType::Bool:
830     case BuiltinType::Char_S:
831     case BuiltinType::Char_U:
832     case BuiltinType::SChar:
833     case BuiltinType::UChar:
834     case BuiltinType::Short:
835     case BuiltinType::UShort:
836       return true;
837     default:
838       return false;
839     }
840   return false;
841 }
842 
843 bool Type::isNullPtrType() const {
844   if (const BuiltinType *BT = getAsBuiltinType())
845     return BT->getKind() == BuiltinType::NullPtr;
846   return false;
847 }
848 
849 bool Type::isSpecifierType() const {
850   // Note that this intentionally does not use the canonical type.
851   switch (getTypeClass()) {
852   case Builtin:
853   case Record:
854   case Enum:
855   case Typedef:
856   case Complex:
857   case TypeOfExpr:
858   case TypeOf:
859   case TemplateTypeParm:
860   case TemplateSpecialization:
861   case QualifiedName:
862   case Typename:
863   case ObjCInterface:
864   case ObjCObjectPointer:
865     return true;
866   default:
867     return false;
868   }
869 }
870 
871 const char *BuiltinType::getName(const LangOptions &LO) const {
872   switch (getKind()) {
873   default: assert(0 && "Unknown builtin type!");
874   case Void:              return "void";
875   case Bool:              return LO.Bool ? "bool" : "_Bool";
876   case Char_S:            return "char";
877   case Char_U:            return "char";
878   case SChar:             return "signed char";
879   case Short:             return "short";
880   case Int:               return "int";
881   case Long:              return "long";
882   case LongLong:          return "long long";
883   case Int128:            return "__int128_t";
884   case UChar:             return "unsigned char";
885   case UShort:            return "unsigned short";
886   case UInt:              return "unsigned int";
887   case ULong:             return "unsigned long";
888   case ULongLong:         return "unsigned long long";
889   case UInt128:           return "__uint128_t";
890   case Float:             return "float";
891   case Double:            return "double";
892   case LongDouble:        return "long double";
893   case WChar:             return "wchar_t";
894   case Char16:            return "char16_t";
895   case Char32:            return "char32_t";
896   case NullPtr:           return "nullptr_t";
897   case Overload:          return "<overloaded function type>";
898   case Dependent:         return "<dependent type>";
899   case UndeducedAuto:     return "auto";
900   case ObjCId:            return "id";
901   case ObjCClass:         return "Class";
902   }
903 }
904 
905 void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID, QualType Result,
906                                 arg_type_iterator ArgTys,
907                                 unsigned NumArgs, bool isVariadic,
908                                 unsigned TypeQuals, bool hasExceptionSpec,
909                                 bool anyExceptionSpec, unsigned NumExceptions,
910                                 exception_iterator Exs, bool NoReturn) {
911   ID.AddPointer(Result.getAsOpaquePtr());
912   for (unsigned i = 0; i != NumArgs; ++i)
913     ID.AddPointer(ArgTys[i].getAsOpaquePtr());
914   ID.AddInteger(isVariadic);
915   ID.AddInteger(TypeQuals);
916   ID.AddInteger(hasExceptionSpec);
917   if (hasExceptionSpec) {
918     ID.AddInteger(anyExceptionSpec);
919     for(unsigned i = 0; i != NumExceptions; ++i)
920       ID.AddPointer(Exs[i].getAsOpaquePtr());
921   }
922   ID.AddInteger(NoReturn);
923 }
924 
925 void FunctionProtoType::Profile(llvm::FoldingSetNodeID &ID) {
926   Profile(ID, getResultType(), arg_type_begin(), NumArgs, isVariadic(),
927           getTypeQuals(), hasExceptionSpec(), hasAnyExceptionSpec(),
928           getNumExceptions(), exception_begin(), getNoReturnAttr());
929 }
930 
931 void ObjCObjectPointerType::Profile(llvm::FoldingSetNodeID &ID,
932                                     QualType OIT, ObjCProtocolDecl **protocols,
933                                     unsigned NumProtocols) {
934   ID.AddPointer(OIT.getAsOpaquePtr());
935   for (unsigned i = 0; i != NumProtocols; i++)
936     ID.AddPointer(protocols[i]);
937 }
938 
939 void ObjCObjectPointerType::Profile(llvm::FoldingSetNodeID &ID) {
940   if (getNumProtocols())
941     Profile(ID, getPointeeType(), &Protocols[0], getNumProtocols());
942   else
943     Profile(ID, getPointeeType(), 0, 0);
944 }
945 
946 /// LookThroughTypedefs - Return the ultimate type this typedef corresponds to
947 /// potentially looking through *all* consequtive typedefs.  This returns the
948 /// sum of the type qualifiers, so if you have:
949 ///   typedef const int A;
950 ///   typedef volatile A B;
951 /// looking through the typedefs for B will give you "const volatile A".
952 ///
953 QualType TypedefType::LookThroughTypedefs() const {
954   // Usually, there is only a single level of typedefs, be fast in that case.
955   QualType FirstType = getDecl()->getUnderlyingType();
956   if (!isa<TypedefType>(FirstType))
957     return FirstType;
958 
959   // Otherwise, do the fully general loop.
960   unsigned TypeQuals = 0;
961   const TypedefType *TDT = this;
962   while (1) {
963     QualType CurType = TDT->getDecl()->getUnderlyingType();
964 
965 
966     /// FIXME:
967     /// FIXME: This is incorrect for ExtQuals!
968     /// FIXME:
969     TypeQuals |= CurType.getCVRQualifiers();
970 
971     TDT = dyn_cast<TypedefType>(CurType);
972     if (TDT == 0)
973       return QualType(CurType.getTypePtr(), TypeQuals);
974   }
975 }
976 
977 TypeOfExprType::TypeOfExprType(Expr *E, QualType can)
978   : Type(TypeOfExpr, can, E->isTypeDependent()), TOExpr(E) {
979 }
980 
981 void DependentTypeOfExprType::Profile(llvm::FoldingSetNodeID &ID,
982                                       ASTContext &Context, Expr *E) {
983   E->Profile(ID, Context, true);
984 }
985 
986 DecltypeType::DecltypeType(Expr *E, QualType underlyingType, QualType can)
987   : Type(Decltype, can, E->isTypeDependent()), E(E),
988   UnderlyingType(underlyingType) {
989 }
990 
991 DependentDecltypeType::DependentDecltypeType(ASTContext &Context, Expr *E)
992   : DecltypeType(E, Context.DependentTy), Context(Context) { }
993 
994 void DependentDecltypeType::Profile(llvm::FoldingSetNodeID &ID,
995                                     ASTContext &Context, Expr *E) {
996   E->Profile(ID, Context, true);
997 }
998 
999 TagType::TagType(TypeClass TC, TagDecl *D, QualType can)
1000   : Type(TC, can, D->isDependentType()), decl(D, 0) {}
1001 
1002 bool RecordType::classof(const TagType *TT) {
1003   return isa<RecordDecl>(TT->getDecl());
1004 }
1005 
1006 bool EnumType::classof(const TagType *TT) {
1007   return isa<EnumDecl>(TT->getDecl());
1008 }
1009 
1010 bool
1011 TemplateSpecializationType::
1012 anyDependentTemplateArguments(const TemplateArgument *Args, unsigned NumArgs) {
1013   for (unsigned Idx = 0; Idx < NumArgs; ++Idx) {
1014     switch (Args[Idx].getKind()) {
1015     case TemplateArgument::Null:
1016       assert(false && "Should not have a NULL template argument");
1017       break;
1018 
1019     case TemplateArgument::Type:
1020       if (Args[Idx].getAsType()->isDependentType())
1021         return true;
1022       break;
1023 
1024     case TemplateArgument::Declaration:
1025     case TemplateArgument::Integral:
1026       // Never dependent
1027       break;
1028 
1029     case TemplateArgument::Expression:
1030       if (Args[Idx].getAsExpr()->isTypeDependent() ||
1031           Args[Idx].getAsExpr()->isValueDependent())
1032         return true;
1033       break;
1034 
1035     case TemplateArgument::Pack:
1036       assert(0 && "FIXME: Implement!");
1037       break;
1038     }
1039   }
1040 
1041   return false;
1042 }
1043 
1044 TemplateSpecializationType::
1045 TemplateSpecializationType(ASTContext &Context, TemplateName T,
1046                            const TemplateArgument *Args,
1047                            unsigned NumArgs, QualType Canon)
1048   : Type(TemplateSpecialization,
1049          Canon.isNull()? QualType(this, 0) : Canon,
1050          T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)),
1051     Context(Context),
1052     Template(T), NumArgs(NumArgs)
1053 {
1054   assert((!Canon.isNull() ||
1055           T.isDependent() || anyDependentTemplateArguments(Args, NumArgs)) &&
1056          "No canonical type for non-dependent class template specialization");
1057 
1058   TemplateArgument *TemplateArgs
1059     = reinterpret_cast<TemplateArgument *>(this + 1);
1060   for (unsigned Arg = 0; Arg < NumArgs; ++Arg)
1061     new (&TemplateArgs[Arg]) TemplateArgument(Args[Arg]);
1062 }
1063 
1064 void TemplateSpecializationType::Destroy(ASTContext& C) {
1065   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1066     // FIXME: Not all expressions get cloned, so we can't yet perform
1067     // this destruction.
1068     //    if (Expr *E = getArg(Arg).getAsExpr())
1069     //      E->Destroy(C);
1070   }
1071 }
1072 
1073 TemplateSpecializationType::iterator
1074 TemplateSpecializationType::end() const {
1075   return begin() + getNumArgs();
1076 }
1077 
1078 const TemplateArgument &
1079 TemplateSpecializationType::getArg(unsigned Idx) const {
1080   assert(Idx < getNumArgs() && "Template argument out of range");
1081   return getArgs()[Idx];
1082 }
1083 
1084 void
1085 TemplateSpecializationType::Profile(llvm::FoldingSetNodeID &ID,
1086                                     TemplateName T,
1087                                     const TemplateArgument *Args,
1088                                     unsigned NumArgs,
1089                                     ASTContext &Context) {
1090   T.Profile(ID);
1091   for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
1092     Args[Idx].Profile(ID, Context);
1093 }
1094 
1095 const Type *QualifierSet::strip(const Type* T) {
1096   QualType DT = T->getDesugaredType();
1097   addCVR(DT.getCVRQualifiers());
1098 
1099   if (const ExtQualType* EQT = dyn_cast<ExtQualType>(DT)) {
1100     if (EQT->getAddressSpace())
1101       addAddressSpace(EQT->getAddressSpace());
1102     if (EQT->getObjCGCAttr())
1103       addObjCGCAttrType(EQT->getObjCGCAttr());
1104     return EQT->getBaseType();
1105   } else {
1106     // Use the sugared type unless desugaring found extra qualifiers.
1107     return (DT.getCVRQualifiers() ? DT.getTypePtr() : T);
1108   }
1109 }
1110 
1111 QualType QualifierSet::apply(QualType QT, ASTContext& C) {
1112   QT = QT.getWithAdditionalQualifiers(getCVRMask());
1113   if (hasObjCGCAttrType()) QT = C.getObjCGCQualType(QT, getObjCGCAttrType());
1114   if (hasAddressSpace()) QT = C.getAddrSpaceQualType(QT, getAddressSpace());
1115   return QT;
1116 }
1117 
1118 
1119 //===----------------------------------------------------------------------===//
1120 // Type Printing
1121 //===----------------------------------------------------------------------===//
1122 
1123 void QualType::dump(const char *msg) const {
1124   std::string R = "identifier";
1125   LangOptions LO;
1126   getAsStringInternal(R, PrintingPolicy(LO));
1127   if (msg)
1128     fprintf(stderr, "%s: %s\n", msg, R.c_str());
1129   else
1130     fprintf(stderr, "%s\n", R.c_str());
1131 }
1132 void QualType::dump() const {
1133   dump("");
1134 }
1135 
1136 void Type::dump() const {
1137   std::string S = "identifier";
1138   LangOptions LO;
1139   getAsStringInternal(S, PrintingPolicy(LO));
1140   fprintf(stderr, "%s\n", S.c_str());
1141 }
1142 
1143 
1144 
1145 static void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
1146   // Note: funkiness to ensure we get a space only between quals.
1147   bool NonePrinted = true;
1148   if (TypeQuals & QualType::Const)
1149     S += "const", NonePrinted = false;
1150   if (TypeQuals & QualType::Volatile)
1151     S += (NonePrinted+" volatile"), NonePrinted = false;
1152   if (TypeQuals & QualType::Restrict)
1153     S += (NonePrinted+" restrict"), NonePrinted = false;
1154 }
1155 
1156 std::string QualType::getAsString() const {
1157   std::string S;
1158   LangOptions LO;
1159   getAsStringInternal(S, PrintingPolicy(LO));
1160   return S;
1161 }
1162 
1163 void
1164 QualType::getAsStringInternal(std::string &S,
1165                               const PrintingPolicy &Policy) const {
1166   if (isNull()) {
1167     S += "NULL TYPE";
1168     return;
1169   }
1170 
1171   if (Policy.SuppressSpecifiers && getTypePtr()->isSpecifierType())
1172     return;
1173 
1174   // Print qualifiers as appropriate.
1175   if (unsigned Tq = getCVRQualifiers()) {
1176     std::string TQS;
1177     AppendTypeQualList(TQS, Tq);
1178     if (!S.empty())
1179       S = TQS + ' ' + S;
1180     else
1181       S = TQS;
1182   }
1183 
1184   getTypePtr()->getAsStringInternal(S, Policy);
1185 }
1186 
1187 void BuiltinType::getAsStringInternal(std::string &S,
1188                                       const PrintingPolicy &Policy) const {
1189   if (S.empty()) {
1190     S = getName(Policy.LangOpts);
1191   } else {
1192     // Prefix the basic type, e.g. 'int X'.
1193     S = ' ' + S;
1194     S = getName(Policy.LangOpts) + S;
1195   }
1196 }
1197 
1198 void FixedWidthIntType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1199   // FIXME: Once we get bitwidth attribute, write as
1200   // "int __attribute__((bitwidth(x)))".
1201   std::string prefix = "__clang_fixedwidth";
1202   prefix += llvm::utostr_32(Width);
1203   prefix += (char)(Signed ? 'S' : 'U');
1204   if (S.empty()) {
1205     S = prefix;
1206   } else {
1207     // Prefix the basic type, e.g. 'int X'.
1208     S = prefix + S;
1209   }
1210 }
1211 
1212 
1213 void ComplexType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1214   ElementType->getAsStringInternal(S, Policy);
1215   S = "_Complex " + S;
1216 }
1217 
1218 void ExtQualType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1219   bool NeedsSpace = false;
1220   if (AddressSpace) {
1221     S = "__attribute__((address_space("+llvm::utostr_32(AddressSpace)+")))" + S;
1222     NeedsSpace = true;
1223   }
1224   if (GCAttrType != QualType::GCNone) {
1225     if (NeedsSpace)
1226       S += ' ';
1227     S += "__attribute__((objc_gc(";
1228     if (GCAttrType == QualType::Weak)
1229       S += "weak";
1230     else
1231       S += "strong";
1232     S += ")))";
1233   }
1234   BaseType->getAsStringInternal(S, Policy);
1235 }
1236 
1237 void PointerType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1238   S = '*' + S;
1239 
1240   // Handle things like 'int (*A)[4];' correctly.
1241   // FIXME: this should include vectors, but vectors use attributes I guess.
1242   if (isa<ArrayType>(getPointeeType()))
1243     S = '(' + S + ')';
1244 
1245   getPointeeType().getAsStringInternal(S, Policy);
1246 }
1247 
1248 void BlockPointerType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1249   S = '^' + S;
1250   PointeeType.getAsStringInternal(S, Policy);
1251 }
1252 
1253 void LValueReferenceType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1254   S = '&' + S;
1255 
1256   // Handle things like 'int (&A)[4];' correctly.
1257   // FIXME: this should include vectors, but vectors use attributes I guess.
1258   if (isa<ArrayType>(getPointeeType()))
1259     S = '(' + S + ')';
1260 
1261   getPointeeType().getAsStringInternal(S, Policy);
1262 }
1263 
1264 void RValueReferenceType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1265   S = "&&" + S;
1266 
1267   // Handle things like 'int (&&A)[4];' correctly.
1268   // FIXME: this should include vectors, but vectors use attributes I guess.
1269   if (isa<ArrayType>(getPointeeType()))
1270     S = '(' + S + ')';
1271 
1272   getPointeeType().getAsStringInternal(S, Policy);
1273 }
1274 
1275 void MemberPointerType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1276   std::string C;
1277   Class->getAsStringInternal(C, Policy);
1278   C += "::*";
1279   S = C + S;
1280 
1281   // Handle things like 'int (Cls::*A)[4];' correctly.
1282   // FIXME: this should include vectors, but vectors use attributes I guess.
1283   if (isa<ArrayType>(getPointeeType()))
1284     S = '(' + S + ')';
1285 
1286   getPointeeType().getAsStringInternal(S, Policy);
1287 }
1288 
1289 void ConstantArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1290   S += '[';
1291   S += llvm::utostr(getSize().getZExtValue());
1292   S += ']';
1293 
1294   getElementType().getAsStringInternal(S, Policy);
1295 }
1296 
1297 void ConstantArrayWithExprType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1298   if (Policy.ConstantArraySizeAsWritten) {
1299     std::string SStr;
1300     llvm::raw_string_ostream s(SStr);
1301     getSizeExpr()->printPretty(s, 0, Policy);
1302     S += '[';
1303     S += s.str();
1304     S += ']';
1305     getElementType().getAsStringInternal(S, Policy);
1306   }
1307   else
1308     ConstantArrayType::getAsStringInternal(S, Policy);
1309 }
1310 
1311 void ConstantArrayWithoutExprType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1312   if (Policy.ConstantArraySizeAsWritten) {
1313     S += "[]";
1314     getElementType().getAsStringInternal(S, Policy);
1315   }
1316   else
1317     ConstantArrayType::getAsStringInternal(S, Policy);
1318 }
1319 
1320 void IncompleteArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1321   S += "[]";
1322 
1323   getElementType().getAsStringInternal(S, Policy);
1324 }
1325 
1326 void VariableArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1327   S += '[';
1328 
1329   if (getIndexTypeQualifier()) {
1330     AppendTypeQualList(S, getIndexTypeQualifier());
1331     S += ' ';
1332   }
1333 
1334   if (getSizeModifier() == Static)
1335     S += "static";
1336   else if (getSizeModifier() == Star)
1337     S += '*';
1338 
1339   if (getSizeExpr()) {
1340     std::string SStr;
1341     llvm::raw_string_ostream s(SStr);
1342     getSizeExpr()->printPretty(s, 0, Policy);
1343     S += s.str();
1344   }
1345   S += ']';
1346 
1347   getElementType().getAsStringInternal(S, Policy);
1348 }
1349 
1350 void DependentSizedArrayType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1351   S += '[';
1352 
1353   if (getIndexTypeQualifier()) {
1354     AppendTypeQualList(S, getIndexTypeQualifier());
1355     S += ' ';
1356   }
1357 
1358   if (getSizeModifier() == Static)
1359     S += "static";
1360   else if (getSizeModifier() == Star)
1361     S += '*';
1362 
1363   if (getSizeExpr()) {
1364     std::string SStr;
1365     llvm::raw_string_ostream s(SStr);
1366     getSizeExpr()->printPretty(s, 0, Policy);
1367     S += s.str();
1368   }
1369   S += ']';
1370 
1371   getElementType().getAsStringInternal(S, Policy);
1372 }
1373 
1374 void DependentSizedExtVectorType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1375   getElementType().getAsStringInternal(S, Policy);
1376 
1377   S += " __attribute__((ext_vector_type(";
1378   if (getSizeExpr()) {
1379     std::string SStr;
1380     llvm::raw_string_ostream s(SStr);
1381     getSizeExpr()->printPretty(s, 0, Policy);
1382     S += s.str();
1383   }
1384   S += ")))";
1385 }
1386 
1387 void VectorType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1388   // FIXME: We prefer to print the size directly here, but have no way
1389   // to get the size of the type.
1390   S += " __attribute__((__vector_size__(";
1391   S += llvm::utostr_32(NumElements); // convert back to bytes.
1392   S += " * sizeof(" + ElementType.getAsString() + "))))";
1393   ElementType.getAsStringInternal(S, Policy);
1394 }
1395 
1396 void ExtVectorType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1397   S += " __attribute__((ext_vector_type(";
1398   S += llvm::utostr_32(NumElements);
1399   S += ")))";
1400   ElementType.getAsStringInternal(S, Policy);
1401 }
1402 
1403 void TypeOfExprType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1404   if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(e) X'.
1405     InnerString = ' ' + InnerString;
1406   std::string Str;
1407   llvm::raw_string_ostream s(Str);
1408   getUnderlyingExpr()->printPretty(s, 0, Policy);
1409   InnerString = "typeof " + s.str() + InnerString;
1410 }
1411 
1412 void TypeOfType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1413   if (!InnerString.empty())    // Prefix the basic type, e.g. 'typeof(t) X'.
1414     InnerString = ' ' + InnerString;
1415   std::string Tmp;
1416   getUnderlyingType().getAsStringInternal(Tmp, Policy);
1417   InnerString = "typeof(" + Tmp + ")" + InnerString;
1418 }
1419 
1420 void DecltypeType::getAsStringInternal(std::string &InnerString,
1421                                        const PrintingPolicy &Policy) const {
1422   if (!InnerString.empty())    // Prefix the basic type, e.g. 'decltype(t) X'.
1423     InnerString = ' ' + InnerString;
1424   std::string Str;
1425   llvm::raw_string_ostream s(Str);
1426   getUnderlyingExpr()->printPretty(s, 0, Policy);
1427   InnerString = "decltype(" + s.str() + ")" + InnerString;
1428 }
1429 
1430 void FunctionNoProtoType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1431   // If needed for precedence reasons, wrap the inner part in grouping parens.
1432   if (!S.empty())
1433     S = "(" + S + ")";
1434 
1435   S += "()";
1436   if (getNoReturnAttr())
1437     S += " __attribute__((noreturn))";
1438   getResultType().getAsStringInternal(S, Policy);
1439 }
1440 
1441 void FunctionProtoType::getAsStringInternal(std::string &S, const PrintingPolicy &Policy) const {
1442   // If needed for precedence reasons, wrap the inner part in grouping parens.
1443   if (!S.empty())
1444     S = "(" + S + ")";
1445 
1446   S += "(";
1447   std::string Tmp;
1448   PrintingPolicy ParamPolicy(Policy);
1449   ParamPolicy.SuppressSpecifiers = false;
1450   for (unsigned i = 0, e = getNumArgs(); i != e; ++i) {
1451     if (i) S += ", ";
1452     getArgType(i).getAsStringInternal(Tmp, ParamPolicy);
1453     S += Tmp;
1454     Tmp.clear();
1455   }
1456 
1457   if (isVariadic()) {
1458     if (getNumArgs())
1459       S += ", ";
1460     S += "...";
1461   } else if (getNumArgs() == 0 && !Policy.LangOpts.CPlusPlus) {
1462     // Do not emit int() if we have a proto, emit 'int(void)'.
1463     S += "void";
1464   }
1465 
1466   S += ")";
1467   if (getNoReturnAttr())
1468     S += " __attribute__((noreturn))";
1469   getResultType().getAsStringInternal(S, Policy);
1470 }
1471 
1472 
1473 void TypedefType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1474   if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
1475     InnerString = ' ' + InnerString;
1476   InnerString = getDecl()->getIdentifier()->getName() + InnerString;
1477 }
1478 
1479 void TemplateTypeParmType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1480   if (!InnerString.empty())    // Prefix the basic type, e.g. 'parmname X'.
1481     InnerString = ' ' + InnerString;
1482 
1483   if (!Name)
1484     InnerString = "type-parameter-" + llvm::utostr_32(Depth) + '-' +
1485       llvm::utostr_32(Index) + InnerString;
1486   else
1487     InnerString = Name->getName() + InnerString;
1488 }
1489 
1490 std::string
1491 TemplateSpecializationType::PrintTemplateArgumentList(
1492                                                   const TemplateArgument *Args,
1493                                                   unsigned NumArgs,
1494                                                   const PrintingPolicy &Policy) {
1495   std::string SpecString;
1496   SpecString += '<';
1497   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1498     if (Arg)
1499       SpecString += ", ";
1500 
1501     // Print the argument into a string.
1502     std::string ArgString;
1503     switch (Args[Arg].getKind()) {
1504     case TemplateArgument::Null:
1505       assert(false && "Null template argument");
1506       break;
1507 
1508     case TemplateArgument::Type:
1509       Args[Arg].getAsType().getAsStringInternal(ArgString, Policy);
1510       break;
1511 
1512     case TemplateArgument::Declaration:
1513       ArgString = cast<NamedDecl>(Args[Arg].getAsDecl())->getNameAsString();
1514       break;
1515 
1516     case TemplateArgument::Integral:
1517       ArgString = Args[Arg].getAsIntegral()->toString(10, true);
1518       break;
1519 
1520     case TemplateArgument::Expression: {
1521       llvm::raw_string_ostream s(ArgString);
1522       Args[Arg].getAsExpr()->printPretty(s, 0, Policy);
1523       break;
1524     }
1525     case TemplateArgument::Pack:
1526       assert(0 && "FIXME: Implement!");
1527       break;
1528     }
1529 
1530     // If this is the first argument and its string representation
1531     // begins with the global scope specifier ('::foo'), add a space
1532     // to avoid printing the diagraph '<:'.
1533     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1534       SpecString += ' ';
1535 
1536     SpecString += ArgString;
1537   }
1538 
1539   // If the last character of our string is '>', add another space to
1540   // keep the two '>''s separate tokens. We don't *have* to do this in
1541   // C++0x, but it's still good hygiene.
1542   if (SpecString[SpecString.size() - 1] == '>')
1543     SpecString += ' ';
1544 
1545   SpecString += '>';
1546 
1547   return SpecString;
1548 }
1549 
1550 void
1551 TemplateSpecializationType::
1552 getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1553   std::string SpecString;
1554 
1555   {
1556     llvm::raw_string_ostream OS(SpecString);
1557     Template.print(OS, Policy);
1558   }
1559 
1560   SpecString += PrintTemplateArgumentList(getArgs(), getNumArgs(), Policy);
1561   if (InnerString.empty())
1562     InnerString.swap(SpecString);
1563   else
1564     InnerString = SpecString + ' ' + InnerString;
1565 }
1566 
1567 void QualifiedNameType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1568   std::string MyString;
1569 
1570   {
1571     llvm::raw_string_ostream OS(MyString);
1572     NNS->print(OS, Policy);
1573   }
1574 
1575   std::string TypeStr;
1576   PrintingPolicy InnerPolicy(Policy);
1577   InnerPolicy.SuppressTagKind = true;
1578   NamedType.getAsStringInternal(TypeStr, InnerPolicy);
1579 
1580   MyString += TypeStr;
1581   if (InnerString.empty())
1582     InnerString.swap(MyString);
1583   else
1584     InnerString = MyString + ' ' + InnerString;
1585 }
1586 
1587 void TypenameType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1588   std::string MyString;
1589 
1590   {
1591     llvm::raw_string_ostream OS(MyString);
1592     OS << "typename ";
1593     NNS->print(OS, Policy);
1594 
1595     if (const IdentifierInfo *Ident = getIdentifier())
1596       OS << Ident->getName();
1597     else if (const TemplateSpecializationType *Spec = getTemplateId()) {
1598       Spec->getTemplateName().print(OS, Policy, true);
1599       OS << TemplateSpecializationType::PrintTemplateArgumentList(
1600                                                                Spec->getArgs(),
1601                                                             Spec->getNumArgs(),
1602                                                                Policy);
1603     }
1604   }
1605 
1606   if (InnerString.empty())
1607     InnerString.swap(MyString);
1608   else
1609     InnerString = MyString + ' ' + InnerString;
1610 }
1611 
1612 void ObjCInterfaceType::Profile(llvm::FoldingSetNodeID &ID,
1613                                          const ObjCInterfaceDecl *Decl,
1614                                          ObjCProtocolDecl **protocols,
1615                                          unsigned NumProtocols) {
1616   ID.AddPointer(Decl);
1617   for (unsigned i = 0; i != NumProtocols; i++)
1618     ID.AddPointer(protocols[i]);
1619 }
1620 
1621 void ObjCInterfaceType::Profile(llvm::FoldingSetNodeID &ID) {
1622   if (getNumProtocols())
1623     Profile(ID, getDecl(), &Protocols[0], getNumProtocols());
1624   else
1625     Profile(ID, getDecl(), 0, 0);
1626 }
1627 
1628 void ObjCInterfaceType::getAsStringInternal(std::string &InnerString,
1629                                            const PrintingPolicy &Policy) const {
1630   if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
1631     InnerString = ' ' + InnerString;
1632 
1633   std::string ObjCQIString = getDecl()->getNameAsString();
1634   if (getNumProtocols()) {
1635     ObjCQIString += '<';
1636     bool isFirst = true;
1637     for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) {
1638       if (isFirst)
1639         isFirst = false;
1640       else
1641         ObjCQIString += ',';
1642       ObjCQIString += (*I)->getNameAsString();
1643     }
1644     ObjCQIString += '>';
1645   }
1646   InnerString = ObjCQIString + InnerString;
1647 }
1648 
1649 void ObjCObjectPointerType::getAsStringInternal(std::string &InnerString,
1650                                                 const PrintingPolicy &Policy) const {
1651   std::string ObjCQIString;
1652 
1653   if (isObjCIdType() || isObjCQualifiedIdType())
1654     ObjCQIString = "id";
1655   else if (isObjCClassType() || isObjCQualifiedClassType())
1656     ObjCQIString = "Class";
1657   else
1658     ObjCQIString = getInterfaceDecl()->getNameAsString();
1659 
1660   if (!qual_empty()) {
1661     ObjCQIString += '<';
1662     for (qual_iterator I = qual_begin(), E = qual_end(); I != E; ++I) {
1663       ObjCQIString += (*I)->getNameAsString();
1664       if (I+1 != E)
1665         ObjCQIString += ',';
1666     }
1667     ObjCQIString += '>';
1668   }
1669   if (!isObjCIdType() && !isObjCQualifiedIdType())
1670     ObjCQIString += " *"; // Don't forget the implicit pointer.
1671   else if (!InnerString.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1672     InnerString = ' ' + InnerString;
1673 
1674   InnerString = ObjCQIString + InnerString;
1675 }
1676 
1677 void TagType::getAsStringInternal(std::string &InnerString, const PrintingPolicy &Policy) const {
1678   if (Policy.SuppressTag)
1679     return;
1680 
1681   if (!InnerString.empty())    // Prefix the basic type, e.g. 'typedefname X'.
1682     InnerString = ' ' + InnerString;
1683 
1684   const char *Kind = Policy.SuppressTagKind? 0 : getDecl()->getKindName();
1685   const char *ID;
1686   if (const IdentifierInfo *II = getDecl()->getIdentifier())
1687     ID = II->getName();
1688   else if (TypedefDecl *Typedef = getDecl()->getTypedefForAnonDecl()) {
1689     Kind = 0;
1690     assert(Typedef->getIdentifier() && "Typedef without identifier?");
1691     ID = Typedef->getIdentifier()->getName();
1692   } else
1693     ID = "<anonymous>";
1694 
1695   // If this is a class template specialization, print the template
1696   // arguments.
1697   if (ClassTemplateSpecializationDecl *Spec
1698         = dyn_cast<ClassTemplateSpecializationDecl>(getDecl())) {
1699     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1700     std::string TemplateArgsStr
1701       = TemplateSpecializationType::PrintTemplateArgumentList(
1702                                             TemplateArgs.getFlatArgumentList(),
1703                                             TemplateArgs.flat_size(),
1704                                                               Policy);
1705     InnerString = TemplateArgsStr + InnerString;
1706   }
1707 
1708   if (Kind) {
1709     // Compute the full nested-name-specifier for this type. In C,
1710     // this will always be empty.
1711     std::string ContextStr;
1712     for (DeclContext *DC = getDecl()->getDeclContext();
1713          !DC->isTranslationUnit(); DC = DC->getParent()) {
1714       std::string MyPart;
1715       if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
1716         if (NS->getIdentifier())
1717           MyPart = NS->getNameAsString();
1718       } else if (ClassTemplateSpecializationDecl *Spec
1719                    = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1720         const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1721         std::string TemplateArgsStr
1722           = TemplateSpecializationType::PrintTemplateArgumentList(
1723                                            TemplateArgs.getFlatArgumentList(),
1724                                            TemplateArgs.flat_size(),
1725                                            Policy);
1726         MyPart = Spec->getIdentifier()->getName() + TemplateArgsStr;
1727       } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
1728         if (TypedefDecl *Typedef = Tag->getTypedefForAnonDecl())
1729           MyPart = Typedef->getIdentifier()->getName();
1730         else if (Tag->getIdentifier())
1731           MyPart = Tag->getIdentifier()->getName();
1732       }
1733 
1734       if (!MyPart.empty())
1735         ContextStr = MyPart + "::" + ContextStr;
1736     }
1737 
1738     InnerString = std::string(Kind) + " " + ContextStr + ID + InnerString;
1739   } else
1740     InnerString = ID + InnerString;
1741 }
1742