1 //===--- TypePrinter.cpp - Pretty-Print Clang Types -----------------------===//
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 contains code to print types from Clang's type system.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/AST/Decl.h"
15 #include "clang/AST/DeclObjC.h"
16 #include "clang/AST/DeclTemplate.h"
17 #include "clang/AST/Expr.h"
18 #include "clang/AST/Type.h"
19 #include "clang/AST/PrettyPrinter.h"
20 #include "clang/Basic/LangOptions.h"
21 #include "clang/Basic/SourceManager.h"
22 #include "llvm/ADT/StringExtras.h"
23 #include "llvm/Support/raw_ostream.h"
24 using namespace clang;
25 
26 namespace {
27   /// \brief RAII object that enables printing of the ARC __strong lifetime
28   /// qualifier.
29   class IncludeStrongLifetimeRAII {
30     PrintingPolicy &Policy;
31     bool Old;
32 
33   public:
34     explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy)
35       : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
36       Policy.SuppressStrongLifetime = false;
37     }
38 
39     ~IncludeStrongLifetimeRAII() {
40       Policy.SuppressStrongLifetime = Old;
41     }
42   };
43 
44   class TypePrinter {
45     PrintingPolicy Policy;
46 
47   public:
48     explicit TypePrinter(const PrintingPolicy &Policy) : Policy(Policy) { }
49 
50     void print(const Type *ty, Qualifiers qs, std::string &buffer);
51     void print(QualType T, std::string &S);
52     void AppendScope(DeclContext *DC, std::string &S);
53     void printTag(TagDecl *T, std::string &S);
54 #define ABSTRACT_TYPE(CLASS, PARENT)
55 #define TYPE(CLASS, PARENT) \
56     void print##CLASS(const CLASS##Type *T, std::string &S);
57 #include "clang/AST/TypeNodes.def"
58   };
59 }
60 
61 static void AppendTypeQualList(std::string &S, unsigned TypeQuals) {
62   if (TypeQuals & Qualifiers::Const) {
63     if (!S.empty()) S += ' ';
64     S += "const";
65   }
66   if (TypeQuals & Qualifiers::Volatile) {
67     if (!S.empty()) S += ' ';
68     S += "volatile";
69   }
70   if (TypeQuals & Qualifiers::Restrict) {
71     if (!S.empty()) S += ' ';
72     S += "restrict";
73   }
74 }
75 
76 void TypePrinter::print(QualType t, std::string &buffer) {
77   SplitQualType split = t.split();
78   print(split.first, split.second, buffer);
79 }
80 
81 void TypePrinter::print(const Type *T, Qualifiers Quals, std::string &buffer) {
82   if (!T) {
83     buffer += "NULL TYPE";
84     return;
85   }
86 
87   if (Policy.SuppressSpecifiers && T->isSpecifierType())
88     return;
89 
90   // Print qualifiers as appropriate.
91 
92   // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
93   // so that we get "const int" instead of "int const", but we can't do this if
94   // the type is complex.  For example if the type is "int*", we *must* print
95   // "int * const", printing "const int *" is different.  Only do this when the
96   // type expands to a simple string.
97   bool CanPrefixQualifiers = false;
98   bool NeedARCStrongQualifier = false;
99   Type::TypeClass TC = T->getTypeClass();
100   if (const AutoType *AT = dyn_cast<AutoType>(T))
101     TC = AT->desugar()->getTypeClass();
102   if (const SubstTemplateTypeParmType *Subst
103                                       = dyn_cast<SubstTemplateTypeParmType>(T))
104     TC = Subst->getReplacementType()->getTypeClass();
105 
106   switch (TC) {
107     case Type::Builtin:
108     case Type::Complex:
109     case Type::UnresolvedUsing:
110     case Type::Typedef:
111     case Type::TypeOfExpr:
112     case Type::TypeOf:
113     case Type::Decltype:
114     case Type::UnaryTransform:
115     case Type::Record:
116     case Type::Enum:
117     case Type::Elaborated:
118     case Type::TemplateTypeParm:
119     case Type::SubstTemplateTypeParmPack:
120     case Type::TemplateSpecialization:
121     case Type::InjectedClassName:
122     case Type::DependentName:
123     case Type::DependentTemplateSpecialization:
124     case Type::ObjCObject:
125     case Type::ObjCInterface:
126     case Type::Atomic:
127       CanPrefixQualifiers = true;
128       break;
129 
130     case Type::ObjCObjectPointer:
131       CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
132         T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
133       break;
134 
135     case Type::ConstantArray:
136     case Type::IncompleteArray:
137     case Type::VariableArray:
138     case Type::DependentSizedArray:
139       NeedARCStrongQualifier = true;
140       // Fall through
141 
142     case Type::Pointer:
143     case Type::BlockPointer:
144     case Type::LValueReference:
145     case Type::RValueReference:
146     case Type::MemberPointer:
147     case Type::DependentSizedExtVector:
148     case Type::Vector:
149     case Type::ExtVector:
150     case Type::FunctionProto:
151     case Type::FunctionNoProto:
152     case Type::Paren:
153     case Type::Attributed:
154     case Type::PackExpansion:
155     case Type::SubstTemplateTypeParm:
156     case Type::Auto:
157       CanPrefixQualifiers = false;
158       break;
159   }
160 
161   if (!CanPrefixQualifiers && !Quals.empty()) {
162     std::string qualsBuffer;
163     if (NeedARCStrongQualifier) {
164       IncludeStrongLifetimeRAII Strong(Policy);
165       Quals.getAsStringInternal(qualsBuffer, Policy);
166     } else {
167       Quals.getAsStringInternal(qualsBuffer, Policy);
168     }
169 
170     if (!qualsBuffer.empty()) {
171       if (!buffer.empty()) {
172         qualsBuffer += ' ';
173         qualsBuffer += buffer;
174       }
175       std::swap(buffer, qualsBuffer);
176     }
177   }
178 
179   switch (T->getTypeClass()) {
180 #define ABSTRACT_TYPE(CLASS, PARENT)
181 #define TYPE(CLASS, PARENT) case Type::CLASS: \
182     print##CLASS(cast<CLASS##Type>(T), buffer); \
183     break;
184 #include "clang/AST/TypeNodes.def"
185   }
186 
187   // If we're adding the qualifiers as a prefix, do it now.
188   if (CanPrefixQualifiers && !Quals.empty()) {
189     std::string qualsBuffer;
190     if (NeedARCStrongQualifier) {
191       IncludeStrongLifetimeRAII Strong(Policy);
192       Quals.getAsStringInternal(qualsBuffer, Policy);
193     } else {
194       Quals.getAsStringInternal(qualsBuffer, Policy);
195     }
196 
197     if (!qualsBuffer.empty()) {
198       if (!buffer.empty()) {
199         qualsBuffer += ' ';
200         qualsBuffer += buffer;
201       }
202       std::swap(buffer, qualsBuffer);
203     }
204   }
205 }
206 
207 void TypePrinter::printBuiltin(const BuiltinType *T, std::string &S) {
208   if (S.empty()) {
209     S = T->getName(Policy);
210   } else {
211     // Prefix the basic type, e.g. 'int X'.
212     S = ' ' + S;
213     S = T->getName(Policy) + S;
214   }
215 }
216 
217 void TypePrinter::printComplex(const ComplexType *T, std::string &S) {
218   print(T->getElementType(), S);
219   S = "_Complex " + S;
220 }
221 
222 void TypePrinter::printPointer(const PointerType *T, std::string &S) {
223   S = '*' + S;
224 
225   // Handle things like 'int (*A)[4];' correctly.
226   // FIXME: this should include vectors, but vectors use attributes I guess.
227   if (isa<ArrayType>(T->getPointeeType()))
228     S = '(' + S + ')';
229 
230   IncludeStrongLifetimeRAII Strong(Policy);
231   print(T->getPointeeType(), S);
232 }
233 
234 void TypePrinter::printBlockPointer(const BlockPointerType *T, std::string &S) {
235   S = '^' + S;
236   print(T->getPointeeType(), S);
237 }
238 
239 void TypePrinter::printLValueReference(const LValueReferenceType *T,
240                                        std::string &S) {
241   S = '&' + S;
242 
243   // Handle things like 'int (&A)[4];' correctly.
244   // FIXME: this should include vectors, but vectors use attributes I guess.
245   if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
246     S = '(' + S + ')';
247 
248   IncludeStrongLifetimeRAII Strong(Policy);
249   print(T->getPointeeTypeAsWritten(), S);
250 }
251 
252 void TypePrinter::printRValueReference(const RValueReferenceType *T,
253                                        std::string &S) {
254   S = "&&" + S;
255 
256   // Handle things like 'int (&&A)[4];' correctly.
257   // FIXME: this should include vectors, but vectors use attributes I guess.
258   if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
259     S = '(' + S + ')';
260 
261   IncludeStrongLifetimeRAII Strong(Policy);
262   print(T->getPointeeTypeAsWritten(), S);
263 }
264 
265 void TypePrinter::printMemberPointer(const MemberPointerType *T,
266                                      std::string &S) {
267   std::string C;
268   print(QualType(T->getClass(), 0), C);
269   C += "::*";
270   S = C + S;
271 
272   // Handle things like 'int (Cls::*A)[4];' correctly.
273   // FIXME: this should include vectors, but vectors use attributes I guess.
274   if (isa<ArrayType>(T->getPointeeType()))
275     S = '(' + S + ')';
276 
277   IncludeStrongLifetimeRAII Strong(Policy);
278   print(T->getPointeeType(), S);
279 }
280 
281 void TypePrinter::printConstantArray(const ConstantArrayType *T,
282                                      std::string &S) {
283   S += '[';
284   S += llvm::utostr(T->getSize().getZExtValue());
285   S += ']';
286 
287   IncludeStrongLifetimeRAII Strong(Policy);
288   print(T->getElementType(), S);
289 }
290 
291 void TypePrinter::printIncompleteArray(const IncompleteArrayType *T,
292                                        std::string &S) {
293   S += "[]";
294   IncludeStrongLifetimeRAII Strong(Policy);
295   print(T->getElementType(), S);
296 }
297 
298 void TypePrinter::printVariableArray(const VariableArrayType *T,
299                                      std::string &S) {
300   S += '[';
301 
302   if (T->getIndexTypeQualifiers().hasQualifiers()) {
303     AppendTypeQualList(S, T->getIndexTypeCVRQualifiers());
304     S += ' ';
305   }
306 
307   if (T->getSizeModifier() == VariableArrayType::Static)
308     S += "static";
309   else if (T->getSizeModifier() == VariableArrayType::Star)
310     S += '*';
311 
312   if (T->getSizeExpr()) {
313     std::string SStr;
314     llvm::raw_string_ostream s(SStr);
315     T->getSizeExpr()->printPretty(s, 0, Policy);
316     S += s.str();
317   }
318   S += ']';
319 
320   IncludeStrongLifetimeRAII Strong(Policy);
321   print(T->getElementType(), S);
322 }
323 
324 void TypePrinter::printDependentSizedArray(const DependentSizedArrayType *T,
325                                            std::string &S) {
326   S += '[';
327 
328   if (T->getSizeExpr()) {
329     std::string SStr;
330     llvm::raw_string_ostream s(SStr);
331     T->getSizeExpr()->printPretty(s, 0, Policy);
332     S += s.str();
333   }
334   S += ']';
335 
336   IncludeStrongLifetimeRAII Strong(Policy);
337   print(T->getElementType(), S);
338 }
339 
340 void TypePrinter::printDependentSizedExtVector(
341                                           const DependentSizedExtVectorType *T,
342                                                std::string &S) {
343   print(T->getElementType(), S);
344 
345   S += " __attribute__((ext_vector_type(";
346   if (T->getSizeExpr()) {
347     std::string SStr;
348     llvm::raw_string_ostream s(SStr);
349     T->getSizeExpr()->printPretty(s, 0, Policy);
350     S += s.str();
351   }
352   S += ")))";
353 }
354 
355 void TypePrinter::printVector(const VectorType *T, std::string &S) {
356   switch (T->getVectorKind()) {
357   case VectorType::AltiVecPixel:
358     S = "__vector __pixel " + S;
359     break;
360   case VectorType::AltiVecBool:
361     print(T->getElementType(), S);
362     S = "__vector __bool " + S;
363     break;
364   case VectorType::AltiVecVector:
365     print(T->getElementType(), S);
366     S = "__vector " + S;
367     break;
368   case VectorType::NeonVector:
369     print(T->getElementType(), S);
370     S = ("__attribute__((neon_vector_type(" +
371          llvm::utostr_32(T->getNumElements()) + "))) " + S);
372     break;
373   case VectorType::NeonPolyVector:
374     print(T->getElementType(), S);
375     S = ("__attribute__((neon_polyvector_type(" +
376          llvm::utostr_32(T->getNumElements()) + "))) " + S);
377     break;
378   case VectorType::GenericVector: {
379     // FIXME: We prefer to print the size directly here, but have no way
380     // to get the size of the type.
381     print(T->getElementType(), S);
382     std::string V = "__attribute__((__vector_size__(";
383     V += llvm::utostr_32(T->getNumElements()); // convert back to bytes.
384     std::string ET;
385     print(T->getElementType(), ET);
386     V += " * sizeof(" + ET + ")))) ";
387     S = V + S;
388     break;
389   }
390   }
391 }
392 
393 void TypePrinter::printExtVector(const ExtVectorType *T, std::string &S) {
394   S += " __attribute__((ext_vector_type(";
395   S += llvm::utostr_32(T->getNumElements());
396   S += ")))";
397   print(T->getElementType(), S);
398 }
399 
400 void TypePrinter::printFunctionProto(const FunctionProtoType *T,
401                                      std::string &S) {
402   // If needed for precedence reasons, wrap the inner part in grouping parens.
403   if (!S.empty())
404     S = "(" + S + ")";
405 
406   S += "(";
407   std::string Tmp;
408   PrintingPolicy ParamPolicy(Policy);
409   ParamPolicy.SuppressSpecifiers = false;
410   for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
411     if (i) S += ", ";
412     print(T->getArgType(i), Tmp);
413     S += Tmp;
414     Tmp.clear();
415   }
416 
417   if (T->isVariadic()) {
418     if (T->getNumArgs())
419       S += ", ";
420     S += "...";
421   } else if (T->getNumArgs() == 0 && !Policy.LangOpts.CPlusPlus) {
422     // Do not emit int() if we have a proto, emit 'int(void)'.
423     S += "void";
424   }
425 
426   S += ")";
427 
428   FunctionType::ExtInfo Info = T->getExtInfo();
429   switch(Info.getCC()) {
430   case CC_Default:
431   default: break;
432   case CC_C:
433     S += " __attribute__((cdecl))";
434     break;
435   case CC_X86StdCall:
436     S += " __attribute__((stdcall))";
437     break;
438   case CC_X86FastCall:
439     S += " __attribute__((fastcall))";
440     break;
441   case CC_X86ThisCall:
442     S += " __attribute__((thiscall))";
443     break;
444   case CC_X86Pascal:
445     S += " __attribute__((pascal))";
446     break;
447   case CC_AAPCS:
448     S += " __attribute__((pcs(\"aapcs\")))";
449     break;
450   case CC_AAPCS_VFP:
451     S += " __attribute__((pcs(\"aapcs-vfp\")))";
452     break;
453   }
454   if (Info.getNoReturn())
455     S += " __attribute__((noreturn))";
456   if (Info.getRegParm())
457     S += " __attribute__((regparm (" +
458         llvm::utostr_32(Info.getRegParm()) + ")))";
459 
460   AppendTypeQualList(S, T->getTypeQuals());
461 
462   switch (T->getRefQualifier()) {
463   case RQ_None:
464     break;
465 
466   case RQ_LValue:
467     S += " &";
468     break;
469 
470   case RQ_RValue:
471     S += " &&";
472     break;
473   }
474 
475   if (T->hasDynamicExceptionSpec()) {
476     S += " throw(";
477     if (T->getExceptionSpecType() == EST_MSAny)
478       S += "...";
479     else
480       for (unsigned I = 0, N = T->getNumExceptions(); I != N; ++I) {
481         if (I)
482           S += ", ";
483 
484         std::string ExceptionType;
485         print(T->getExceptionType(I), ExceptionType);
486         S += ExceptionType;
487       }
488     S += ")";
489   } else if (isNoexceptExceptionSpec(T->getExceptionSpecType())) {
490     S += " noexcept";
491     if (T->getExceptionSpecType() == EST_ComputedNoexcept) {
492       S += "(";
493       llvm::raw_string_ostream EOut(S);
494       T->getNoexceptExpr()->printPretty(EOut, 0, Policy);
495       EOut.flush();
496       S += EOut.str();
497       S += ")";
498     }
499   }
500 
501   print(T->getResultType(), S);
502 }
503 
504 void TypePrinter::printFunctionNoProto(const FunctionNoProtoType *T,
505                                        std::string &S) {
506   // If needed for precedence reasons, wrap the inner part in grouping parens.
507   if (!S.empty())
508     S = "(" + S + ")";
509 
510   S += "()";
511   if (T->getNoReturnAttr())
512     S += " __attribute__((noreturn))";
513   print(T->getResultType(), S);
514 }
515 
516 static void printTypeSpec(const NamedDecl *D, std::string &S) {
517   IdentifierInfo *II = D->getIdentifier();
518   if (S.empty())
519     S = II->getName().str();
520   else
521     S = II->getName().str() + ' ' + S;
522 }
523 
524 void TypePrinter::printUnresolvedUsing(const UnresolvedUsingType *T,
525                                        std::string &S) {
526   printTypeSpec(T->getDecl(), S);
527 }
528 
529 void TypePrinter::printTypedef(const TypedefType *T, std::string &S) {
530   printTypeSpec(T->getDecl(), S);
531 }
532 
533 void TypePrinter::printTypeOfExpr(const TypeOfExprType *T, std::string &S) {
534   if (!S.empty())    // Prefix the basic type, e.g. 'typeof(e) X'.
535     S = ' ' + S;
536   std::string Str;
537   llvm::raw_string_ostream s(Str);
538   T->getUnderlyingExpr()->printPretty(s, 0, Policy);
539   S = "typeof " + s.str() + S;
540 }
541 
542 void TypePrinter::printTypeOf(const TypeOfType *T, std::string &S) {
543   if (!S.empty())    // Prefix the basic type, e.g. 'typeof(t) X'.
544     S = ' ' + S;
545   std::string Tmp;
546   print(T->getUnderlyingType(), Tmp);
547   S = "typeof(" + Tmp + ")" + S;
548 }
549 
550 void TypePrinter::printDecltype(const DecltypeType *T, std::string &S) {
551   if (!S.empty())    // Prefix the basic type, e.g. 'decltype(t) X'.
552     S = ' ' + S;
553   std::string Str;
554   llvm::raw_string_ostream s(Str);
555   T->getUnderlyingExpr()->printPretty(s, 0, Policy);
556   S = "decltype(" + s.str() + ")" + S;
557 }
558 
559 void TypePrinter::printUnaryTransform(const UnaryTransformType *T,
560                                            std::string &S) {
561   if (!S.empty())
562     S = ' ' + S;
563   std::string Str;
564   IncludeStrongLifetimeRAII Strong(Policy);
565   print(T->getBaseType(), Str);
566 
567   switch (T->getUTTKind()) {
568     case UnaryTransformType::EnumUnderlyingType:
569       S = "__underlying_type(" + Str + ")" + S;
570       break;
571   }
572 }
573 
574 void TypePrinter::printAuto(const AutoType *T, std::string &S) {
575   // If the type has been deduced, do not print 'auto'.
576   if (T->isDeduced()) {
577     print(T->getDeducedType(), S);
578   } else {
579     if (!S.empty())    // Prefix the basic type, e.g. 'auto X'.
580       S = ' ' + S;
581     S = "auto" + S;
582   }
583 }
584 
585 void TypePrinter::printAtomic(const AtomicType *T, std::string &S) {
586   if (!S.empty())
587     S = ' ' + S;
588   std::string Str;
589   IncludeStrongLifetimeRAII Strong(Policy);
590   print(T->getValueType(), Str);
591 
592   S = "_Atomic(" + Str + ")" + S;
593 }
594 
595 /// Appends the given scope to the end of a string.
596 void TypePrinter::AppendScope(DeclContext *DC, std::string &Buffer) {
597   if (DC->isTranslationUnit()) return;
598   AppendScope(DC->getParent(), Buffer);
599 
600   unsigned OldSize = Buffer.size();
601 
602   if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
603     if (Policy.SuppressUnwrittenScope &&
604         (NS->isAnonymousNamespace() || NS->isInline()))
605       return;
606     if (NS->getIdentifier())
607       Buffer += NS->getNameAsString();
608     else
609       Buffer += "<anonymous>";
610   } else if (ClassTemplateSpecializationDecl *Spec
611                = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
612     IncludeStrongLifetimeRAII Strong(Policy);
613     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
614     std::string TemplateArgsStr
615       = TemplateSpecializationType::PrintTemplateArgumentList(
616                                             TemplateArgs.data(),
617                                             TemplateArgs.size(),
618                                             Policy);
619     Buffer += Spec->getIdentifier()->getName();
620     Buffer += TemplateArgsStr;
621   } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
622     if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
623       Buffer += Typedef->getIdentifier()->getName();
624     else if (Tag->getIdentifier())
625       Buffer += Tag->getIdentifier()->getName();
626     else
627       return;
628   }
629 
630   if (Buffer.size() != OldSize)
631     Buffer += "::";
632 }
633 
634 void TypePrinter::printTag(TagDecl *D, std::string &InnerString) {
635   if (Policy.SuppressTag)
636     return;
637 
638   std::string Buffer;
639   bool HasKindDecoration = false;
640 
641   // bool SuppressTagKeyword
642   //   = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword;
643 
644   // We don't print tags unless this is an elaborated type.
645   // In C, we just assume every RecordType is an elaborated type.
646   if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword ||
647         D->getTypedefNameForAnonDecl())) {
648     HasKindDecoration = true;
649     Buffer += D->getKindName();
650     Buffer += ' ';
651   }
652 
653   // Compute the full nested-name-specifier for this type.
654   // In C, this will always be empty except when the type
655   // being printed is anonymous within other Record.
656   if (!Policy.SuppressScope)
657     AppendScope(D->getDeclContext(), Buffer);
658 
659   if (const IdentifierInfo *II = D->getIdentifier())
660     Buffer += II->getNameStart();
661   else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
662     assert(Typedef->getIdentifier() && "Typedef without identifier?");
663     Buffer += Typedef->getIdentifier()->getNameStart();
664   } else {
665     // Make an unambiguous representation for anonymous types, e.g.
666     //   <anonymous enum at /usr/include/string.h:120:9>
667     llvm::raw_string_ostream OS(Buffer);
668     OS << "<anonymous";
669 
670     if (Policy.AnonymousTagLocations) {
671       // Suppress the redundant tag keyword if we just printed one.
672       // We don't have to worry about ElaboratedTypes here because you can't
673       // refer to an anonymous type with one.
674       if (!HasKindDecoration)
675         OS << " " << D->getKindName();
676 
677       PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
678           D->getLocation());
679       if (PLoc.isValid()) {
680         OS << " at " << PLoc.getFilename()
681            << ':' << PLoc.getLine()
682            << ':' << PLoc.getColumn();
683       }
684     }
685 
686     OS << '>';
687   }
688 
689   // If this is a class template specialization, print the template
690   // arguments.
691   if (ClassTemplateSpecializationDecl *Spec
692         = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
693     const TemplateArgument *Args;
694     unsigned NumArgs;
695     if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
696       const TemplateSpecializationType *TST =
697         cast<TemplateSpecializationType>(TAW->getType());
698       Args = TST->getArgs();
699       NumArgs = TST->getNumArgs();
700     } else {
701       const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
702       Args = TemplateArgs.data();
703       NumArgs = TemplateArgs.size();
704     }
705     IncludeStrongLifetimeRAII Strong(Policy);
706     Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args,
707                                                                     NumArgs,
708                                                                     Policy);
709   }
710 
711   if (!InnerString.empty()) {
712     Buffer += ' ';
713     Buffer += InnerString;
714   }
715 
716   std::swap(Buffer, InnerString);
717 }
718 
719 void TypePrinter::printRecord(const RecordType *T, std::string &S) {
720   printTag(T->getDecl(), S);
721 }
722 
723 void TypePrinter::printEnum(const EnumType *T, std::string &S) {
724   printTag(T->getDecl(), S);
725 }
726 
727 void TypePrinter::printTemplateTypeParm(const TemplateTypeParmType *T,
728                                         std::string &S) {
729   if (!S.empty())    // Prefix the basic type, e.g. 'parmname X'.
730     S = ' ' + S;
731 
732   if (IdentifierInfo *Id = T->getIdentifier())
733     S = Id->getName().str() + S;
734   else
735     S = "type-parameter-" + llvm::utostr_32(T->getDepth()) + '-' +
736         llvm::utostr_32(T->getIndex()) + S;
737 }
738 
739 void TypePrinter::printSubstTemplateTypeParm(const SubstTemplateTypeParmType *T,
740                                              std::string &S) {
741   IncludeStrongLifetimeRAII Strong(Policy);
742   print(T->getReplacementType(), S);
743 }
744 
745 void TypePrinter::printSubstTemplateTypeParmPack(
746                                         const SubstTemplateTypeParmPackType *T,
747                                              std::string &S) {
748   IncludeStrongLifetimeRAII Strong(Policy);
749   printTemplateTypeParm(T->getReplacedParameter(), S);
750 }
751 
752 void TypePrinter::printTemplateSpecialization(
753                                             const TemplateSpecializationType *T,
754                                               std::string &S) {
755   IncludeStrongLifetimeRAII Strong(Policy);
756   std::string SpecString;
757 
758   {
759     llvm::raw_string_ostream OS(SpecString);
760     T->getTemplateName().print(OS, Policy);
761   }
762 
763   SpecString += TemplateSpecializationType::PrintTemplateArgumentList(
764                                                                   T->getArgs(),
765                                                                 T->getNumArgs(),
766                                                                       Policy);
767   if (S.empty())
768     S.swap(SpecString);
769   else
770     S = SpecString + ' ' + S;
771 }
772 
773 void TypePrinter::printInjectedClassName(const InjectedClassNameType *T,
774                                          std::string &S) {
775   printTemplateSpecialization(T->getInjectedTST(), S);
776 }
777 
778 void TypePrinter::printElaborated(const ElaboratedType *T, std::string &S) {
779   std::string MyString;
780 
781   {
782     llvm::raw_string_ostream OS(MyString);
783     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
784     if (T->getKeyword() != ETK_None)
785       OS << " ";
786     NestedNameSpecifier* Qualifier = T->getQualifier();
787     if (Qualifier)
788       Qualifier->print(OS, Policy);
789   }
790 
791   std::string TypeStr;
792   PrintingPolicy InnerPolicy(Policy);
793   InnerPolicy.SuppressTagKeyword = true;
794   InnerPolicy.SuppressScope = true;
795   TypePrinter(InnerPolicy).print(T->getNamedType(), TypeStr);
796 
797   MyString += TypeStr;
798   if (S.empty())
799     S.swap(MyString);
800   else
801     S = MyString + ' ' + S;
802 }
803 
804 void TypePrinter::printParen(const ParenType *T, std::string &S) {
805   if (!S.empty() && !isa<FunctionType>(T->getInnerType()))
806     S = '(' + S + ')';
807   print(T->getInnerType(), S);
808 }
809 
810 void TypePrinter::printDependentName(const DependentNameType *T, std::string &S) {
811   std::string MyString;
812 
813   {
814     llvm::raw_string_ostream OS(MyString);
815     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
816     if (T->getKeyword() != ETK_None)
817       OS << " ";
818 
819     T->getQualifier()->print(OS, Policy);
820 
821     OS << T->getIdentifier()->getName();
822   }
823 
824   if (S.empty())
825     S.swap(MyString);
826   else
827     S = MyString + ' ' + S;
828 }
829 
830 void TypePrinter::printDependentTemplateSpecialization(
831         const DependentTemplateSpecializationType *T, std::string &S) {
832   IncludeStrongLifetimeRAII Strong(Policy);
833   std::string MyString;
834   {
835     llvm::raw_string_ostream OS(MyString);
836 
837     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
838     if (T->getKeyword() != ETK_None)
839       OS << " ";
840 
841     if (T->getQualifier())
842       T->getQualifier()->print(OS, Policy);
843     OS << T->getIdentifier()->getName();
844     OS << TemplateSpecializationType::PrintTemplateArgumentList(
845                                                             T->getArgs(),
846                                                             T->getNumArgs(),
847                                                             Policy);
848   }
849 
850   if (S.empty())
851     S.swap(MyString);
852   else
853     S = MyString + ' ' + S;
854 }
855 
856 void TypePrinter::printPackExpansion(const PackExpansionType *T,
857                                      std::string &S) {
858   print(T->getPattern(), S);
859   S += "...";
860 }
861 
862 void TypePrinter::printAttributed(const AttributedType *T,
863                                   std::string &S) {
864   // Prefer the macro forms of the GC and ownership qualifiers.
865   if (T->getAttrKind() == AttributedType::attr_objc_gc ||
866       T->getAttrKind() == AttributedType::attr_objc_ownership)
867     return print(T->getEquivalentType(), S);
868 
869   print(T->getModifiedType(), S);
870 
871   // TODO: not all attributes are GCC-style attributes.
872   S += " __attribute__((";
873   switch (T->getAttrKind()) {
874   case AttributedType::attr_address_space:
875     S += "address_space(";
876     S += T->getEquivalentType().getAddressSpace();
877     S += ")";
878     break;
879 
880   case AttributedType::attr_vector_size: {
881     S += "__vector_size__(";
882     if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) {
883       S += vector->getNumElements();
884       S += " * sizeof(";
885 
886       std::string tmp;
887       print(vector->getElementType(), tmp);
888       S += tmp;
889       S += ")";
890     }
891     S += ")";
892     break;
893   }
894 
895   case AttributedType::attr_neon_vector_type:
896   case AttributedType::attr_neon_polyvector_type: {
897     if (T->getAttrKind() == AttributedType::attr_neon_vector_type)
898       S += "neon_vector_type(";
899     else
900       S += "neon_polyvector_type(";
901     const VectorType *vector = T->getEquivalentType()->getAs<VectorType>();
902     S += llvm::utostr_32(vector->getNumElements());
903     S += ")";
904     break;
905   }
906 
907   case AttributedType::attr_regparm: {
908     S += "regparm(";
909     QualType t = T->getEquivalentType();
910     while (!t->isFunctionType())
911       t = t->getPointeeType();
912     S += t->getAs<FunctionType>()->getRegParmType();
913     S += ")";
914     break;
915   }
916 
917   case AttributedType::attr_objc_gc: {
918     S += "objc_gc(";
919 
920     QualType tmp = T->getEquivalentType();
921     while (tmp.getObjCGCAttr() == Qualifiers::GCNone) {
922       QualType next = tmp->getPointeeType();
923       if (next == tmp) break;
924       tmp = next;
925     }
926 
927     if (tmp.isObjCGCWeak())
928       S += "weak";
929     else
930       S += "strong";
931     S += ")";
932     break;
933   }
934 
935   case AttributedType::attr_objc_ownership:
936     S += "objc_ownership(";
937     switch (T->getEquivalentType().getObjCLifetime()) {
938     case Qualifiers::OCL_None: llvm_unreachable("no ownership!"); break;
939     case Qualifiers::OCL_ExplicitNone: S += "none"; break;
940     case Qualifiers::OCL_Strong: S += "strong"; break;
941     case Qualifiers::OCL_Weak: S += "weak"; break;
942     case Qualifiers::OCL_Autoreleasing: S += "autoreleasing"; break;
943     }
944     S += ")";
945     break;
946 
947   case AttributedType::attr_noreturn: S += "noreturn"; break;
948   case AttributedType::attr_cdecl: S += "cdecl"; break;
949   case AttributedType::attr_fastcall: S += "fastcall"; break;
950   case AttributedType::attr_stdcall: S += "stdcall"; break;
951   case AttributedType::attr_thiscall: S += "thiscall"; break;
952   case AttributedType::attr_pascal: S += "pascal"; break;
953   case AttributedType::attr_pcs: {
954    S += "pcs(";
955    QualType t = T->getEquivalentType();
956    while (!t->isFunctionType())
957      t = t->getPointeeType();
958    S += (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
959          "\"aapcs\"" : "\"aapcs-vfp\"");
960    S += ")";
961    break;
962   }
963   }
964   S += "))";
965 }
966 
967 void TypePrinter::printObjCInterface(const ObjCInterfaceType *T,
968                                      std::string &S) {
969   if (!S.empty())    // Prefix the basic type, e.g. 'typedefname X'.
970     S = ' ' + S;
971 
972   std::string ObjCQIString = T->getDecl()->getNameAsString();
973   S = ObjCQIString + S;
974 }
975 
976 void TypePrinter::printObjCObject(const ObjCObjectType *T,
977                                   std::string &S) {
978   if (T->qual_empty())
979     return print(T->getBaseType(), S);
980 
981   std::string tmp;
982   print(T->getBaseType(), tmp);
983   tmp += '<';
984   bool isFirst = true;
985   for (ObjCObjectType::qual_iterator
986          I = T->qual_begin(), E = T->qual_end(); I != E; ++I) {
987     if (isFirst)
988       isFirst = false;
989     else
990       tmp += ',';
991     tmp += (*I)->getNameAsString();
992   }
993   tmp += '>';
994 
995   if (!S.empty()) {
996     tmp += ' ';
997     tmp += S;
998   }
999   std::swap(tmp, S);
1000 }
1001 
1002 void TypePrinter::printObjCObjectPointer(const ObjCObjectPointerType *T,
1003                                          std::string &S) {
1004   std::string ObjCQIString;
1005 
1006   T->getPointeeType().getLocalQualifiers().getAsStringInternal(ObjCQIString,
1007                                                                Policy);
1008   if (!ObjCQIString.empty())
1009     ObjCQIString += ' ';
1010 
1011   if (T->isObjCIdType() || T->isObjCQualifiedIdType())
1012     ObjCQIString += "id";
1013   else if (T->isObjCClassType() || T->isObjCQualifiedClassType())
1014     ObjCQIString += "Class";
1015   else if (T->isObjCSelType())
1016     ObjCQIString += "SEL";
1017   else
1018     ObjCQIString += T->getInterfaceDecl()->getNameAsString();
1019 
1020   if (!T->qual_empty()) {
1021     ObjCQIString += '<';
1022     for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(),
1023                                               E = T->qual_end();
1024          I != E; ++I) {
1025       ObjCQIString += (*I)->getNameAsString();
1026       if (I+1 != E)
1027         ObjCQIString += ',';
1028     }
1029     ObjCQIString += '>';
1030   }
1031 
1032   if (!T->isObjCIdType() && !T->isObjCQualifiedIdType())
1033     ObjCQIString += " *"; // Don't forget the implicit pointer.
1034   else if (!S.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1035     S = ' ' + S;
1036 
1037   S = ObjCQIString + S;
1038 }
1039 
1040 std::string TemplateSpecializationType::
1041   PrintTemplateArgumentList(const TemplateArgumentListInfo &Args,
1042                             const PrintingPolicy &Policy) {
1043   return PrintTemplateArgumentList(Args.getArgumentArray(),
1044                                    Args.size(),
1045                                    Policy);
1046 }
1047 
1048 std::string
1049 TemplateSpecializationType::PrintTemplateArgumentList(
1050                                                 const TemplateArgument *Args,
1051                                                 unsigned NumArgs,
1052                                                   const PrintingPolicy &Policy,
1053                                                       bool SkipBrackets) {
1054   std::string SpecString;
1055   if (!SkipBrackets)
1056     SpecString += '<';
1057 
1058   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1059     if (SpecString.size() > unsigned(!SkipBrackets))
1060       SpecString += ", ";
1061 
1062     // Print the argument into a string.
1063     std::string ArgString;
1064     if (Args[Arg].getKind() == TemplateArgument::Pack) {
1065       ArgString = PrintTemplateArgumentList(Args[Arg].pack_begin(),
1066                                             Args[Arg].pack_size(),
1067                                             Policy, true);
1068     } else {
1069       llvm::raw_string_ostream ArgOut(ArgString);
1070       Args[Arg].print(Policy, ArgOut);
1071     }
1072 
1073     // If this is the first argument and its string representation
1074     // begins with the global scope specifier ('::foo'), add a space
1075     // to avoid printing the diagraph '<:'.
1076     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1077       SpecString += ' ';
1078 
1079     SpecString += ArgString;
1080   }
1081 
1082   // If the last character of our string is '>', add another space to
1083   // keep the two '>''s separate tokens. We don't *have* to do this in
1084   // C++0x, but it's still good hygiene.
1085   if (!SpecString.empty() && SpecString[SpecString.size() - 1] == '>')
1086     SpecString += ' ';
1087 
1088   if (!SkipBrackets)
1089     SpecString += '>';
1090 
1091   return SpecString;
1092 }
1093 
1094 // Sadly, repeat all that with TemplateArgLoc.
1095 std::string TemplateSpecializationType::
1096 PrintTemplateArgumentList(const TemplateArgumentLoc *Args, unsigned NumArgs,
1097                           const PrintingPolicy &Policy) {
1098   std::string SpecString;
1099   SpecString += '<';
1100   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1101     if (SpecString.size() > 1)
1102       SpecString += ", ";
1103 
1104     // Print the argument into a string.
1105     std::string ArgString;
1106     if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1107       ArgString = PrintTemplateArgumentList(
1108                                            Args[Arg].getArgument().pack_begin(),
1109                                             Args[Arg].getArgument().pack_size(),
1110                                             Policy, true);
1111     } else {
1112       llvm::raw_string_ostream ArgOut(ArgString);
1113       Args[Arg].getArgument().print(Policy, ArgOut);
1114     }
1115 
1116     // If this is the first argument and its string representation
1117     // begins with the global scope specifier ('::foo'), add a space
1118     // to avoid printing the diagraph '<:'.
1119     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1120       SpecString += ' ';
1121 
1122     SpecString += ArgString;
1123   }
1124 
1125   // If the last character of our string is '>', add another space to
1126   // keep the two '>''s separate tokens. We don't *have* to do this in
1127   // C++0x, but it's still good hygiene.
1128   if (SpecString[SpecString.size() - 1] == '>')
1129     SpecString += ' ';
1130 
1131   SpecString += '>';
1132 
1133   return SpecString;
1134 }
1135 
1136 void QualType::dump(const char *msg) const {
1137   std::string R = "identifier";
1138   LangOptions LO;
1139   getAsStringInternal(R, PrintingPolicy(LO));
1140   if (msg)
1141     llvm::errs() << msg << ": ";
1142   llvm::errs() << R << "\n";
1143 }
1144 void QualType::dump() const {
1145   dump("");
1146 }
1147 
1148 void Type::dump() const {
1149   QualType(this, 0).dump();
1150 }
1151 
1152 std::string Qualifiers::getAsString() const {
1153   LangOptions LO;
1154   return getAsString(PrintingPolicy(LO));
1155 }
1156 
1157 // Appends qualifiers to the given string, separated by spaces.  Will
1158 // prefix a space if the string is non-empty.  Will not append a final
1159 // space.
1160 void Qualifiers::getAsStringInternal(std::string &S,
1161                                      const PrintingPolicy& Policy) const {
1162   AppendTypeQualList(S, getCVRQualifiers());
1163   if (unsigned addrspace = getAddressSpace()) {
1164     if (!S.empty()) S += ' ';
1165     switch (addrspace) {
1166       case LangAS::opencl_global:
1167         S += "__global";
1168         break;
1169       case LangAS::opencl_local:
1170         S += "__local";
1171         break;
1172       case LangAS::opencl_constant:
1173         S += "__constant";
1174         break;
1175       default:
1176         S += "__attribute__((address_space(";
1177         S += llvm::utostr_32(addrspace);
1178         S += ")))";
1179     }
1180   }
1181   if (Qualifiers::GC gc = getObjCGCAttr()) {
1182     if (!S.empty()) S += ' ';
1183     if (gc == Qualifiers::Weak)
1184       S += "__weak";
1185     else
1186       S += "__strong";
1187   }
1188   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
1189     if (!S.empty() &&
1190         !(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
1191       S += ' ';
1192 
1193     switch (lifetime) {
1194     case Qualifiers::OCL_None: llvm_unreachable("none but true");
1195     case Qualifiers::OCL_ExplicitNone: S += "__unsafe_unretained"; break;
1196     case Qualifiers::OCL_Strong:
1197       if (!Policy.SuppressStrongLifetime)
1198         S += "__strong";
1199       break;
1200 
1201     case Qualifiers::OCL_Weak: S += "__weak"; break;
1202     case Qualifiers::OCL_Autoreleasing: S += "__autoreleasing"; break;
1203     }
1204   }
1205 }
1206 
1207 std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
1208   std::string buffer;
1209   LangOptions options;
1210   getAsStringInternal(ty, qs, buffer, PrintingPolicy(options));
1211   return buffer;
1212 }
1213 
1214 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1215                                    std::string &buffer,
1216                                    const PrintingPolicy &policy) {
1217   TypePrinter(policy).print(ty, qs, buffer);
1218 }
1219