]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/lib/AST/TypePrinter.cpp
Merge ^/head r275118 through r275209.
[FreeBSD/FreeBSD.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/PrettyPrinter.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/Decl.h"
17 #include "clang/AST/DeclObjC.h"
18 #include "clang/AST/DeclTemplate.h"
19 #include "clang/AST/Expr.h"
20 #include "clang/AST/Type.h"
21 #include "clang/Basic/LangOptions.h"
22 #include "clang/Basic/SourceManager.h"
23 #include "llvm/ADT/SmallString.h"
24 #include "llvm/ADT/StringExtras.h"
25 #include "llvm/Support/SaveAndRestore.h"
26 #include "llvm/Support/raw_ostream.h"
27 using namespace clang;
28
29 namespace {
30   /// \brief RAII object that enables printing of the ARC __strong lifetime
31   /// qualifier.
32   class IncludeStrongLifetimeRAII {
33     PrintingPolicy &Policy;
34     bool Old;
35     
36   public:
37     explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy) 
38       : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
39         if (!Policy.SuppressLifetimeQualifiers)
40           Policy.SuppressStrongLifetime = false;
41     }
42     
43     ~IncludeStrongLifetimeRAII() {
44       Policy.SuppressStrongLifetime = Old;
45     }
46   };
47
48   class ParamPolicyRAII {
49     PrintingPolicy &Policy;
50     bool Old;
51     
52   public:
53     explicit ParamPolicyRAII(PrintingPolicy &Policy) 
54       : Policy(Policy), Old(Policy.SuppressSpecifiers) {
55       Policy.SuppressSpecifiers = false;
56     }
57     
58     ~ParamPolicyRAII() {
59       Policy.SuppressSpecifiers = Old;
60     }
61   };
62
63   class ElaboratedTypePolicyRAII {
64     PrintingPolicy &Policy;
65     bool SuppressTagKeyword;
66     bool SuppressScope;
67     
68   public:
69     explicit ElaboratedTypePolicyRAII(PrintingPolicy &Policy) : Policy(Policy) {
70       SuppressTagKeyword = Policy.SuppressTagKeyword;
71       SuppressScope = Policy.SuppressScope;
72       Policy.SuppressTagKeyword = true;
73       Policy.SuppressScope = true;
74     }
75     
76     ~ElaboratedTypePolicyRAII() {
77       Policy.SuppressTagKeyword = SuppressTagKeyword;
78       Policy.SuppressScope = SuppressScope;
79     }
80   };
81   
82   class TypePrinter {
83     PrintingPolicy Policy;
84     bool HasEmptyPlaceHolder;
85     bool InsideCCAttribute;
86
87   public:
88     explicit TypePrinter(const PrintingPolicy &Policy)
89       : Policy(Policy), HasEmptyPlaceHolder(false), InsideCCAttribute(false) { }
90
91     void print(const Type *ty, Qualifiers qs, raw_ostream &OS,
92                StringRef PlaceHolder);
93     void print(QualType T, raw_ostream &OS, StringRef PlaceHolder);
94
95     static bool canPrefixQualifiers(const Type *T, bool &NeedARCStrongQualifier);
96     void spaceBeforePlaceHolder(raw_ostream &OS);
97     void printTypeSpec(const NamedDecl *D, raw_ostream &OS);
98
99     void printBefore(const Type *ty, Qualifiers qs, raw_ostream &OS);
100     void printBefore(QualType T, raw_ostream &OS);
101     void printAfter(const Type *ty, Qualifiers qs, raw_ostream &OS);
102     void printAfter(QualType T, raw_ostream &OS);
103     void AppendScope(DeclContext *DC, raw_ostream &OS);
104     void printTag(TagDecl *T, raw_ostream &OS);
105 #define ABSTRACT_TYPE(CLASS, PARENT)
106 #define TYPE(CLASS, PARENT) \
107     void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \
108     void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS);
109 #include "clang/AST/TypeNodes.def"
110   };
111 }
112
113 static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals) {
114   bool appendSpace = false;
115   if (TypeQuals & Qualifiers::Const) {
116     OS << "const";
117     appendSpace = true;
118   }
119   if (TypeQuals & Qualifiers::Volatile) {
120     if (appendSpace) OS << ' ';
121     OS << "volatile";
122     appendSpace = true;
123   }
124   if (TypeQuals & Qualifiers::Restrict) {
125     if (appendSpace) OS << ' ';
126     OS << "restrict";
127   }
128 }
129
130 void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
131   if (!HasEmptyPlaceHolder)
132     OS << ' ';
133 }
134
135 void TypePrinter::print(QualType t, raw_ostream &OS, StringRef PlaceHolder) {
136   SplitQualType split = t.split();
137   print(split.Ty, split.Quals, OS, PlaceHolder);
138 }
139
140 void TypePrinter::print(const Type *T, Qualifiers Quals, raw_ostream &OS,
141                         StringRef PlaceHolder) {
142   if (!T) {
143     OS << "NULL TYPE";
144     return;
145   }
146
147   SaveAndRestore<bool> PHVal(HasEmptyPlaceHolder, PlaceHolder.empty());
148
149   printBefore(T, Quals, OS);
150   OS << PlaceHolder;
151   printAfter(T, Quals, OS);
152 }
153
154 bool TypePrinter::canPrefixQualifiers(const Type *T,
155                                       bool &NeedARCStrongQualifier) {
156   // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
157   // so that we get "const int" instead of "int const", but we can't do this if
158   // the type is complex.  For example if the type is "int*", we *must* print
159   // "int * const", printing "const int *" is different.  Only do this when the
160   // type expands to a simple string.
161   bool CanPrefixQualifiers = false;
162   NeedARCStrongQualifier = false;
163   Type::TypeClass TC = T->getTypeClass();
164   if (const AutoType *AT = dyn_cast<AutoType>(T))
165     TC = AT->desugar()->getTypeClass();
166   if (const SubstTemplateTypeParmType *Subst
167                                       = dyn_cast<SubstTemplateTypeParmType>(T))
168     TC = Subst->getReplacementType()->getTypeClass();
169   
170   switch (TC) {
171     case Type::Auto:
172     case Type::Builtin:
173     case Type::Complex:
174     case Type::UnresolvedUsing:
175     case Type::Typedef:
176     case Type::TypeOfExpr:
177     case Type::TypeOf:
178     case Type::Decltype:
179     case Type::UnaryTransform:
180     case Type::Record:
181     case Type::Enum:
182     case Type::Elaborated:
183     case Type::TemplateTypeParm:
184     case Type::SubstTemplateTypeParmPack:
185     case Type::TemplateSpecialization:
186     case Type::InjectedClassName:
187     case Type::DependentName:
188     case Type::DependentTemplateSpecialization:
189     case Type::ObjCObject:
190     case Type::ObjCInterface:
191     case Type::Atomic:
192       CanPrefixQualifiers = true;
193       break;
194       
195     case Type::ObjCObjectPointer:
196       CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
197         T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
198       break;
199       
200     case Type::ConstantArray:
201     case Type::IncompleteArray:
202     case Type::VariableArray:
203     case Type::DependentSizedArray:
204       NeedARCStrongQualifier = true;
205       // Fall through
206       
207     case Type::Adjusted:
208     case Type::Decayed:
209     case Type::Pointer:
210     case Type::BlockPointer:
211     case Type::LValueReference:
212     case Type::RValueReference:
213     case Type::MemberPointer:
214     case Type::DependentSizedExtVector:
215     case Type::Vector:
216     case Type::ExtVector:
217     case Type::FunctionProto:
218     case Type::FunctionNoProto:
219     case Type::Paren:
220     case Type::Attributed:
221     case Type::PackExpansion:
222     case Type::SubstTemplateTypeParm:
223       CanPrefixQualifiers = false;
224       break;
225   }
226
227   return CanPrefixQualifiers;
228 }
229
230 void TypePrinter::printBefore(QualType T, raw_ostream &OS) {
231   SplitQualType Split = T.split();
232
233   // If we have cv1 T, where T is substituted for cv2 U, only print cv1 - cv2
234   // at this level.
235   Qualifiers Quals = Split.Quals;
236   if (const SubstTemplateTypeParmType *Subst =
237         dyn_cast<SubstTemplateTypeParmType>(Split.Ty))
238     Quals -= QualType(Subst, 0).getQualifiers();
239
240   printBefore(Split.Ty, Quals, OS);
241 }
242
243 /// \brief Prints the part of the type string before an identifier, e.g. for
244 /// "int foo[10]" it prints "int ".
245 void TypePrinter::printBefore(const Type *T,Qualifiers Quals, raw_ostream &OS) {
246   if (Policy.SuppressSpecifiers && T->isSpecifierType())
247     return;
248
249   SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder);
250
251   // Print qualifiers as appropriate.
252
253   bool CanPrefixQualifiers = false;
254   bool NeedARCStrongQualifier = false;
255   CanPrefixQualifiers = canPrefixQualifiers(T, NeedARCStrongQualifier);
256
257   if (CanPrefixQualifiers && !Quals.empty()) {
258     if (NeedARCStrongQualifier) {
259       IncludeStrongLifetimeRAII Strong(Policy);
260       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
261     } else {
262       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
263     }
264   }
265
266   bool hasAfterQuals = false;
267   if (!CanPrefixQualifiers && !Quals.empty()) {
268     hasAfterQuals = !Quals.isEmptyWhenPrinted(Policy);
269     if (hasAfterQuals)
270       HasEmptyPlaceHolder = false;
271   }
272
273   switch (T->getTypeClass()) {
274 #define ABSTRACT_TYPE(CLASS, PARENT)
275 #define TYPE(CLASS, PARENT) case Type::CLASS: \
276     print##CLASS##Before(cast<CLASS##Type>(T), OS); \
277     break;
278 #include "clang/AST/TypeNodes.def"
279   }
280
281   if (hasAfterQuals) {
282     if (NeedARCStrongQualifier) {
283       IncludeStrongLifetimeRAII Strong(Policy);
284       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
285     } else {
286       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
287     }
288   }
289 }
290
291 void TypePrinter::printAfter(QualType t, raw_ostream &OS) {
292   SplitQualType split = t.split();
293   printAfter(split.Ty, split.Quals, OS);
294 }
295
296 /// \brief Prints the part of the type string after an identifier, e.g. for
297 /// "int foo[10]" it prints "[10]".
298 void TypePrinter::printAfter(const Type *T, Qualifiers Quals, raw_ostream &OS) {
299   switch (T->getTypeClass()) {
300 #define ABSTRACT_TYPE(CLASS, PARENT)
301 #define TYPE(CLASS, PARENT) case Type::CLASS: \
302     print##CLASS##After(cast<CLASS##Type>(T), OS); \
303     break;
304 #include "clang/AST/TypeNodes.def"
305   }
306 }
307
308 void TypePrinter::printBuiltinBefore(const BuiltinType *T, raw_ostream &OS) {
309   OS << T->getName(Policy);
310   spaceBeforePlaceHolder(OS);
311 }
312 void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) { }
313
314 void TypePrinter::printComplexBefore(const ComplexType *T, raw_ostream &OS) {
315   OS << "_Complex ";
316   printBefore(T->getElementType(), OS);
317 }
318 void TypePrinter::printComplexAfter(const ComplexType *T, raw_ostream &OS) {
319   printAfter(T->getElementType(), OS);
320 }
321
322 void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) {
323   IncludeStrongLifetimeRAII Strong(Policy);
324   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
325   printBefore(T->getPointeeType(), OS);
326   // Handle things like 'int (*A)[4];' correctly.
327   // FIXME: this should include vectors, but vectors use attributes I guess.
328   if (isa<ArrayType>(T->getPointeeType()))
329     OS << '(';
330   OS << '*';
331 }
332 void TypePrinter::printPointerAfter(const PointerType *T, raw_ostream &OS) {
333   IncludeStrongLifetimeRAII Strong(Policy);
334   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
335   // Handle things like 'int (*A)[4];' correctly.
336   // FIXME: this should include vectors, but vectors use attributes I guess.
337   if (isa<ArrayType>(T->getPointeeType()))
338     OS << ')';
339   printAfter(T->getPointeeType(), OS);
340 }
341
342 void TypePrinter::printBlockPointerBefore(const BlockPointerType *T,
343                                           raw_ostream &OS) {
344   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
345   printBefore(T->getPointeeType(), OS);
346   OS << '^';
347 }
348 void TypePrinter::printBlockPointerAfter(const BlockPointerType *T,
349                                           raw_ostream &OS) {
350   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
351   printAfter(T->getPointeeType(), OS);
352 }
353
354 void TypePrinter::printLValueReferenceBefore(const LValueReferenceType *T,
355                                              raw_ostream &OS) {
356   IncludeStrongLifetimeRAII Strong(Policy);
357   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
358   printBefore(T->getPointeeTypeAsWritten(), OS);
359   // Handle things like 'int (&A)[4];' correctly.
360   // FIXME: this should include vectors, but vectors use attributes I guess.
361   if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
362     OS << '(';
363   OS << '&';
364 }
365 void TypePrinter::printLValueReferenceAfter(const LValueReferenceType *T,
366                                             raw_ostream &OS) {
367   IncludeStrongLifetimeRAII Strong(Policy);
368   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
369   // Handle things like 'int (&A)[4];' correctly.
370   // FIXME: this should include vectors, but vectors use attributes I guess.
371   if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
372     OS << ')';
373   printAfter(T->getPointeeTypeAsWritten(), OS);
374 }
375
376 void TypePrinter::printRValueReferenceBefore(const RValueReferenceType *T,
377                                              raw_ostream &OS) {
378   IncludeStrongLifetimeRAII Strong(Policy);
379   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
380   printBefore(T->getPointeeTypeAsWritten(), OS);
381   // Handle things like 'int (&&A)[4];' correctly.
382   // FIXME: this should include vectors, but vectors use attributes I guess.
383   if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
384     OS << '(';
385   OS << "&&";
386 }
387 void TypePrinter::printRValueReferenceAfter(const RValueReferenceType *T,
388                                             raw_ostream &OS) {
389   IncludeStrongLifetimeRAII Strong(Policy);
390   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
391   // Handle things like 'int (&&A)[4];' correctly.
392   // FIXME: this should include vectors, but vectors use attributes I guess.
393   if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
394     OS << ')';
395   printAfter(T->getPointeeTypeAsWritten(), OS);
396 }
397
398 void TypePrinter::printMemberPointerBefore(const MemberPointerType *T, 
399                                            raw_ostream &OS) { 
400   IncludeStrongLifetimeRAII Strong(Policy);
401   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
402   printBefore(T->getPointeeType(), OS);
403   // Handle things like 'int (Cls::*A)[4];' correctly.
404   // FIXME: this should include vectors, but vectors use attributes I guess.
405   if (isa<ArrayType>(T->getPointeeType()))
406     OS << '(';
407
408   PrintingPolicy InnerPolicy(Policy);
409   InnerPolicy.SuppressTag = false;
410   TypePrinter(InnerPolicy).print(QualType(T->getClass(), 0), OS, StringRef());
411
412   OS << "::*";
413 }
414 void TypePrinter::printMemberPointerAfter(const MemberPointerType *T, 
415                                           raw_ostream &OS) { 
416   IncludeStrongLifetimeRAII Strong(Policy);
417   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
418   // Handle things like 'int (Cls::*A)[4];' correctly.
419   // FIXME: this should include vectors, but vectors use attributes I guess.
420   if (isa<ArrayType>(T->getPointeeType()))
421     OS << ')';
422   printAfter(T->getPointeeType(), OS);
423 }
424
425 void TypePrinter::printConstantArrayBefore(const ConstantArrayType *T, 
426                                            raw_ostream &OS) {
427   IncludeStrongLifetimeRAII Strong(Policy);
428   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
429   printBefore(T->getElementType(), OS);
430 }
431 void TypePrinter::printConstantArrayAfter(const ConstantArrayType *T, 
432                                           raw_ostream &OS) {
433   OS << '[';
434   if (T->getIndexTypeQualifiers().hasQualifiers()) {
435     AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers());
436     OS << ' ';
437   }
438
439   if (T->getSizeModifier() == ArrayType::Static)
440     OS << "static ";
441
442   OS << T->getSize().getZExtValue() << ']';
443   printAfter(T->getElementType(), OS);
444 }
445
446 void TypePrinter::printIncompleteArrayBefore(const IncompleteArrayType *T, 
447                                              raw_ostream &OS) {
448   IncludeStrongLifetimeRAII Strong(Policy);
449   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
450   printBefore(T->getElementType(), OS);
451 }
452 void TypePrinter::printIncompleteArrayAfter(const IncompleteArrayType *T, 
453                                             raw_ostream &OS) {
454   OS << "[]";
455   printAfter(T->getElementType(), OS);
456 }
457
458 void TypePrinter::printVariableArrayBefore(const VariableArrayType *T, 
459                                            raw_ostream &OS) {
460   IncludeStrongLifetimeRAII Strong(Policy);
461   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
462   printBefore(T->getElementType(), OS);
463 }
464 void TypePrinter::printVariableArrayAfter(const VariableArrayType *T, 
465                                           raw_ostream &OS) {
466   OS << '[';
467   if (T->getIndexTypeQualifiers().hasQualifiers()) {
468     AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers());
469     OS << ' ';
470   }
471
472   if (T->getSizeModifier() == VariableArrayType::Static)
473     OS << "static ";
474   else if (T->getSizeModifier() == VariableArrayType::Star)
475     OS << '*';
476
477   if (T->getSizeExpr())
478     T->getSizeExpr()->printPretty(OS, nullptr, Policy);
479   OS << ']';
480
481   printAfter(T->getElementType(), OS);
482 }
483
484 void TypePrinter::printAdjustedBefore(const AdjustedType *T, raw_ostream &OS) {
485   // Print the adjusted representation, otherwise the adjustment will be
486   // invisible.
487   printBefore(T->getAdjustedType(), OS);
488 }
489 void TypePrinter::printAdjustedAfter(const AdjustedType *T, raw_ostream &OS) {
490   printAfter(T->getAdjustedType(), OS);
491 }
492
493 void TypePrinter::printDecayedBefore(const DecayedType *T, raw_ostream &OS) {
494   // Print as though it's a pointer.
495   printAdjustedBefore(T, OS);
496 }
497 void TypePrinter::printDecayedAfter(const DecayedType *T, raw_ostream &OS) {
498   printAdjustedAfter(T, OS);
499 }
500
501 void TypePrinter::printDependentSizedArrayBefore(
502                                                const DependentSizedArrayType *T, 
503                                                raw_ostream &OS) {
504   IncludeStrongLifetimeRAII Strong(Policy);
505   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
506   printBefore(T->getElementType(), OS);
507 }
508 void TypePrinter::printDependentSizedArrayAfter(
509                                                const DependentSizedArrayType *T, 
510                                                raw_ostream &OS) {
511   OS << '[';
512   if (T->getSizeExpr())
513     T->getSizeExpr()->printPretty(OS, nullptr, Policy);
514   OS << ']';
515   printAfter(T->getElementType(), OS);
516 }
517
518 void TypePrinter::printDependentSizedExtVectorBefore(
519                                           const DependentSizedExtVectorType *T, 
520                                           raw_ostream &OS) { 
521   printBefore(T->getElementType(), OS);
522 }
523 void TypePrinter::printDependentSizedExtVectorAfter(
524                                           const DependentSizedExtVectorType *T, 
525                                           raw_ostream &OS) { 
526   OS << " __attribute__((ext_vector_type(";
527   if (T->getSizeExpr())
528     T->getSizeExpr()->printPretty(OS, nullptr, Policy);
529   OS << ")))";  
530   printAfter(T->getElementType(), OS);
531 }
532
533 void TypePrinter::printVectorBefore(const VectorType *T, raw_ostream &OS) { 
534   switch (T->getVectorKind()) {
535   case VectorType::AltiVecPixel:
536     OS << "__vector __pixel ";
537     break;
538   case VectorType::AltiVecBool:
539     OS << "__vector __bool ";
540     printBefore(T->getElementType(), OS);
541     break;
542   case VectorType::AltiVecVector:
543     OS << "__vector ";
544     printBefore(T->getElementType(), OS);
545     break;
546   case VectorType::NeonVector:
547     OS << "__attribute__((neon_vector_type("
548        << T->getNumElements() << "))) ";
549     printBefore(T->getElementType(), OS);
550     break;
551   case VectorType::NeonPolyVector:
552     OS << "__attribute__((neon_polyvector_type(" <<
553           T->getNumElements() << "))) ";
554     printBefore(T->getElementType(), OS);
555     break;
556   case VectorType::GenericVector: {
557     // FIXME: We prefer to print the size directly here, but have no way
558     // to get the size of the type.
559     OS << "__attribute__((__vector_size__("
560        << T->getNumElements()
561        << " * sizeof(";
562     print(T->getElementType(), OS, StringRef());
563     OS << ")))) "; 
564     printBefore(T->getElementType(), OS);
565     break;
566   }
567   }
568 }
569 void TypePrinter::printVectorAfter(const VectorType *T, raw_ostream &OS) {
570   printAfter(T->getElementType(), OS);
571
572
573 void TypePrinter::printExtVectorBefore(const ExtVectorType *T,
574                                        raw_ostream &OS) { 
575   printBefore(T->getElementType(), OS);
576 }
577 void TypePrinter::printExtVectorAfter(const ExtVectorType *T, raw_ostream &OS) { 
578   printAfter(T->getElementType(), OS);
579   OS << " __attribute__((ext_vector_type(";
580   OS << T->getNumElements();
581   OS << ")))";
582 }
583
584 void 
585 FunctionProtoType::printExceptionSpecification(raw_ostream &OS, 
586                                                const PrintingPolicy &Policy)
587                                                                          const {
588   
589   if (hasDynamicExceptionSpec()) {
590     OS << " throw(";
591     if (getExceptionSpecType() == EST_MSAny)
592       OS << "...";
593     else
594       for (unsigned I = 0, N = getNumExceptions(); I != N; ++I) {
595         if (I)
596           OS << ", ";
597         
598         OS << getExceptionType(I).stream(Policy);
599       }
600     OS << ')';
601   } else if (isNoexceptExceptionSpec(getExceptionSpecType())) {
602     OS << " noexcept";
603     if (getExceptionSpecType() == EST_ComputedNoexcept) {
604       OS << '(';
605       if (getNoexceptExpr())
606         getNoexceptExpr()->printPretty(OS, nullptr, Policy);
607       OS << ')';
608     }
609   }
610 }
611
612 void TypePrinter::printFunctionProtoBefore(const FunctionProtoType *T, 
613                                            raw_ostream &OS) {
614   if (T->hasTrailingReturn()) {
615     OS << "auto ";
616     if (!HasEmptyPlaceHolder)
617       OS << '(';
618   } else {
619     // If needed for precedence reasons, wrap the inner part in grouping parens.
620     SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
621     printBefore(T->getReturnType(), OS);
622     if (!PrevPHIsEmpty.get())
623       OS << '(';
624   }
625 }
626
627 void TypePrinter::printFunctionProtoAfter(const FunctionProtoType *T, 
628                                           raw_ostream &OS) { 
629   // If needed for precedence reasons, wrap the inner part in grouping parens.
630   if (!HasEmptyPlaceHolder)
631     OS << ')';
632   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
633
634   OS << '(';
635   {
636     ParamPolicyRAII ParamPolicy(Policy);
637     for (unsigned i = 0, e = T->getNumParams(); i != e; ++i) {
638       if (i) OS << ", ";
639       print(T->getParamType(i), OS, StringRef());
640     }
641   }
642   
643   if (T->isVariadic()) {
644     if (T->getNumParams())
645       OS << ", ";
646     OS << "...";
647   } else if (T->getNumParams() == 0 && !Policy.LangOpts.CPlusPlus) {
648     // Do not emit int() if we have a proto, emit 'int(void)'.
649     OS << "void";
650   }
651   
652   OS << ')';
653
654   FunctionType::ExtInfo Info = T->getExtInfo();
655
656   if (!InsideCCAttribute) {
657     switch (Info.getCC()) {
658     case CC_C:
659       // The C calling convention is the default on the vast majority of platforms
660       // we support.  If the user wrote it explicitly, it will usually be printed
661       // while traversing the AttributedType.  If the type has been desugared, let
662       // the canonical spelling be the implicit calling convention.
663       // FIXME: It would be better to be explicit in certain contexts, such as a
664       // cdecl function typedef used to declare a member function with the
665       // Microsoft C++ ABI.
666       break;
667     case CC_X86StdCall:
668       OS << " __attribute__((stdcall))";
669       break;
670     case CC_X86FastCall:
671       OS << " __attribute__((fastcall))";
672       break;
673     case CC_X86ThisCall:
674       OS << " __attribute__((thiscall))";
675       break;
676     case CC_X86Pascal:
677       OS << " __attribute__((pascal))";
678       break;
679     case CC_AAPCS:
680       OS << " __attribute__((pcs(\"aapcs\")))";
681       break;
682     case CC_AAPCS_VFP:
683       OS << " __attribute__((pcs(\"aapcs-vfp\")))";
684       break;
685     case CC_PnaclCall:
686       OS << " __attribute__((pnaclcall))";
687       break;
688     case CC_IntelOclBicc:
689       OS << " __attribute__((intel_ocl_bicc))";
690       break;
691     case CC_X86_64Win64:
692       OS << " __attribute__((ms_abi))";
693       break;
694     case CC_X86_64SysV:
695       OS << " __attribute__((sysv_abi))";
696       break;
697     }
698   }
699
700   if (Info.getNoReturn())
701     OS << " __attribute__((noreturn))";
702   if (Info.getRegParm())
703     OS << " __attribute__((regparm ("
704        << Info.getRegParm() << ")))";
705
706   if (unsigned quals = T->getTypeQuals()) {
707     OS << ' ';
708     AppendTypeQualList(OS, quals);
709   }
710
711   switch (T->getRefQualifier()) {
712   case RQ_None:
713     break;
714     
715   case RQ_LValue:
716     OS << " &";
717     break;
718     
719   case RQ_RValue:
720     OS << " &&";
721     break;
722   }
723   T->printExceptionSpecification(OS, Policy);
724
725   if (T->hasTrailingReturn()) {
726     OS << " -> ";
727     print(T->getReturnType(), OS, StringRef());
728   } else
729     printAfter(T->getReturnType(), OS);
730 }
731
732 void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T, 
733                                              raw_ostream &OS) { 
734   // If needed for precedence reasons, wrap the inner part in grouping parens.
735   SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
736   printBefore(T->getReturnType(), OS);
737   if (!PrevPHIsEmpty.get())
738     OS << '(';
739 }
740 void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T, 
741                                             raw_ostream &OS) {
742   // If needed for precedence reasons, wrap the inner part in grouping parens.
743   if (!HasEmptyPlaceHolder)
744     OS << ')';
745   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
746   
747   OS << "()";
748   if (T->getNoReturnAttr())
749     OS << " __attribute__((noreturn))";
750   printAfter(T->getReturnType(), OS);
751 }
752
753 void TypePrinter::printTypeSpec(const NamedDecl *D, raw_ostream &OS) {
754   IdentifierInfo *II = D->getIdentifier();
755   OS << II->getName();
756   spaceBeforePlaceHolder(OS);
757 }
758
759 void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T,
760                                              raw_ostream &OS) {
761   printTypeSpec(T->getDecl(), OS);
762 }
763 void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T,
764                                              raw_ostream &OS) { }
765
766 void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) { 
767   printTypeSpec(T->getDecl(), OS);
768 }
769 void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) { } 
770
771 void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T,
772                                         raw_ostream &OS) {
773   OS << "typeof ";
774   if (T->getUnderlyingExpr())
775     T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
776   spaceBeforePlaceHolder(OS);
777 }
778 void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T,
779                                        raw_ostream &OS) { }
780
781 void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) { 
782   OS << "typeof(";
783   print(T->getUnderlyingType(), OS, StringRef());
784   OS << ')';
785   spaceBeforePlaceHolder(OS);
786 }
787 void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) { } 
788
789 void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) { 
790   OS << "decltype(";
791   if (T->getUnderlyingExpr())
792     T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
793   OS << ')';
794   spaceBeforePlaceHolder(OS);
795 }
796 void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) { } 
797
798 void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T,
799                                             raw_ostream &OS) {
800   IncludeStrongLifetimeRAII Strong(Policy);
801
802   switch (T->getUTTKind()) {
803     case UnaryTransformType::EnumUnderlyingType:
804       OS << "__underlying_type(";
805       print(T->getBaseType(), OS, StringRef());
806       OS << ')';
807       spaceBeforePlaceHolder(OS);
808       return;
809   }
810
811   printBefore(T->getBaseType(), OS);
812 }
813 void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T,
814                                            raw_ostream &OS) {
815   IncludeStrongLifetimeRAII Strong(Policy);
816
817   switch (T->getUTTKind()) {
818     case UnaryTransformType::EnumUnderlyingType:
819       return;
820   }
821
822   printAfter(T->getBaseType(), OS);
823 }
824
825 void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) { 
826   // If the type has been deduced, do not print 'auto'.
827   if (!T->getDeducedType().isNull()) {
828     printBefore(T->getDeducedType(), OS);
829   } else {
830     OS << (T->isDecltypeAuto() ? "decltype(auto)" : "auto");
831     spaceBeforePlaceHolder(OS);
832   }
833 }
834 void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) { 
835   // If the type has been deduced, do not print 'auto'.
836   if (!T->getDeducedType().isNull())
837     printAfter(T->getDeducedType(), OS);
838 }
839
840 void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) {
841   IncludeStrongLifetimeRAII Strong(Policy);
842
843   OS << "_Atomic(";
844   print(T->getValueType(), OS, StringRef());
845   OS << ')';
846   spaceBeforePlaceHolder(OS);
847 }
848 void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) { }
849
850 /// Appends the given scope to the end of a string.
851 void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS) {
852   if (DC->isTranslationUnit()) return;
853   if (DC->isFunctionOrMethod()) return;
854   AppendScope(DC->getParent(), OS);
855
856   if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
857     if (Policy.SuppressUnwrittenScope && 
858         (NS->isAnonymousNamespace() || NS->isInline()))
859       return;
860     if (NS->getIdentifier())
861       OS << NS->getName() << "::";
862     else
863       OS << "(anonymous namespace)::";
864   } else if (ClassTemplateSpecializationDecl *Spec
865                = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
866     IncludeStrongLifetimeRAII Strong(Policy);
867     OS << Spec->getIdentifier()->getName();
868     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
869     TemplateSpecializationType::PrintTemplateArgumentList(OS,
870                                             TemplateArgs.data(),
871                                             TemplateArgs.size(),
872                                             Policy);
873     OS << "::";
874   } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
875     if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
876       OS << Typedef->getIdentifier()->getName() << "::";
877     else if (Tag->getIdentifier())
878       OS << Tag->getIdentifier()->getName() << "::";
879     else
880       return;
881   }
882 }
883
884 void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
885   if (Policy.SuppressTag)
886     return;
887
888   bool HasKindDecoration = false;
889
890   // bool SuppressTagKeyword
891   //   = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword;
892
893   // We don't print tags unless this is an elaborated type.
894   // In C, we just assume every RecordType is an elaborated type.
895   if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword ||
896         D->getTypedefNameForAnonDecl())) {
897     HasKindDecoration = true;
898     OS << D->getKindName();
899     OS << ' ';
900   }
901
902   // Compute the full nested-name-specifier for this type.
903   // In C, this will always be empty except when the type
904   // being printed is anonymous within other Record.
905   if (!Policy.SuppressScope)
906     AppendScope(D->getDeclContext(), OS);
907
908   if (const IdentifierInfo *II = D->getIdentifier())
909     OS << II->getName();
910   else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
911     assert(Typedef->getIdentifier() && "Typedef without identifier?");
912     OS << Typedef->getIdentifier()->getName();
913   } else {
914     // Make an unambiguous representation for anonymous types, e.g.
915     //   (anonymous enum at /usr/include/string.h:120:9)
916     
917     if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
918       OS << "(lambda";
919       HasKindDecoration = true;
920     } else {
921       OS << "(anonymous";
922     }
923     
924     if (Policy.AnonymousTagLocations) {
925       // Suppress the redundant tag keyword if we just printed one.
926       // We don't have to worry about ElaboratedTypes here because you can't
927       // refer to an anonymous type with one.
928       if (!HasKindDecoration)
929         OS << " " << D->getKindName();
930
931       PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
932           D->getLocation());
933       if (PLoc.isValid()) {
934         OS << " at " << PLoc.getFilename()
935            << ':' << PLoc.getLine()
936            << ':' << PLoc.getColumn();
937       }
938     }
939     
940     OS << ')';
941   }
942
943   // If this is a class template specialization, print the template
944   // arguments.
945   if (ClassTemplateSpecializationDecl *Spec
946         = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
947     const TemplateArgument *Args;
948     unsigned NumArgs;
949     if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
950       const TemplateSpecializationType *TST =
951         cast<TemplateSpecializationType>(TAW->getType());
952       Args = TST->getArgs();
953       NumArgs = TST->getNumArgs();
954     } else {
955       const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
956       Args = TemplateArgs.data();
957       NumArgs = TemplateArgs.size();
958     }
959     IncludeStrongLifetimeRAII Strong(Policy);
960     TemplateSpecializationType::PrintTemplateArgumentList(OS,
961                                                           Args, NumArgs,
962                                                           Policy);
963   }
964
965   spaceBeforePlaceHolder(OS);
966 }
967
968 void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) {
969   printTag(T->getDecl(), OS);
970 }
971 void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) { }
972
973 void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) { 
974   printTag(T->getDecl(), OS);
975 }
976 void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) { }
977
978 void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T, 
979                                               raw_ostream &OS) { 
980   if (IdentifierInfo *Id = T->getIdentifier())
981     OS << Id->getName();
982   else
983     OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex();
984   spaceBeforePlaceHolder(OS);
985 }
986 void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T, 
987                                              raw_ostream &OS) { } 
988
989 void TypePrinter::printSubstTemplateTypeParmBefore(
990                                              const SubstTemplateTypeParmType *T, 
991                                              raw_ostream &OS) { 
992   IncludeStrongLifetimeRAII Strong(Policy);
993   printBefore(T->getReplacementType(), OS);
994 }
995 void TypePrinter::printSubstTemplateTypeParmAfter(
996                                              const SubstTemplateTypeParmType *T, 
997                                              raw_ostream &OS) { 
998   IncludeStrongLifetimeRAII Strong(Policy);
999   printAfter(T->getReplacementType(), OS);
1000 }
1001
1002 void TypePrinter::printSubstTemplateTypeParmPackBefore(
1003                                         const SubstTemplateTypeParmPackType *T, 
1004                                         raw_ostream &OS) { 
1005   IncludeStrongLifetimeRAII Strong(Policy);
1006   printTemplateTypeParmBefore(T->getReplacedParameter(), OS);
1007 }
1008 void TypePrinter::printSubstTemplateTypeParmPackAfter(
1009                                         const SubstTemplateTypeParmPackType *T, 
1010                                         raw_ostream &OS) { 
1011   IncludeStrongLifetimeRAII Strong(Policy);
1012   printTemplateTypeParmAfter(T->getReplacedParameter(), OS);
1013 }
1014
1015 void TypePrinter::printTemplateSpecializationBefore(
1016                                             const TemplateSpecializationType *T, 
1017                                             raw_ostream &OS) { 
1018   IncludeStrongLifetimeRAII Strong(Policy);
1019   T->getTemplateName().print(OS, Policy);
1020   
1021   TemplateSpecializationType::PrintTemplateArgumentList(OS,
1022                                                         T->getArgs(), 
1023                                                         T->getNumArgs(), 
1024                                                         Policy);
1025   spaceBeforePlaceHolder(OS);
1026 }
1027 void TypePrinter::printTemplateSpecializationAfter(
1028                                             const TemplateSpecializationType *T, 
1029                                             raw_ostream &OS) { } 
1030
1031 void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T,
1032                                                raw_ostream &OS) {
1033   printTemplateSpecializationBefore(T->getInjectedTST(), OS);
1034 }
1035 void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T,
1036                                                raw_ostream &OS) { }
1037
1038 void TypePrinter::printElaboratedBefore(const ElaboratedType *T,
1039                                         raw_ostream &OS) {
1040   if (Policy.SuppressTag && isa<TagType>(T->getNamedType()))
1041     return;
1042   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1043   if (T->getKeyword() != ETK_None)
1044     OS << " ";
1045   NestedNameSpecifier* Qualifier = T->getQualifier();
1046   if (Qualifier)
1047     Qualifier->print(OS, Policy);
1048   
1049   ElaboratedTypePolicyRAII PolicyRAII(Policy);
1050   printBefore(T->getNamedType(), OS);
1051 }
1052 void TypePrinter::printElaboratedAfter(const ElaboratedType *T,
1053                                         raw_ostream &OS) {
1054   ElaboratedTypePolicyRAII PolicyRAII(Policy);
1055   printAfter(T->getNamedType(), OS);
1056 }
1057
1058 void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) {
1059   if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1060     printBefore(T->getInnerType(), OS);
1061     OS << '(';
1062   } else
1063     printBefore(T->getInnerType(), OS);
1064 }
1065 void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) {
1066   if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1067     OS << ')';
1068     printAfter(T->getInnerType(), OS);
1069   } else
1070     printAfter(T->getInnerType(), OS);
1071 }
1072
1073 void TypePrinter::printDependentNameBefore(const DependentNameType *T,
1074                                            raw_ostream &OS) { 
1075   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1076   if (T->getKeyword() != ETK_None)
1077     OS << " ";
1078   
1079   T->getQualifier()->print(OS, Policy);
1080   
1081   OS << T->getIdentifier()->getName();
1082   spaceBeforePlaceHolder(OS);
1083 }
1084 void TypePrinter::printDependentNameAfter(const DependentNameType *T,
1085                                           raw_ostream &OS) { } 
1086
1087 void TypePrinter::printDependentTemplateSpecializationBefore(
1088         const DependentTemplateSpecializationType *T, raw_ostream &OS) { 
1089   IncludeStrongLifetimeRAII Strong(Policy);
1090   
1091   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1092   if (T->getKeyword() != ETK_None)
1093     OS << " ";
1094   
1095   if (T->getQualifier())
1096     T->getQualifier()->print(OS, Policy);    
1097   OS << T->getIdentifier()->getName();
1098   TemplateSpecializationType::PrintTemplateArgumentList(OS,
1099                                                         T->getArgs(),
1100                                                         T->getNumArgs(),
1101                                                         Policy);
1102   spaceBeforePlaceHolder(OS);
1103 }
1104 void TypePrinter::printDependentTemplateSpecializationAfter(
1105         const DependentTemplateSpecializationType *T, raw_ostream &OS) { } 
1106
1107 void TypePrinter::printPackExpansionBefore(const PackExpansionType *T, 
1108                                            raw_ostream &OS) {
1109   printBefore(T->getPattern(), OS);
1110 }
1111 void TypePrinter::printPackExpansionAfter(const PackExpansionType *T, 
1112                                           raw_ostream &OS) {
1113   printAfter(T->getPattern(), OS);
1114   OS << "...";
1115 }
1116
1117 void TypePrinter::printAttributedBefore(const AttributedType *T,
1118                                         raw_ostream &OS) {
1119   // Prefer the macro forms of the GC and ownership qualifiers.
1120   if (T->getAttrKind() == AttributedType::attr_objc_gc ||
1121       T->getAttrKind() == AttributedType::attr_objc_ownership)
1122     return printBefore(T->getEquivalentType(), OS);
1123
1124   printBefore(T->getModifiedType(), OS);
1125
1126   if (T->isMSTypeSpec()) {
1127     switch (T->getAttrKind()) {
1128     default: return;
1129     case AttributedType::attr_ptr32: OS << " __ptr32"; break;
1130     case AttributedType::attr_ptr64: OS << " __ptr64"; break;
1131     case AttributedType::attr_sptr: OS << " __sptr"; break;
1132     case AttributedType::attr_uptr: OS << " __uptr"; break;
1133     }
1134     spaceBeforePlaceHolder(OS);
1135   }
1136 }
1137
1138 void TypePrinter::printAttributedAfter(const AttributedType *T,
1139                                        raw_ostream &OS) {
1140   // Prefer the macro forms of the GC and ownership qualifiers.
1141   if (T->getAttrKind() == AttributedType::attr_objc_gc ||
1142       T->getAttrKind() == AttributedType::attr_objc_ownership)
1143     return printAfter(T->getEquivalentType(), OS);
1144
1145   // TODO: not all attributes are GCC-style attributes.
1146   if (T->isMSTypeSpec())
1147     return;
1148
1149   // If this is a calling convention attribute, don't print the implicit CC from
1150   // the modified type.
1151   SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv());
1152
1153   printAfter(T->getModifiedType(), OS);
1154
1155   OS << " __attribute__((";
1156   switch (T->getAttrKind()) {
1157   default: llvm_unreachable("This attribute should have been handled already");
1158   case AttributedType::attr_address_space:
1159     OS << "address_space(";
1160     OS << T->getEquivalentType().getAddressSpace();
1161     OS << ')';
1162     break;
1163
1164   case AttributedType::attr_vector_size: {
1165     OS << "__vector_size__(";
1166     if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) {
1167       OS << vector->getNumElements();
1168       OS << " * sizeof(";
1169       print(vector->getElementType(), OS, StringRef());
1170       OS << ')';
1171     }
1172     OS << ')';
1173     break;
1174   }
1175
1176   case AttributedType::attr_neon_vector_type:
1177   case AttributedType::attr_neon_polyvector_type: {
1178     if (T->getAttrKind() == AttributedType::attr_neon_vector_type)
1179       OS << "neon_vector_type(";
1180     else
1181       OS << "neon_polyvector_type(";
1182     const VectorType *vector = T->getEquivalentType()->getAs<VectorType>();
1183     OS << vector->getNumElements();
1184     OS << ')';
1185     break;
1186   }
1187
1188   case AttributedType::attr_regparm: {
1189     // FIXME: When Sema learns to form this AttributedType, avoid printing the
1190     // attribute again in printFunctionProtoAfter.
1191     OS << "regparm(";
1192     QualType t = T->getEquivalentType();
1193     while (!t->isFunctionType())
1194       t = t->getPointeeType();
1195     OS << t->getAs<FunctionType>()->getRegParmType();
1196     OS << ')';
1197     break;
1198   }
1199
1200   case AttributedType::attr_objc_gc: {
1201     OS << "objc_gc(";
1202
1203     QualType tmp = T->getEquivalentType();
1204     while (tmp.getObjCGCAttr() == Qualifiers::GCNone) {
1205       QualType next = tmp->getPointeeType();
1206       if (next == tmp) break;
1207       tmp = next;
1208     }
1209
1210     if (tmp.isObjCGCWeak())
1211       OS << "weak";
1212     else
1213       OS << "strong";
1214     OS << ')';
1215     break;
1216   }
1217
1218   case AttributedType::attr_objc_ownership:
1219     OS << "objc_ownership(";
1220     switch (T->getEquivalentType().getObjCLifetime()) {
1221     case Qualifiers::OCL_None: llvm_unreachable("no ownership!");
1222     case Qualifiers::OCL_ExplicitNone: OS << "none"; break;
1223     case Qualifiers::OCL_Strong: OS << "strong"; break;
1224     case Qualifiers::OCL_Weak: OS << "weak"; break;
1225     case Qualifiers::OCL_Autoreleasing: OS << "autoreleasing"; break;
1226     }
1227     OS << ')';
1228     break;
1229
1230   // FIXME: When Sema learns to form this AttributedType, avoid printing the
1231   // attribute again in printFunctionProtoAfter.
1232   case AttributedType::attr_noreturn: OS << "noreturn"; break;
1233
1234   case AttributedType::attr_cdecl: OS << "cdecl"; break;
1235   case AttributedType::attr_fastcall: OS << "fastcall"; break;
1236   case AttributedType::attr_stdcall: OS << "stdcall"; break;
1237   case AttributedType::attr_thiscall: OS << "thiscall"; break;
1238   case AttributedType::attr_pascal: OS << "pascal"; break;
1239   case AttributedType::attr_ms_abi: OS << "ms_abi"; break;
1240   case AttributedType::attr_sysv_abi: OS << "sysv_abi"; break;
1241   case AttributedType::attr_pcs:
1242   case AttributedType::attr_pcs_vfp: {
1243     OS << "pcs(";
1244    QualType t = T->getEquivalentType();
1245    while (!t->isFunctionType())
1246      t = t->getPointeeType();
1247    OS << (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
1248          "\"aapcs\"" : "\"aapcs-vfp\"");
1249    OS << ')';
1250    break;
1251   }
1252   case AttributedType::attr_pnaclcall: OS << "pnaclcall"; break;
1253   case AttributedType::attr_inteloclbicc: OS << "inteloclbicc"; break;
1254   }
1255   OS << "))";
1256 }
1257
1258 void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T, 
1259                                            raw_ostream &OS) { 
1260   OS << T->getDecl()->getName();
1261   spaceBeforePlaceHolder(OS);
1262 }
1263 void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T, 
1264                                           raw_ostream &OS) { } 
1265
1266 void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T,
1267                                         raw_ostream &OS) {
1268   if (T->qual_empty())
1269     return printBefore(T->getBaseType(), OS);
1270
1271   print(T->getBaseType(), OS, StringRef());
1272   OS << '<';
1273   bool isFirst = true;
1274   for (const auto *I : T->quals()) {
1275     if (isFirst)
1276       isFirst = false;
1277     else
1278       OS << ',';
1279     OS << I->getName();
1280   }
1281   OS << '>';
1282   spaceBeforePlaceHolder(OS);
1283 }
1284 void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T,
1285                                         raw_ostream &OS) {
1286   if (T->qual_empty())
1287     return printAfter(T->getBaseType(), OS);
1288 }
1289
1290 void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T, 
1291                                                raw_ostream &OS) {
1292   T->getPointeeType().getLocalQualifiers().print(OS, Policy,
1293                                                 /*appendSpaceIfNonEmpty=*/true);
1294
1295   assert(!T->isObjCSelType());
1296
1297   if (T->isObjCIdType() || T->isObjCQualifiedIdType())
1298     OS << "id";
1299   else if (T->isObjCClassType() || T->isObjCQualifiedClassType())
1300     OS << "Class";
1301   else
1302     OS << T->getInterfaceDecl()->getName();
1303   
1304   if (!T->qual_empty()) {
1305     OS << '<';
1306     for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(), 
1307                                               E = T->qual_end();
1308          I != E; ++I) {
1309       OS << (*I)->getName();
1310       if (I+1 != E)
1311         OS << ',';
1312     }
1313     OS << '>';
1314   }
1315   
1316   if (!T->isObjCIdType() && !T->isObjCQualifiedIdType() &&
1317       !T->isObjCClassType() && !T->isObjCQualifiedClassType()) {
1318     OS << " *"; // Don't forget the implicit pointer.
1319   } else {
1320     spaceBeforePlaceHolder(OS);
1321   }
1322 }
1323 void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T, 
1324                                               raw_ostream &OS) { }
1325
1326 void TemplateSpecializationType::
1327   PrintTemplateArgumentList(raw_ostream &OS,
1328                             const TemplateArgumentListInfo &Args,
1329                             const PrintingPolicy &Policy) {
1330   return PrintTemplateArgumentList(OS,
1331                                    Args.getArgumentArray(),
1332                                    Args.size(),
1333                                    Policy);
1334 }
1335
1336 void
1337 TemplateSpecializationType::PrintTemplateArgumentList(
1338                                                 raw_ostream &OS,
1339                                                 const TemplateArgument *Args,
1340                                                 unsigned NumArgs,
1341                                                   const PrintingPolicy &Policy,
1342                                                       bool SkipBrackets) {
1343   if (!SkipBrackets)
1344     OS << '<';
1345   
1346   bool needSpace = false;
1347   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1348     // Print the argument into a string.
1349     SmallString<128> Buf;
1350     llvm::raw_svector_ostream ArgOS(Buf);
1351     if (Args[Arg].getKind() == TemplateArgument::Pack) {
1352       if (Args[Arg].pack_size() && Arg > 0)
1353         OS << ", ";
1354       PrintTemplateArgumentList(ArgOS,
1355                                 Args[Arg].pack_begin(), 
1356                                 Args[Arg].pack_size(), 
1357                                 Policy, true);
1358     } else {
1359       if (Arg > 0)
1360         OS << ", ";
1361       Args[Arg].print(Policy, ArgOS);
1362     }
1363     StringRef ArgString = ArgOS.str();
1364
1365     // If this is the first argument and its string representation
1366     // begins with the global scope specifier ('::foo'), add a space
1367     // to avoid printing the diagraph '<:'.
1368     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1369       OS << ' ';
1370
1371     OS << ArgString;
1372
1373     needSpace = (!ArgString.empty() && ArgString.back() == '>');
1374   }
1375
1376   // If the last character of our string is '>', add another space to
1377   // keep the two '>''s separate tokens. We don't *have* to do this in
1378   // C++0x, but it's still good hygiene.
1379   if (needSpace)
1380     OS << ' ';
1381
1382   if (!SkipBrackets)
1383     OS << '>';
1384 }
1385
1386 // Sadly, repeat all that with TemplateArgLoc.
1387 void TemplateSpecializationType::
1388 PrintTemplateArgumentList(raw_ostream &OS,
1389                           const TemplateArgumentLoc *Args, unsigned NumArgs,
1390                           const PrintingPolicy &Policy) {
1391   OS << '<';
1392
1393   bool needSpace = false;
1394   for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1395     if (Arg > 0)
1396       OS << ", ";
1397     
1398     // Print the argument into a string.
1399     SmallString<128> Buf;
1400     llvm::raw_svector_ostream ArgOS(Buf);
1401     if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1402       PrintTemplateArgumentList(ArgOS,
1403                                 Args[Arg].getArgument().pack_begin(), 
1404                                 Args[Arg].getArgument().pack_size(), 
1405                                 Policy, true);
1406     } else {
1407       Args[Arg].getArgument().print(Policy, ArgOS);
1408     }
1409     StringRef ArgString = ArgOS.str();
1410     
1411     // If this is the first argument and its string representation
1412     // begins with the global scope specifier ('::foo'), add a space
1413     // to avoid printing the diagraph '<:'.
1414     if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1415       OS << ' ';
1416
1417     OS << ArgString;
1418
1419     needSpace = (!ArgString.empty() && ArgString.back() == '>');
1420   }
1421   
1422   // If the last character of our string is '>', add another space to
1423   // keep the two '>''s separate tokens. We don't *have* to do this in
1424   // C++0x, but it's still good hygiene.
1425   if (needSpace)
1426     OS << ' ';
1427
1428   OS << '>';
1429 }
1430
1431 void QualType::dump(const char *msg) const {
1432   if (msg)
1433     llvm::errs() << msg << ": ";
1434   LangOptions LO;
1435   print(llvm::errs(), PrintingPolicy(LO), "identifier");
1436   llvm::errs() << '\n';
1437 }
1438
1439 LLVM_DUMP_METHOD void QualType::dump() const { dump(nullptr); }
1440
1441 LLVM_DUMP_METHOD void Type::dump() const { QualType(this, 0).dump(); }
1442
1443 std::string Qualifiers::getAsString() const {
1444   LangOptions LO;
1445   return getAsString(PrintingPolicy(LO));
1446 }
1447
1448 // Appends qualifiers to the given string, separated by spaces.  Will
1449 // prefix a space if the string is non-empty.  Will not append a final
1450 // space.
1451 std::string Qualifiers::getAsString(const PrintingPolicy &Policy) const {
1452   SmallString<64> Buf;
1453   llvm::raw_svector_ostream StrOS(Buf);
1454   print(StrOS, Policy);
1455   return StrOS.str();
1456 }
1457
1458 bool Qualifiers::isEmptyWhenPrinted(const PrintingPolicy &Policy) const {
1459   if (getCVRQualifiers())
1460     return false;
1461
1462   if (getAddressSpace())
1463     return false;
1464
1465   if (getObjCGCAttr())
1466     return false;
1467
1468   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime())
1469     if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
1470       return false;
1471
1472   return true;
1473 }
1474
1475 // Appends qualifiers to the given string, separated by spaces.  Will
1476 // prefix a space if the string is non-empty.  Will not append a final
1477 // space.
1478 void Qualifiers::print(raw_ostream &OS, const PrintingPolicy& Policy,
1479                        bool appendSpaceIfNonEmpty) const {
1480   bool addSpace = false;
1481
1482   unsigned quals = getCVRQualifiers();
1483   if (quals) {
1484     AppendTypeQualList(OS, quals);
1485     addSpace = true;
1486   }
1487   if (unsigned addrspace = getAddressSpace()) {
1488     if (addSpace)
1489       OS << ' ';
1490     addSpace = true;
1491     switch (addrspace) {
1492       case LangAS::opencl_global:
1493         OS << "__global";
1494         break;
1495       case LangAS::opencl_local:
1496         OS << "__local";
1497         break;
1498       case LangAS::opencl_constant:
1499         OS << "__constant";
1500         break;
1501       default:
1502         OS << "__attribute__((address_space(";
1503         OS << addrspace;
1504         OS << ")))";
1505     }
1506   }
1507   if (Qualifiers::GC gc = getObjCGCAttr()) {
1508     if (addSpace)
1509       OS << ' ';
1510     addSpace = true;
1511     if (gc == Qualifiers::Weak)
1512       OS << "__weak";
1513     else
1514       OS << "__strong";
1515   }
1516   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
1517     if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)){
1518       if (addSpace)
1519         OS << ' ';
1520       addSpace = true;
1521     }
1522
1523     switch (lifetime) {
1524     case Qualifiers::OCL_None: llvm_unreachable("none but true");
1525     case Qualifiers::OCL_ExplicitNone: OS << "__unsafe_unretained"; break;
1526     case Qualifiers::OCL_Strong: 
1527       if (!Policy.SuppressStrongLifetime)
1528         OS << "__strong"; 
1529       break;
1530         
1531     case Qualifiers::OCL_Weak: OS << "__weak"; break;
1532     case Qualifiers::OCL_Autoreleasing: OS << "__autoreleasing"; break;
1533     }
1534   }
1535
1536   if (appendSpaceIfNonEmpty && addSpace)
1537     OS << ' ';
1538 }
1539
1540 std::string QualType::getAsString(const PrintingPolicy &Policy) const {
1541   std::string S;
1542   getAsStringInternal(S, Policy);
1543   return S;
1544 }
1545
1546 std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
1547   std::string buffer;
1548   LangOptions options;
1549   getAsStringInternal(ty, qs, buffer, PrintingPolicy(options));
1550   return buffer;
1551 }
1552
1553 void QualType::print(const Type *ty, Qualifiers qs,
1554                      raw_ostream &OS, const PrintingPolicy &policy,
1555                      const Twine &PlaceHolder) {
1556   SmallString<128> PHBuf;
1557   StringRef PH = PlaceHolder.toStringRef(PHBuf);
1558
1559   TypePrinter(policy).print(ty, qs, OS, PH);
1560 }
1561
1562 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1563                                    std::string &buffer,
1564                                    const PrintingPolicy &policy) {
1565   SmallString<256> Buf;
1566   llvm::raw_svector_ostream StrOS(Buf);
1567   TypePrinter(policy).print(ty, qs, StrOS, buffer);
1568   std::string str = StrOS.str();
1569   buffer.swap(str);
1570 }