]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / lib / AST / TypePrinter.cpp
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 (NS->getIdentifier())
604       Buffer += NS->getNameAsString();
605     else
606       Buffer += "<anonymous>";
607   } else if (ClassTemplateSpecializationDecl *Spec
608                = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
609     IncludeStrongLifetimeRAII Strong(Policy);
610     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
611     std::string TemplateArgsStr
612       = TemplateSpecializationType::PrintTemplateArgumentList(
613                                             TemplateArgs.data(),
614                                             TemplateArgs.size(),
615                                             Policy);
616     Buffer += Spec->getIdentifier()->getName();
617     Buffer += TemplateArgsStr;
618   } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
619     if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
620       Buffer += Typedef->getIdentifier()->getName();
621     else if (Tag->getIdentifier())
622       Buffer += Tag->getIdentifier()->getName();
623   }
624
625   if (Buffer.size() != OldSize)
626     Buffer += "::";
627 }
628
629 void TypePrinter::printTag(TagDecl *D, std::string &InnerString) {
630   if (Policy.SuppressTag)
631     return;
632
633   std::string Buffer;
634   bool HasKindDecoration = false;
635
636   // bool SuppressTagKeyword
637   //   = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword;
638
639   // We don't print tags unless this is an elaborated type.
640   // In C, we just assume every RecordType is an elaborated type.
641   if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword ||
642         D->getTypedefNameForAnonDecl())) {
643     HasKindDecoration = true;
644     Buffer += D->getKindName();
645     Buffer += ' ';
646   }
647
648   // Compute the full nested-name-specifier for this type.
649   // In C, this will always be empty except when the type
650   // being printed is anonymous within other Record.
651   if (!Policy.SuppressScope)
652     AppendScope(D->getDeclContext(), Buffer);
653
654   if (const IdentifierInfo *II = D->getIdentifier())
655     Buffer += II->getNameStart();
656   else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
657     assert(Typedef->getIdentifier() && "Typedef without identifier?");
658     Buffer += Typedef->getIdentifier()->getNameStart();
659   } else {
660     // Make an unambiguous representation for anonymous types, e.g.
661     //   <anonymous enum at /usr/include/string.h:120:9>
662     llvm::raw_string_ostream OS(Buffer);
663     OS << "<anonymous";
664
665     if (Policy.AnonymousTagLocations) {
666       // Suppress the redundant tag keyword if we just printed one.
667       // We don't have to worry about ElaboratedTypes here because you can't
668       // refer to an anonymous type with one.
669       if (!HasKindDecoration)
670         OS << " " << D->getKindName();
671
672       PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
673           D->getLocation());
674       if (PLoc.isValid()) {
675         OS << " at " << PLoc.getFilename()
676            << ':' << PLoc.getLine()
677            << ':' << PLoc.getColumn();
678       }
679     }
680     
681     OS << '>';
682   }
683
684   // If this is a class template specialization, print the template
685   // arguments.
686   if (ClassTemplateSpecializationDecl *Spec
687         = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
688     const TemplateArgument *Args;
689     unsigned NumArgs;
690     if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
691       const TemplateSpecializationType *TST =
692         cast<TemplateSpecializationType>(TAW->getType());
693       Args = TST->getArgs();
694       NumArgs = TST->getNumArgs();
695     } else {
696       const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
697       Args = TemplateArgs.data();
698       NumArgs = TemplateArgs.size();
699     }
700     IncludeStrongLifetimeRAII Strong(Policy);
701     Buffer += TemplateSpecializationType::PrintTemplateArgumentList(Args,
702                                                                     NumArgs,
703                                                                     Policy);
704   }
705
706   if (!InnerString.empty()) {
707     Buffer += ' ';
708     Buffer += InnerString;
709   }
710
711   std::swap(Buffer, InnerString);
712 }
713
714 void TypePrinter::printRecord(const RecordType *T, std::string &S) {
715   printTag(T->getDecl(), S);
716 }
717
718 void TypePrinter::printEnum(const EnumType *T, std::string &S) { 
719   printTag(T->getDecl(), S);
720 }
721
722 void TypePrinter::printTemplateTypeParm(const TemplateTypeParmType *T, 
723                                         std::string &S) { 
724   if (!S.empty())    // Prefix the basic type, e.g. 'parmname X'.
725     S = ' ' + S;
726
727   if (IdentifierInfo *Id = T->getIdentifier())
728     S = Id->getName().str() + S;
729   else
730     S = "type-parameter-" + llvm::utostr_32(T->getDepth()) + '-' +
731         llvm::utostr_32(T->getIndex()) + S;
732 }
733
734 void TypePrinter::printSubstTemplateTypeParm(const SubstTemplateTypeParmType *T, 
735                                              std::string &S) { 
736   IncludeStrongLifetimeRAII Strong(Policy);
737   print(T->getReplacementType(), S);
738 }
739
740 void TypePrinter::printSubstTemplateTypeParmPack(
741                                         const SubstTemplateTypeParmPackType *T, 
742                                              std::string &S) { 
743   IncludeStrongLifetimeRAII Strong(Policy);
744   printTemplateTypeParm(T->getReplacedParameter(), S);
745 }
746
747 void TypePrinter::printTemplateSpecialization(
748                                             const TemplateSpecializationType *T, 
749                                               std::string &S) { 
750   IncludeStrongLifetimeRAII Strong(Policy);
751   std::string SpecString;
752   
753   {
754     llvm::raw_string_ostream OS(SpecString);
755     T->getTemplateName().print(OS, Policy);
756   }
757   
758   SpecString += TemplateSpecializationType::PrintTemplateArgumentList(
759                                                                   T->getArgs(), 
760                                                                 T->getNumArgs(), 
761                                                                       Policy);
762   if (S.empty())
763     S.swap(SpecString);
764   else
765     S = SpecString + ' ' + S;
766 }
767
768 void TypePrinter::printInjectedClassName(const InjectedClassNameType *T,
769                                          std::string &S) {
770   printTemplateSpecialization(T->getInjectedTST(), S);
771 }
772
773 void TypePrinter::printElaborated(const ElaboratedType *T, std::string &S) {
774   std::string MyString;
775   
776   {
777     llvm::raw_string_ostream OS(MyString);
778     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
779     if (T->getKeyword() != ETK_None)
780       OS << " ";
781     NestedNameSpecifier* Qualifier = T->getQualifier();
782     if (Qualifier)
783       Qualifier->print(OS, Policy);
784   }
785   
786   std::string TypeStr;
787   PrintingPolicy InnerPolicy(Policy);
788   InnerPolicy.SuppressTagKeyword = true;
789   InnerPolicy.SuppressScope = true;
790   TypePrinter(InnerPolicy).print(T->getNamedType(), TypeStr);
791   
792   MyString += TypeStr;
793   if (S.empty())
794     S.swap(MyString);
795   else
796     S = MyString + ' ' + S;  
797 }
798
799 void TypePrinter::printParen(const ParenType *T, std::string &S) {
800   if (!S.empty() && !isa<FunctionType>(T->getInnerType()))
801     S = '(' + S + ')';
802   print(T->getInnerType(), S);
803 }
804
805 void TypePrinter::printDependentName(const DependentNameType *T, std::string &S) { 
806   std::string MyString;
807   
808   {
809     llvm::raw_string_ostream OS(MyString);
810     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
811     if (T->getKeyword() != ETK_None)
812       OS << " ";
813     
814     T->getQualifier()->print(OS, Policy);
815     
816     OS << T->getIdentifier()->getName();
817   }
818   
819   if (S.empty())
820     S.swap(MyString);
821   else
822     S = MyString + ' ' + S;
823 }
824
825 void TypePrinter::printDependentTemplateSpecialization(
826         const DependentTemplateSpecializationType *T, std::string &S) { 
827   IncludeStrongLifetimeRAII Strong(Policy);
828   std::string MyString;
829   {
830     llvm::raw_string_ostream OS(MyString);
831   
832     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
833     if (T->getKeyword() != ETK_None)
834       OS << " ";
835     
836     if (T->getQualifier())
837       T->getQualifier()->print(OS, Policy);    
838     OS << T->getIdentifier()->getName();
839     OS << TemplateSpecializationType::PrintTemplateArgumentList(
840                                                             T->getArgs(),
841                                                             T->getNumArgs(),
842                                                             Policy);
843   }
844   
845   if (S.empty())
846     S.swap(MyString);
847   else
848     S = MyString + ' ' + S;
849 }
850
851 void TypePrinter::printPackExpansion(const PackExpansionType *T, 
852                                      std::string &S) {
853   print(T->getPattern(), S);
854   S += "...";
855 }
856
857 void TypePrinter::printAttributed(const AttributedType *T,
858                                   std::string &S) {
859   // Prefer the macro forms of the GC and ownership qualifiers.
860   if (T->getAttrKind() == AttributedType::attr_objc_gc ||
861       T->getAttrKind() == AttributedType::attr_objc_ownership)
862     return print(T->getEquivalentType(), S);
863
864   print(T->getModifiedType(), S);
865
866   // TODO: not all attributes are GCC-style attributes.
867   S += " __attribute__((";
868   switch (T->getAttrKind()) {
869   case AttributedType::attr_address_space:
870     S += "address_space(";
871     S += T->getEquivalentType().getAddressSpace();
872     S += ")";
873     break;
874
875   case AttributedType::attr_vector_size: {
876     S += "__vector_size__(";
877     if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) {
878       S += vector->getNumElements();
879       S += " * sizeof(";
880
881       std::string tmp;
882       print(vector->getElementType(), tmp);
883       S += tmp;
884       S += ")";
885     }
886     S += ")";
887     break;
888   }
889
890   case AttributedType::attr_neon_vector_type:
891   case AttributedType::attr_neon_polyvector_type: {
892     if (T->getAttrKind() == AttributedType::attr_neon_vector_type)
893       S += "neon_vector_type(";
894     else
895       S += "neon_polyvector_type(";
896     const VectorType *vector = T->getEquivalentType()->getAs<VectorType>();
897     S += llvm::utostr_32(vector->getNumElements());
898     S += ")";
899     break;
900   }
901
902   case AttributedType::attr_regparm: {
903     S += "regparm(";
904     QualType t = T->getEquivalentType();
905     while (!t->isFunctionType())
906       t = t->getPointeeType();
907     S += t->getAs<FunctionType>()->getRegParmType();
908     S += ")";
909     break;
910   }
911
912   case AttributedType::attr_objc_gc: {
913     S += "objc_gc(";
914
915     QualType tmp = T->getEquivalentType();
916     while (tmp.getObjCGCAttr() == Qualifiers::GCNone) {
917       QualType next = tmp->getPointeeType();
918       if (next == tmp) break;
919       tmp = next;
920     }
921
922     if (tmp.isObjCGCWeak())
923       S += "weak";
924     else
925       S += "strong";
926     S += ")";
927     break;
928   }
929
930   case AttributedType::attr_objc_ownership:
931     S += "objc_ownership(";
932     switch (T->getEquivalentType().getObjCLifetime()) {
933     case Qualifiers::OCL_None: llvm_unreachable("no ownership!"); break;
934     case Qualifiers::OCL_ExplicitNone: S += "none"; break;
935     case Qualifiers::OCL_Strong: S += "strong"; break;
936     case Qualifiers::OCL_Weak: S += "weak"; break;
937     case Qualifiers::OCL_Autoreleasing: S += "autoreleasing"; break;
938     }
939     S += ")";
940     break;
941
942   case AttributedType::attr_noreturn: S += "noreturn"; break;
943   case AttributedType::attr_cdecl: S += "cdecl"; break;
944   case AttributedType::attr_fastcall: S += "fastcall"; break;
945   case AttributedType::attr_stdcall: S += "stdcall"; break;
946   case AttributedType::attr_thiscall: S += "thiscall"; break;
947   case AttributedType::attr_pascal: S += "pascal"; break;
948   case AttributedType::attr_pcs: {
949    S += "pcs(";
950    QualType t = T->getEquivalentType();
951    while (!t->isFunctionType())
952      t = t->getPointeeType();
953    S += (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
954          "\"aapcs\"" : "\"aapcs-vfp\"");
955    S += ")";
956    break;
957   }
958   }
959   S += "))";
960 }
961
962 void TypePrinter::printObjCInterface(const ObjCInterfaceType *T, 
963                                      std::string &S) { 
964   if (!S.empty())    // Prefix the basic type, e.g. 'typedefname X'.
965     S = ' ' + S;
966
967   std::string ObjCQIString = T->getDecl()->getNameAsString();
968   S = ObjCQIString + S;
969 }
970
971 void TypePrinter::printObjCObject(const ObjCObjectType *T,
972                                   std::string &S) {
973   if (T->qual_empty())
974     return print(T->getBaseType(), S);
975
976   std::string tmp;
977   print(T->getBaseType(), tmp);
978   tmp += '<';
979   bool isFirst = true;
980   for (ObjCObjectType::qual_iterator
981          I = T->qual_begin(), E = T->qual_end(); I != E; ++I) {
982     if (isFirst)
983       isFirst = false;
984     else
985       tmp += ',';
986     tmp += (*I)->getNameAsString();
987   }
988   tmp += '>';
989
990   if (!S.empty()) {
991     tmp += ' ';
992     tmp += S;
993   }
994   std::swap(tmp, S);
995 }
996
997 void TypePrinter::printObjCObjectPointer(const ObjCObjectPointerType *T, 
998                                          std::string &S) { 
999   std::string ObjCQIString;
1000   
1001   T->getPointeeType().getLocalQualifiers().getAsStringInternal(ObjCQIString, 
1002                                                                Policy);
1003   if (!ObjCQIString.empty())
1004     ObjCQIString += ' ';
1005     
1006   if (T->isObjCIdType() || T->isObjCQualifiedIdType())
1007     ObjCQIString += "id";
1008   else if (T->isObjCClassType() || T->isObjCQualifiedClassType())
1009     ObjCQIString += "Class";
1010   else if (T->isObjCSelType())
1011     ObjCQIString += "SEL";
1012   else
1013     ObjCQIString += T->getInterfaceDecl()->getNameAsString();
1014   
1015   if (!T->qual_empty()) {
1016     ObjCQIString += '<';
1017     for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(), 
1018                                               E = T->qual_end();
1019          I != E; ++I) {
1020       ObjCQIString += (*I)->getNameAsString();
1021       if (I+1 != E)
1022         ObjCQIString += ',';
1023     }
1024     ObjCQIString += '>';
1025   }
1026   
1027   if (!T->isObjCIdType() && !T->isObjCQualifiedIdType())
1028     ObjCQIString += " *"; // Don't forget the implicit pointer.
1029   else if (!S.empty()) // Prefix the basic type, e.g. 'typedefname X'.
1030     S = ' ' + S;
1031   
1032   S = ObjCQIString + S;  
1033 }
1034
1035 std::string TemplateSpecializationType::
1036   PrintTemplateArgumentList(const TemplateArgumentListInfo &Args,
1037                             const PrintingPolicy &Policy) {
1038   return PrintTemplateArgumentList(Args.getArgumentArray(),
1039                                    Args.size(),
1040                                    Policy);
1041 }
1042
1043 std::string
1044 TemplateSpecializationType::PrintTemplateArgumentList(
1045                                                 const TemplateArgument *Args,
1046                                                 unsigned NumArgs,
1047                                                   const PrintingPolicy &Policy,
1048                                                       bool SkipBrackets) {
1049   std::string SpecString;
1050   if (!SkipBrackets)
1051     SpecString += '<';
1052   
1053   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1054     if (SpecString.size() > unsigned(!SkipBrackets))
1055       SpecString += ", ";
1056     
1057     // Print the argument into a string.
1058     std::string ArgString;
1059     if (Args[Arg].getKind() == TemplateArgument::Pack) {
1060       ArgString = PrintTemplateArgumentList(Args[Arg].pack_begin(), 
1061                                             Args[Arg].pack_size(), 
1062                                             Policy, true);
1063     } else {
1064       llvm::raw_string_ostream ArgOut(ArgString);
1065       Args[Arg].print(Policy, ArgOut);
1066     }
1067    
1068     // If this is the first argument and its string representation
1069     // begins with the global scope specifier ('::foo'), add a space
1070     // to avoid printing the diagraph '<:'.
1071     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1072       SpecString += ' ';
1073     
1074     SpecString += ArgString;
1075   }
1076   
1077   // If the last character of our string is '>', add another space to
1078   // keep the two '>''s separate tokens. We don't *have* to do this in
1079   // C++0x, but it's still good hygiene.
1080   if (!SpecString.empty() && SpecString[SpecString.size() - 1] == '>')
1081     SpecString += ' ';
1082   
1083   if (!SkipBrackets)
1084     SpecString += '>';
1085   
1086   return SpecString;
1087 }
1088
1089 // Sadly, repeat all that with TemplateArgLoc.
1090 std::string TemplateSpecializationType::
1091 PrintTemplateArgumentList(const TemplateArgumentLoc *Args, unsigned NumArgs,
1092                           const PrintingPolicy &Policy) {
1093   std::string SpecString;
1094   SpecString += '<';
1095   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1096     if (SpecString.size() > 1)
1097       SpecString += ", ";
1098     
1099     // Print the argument into a string.
1100     std::string ArgString;
1101     if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1102       ArgString = PrintTemplateArgumentList(
1103                                            Args[Arg].getArgument().pack_begin(), 
1104                                             Args[Arg].getArgument().pack_size(), 
1105                                             Policy, true);
1106     } else {
1107       llvm::raw_string_ostream ArgOut(ArgString);
1108       Args[Arg].getArgument().print(Policy, ArgOut);
1109     }
1110     
1111     // If this is the first argument and its string representation
1112     // begins with the global scope specifier ('::foo'), add a space
1113     // to avoid printing the diagraph '<:'.
1114     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1115       SpecString += ' ';
1116     
1117     SpecString += ArgString;
1118   }
1119   
1120   // If the last character of our string is '>', add another space to
1121   // keep the two '>''s separate tokens. We don't *have* to do this in
1122   // C++0x, but it's still good hygiene.
1123   if (SpecString[SpecString.size() - 1] == '>')
1124     SpecString += ' ';
1125   
1126   SpecString += '>';
1127   
1128   return SpecString;
1129 }
1130
1131 void QualType::dump(const char *msg) const {
1132   std::string R = "identifier";
1133   LangOptions LO;
1134   getAsStringInternal(R, PrintingPolicy(LO));
1135   if (msg)
1136     llvm::errs() << msg << ": ";
1137   llvm::errs() << R << "\n";
1138 }
1139 void QualType::dump() const {
1140   dump("");
1141 }
1142
1143 void Type::dump() const {
1144   QualType(this, 0).dump();
1145 }
1146
1147 std::string Qualifiers::getAsString() const {
1148   LangOptions LO;
1149   return getAsString(PrintingPolicy(LO));
1150 }
1151
1152 // Appends qualifiers to the given string, separated by spaces.  Will
1153 // prefix a space if the string is non-empty.  Will not append a final
1154 // space.
1155 void Qualifiers::getAsStringInternal(std::string &S,
1156                                      const PrintingPolicy& Policy) const {
1157   AppendTypeQualList(S, getCVRQualifiers());
1158   if (unsigned addrspace = getAddressSpace()) {
1159     if (!S.empty()) S += ' ';
1160     S += "__attribute__((address_space(";
1161     S += llvm::utostr_32(addrspace);
1162     S += ")))";
1163   }
1164   if (Qualifiers::GC gc = getObjCGCAttr()) {
1165     if (!S.empty()) S += ' ';
1166     if (gc == Qualifiers::Weak)
1167       S += "__weak";
1168     else
1169       S += "__strong";
1170   }
1171   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
1172     if (!S.empty() && 
1173         !(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
1174       S += ' ';
1175     
1176     switch (lifetime) {
1177     case Qualifiers::OCL_None: llvm_unreachable("none but true");
1178     case Qualifiers::OCL_ExplicitNone: S += "__unsafe_unretained"; break;
1179     case Qualifiers::OCL_Strong: 
1180       if (!Policy.SuppressStrongLifetime)
1181         S += "__strong"; 
1182       break;
1183         
1184     case Qualifiers::OCL_Weak: S += "__weak"; break;
1185     case Qualifiers::OCL_Autoreleasing: S += "__autoreleasing"; break;
1186     }
1187   }
1188 }
1189
1190 std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
1191   std::string buffer;
1192   LangOptions options;
1193   getAsStringInternal(ty, qs, buffer, PrintingPolicy(options));
1194   return buffer;
1195 }
1196
1197 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1198                                    std::string &buffer,
1199                                    const PrintingPolicy &policy) {
1200   TypePrinter(policy).print(ty, qs, buffer);
1201 }