1 //===- TypePrinter.cpp - Pretty-Print Clang Types -------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This contains code to print types from Clang's type system.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "clang/AST/ASTContext.h"
14 #include "clang/AST/Attr.h"
15 #include "clang/AST/Decl.h"
16 #include "clang/AST/DeclBase.h"
17 #include "clang/AST/DeclCXX.h"
18 #include "clang/AST/DeclObjC.h"
19 #include "clang/AST/DeclTemplate.h"
20 #include "clang/AST/Expr.h"
21 #include "clang/AST/NestedNameSpecifier.h"
22 #include "clang/AST/PrettyPrinter.h"
23 #include "clang/AST/TemplateBase.h"
24 #include "clang/AST/TemplateName.h"
25 #include "clang/AST/Type.h"
26 #include "clang/Basic/AddressSpaces.h"
27 #include "clang/Basic/ExceptionSpecificationType.h"
28 #include "clang/Basic/IdentifierTable.h"
29 #include "clang/Basic/LLVM.h"
30 #include "clang/Basic/LangOptions.h"
31 #include "clang/Basic/SourceLocation.h"
32 #include "clang/Basic/SourceManager.h"
33 #include "clang/Basic/Specifiers.h"
34 #include "llvm/ADT/ArrayRef.h"
35 #include "llvm/ADT/SmallString.h"
36 #include "llvm/ADT/StringRef.h"
37 #include "llvm/ADT/Twine.h"
38 #include "llvm/Support/Casting.h"
39 #include "llvm/Support/Compiler.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include "llvm/Support/SaveAndRestore.h"
42 #include "llvm/Support/raw_ostream.h"
43 #include <cassert>
44 #include <string>
45 
46 using namespace clang;
47 
48 namespace {
49 
50   /// RAII object that enables printing of the ARC __strong lifetime
51   /// qualifier.
52   class IncludeStrongLifetimeRAII {
53     PrintingPolicy &Policy;
54     bool Old;
55 
56   public:
57     explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy)
58         : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
59         if (!Policy.SuppressLifetimeQualifiers)
60           Policy.SuppressStrongLifetime = false;
61     }
62 
63     ~IncludeStrongLifetimeRAII() {
64       Policy.SuppressStrongLifetime = Old;
65     }
66   };
67 
68   class ParamPolicyRAII {
69     PrintingPolicy &Policy;
70     bool Old;
71 
72   public:
73     explicit ParamPolicyRAII(PrintingPolicy &Policy)
74         : Policy(Policy), Old(Policy.SuppressSpecifiers) {
75       Policy.SuppressSpecifiers = false;
76     }
77 
78     ~ParamPolicyRAII() {
79       Policy.SuppressSpecifiers = Old;
80     }
81   };
82 
83   class ElaboratedTypePolicyRAII {
84     PrintingPolicy &Policy;
85     bool SuppressTagKeyword;
86     bool SuppressScope;
87 
88   public:
89     explicit ElaboratedTypePolicyRAII(PrintingPolicy &Policy) : Policy(Policy) {
90       SuppressTagKeyword = Policy.SuppressTagKeyword;
91       SuppressScope = Policy.SuppressScope;
92       Policy.SuppressTagKeyword = true;
93       Policy.SuppressScope = true;
94     }
95 
96     ~ElaboratedTypePolicyRAII() {
97       Policy.SuppressTagKeyword = SuppressTagKeyword;
98       Policy.SuppressScope = SuppressScope;
99     }
100   };
101 
102   class TypePrinter {
103     PrintingPolicy Policy;
104     unsigned Indentation;
105     bool HasEmptyPlaceHolder = false;
106     bool InsideCCAttribute = false;
107 
108   public:
109     explicit TypePrinter(const PrintingPolicy &Policy, unsigned Indentation = 0)
110         : Policy(Policy), Indentation(Indentation) {}
111 
112     void print(const Type *ty, Qualifiers qs, raw_ostream &OS,
113                StringRef PlaceHolder);
114     void print(QualType T, raw_ostream &OS, StringRef PlaceHolder);
115 
116     static bool canPrefixQualifiers(const Type *T, bool &NeedARCStrongQualifier);
117     void spaceBeforePlaceHolder(raw_ostream &OS);
118     void printTypeSpec(NamedDecl *D, raw_ostream &OS);
119     void printTemplateId(const TemplateSpecializationType *T, raw_ostream &OS,
120                          bool FullyQualify);
121 
122     void printBefore(QualType T, raw_ostream &OS);
123     void printAfter(QualType T, raw_ostream &OS);
124     void AppendScope(DeclContext *DC, raw_ostream &OS,
125                      DeclarationName NameInScope);
126     void printTag(TagDecl *T, raw_ostream &OS);
127     void printFunctionAfter(const FunctionType::ExtInfo &Info, raw_ostream &OS);
128 #define ABSTRACT_TYPE(CLASS, PARENT)
129 #define TYPE(CLASS, PARENT) \
130     void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \
131     void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS);
132 #include "clang/AST/TypeNodes.inc"
133 
134   private:
135     void printBefore(const Type *ty, Qualifiers qs, raw_ostream &OS);
136     void printAfter(const Type *ty, Qualifiers qs, raw_ostream &OS);
137   };
138 
139 } // namespace
140 
141 static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals,
142                                bool HasRestrictKeyword) {
143   bool appendSpace = false;
144   if (TypeQuals & Qualifiers::Const) {
145     OS << "const";
146     appendSpace = true;
147   }
148   if (TypeQuals & Qualifiers::Volatile) {
149     if (appendSpace) OS << ' ';
150     OS << "volatile";
151     appendSpace = true;
152   }
153   if (TypeQuals & Qualifiers::Restrict) {
154     if (appendSpace) OS << ' ';
155     if (HasRestrictKeyword) {
156       OS << "restrict";
157     } else {
158       OS << "__restrict";
159     }
160   }
161 }
162 
163 void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
164   if (!HasEmptyPlaceHolder)
165     OS << ' ';
166 }
167 
168 static SplitQualType splitAccordingToPolicy(QualType QT,
169                                             const PrintingPolicy &Policy) {
170   if (Policy.PrintCanonicalTypes)
171     QT = QT.getCanonicalType();
172   return QT.split();
173 }
174 
175 void TypePrinter::print(QualType t, raw_ostream &OS, StringRef PlaceHolder) {
176   SplitQualType split = splitAccordingToPolicy(t, Policy);
177   print(split.Ty, split.Quals, OS, PlaceHolder);
178 }
179 
180 void TypePrinter::print(const Type *T, Qualifiers Quals, raw_ostream &OS,
181                         StringRef PlaceHolder) {
182   if (!T) {
183     OS << "NULL TYPE";
184     return;
185   }
186 
187   SaveAndRestore<bool> PHVal(HasEmptyPlaceHolder, PlaceHolder.empty());
188 
189   printBefore(T, Quals, OS);
190   OS << PlaceHolder;
191   printAfter(T, Quals, OS);
192 }
193 
194 bool TypePrinter::canPrefixQualifiers(const Type *T,
195                                       bool &NeedARCStrongQualifier) {
196   // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
197   // so that we get "const int" instead of "int const", but we can't do this if
198   // the type is complex.  For example if the type is "int*", we *must* print
199   // "int * const", printing "const int *" is different.  Only do this when the
200   // type expands to a simple string.
201   bool CanPrefixQualifiers = false;
202   NeedARCStrongQualifier = false;
203   const Type *UnderlyingType = T;
204   if (const auto *AT = dyn_cast<AutoType>(T))
205     UnderlyingType = AT->desugar().getTypePtr();
206   if (const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(T))
207     UnderlyingType = Subst->getReplacementType().getTypePtr();
208   Type::TypeClass TC = UnderlyingType->getTypeClass();
209 
210   switch (TC) {
211     case Type::Auto:
212     case Type::Builtin:
213     case Type::Complex:
214     case Type::UnresolvedUsing:
215     case Type::Using:
216     case Type::Typedef:
217     case Type::TypeOfExpr:
218     case Type::TypeOf:
219     case Type::Decltype:
220     case Type::UnaryTransform:
221     case Type::Record:
222     case Type::Enum:
223     case Type::Elaborated:
224     case Type::TemplateTypeParm:
225     case Type::SubstTemplateTypeParmPack:
226     case Type::DeducedTemplateSpecialization:
227     case Type::TemplateSpecialization:
228     case Type::InjectedClassName:
229     case Type::DependentName:
230     case Type::DependentTemplateSpecialization:
231     case Type::ObjCObject:
232     case Type::ObjCTypeParam:
233     case Type::ObjCInterface:
234     case Type::Atomic:
235     case Type::Pipe:
236     case Type::BitInt:
237     case Type::DependentBitInt:
238     case Type::BTFTagAttributed:
239       CanPrefixQualifiers = true;
240       break;
241 
242     case Type::ObjCObjectPointer:
243       CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
244         T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
245       break;
246 
247     case Type::VariableArray:
248     case Type::DependentSizedArray:
249       NeedARCStrongQualifier = true;
250       LLVM_FALLTHROUGH;
251 
252     case Type::ConstantArray:
253     case Type::IncompleteArray:
254       return canPrefixQualifiers(
255           cast<ArrayType>(UnderlyingType)->getElementType().getTypePtr(),
256           NeedARCStrongQualifier);
257 
258     case Type::Adjusted:
259     case Type::Decayed:
260     case Type::Pointer:
261     case Type::BlockPointer:
262     case Type::LValueReference:
263     case Type::RValueReference:
264     case Type::MemberPointer:
265     case Type::DependentAddressSpace:
266     case Type::DependentVector:
267     case Type::DependentSizedExtVector:
268     case Type::Vector:
269     case Type::ExtVector:
270     case Type::ConstantMatrix:
271     case Type::DependentSizedMatrix:
272     case Type::FunctionProto:
273     case Type::FunctionNoProto:
274     case Type::Paren:
275     case Type::PackExpansion:
276     case Type::SubstTemplateTypeParm:
277     case Type::MacroQualified:
278       CanPrefixQualifiers = false;
279       break;
280 
281     case Type::Attributed: {
282       // We still want to print the address_space before the type if it is an
283       // address_space attribute.
284       const auto *AttrTy = cast<AttributedType>(UnderlyingType);
285       CanPrefixQualifiers = AttrTy->getAttrKind() == attr::AddressSpace;
286       break;
287     }
288   }
289 
290   return CanPrefixQualifiers;
291 }
292 
293 void TypePrinter::printBefore(QualType T, raw_ostream &OS) {
294   SplitQualType Split = splitAccordingToPolicy(T, Policy);
295 
296   // If we have cv1 T, where T is substituted for cv2 U, only print cv1 - cv2
297   // at this level.
298   Qualifiers Quals = Split.Quals;
299   if (const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(Split.Ty))
300     Quals -= QualType(Subst, 0).getQualifiers();
301 
302   printBefore(Split.Ty, Quals, OS);
303 }
304 
305 /// Prints the part of the type string before an identifier, e.g. for
306 /// "int foo[10]" it prints "int ".
307 void TypePrinter::printBefore(const Type *T,Qualifiers Quals, raw_ostream &OS) {
308   if (Policy.SuppressSpecifiers && T->isSpecifierType())
309     return;
310 
311   SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder);
312 
313   // Print qualifiers as appropriate.
314 
315   bool CanPrefixQualifiers = false;
316   bool NeedARCStrongQualifier = false;
317   CanPrefixQualifiers = canPrefixQualifiers(T, NeedARCStrongQualifier);
318 
319   if (CanPrefixQualifiers && !Quals.empty()) {
320     if (NeedARCStrongQualifier) {
321       IncludeStrongLifetimeRAII Strong(Policy);
322       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
323     } else {
324       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
325     }
326   }
327 
328   bool hasAfterQuals = false;
329   if (!CanPrefixQualifiers && !Quals.empty()) {
330     hasAfterQuals = !Quals.isEmptyWhenPrinted(Policy);
331     if (hasAfterQuals)
332       HasEmptyPlaceHolder = false;
333   }
334 
335   switch (T->getTypeClass()) {
336 #define ABSTRACT_TYPE(CLASS, PARENT)
337 #define TYPE(CLASS, PARENT) case Type::CLASS: \
338     print##CLASS##Before(cast<CLASS##Type>(T), OS); \
339     break;
340 #include "clang/AST/TypeNodes.inc"
341   }
342 
343   if (hasAfterQuals) {
344     if (NeedARCStrongQualifier) {
345       IncludeStrongLifetimeRAII Strong(Policy);
346       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
347     } else {
348       Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
349     }
350   }
351 }
352 
353 void TypePrinter::printAfter(QualType t, raw_ostream &OS) {
354   SplitQualType split = splitAccordingToPolicy(t, Policy);
355   printAfter(split.Ty, split.Quals, OS);
356 }
357 
358 /// Prints the part of the type string after an identifier, e.g. for
359 /// "int foo[10]" it prints "[10]".
360 void TypePrinter::printAfter(const Type *T, Qualifiers Quals, raw_ostream &OS) {
361   switch (T->getTypeClass()) {
362 #define ABSTRACT_TYPE(CLASS, PARENT)
363 #define TYPE(CLASS, PARENT) case Type::CLASS: \
364     print##CLASS##After(cast<CLASS##Type>(T), OS); \
365     break;
366 #include "clang/AST/TypeNodes.inc"
367   }
368 }
369 
370 void TypePrinter::printBuiltinBefore(const BuiltinType *T, raw_ostream &OS) {
371   OS << T->getName(Policy);
372   spaceBeforePlaceHolder(OS);
373 }
374 
375 void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) {}
376 
377 void TypePrinter::printComplexBefore(const ComplexType *T, raw_ostream &OS) {
378   OS << "_Complex ";
379   printBefore(T->getElementType(), OS);
380 }
381 
382 void TypePrinter::printComplexAfter(const ComplexType *T, raw_ostream &OS) {
383   printAfter(T->getElementType(), OS);
384 }
385 
386 void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) {
387   IncludeStrongLifetimeRAII Strong(Policy);
388   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
389   printBefore(T->getPointeeType(), OS);
390   // Handle things like 'int (*A)[4];' correctly.
391   // FIXME: this should include vectors, but vectors use attributes I guess.
392   if (isa<ArrayType>(T->getPointeeType()))
393     OS << '(';
394   OS << '*';
395 }
396 
397 void TypePrinter::printPointerAfter(const PointerType *T, raw_ostream &OS) {
398   IncludeStrongLifetimeRAII Strong(Policy);
399   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
400   // Handle things like 'int (*A)[4];' correctly.
401   // FIXME: this should include vectors, but vectors use attributes I guess.
402   if (isa<ArrayType>(T->getPointeeType()))
403     OS << ')';
404   printAfter(T->getPointeeType(), OS);
405 }
406 
407 void TypePrinter::printBlockPointerBefore(const BlockPointerType *T,
408                                           raw_ostream &OS) {
409   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
410   printBefore(T->getPointeeType(), OS);
411   OS << '^';
412 }
413 
414 void TypePrinter::printBlockPointerAfter(const BlockPointerType *T,
415                                           raw_ostream &OS) {
416   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
417   printAfter(T->getPointeeType(), OS);
418 }
419 
420 // When printing a reference, the referenced type might also be a reference.
421 // If so, we want to skip that before printing the inner type.
422 static QualType skipTopLevelReferences(QualType T) {
423   if (auto *Ref = T->getAs<ReferenceType>())
424     return skipTopLevelReferences(Ref->getPointeeTypeAsWritten());
425   return T;
426 }
427 
428 void TypePrinter::printLValueReferenceBefore(const LValueReferenceType *T,
429                                              raw_ostream &OS) {
430   IncludeStrongLifetimeRAII Strong(Policy);
431   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
432   QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten());
433   printBefore(Inner, OS);
434   // Handle things like 'int (&A)[4];' correctly.
435   // FIXME: this should include vectors, but vectors use attributes I guess.
436   if (isa<ArrayType>(Inner))
437     OS << '(';
438   OS << '&';
439 }
440 
441 void TypePrinter::printLValueReferenceAfter(const LValueReferenceType *T,
442                                             raw_ostream &OS) {
443   IncludeStrongLifetimeRAII Strong(Policy);
444   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
445   QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten());
446   // Handle things like 'int (&A)[4];' correctly.
447   // FIXME: this should include vectors, but vectors use attributes I guess.
448   if (isa<ArrayType>(Inner))
449     OS << ')';
450   printAfter(Inner, OS);
451 }
452 
453 void TypePrinter::printRValueReferenceBefore(const RValueReferenceType *T,
454                                              raw_ostream &OS) {
455   IncludeStrongLifetimeRAII Strong(Policy);
456   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
457   QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten());
458   printBefore(Inner, OS);
459   // Handle things like 'int (&&A)[4];' correctly.
460   // FIXME: this should include vectors, but vectors use attributes I guess.
461   if (isa<ArrayType>(Inner))
462     OS << '(';
463   OS << "&&";
464 }
465 
466 void TypePrinter::printRValueReferenceAfter(const RValueReferenceType *T,
467                                             raw_ostream &OS) {
468   IncludeStrongLifetimeRAII Strong(Policy);
469   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
470   QualType Inner = skipTopLevelReferences(T->getPointeeTypeAsWritten());
471   // Handle things like 'int (&&A)[4];' correctly.
472   // FIXME: this should include vectors, but vectors use attributes I guess.
473   if (isa<ArrayType>(Inner))
474     OS << ')';
475   printAfter(Inner, OS);
476 }
477 
478 void TypePrinter::printMemberPointerBefore(const MemberPointerType *T,
479                                            raw_ostream &OS) {
480   IncludeStrongLifetimeRAII Strong(Policy);
481   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
482   printBefore(T->getPointeeType(), OS);
483   // Handle things like 'int (Cls::*A)[4];' correctly.
484   // FIXME: this should include vectors, but vectors use attributes I guess.
485   if (isa<ArrayType>(T->getPointeeType()))
486     OS << '(';
487 
488   PrintingPolicy InnerPolicy(Policy);
489   InnerPolicy.IncludeTagDefinition = false;
490   TypePrinter(InnerPolicy).print(QualType(T->getClass(), 0), OS, StringRef());
491 
492   OS << "::*";
493 }
494 
495 void TypePrinter::printMemberPointerAfter(const MemberPointerType *T,
496                                           raw_ostream &OS) {
497   IncludeStrongLifetimeRAII Strong(Policy);
498   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
499   // Handle things like 'int (Cls::*A)[4];' correctly.
500   // FIXME: this should include vectors, but vectors use attributes I guess.
501   if (isa<ArrayType>(T->getPointeeType()))
502     OS << ')';
503   printAfter(T->getPointeeType(), OS);
504 }
505 
506 void TypePrinter::printConstantArrayBefore(const ConstantArrayType *T,
507                                            raw_ostream &OS) {
508   IncludeStrongLifetimeRAII Strong(Policy);
509   printBefore(T->getElementType(), OS);
510 }
511 
512 void TypePrinter::printConstantArrayAfter(const ConstantArrayType *T,
513                                           raw_ostream &OS) {
514   OS << '[';
515   if (T->getIndexTypeQualifiers().hasQualifiers()) {
516     AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers(),
517                        Policy.Restrict);
518     OS << ' ';
519   }
520 
521   if (T->getSizeModifier() == ArrayType::Static)
522     OS << "static ";
523 
524   OS << T->getSize().getZExtValue() << ']';
525   printAfter(T->getElementType(), OS);
526 }
527 
528 void TypePrinter::printIncompleteArrayBefore(const IncompleteArrayType *T,
529                                              raw_ostream &OS) {
530   IncludeStrongLifetimeRAII Strong(Policy);
531   printBefore(T->getElementType(), OS);
532 }
533 
534 void TypePrinter::printIncompleteArrayAfter(const IncompleteArrayType *T,
535                                             raw_ostream &OS) {
536   OS << "[]";
537   printAfter(T->getElementType(), OS);
538 }
539 
540 void TypePrinter::printVariableArrayBefore(const VariableArrayType *T,
541                                            raw_ostream &OS) {
542   IncludeStrongLifetimeRAII Strong(Policy);
543   printBefore(T->getElementType(), OS);
544 }
545 
546 void TypePrinter::printVariableArrayAfter(const VariableArrayType *T,
547                                           raw_ostream &OS) {
548   OS << '[';
549   if (T->getIndexTypeQualifiers().hasQualifiers()) {
550     AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers(), Policy.Restrict);
551     OS << ' ';
552   }
553 
554   if (T->getSizeModifier() == VariableArrayType::Static)
555     OS << "static ";
556   else if (T->getSizeModifier() == VariableArrayType::Star)
557     OS << '*';
558 
559   if (T->getSizeExpr())
560     T->getSizeExpr()->printPretty(OS, nullptr, Policy);
561   OS << ']';
562 
563   printAfter(T->getElementType(), OS);
564 }
565 
566 void TypePrinter::printAdjustedBefore(const AdjustedType *T, raw_ostream &OS) {
567   // Print the adjusted representation, otherwise the adjustment will be
568   // invisible.
569   printBefore(T->getAdjustedType(), OS);
570 }
571 
572 void TypePrinter::printAdjustedAfter(const AdjustedType *T, raw_ostream &OS) {
573   printAfter(T->getAdjustedType(), OS);
574 }
575 
576 void TypePrinter::printDecayedBefore(const DecayedType *T, raw_ostream &OS) {
577   // Print as though it's a pointer.
578   printAdjustedBefore(T, OS);
579 }
580 
581 void TypePrinter::printDecayedAfter(const DecayedType *T, raw_ostream &OS) {
582   printAdjustedAfter(T, OS);
583 }
584 
585 void TypePrinter::printDependentSizedArrayBefore(
586                                                const DependentSizedArrayType *T,
587                                                raw_ostream &OS) {
588   IncludeStrongLifetimeRAII Strong(Policy);
589   printBefore(T->getElementType(), OS);
590 }
591 
592 void TypePrinter::printDependentSizedArrayAfter(
593                                                const DependentSizedArrayType *T,
594                                                raw_ostream &OS) {
595   OS << '[';
596   if (T->getSizeExpr())
597     T->getSizeExpr()->printPretty(OS, nullptr, Policy);
598   OS << ']';
599   printAfter(T->getElementType(), OS);
600 }
601 
602 void TypePrinter::printDependentAddressSpaceBefore(
603     const DependentAddressSpaceType *T, raw_ostream &OS) {
604   printBefore(T->getPointeeType(), OS);
605 }
606 
607 void TypePrinter::printDependentAddressSpaceAfter(
608     const DependentAddressSpaceType *T, raw_ostream &OS) {
609   OS << " __attribute__((address_space(";
610   if (T->getAddrSpaceExpr())
611     T->getAddrSpaceExpr()->printPretty(OS, nullptr, Policy);
612   OS << ")))";
613   printAfter(T->getPointeeType(), OS);
614 }
615 
616 void TypePrinter::printDependentSizedExtVectorBefore(
617                                           const DependentSizedExtVectorType *T,
618                                           raw_ostream &OS) {
619   printBefore(T->getElementType(), OS);
620 }
621 
622 void TypePrinter::printDependentSizedExtVectorAfter(
623                                           const DependentSizedExtVectorType *T,
624                                           raw_ostream &OS) {
625   OS << " __attribute__((ext_vector_type(";
626   if (T->getSizeExpr())
627     T->getSizeExpr()->printPretty(OS, nullptr, Policy);
628   OS << ")))";
629   printAfter(T->getElementType(), OS);
630 }
631 
632 void TypePrinter::printVectorBefore(const VectorType *T, raw_ostream &OS) {
633   switch (T->getVectorKind()) {
634   case VectorType::AltiVecPixel:
635     OS << "__vector __pixel ";
636     break;
637   case VectorType::AltiVecBool:
638     OS << "__vector __bool ";
639     printBefore(T->getElementType(), OS);
640     break;
641   case VectorType::AltiVecVector:
642     OS << "__vector ";
643     printBefore(T->getElementType(), OS);
644     break;
645   case VectorType::NeonVector:
646     OS << "__attribute__((neon_vector_type("
647        << T->getNumElements() << "))) ";
648     printBefore(T->getElementType(), OS);
649     break;
650   case VectorType::NeonPolyVector:
651     OS << "__attribute__((neon_polyvector_type(" <<
652           T->getNumElements() << "))) ";
653     printBefore(T->getElementType(), OS);
654     break;
655   case VectorType::GenericVector: {
656     // FIXME: We prefer to print the size directly here, but have no way
657     // to get the size of the type.
658     OS << "__attribute__((__vector_size__("
659        << T->getNumElements()
660        << " * sizeof(";
661     print(T->getElementType(), OS, StringRef());
662     OS << ")))) ";
663     printBefore(T->getElementType(), OS);
664     break;
665   }
666   case VectorType::SveFixedLengthDataVector:
667   case VectorType::SveFixedLengthPredicateVector:
668     // FIXME: We prefer to print the size directly here, but have no way
669     // to get the size of the type.
670     OS << "__attribute__((__arm_sve_vector_bits__(";
671 
672     if (T->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
673       // Predicates take a bit per byte of the vector size, multiply by 8 to
674       // get the number of bits passed to the attribute.
675       OS << T->getNumElements() * 8;
676     else
677       OS << T->getNumElements();
678 
679     OS << " * sizeof(";
680     print(T->getElementType(), OS, StringRef());
681     // Multiply by 8 for the number of bits.
682     OS << ") * 8))) ";
683     printBefore(T->getElementType(), OS);
684   }
685 }
686 
687 void TypePrinter::printVectorAfter(const VectorType *T, raw_ostream &OS) {
688   printAfter(T->getElementType(), OS);
689 }
690 
691 void TypePrinter::printDependentVectorBefore(
692     const DependentVectorType *T, raw_ostream &OS) {
693   switch (T->getVectorKind()) {
694   case VectorType::AltiVecPixel:
695     OS << "__vector __pixel ";
696     break;
697   case VectorType::AltiVecBool:
698     OS << "__vector __bool ";
699     printBefore(T->getElementType(), OS);
700     break;
701   case VectorType::AltiVecVector:
702     OS << "__vector ";
703     printBefore(T->getElementType(), OS);
704     break;
705   case VectorType::NeonVector:
706     OS << "__attribute__((neon_vector_type(";
707     if (T->getSizeExpr())
708       T->getSizeExpr()->printPretty(OS, nullptr, Policy);
709     OS << "))) ";
710     printBefore(T->getElementType(), OS);
711     break;
712   case VectorType::NeonPolyVector:
713     OS << "__attribute__((neon_polyvector_type(";
714     if (T->getSizeExpr())
715       T->getSizeExpr()->printPretty(OS, nullptr, Policy);
716     OS << "))) ";
717     printBefore(T->getElementType(), OS);
718     break;
719   case VectorType::GenericVector: {
720     // FIXME: We prefer to print the size directly here, but have no way
721     // to get the size of the type.
722     OS << "__attribute__((__vector_size__(";
723     if (T->getSizeExpr())
724       T->getSizeExpr()->printPretty(OS, nullptr, Policy);
725     OS << " * sizeof(";
726     print(T->getElementType(), OS, StringRef());
727     OS << ")))) ";
728     printBefore(T->getElementType(), OS);
729     break;
730   }
731   case VectorType::SveFixedLengthDataVector:
732   case VectorType::SveFixedLengthPredicateVector:
733     // FIXME: We prefer to print the size directly here, but have no way
734     // to get the size of the type.
735     OS << "__attribute__((__arm_sve_vector_bits__(";
736     if (T->getSizeExpr()) {
737       T->getSizeExpr()->printPretty(OS, nullptr, Policy);
738       if (T->getVectorKind() == VectorType::SveFixedLengthPredicateVector)
739         // Predicates take a bit per byte of the vector size, multiply by 8 to
740         // get the number of bits passed to the attribute.
741         OS << " * 8";
742       OS << " * sizeof(";
743       print(T->getElementType(), OS, StringRef());
744       // Multiply by 8 for the number of bits.
745       OS << ") * 8";
746     }
747     OS << "))) ";
748     printBefore(T->getElementType(), OS);
749   }
750 }
751 
752 void TypePrinter::printDependentVectorAfter(
753     const DependentVectorType *T, raw_ostream &OS) {
754   printAfter(T->getElementType(), OS);
755 }
756 
757 void TypePrinter::printExtVectorBefore(const ExtVectorType *T,
758                                        raw_ostream &OS) {
759   printBefore(T->getElementType(), OS);
760 }
761 
762 void TypePrinter::printExtVectorAfter(const ExtVectorType *T, raw_ostream &OS) {
763   printAfter(T->getElementType(), OS);
764   OS << " __attribute__((ext_vector_type(";
765   OS << T->getNumElements();
766   OS << ")))";
767 }
768 
769 void TypePrinter::printConstantMatrixBefore(const ConstantMatrixType *T,
770                                             raw_ostream &OS) {
771   printBefore(T->getElementType(), OS);
772   OS << " __attribute__((matrix_type(";
773   OS << T->getNumRows() << ", " << T->getNumColumns();
774   OS << ")))";
775 }
776 
777 void TypePrinter::printConstantMatrixAfter(const ConstantMatrixType *T,
778                                            raw_ostream &OS) {
779   printAfter(T->getElementType(), OS);
780 }
781 
782 void TypePrinter::printDependentSizedMatrixBefore(
783     const DependentSizedMatrixType *T, raw_ostream &OS) {
784   printBefore(T->getElementType(), OS);
785   OS << " __attribute__((matrix_type(";
786   if (T->getRowExpr()) {
787     T->getRowExpr()->printPretty(OS, nullptr, Policy);
788   }
789   OS << ", ";
790   if (T->getColumnExpr()) {
791     T->getColumnExpr()->printPretty(OS, nullptr, Policy);
792   }
793   OS << ")))";
794 }
795 
796 void TypePrinter::printDependentSizedMatrixAfter(
797     const DependentSizedMatrixType *T, raw_ostream &OS) {
798   printAfter(T->getElementType(), OS);
799 }
800 
801 void
802 FunctionProtoType::printExceptionSpecification(raw_ostream &OS,
803                                                const PrintingPolicy &Policy)
804                                                                          const {
805   if (hasDynamicExceptionSpec()) {
806     OS << " throw(";
807     if (getExceptionSpecType() == EST_MSAny)
808       OS << "...";
809     else
810       for (unsigned I = 0, N = getNumExceptions(); I != N; ++I) {
811         if (I)
812           OS << ", ";
813 
814         OS << getExceptionType(I).stream(Policy);
815       }
816     OS << ')';
817   } else if (EST_NoThrow == getExceptionSpecType()) {
818     OS << " __attribute__((nothrow))";
819   } else if (isNoexceptExceptionSpec(getExceptionSpecType())) {
820     OS << " noexcept";
821     // FIXME:Is it useful to print out the expression for a non-dependent
822     // noexcept specification?
823     if (isComputedNoexcept(getExceptionSpecType())) {
824       OS << '(';
825       if (getNoexceptExpr())
826         getNoexceptExpr()->printPretty(OS, nullptr, Policy);
827       OS << ')';
828     }
829   }
830 }
831 
832 void TypePrinter::printFunctionProtoBefore(const FunctionProtoType *T,
833                                            raw_ostream &OS) {
834   if (T->hasTrailingReturn()) {
835     OS << "auto ";
836     if (!HasEmptyPlaceHolder)
837       OS << '(';
838   } else {
839     // If needed for precedence reasons, wrap the inner part in grouping parens.
840     SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
841     printBefore(T->getReturnType(), OS);
842     if (!PrevPHIsEmpty.get())
843       OS << '(';
844   }
845 }
846 
847 StringRef clang::getParameterABISpelling(ParameterABI ABI) {
848   switch (ABI) {
849   case ParameterABI::Ordinary:
850     llvm_unreachable("asking for spelling of ordinary parameter ABI");
851   case ParameterABI::SwiftContext:
852     return "swift_context";
853   case ParameterABI::SwiftAsyncContext:
854     return "swift_async_context";
855   case ParameterABI::SwiftErrorResult:
856     return "swift_error_result";
857   case ParameterABI::SwiftIndirectResult:
858     return "swift_indirect_result";
859   }
860   llvm_unreachable("bad parameter ABI kind");
861 }
862 
863 void TypePrinter::printFunctionProtoAfter(const FunctionProtoType *T,
864                                           raw_ostream &OS) {
865   // If needed for precedence reasons, wrap the inner part in grouping parens.
866   if (!HasEmptyPlaceHolder)
867     OS << ')';
868   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
869 
870   OS << '(';
871   {
872     ParamPolicyRAII ParamPolicy(Policy);
873     for (unsigned i = 0, e = T->getNumParams(); i != e; ++i) {
874       if (i) OS << ", ";
875 
876       auto EPI = T->getExtParameterInfo(i);
877       if (EPI.isConsumed()) OS << "__attribute__((ns_consumed)) ";
878       if (EPI.isNoEscape())
879         OS << "__attribute__((noescape)) ";
880       auto ABI = EPI.getABI();
881       if (ABI != ParameterABI::Ordinary)
882         OS << "__attribute__((" << getParameterABISpelling(ABI) << ")) ";
883 
884       print(T->getParamType(i), OS, StringRef());
885     }
886   }
887 
888   if (T->isVariadic()) {
889     if (T->getNumParams())
890       OS << ", ";
891     OS << "...";
892   } else if (T->getNumParams() == 0 && Policy.UseVoidForZeroParams) {
893     // Do not emit int() if we have a proto, emit 'int(void)'.
894     OS << "void";
895   }
896 
897   OS << ')';
898 
899   FunctionType::ExtInfo Info = T->getExtInfo();
900 
901   printFunctionAfter(Info, OS);
902 
903   if (!T->getMethodQuals().empty())
904     OS << " " << T->getMethodQuals().getAsString();
905 
906   switch (T->getRefQualifier()) {
907   case RQ_None:
908     break;
909 
910   case RQ_LValue:
911     OS << " &";
912     break;
913 
914   case RQ_RValue:
915     OS << " &&";
916     break;
917   }
918   T->printExceptionSpecification(OS, Policy);
919 
920   if (T->hasTrailingReturn()) {
921     OS << " -> ";
922     print(T->getReturnType(), OS, StringRef());
923   } else
924     printAfter(T->getReturnType(), OS);
925 }
926 
927 void TypePrinter::printFunctionAfter(const FunctionType::ExtInfo &Info,
928                                      raw_ostream &OS) {
929   if (!InsideCCAttribute) {
930     switch (Info.getCC()) {
931     case CC_C:
932       // The C calling convention is the default on the vast majority of platforms
933       // we support.  If the user wrote it explicitly, it will usually be printed
934       // while traversing the AttributedType.  If the type has been desugared, let
935       // the canonical spelling be the implicit calling convention.
936       // FIXME: It would be better to be explicit in certain contexts, such as a
937       // cdecl function typedef used to declare a member function with the
938       // Microsoft C++ ABI.
939       break;
940     case CC_X86StdCall:
941       OS << " __attribute__((stdcall))";
942       break;
943     case CC_X86FastCall:
944       OS << " __attribute__((fastcall))";
945       break;
946     case CC_X86ThisCall:
947       OS << " __attribute__((thiscall))";
948       break;
949     case CC_X86VectorCall:
950       OS << " __attribute__((vectorcall))";
951       break;
952     case CC_X86Pascal:
953       OS << " __attribute__((pascal))";
954       break;
955     case CC_AAPCS:
956       OS << " __attribute__((pcs(\"aapcs\")))";
957       break;
958     case CC_AAPCS_VFP:
959       OS << " __attribute__((pcs(\"aapcs-vfp\")))";
960       break;
961     case CC_AArch64VectorCall:
962       OS << "__attribute__((aarch64_vector_pcs))";
963       break;
964     case CC_IntelOclBicc:
965       OS << " __attribute__((intel_ocl_bicc))";
966       break;
967     case CC_Win64:
968       OS << " __attribute__((ms_abi))";
969       break;
970     case CC_X86_64SysV:
971       OS << " __attribute__((sysv_abi))";
972       break;
973     case CC_X86RegCall:
974       OS << " __attribute__((regcall))";
975       break;
976     case CC_SpirFunction:
977     case CC_OpenCLKernel:
978       // Do nothing. These CCs are not available as attributes.
979       break;
980     case CC_Swift:
981       OS << " __attribute__((swiftcall))";
982       break;
983     case CC_SwiftAsync:
984       OS << "__attribute__((swiftasynccall))";
985       break;
986     case CC_PreserveMost:
987       OS << " __attribute__((preserve_most))";
988       break;
989     case CC_PreserveAll:
990       OS << " __attribute__((preserve_all))";
991       break;
992     }
993   }
994 
995   if (Info.getNoReturn())
996     OS << " __attribute__((noreturn))";
997   if (Info.getCmseNSCall())
998     OS << " __attribute__((cmse_nonsecure_call))";
999   if (Info.getProducesResult())
1000     OS << " __attribute__((ns_returns_retained))";
1001   if (Info.getRegParm())
1002     OS << " __attribute__((regparm ("
1003        << Info.getRegParm() << ")))";
1004   if (Info.getNoCallerSavedRegs())
1005     OS << " __attribute__((no_caller_saved_registers))";
1006   if (Info.getNoCfCheck())
1007     OS << " __attribute__((nocf_check))";
1008 }
1009 
1010 void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T,
1011                                              raw_ostream &OS) {
1012   // If needed for precedence reasons, wrap the inner part in grouping parens.
1013   SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
1014   printBefore(T->getReturnType(), OS);
1015   if (!PrevPHIsEmpty.get())
1016     OS << '(';
1017 }
1018 
1019 void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T,
1020                                             raw_ostream &OS) {
1021   // If needed for precedence reasons, wrap the inner part in grouping parens.
1022   if (!HasEmptyPlaceHolder)
1023     OS << ')';
1024   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
1025 
1026   OS << "()";
1027   printFunctionAfter(T->getExtInfo(), OS);
1028   printAfter(T->getReturnType(), OS);
1029 }
1030 
1031 void TypePrinter::printTypeSpec(NamedDecl *D, raw_ostream &OS) {
1032 
1033   // Compute the full nested-name-specifier for this type.
1034   // In C, this will always be empty except when the type
1035   // being printed is anonymous within other Record.
1036   if (!Policy.SuppressScope)
1037     AppendScope(D->getDeclContext(), OS, D->getDeclName());
1038 
1039   IdentifierInfo *II = D->getIdentifier();
1040   OS << II->getName();
1041   spaceBeforePlaceHolder(OS);
1042 }
1043 
1044 void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T,
1045                                              raw_ostream &OS) {
1046   printTypeSpec(T->getDecl(), OS);
1047 }
1048 
1049 void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T,
1050                                             raw_ostream &OS) {}
1051 
1052 void TypePrinter::printUsingBefore(const UsingType *T, raw_ostream &OS) {
1053   // After `namespace b { using a::X }`, is the type X within B a::X or b::X?
1054   //
1055   // - b::X is more formally correct given the UsingType model
1056   // - b::X makes sense if "re-exporting" a symbol in a new namespace
1057   // - a::X makes sense if "importing" a symbol for convenience
1058   //
1059   // The "importing" use seems much more common, so we print a::X.
1060   // This could be a policy option, but the right choice seems to rest more
1061   // with the intent of the code than the caller.
1062   printTypeSpec(T->getFoundDecl()->getUnderlyingDecl(), OS);
1063 }
1064 
1065 void TypePrinter::printUsingAfter(const UsingType *T, raw_ostream &OS) {}
1066 
1067 void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) {
1068   printTypeSpec(T->getDecl(), OS);
1069 }
1070 
1071 void TypePrinter::printMacroQualifiedBefore(const MacroQualifiedType *T,
1072                                             raw_ostream &OS) {
1073   StringRef MacroName = T->getMacroIdentifier()->getName();
1074   OS << MacroName << " ";
1075 
1076   // Since this type is meant to print the macro instead of the whole attribute,
1077   // we trim any attributes and go directly to the original modified type.
1078   printBefore(T->getModifiedType(), OS);
1079 }
1080 
1081 void TypePrinter::printMacroQualifiedAfter(const MacroQualifiedType *T,
1082                                            raw_ostream &OS) {
1083   printAfter(T->getModifiedType(), OS);
1084 }
1085 
1086 void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) {}
1087 
1088 void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T,
1089                                         raw_ostream &OS) {
1090   OS << "typeof ";
1091   if (T->getUnderlyingExpr())
1092     T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
1093   spaceBeforePlaceHolder(OS);
1094 }
1095 
1096 void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T,
1097                                        raw_ostream &OS) {}
1098 
1099 void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) {
1100   OS << "typeof(";
1101   print(T->getUnderlyingType(), OS, StringRef());
1102   OS << ')';
1103   spaceBeforePlaceHolder(OS);
1104 }
1105 
1106 void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) {}
1107 
1108 void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) {
1109   OS << "decltype(";
1110   if (T->getUnderlyingExpr())
1111     T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
1112   OS << ')';
1113   spaceBeforePlaceHolder(OS);
1114 }
1115 
1116 void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) {}
1117 
1118 void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T,
1119                                             raw_ostream &OS) {
1120   IncludeStrongLifetimeRAII Strong(Policy);
1121 
1122   switch (T->getUTTKind()) {
1123     case UnaryTransformType::EnumUnderlyingType:
1124       OS << "__underlying_type(";
1125       print(T->getBaseType(), OS, StringRef());
1126       OS << ')';
1127       spaceBeforePlaceHolder(OS);
1128       return;
1129   }
1130 
1131   printBefore(T->getBaseType(), OS);
1132 }
1133 
1134 void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T,
1135                                            raw_ostream &OS) {
1136   IncludeStrongLifetimeRAII Strong(Policy);
1137 
1138   switch (T->getUTTKind()) {
1139     case UnaryTransformType::EnumUnderlyingType:
1140       return;
1141   }
1142 
1143   printAfter(T->getBaseType(), OS);
1144 }
1145 
1146 void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) {
1147   // If the type has been deduced, do not print 'auto'.
1148   if (!T->getDeducedType().isNull()) {
1149     printBefore(T->getDeducedType(), OS);
1150   } else {
1151     if (T->isConstrained()) {
1152       // FIXME: Track a TypeConstraint as type sugar, so that we can print the
1153       // type as it was written.
1154       T->getTypeConstraintConcept()->getDeclName().print(OS, Policy);
1155       auto Args = T->getTypeConstraintArguments();
1156       if (!Args.empty())
1157         printTemplateArgumentList(
1158             OS, Args, Policy,
1159             T->getTypeConstraintConcept()->getTemplateParameters());
1160       OS << ' ';
1161     }
1162     switch (T->getKeyword()) {
1163     case AutoTypeKeyword::Auto: OS << "auto"; break;
1164     case AutoTypeKeyword::DecltypeAuto: OS << "decltype(auto)"; break;
1165     case AutoTypeKeyword::GNUAutoType: OS << "__auto_type"; break;
1166     }
1167     spaceBeforePlaceHolder(OS);
1168   }
1169 }
1170 
1171 void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) {
1172   // If the type has been deduced, do not print 'auto'.
1173   if (!T->getDeducedType().isNull())
1174     printAfter(T->getDeducedType(), OS);
1175 }
1176 
1177 void TypePrinter::printDeducedTemplateSpecializationBefore(
1178     const DeducedTemplateSpecializationType *T, raw_ostream &OS) {
1179   // If the type has been deduced, print the deduced type.
1180   if (!T->getDeducedType().isNull()) {
1181     printBefore(T->getDeducedType(), OS);
1182   } else {
1183     IncludeStrongLifetimeRAII Strong(Policy);
1184     T->getTemplateName().print(OS, Policy);
1185     spaceBeforePlaceHolder(OS);
1186   }
1187 }
1188 
1189 void TypePrinter::printDeducedTemplateSpecializationAfter(
1190     const DeducedTemplateSpecializationType *T, raw_ostream &OS) {
1191   // If the type has been deduced, print the deduced type.
1192   if (!T->getDeducedType().isNull())
1193     printAfter(T->getDeducedType(), OS);
1194 }
1195 
1196 void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) {
1197   IncludeStrongLifetimeRAII Strong(Policy);
1198 
1199   OS << "_Atomic(";
1200   print(T->getValueType(), OS, StringRef());
1201   OS << ')';
1202   spaceBeforePlaceHolder(OS);
1203 }
1204 
1205 void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) {}
1206 
1207 void TypePrinter::printPipeBefore(const PipeType *T, raw_ostream &OS) {
1208   IncludeStrongLifetimeRAII Strong(Policy);
1209 
1210   if (T->isReadOnly())
1211     OS << "read_only ";
1212   else
1213     OS << "write_only ";
1214   OS << "pipe ";
1215   print(T->getElementType(), OS, StringRef());
1216   spaceBeforePlaceHolder(OS);
1217 }
1218 
1219 void TypePrinter::printPipeAfter(const PipeType *T, raw_ostream &OS) {}
1220 
1221 void TypePrinter::printBitIntBefore(const BitIntType *T, raw_ostream &OS) {
1222   if (T->isUnsigned())
1223     OS << "unsigned ";
1224   OS << "_BitInt(" << T->getNumBits() << ")";
1225   spaceBeforePlaceHolder(OS);
1226 }
1227 
1228 void TypePrinter::printBitIntAfter(const BitIntType *T, raw_ostream &OS) {}
1229 
1230 void TypePrinter::printDependentBitIntBefore(const DependentBitIntType *T,
1231                                              raw_ostream &OS) {
1232   if (T->isUnsigned())
1233     OS << "unsigned ";
1234   OS << "_BitInt(";
1235   T->getNumBitsExpr()->printPretty(OS, nullptr, Policy);
1236   OS << ")";
1237   spaceBeforePlaceHolder(OS);
1238 }
1239 
1240 void TypePrinter::printDependentBitIntAfter(const DependentBitIntType *T,
1241                                             raw_ostream &OS) {}
1242 
1243 /// Appends the given scope to the end of a string.
1244 void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS,
1245                               DeclarationName NameInScope) {
1246   if (DC->isTranslationUnit())
1247     return;
1248 
1249   // FIXME: Consider replacing this with NamedDecl::printNestedNameSpecifier,
1250   // which can also print names for function and method scopes.
1251   if (DC->isFunctionOrMethod())
1252     return;
1253 
1254   if (Policy.Callbacks && Policy.Callbacks->isScopeVisible(DC))
1255     return;
1256 
1257   if (const auto *NS = dyn_cast<NamespaceDecl>(DC)) {
1258     if (Policy.SuppressUnwrittenScope && NS->isAnonymousNamespace())
1259       return AppendScope(DC->getParent(), OS, NameInScope);
1260 
1261     // Only suppress an inline namespace if the name has the same lookup
1262     // results in the enclosing namespace.
1263     if (Policy.SuppressInlineNamespace && NS->isInline() && NameInScope &&
1264         NS->isRedundantInlineQualifierFor(NameInScope))
1265       return AppendScope(DC->getParent(), OS, NameInScope);
1266 
1267     AppendScope(DC->getParent(), OS, NS->getDeclName());
1268     if (NS->getIdentifier())
1269       OS << NS->getName() << "::";
1270     else
1271       OS << "(anonymous namespace)::";
1272   } else if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1273     AppendScope(DC->getParent(), OS, Spec->getDeclName());
1274     IncludeStrongLifetimeRAII Strong(Policy);
1275     OS << Spec->getIdentifier()->getName();
1276     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1277     printTemplateArgumentList(
1278         OS, TemplateArgs.asArray(), Policy,
1279         Spec->getSpecializedTemplate()->getTemplateParameters());
1280     OS << "::";
1281   } else if (const auto *Tag = dyn_cast<TagDecl>(DC)) {
1282     AppendScope(DC->getParent(), OS, Tag->getDeclName());
1283     if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
1284       OS << Typedef->getIdentifier()->getName() << "::";
1285     else if (Tag->getIdentifier())
1286       OS << Tag->getIdentifier()->getName() << "::";
1287     else
1288       return;
1289   } else {
1290     AppendScope(DC->getParent(), OS, NameInScope);
1291   }
1292 }
1293 
1294 void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
1295   if (Policy.IncludeTagDefinition) {
1296     PrintingPolicy SubPolicy = Policy;
1297     SubPolicy.IncludeTagDefinition = false;
1298     D->print(OS, SubPolicy, Indentation);
1299     spaceBeforePlaceHolder(OS);
1300     return;
1301   }
1302 
1303   bool HasKindDecoration = false;
1304 
1305   // We don't print tags unless this is an elaborated type.
1306   // In C, we just assume every RecordType is an elaborated type.
1307   if (!Policy.SuppressTagKeyword && !D->getTypedefNameForAnonDecl()) {
1308     HasKindDecoration = true;
1309     OS << D->getKindName();
1310     OS << ' ';
1311   }
1312 
1313   // Compute the full nested-name-specifier for this type.
1314   // In C, this will always be empty except when the type
1315   // being printed is anonymous within other Record.
1316   if (!Policy.SuppressScope)
1317     AppendScope(D->getDeclContext(), OS, D->getDeclName());
1318 
1319   if (const IdentifierInfo *II = D->getIdentifier())
1320     OS << II->getName();
1321   else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
1322     assert(Typedef->getIdentifier() && "Typedef without identifier?");
1323     OS << Typedef->getIdentifier()->getName();
1324   } else {
1325     // Make an unambiguous representation for anonymous types, e.g.
1326     //   (anonymous enum at /usr/include/string.h:120:9)
1327     OS << (Policy.MSVCFormatting ? '`' : '(');
1328 
1329     if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
1330       OS << "lambda";
1331       HasKindDecoration = true;
1332     } else if ((isa<RecordDecl>(D) && cast<RecordDecl>(D)->isAnonymousStructOrUnion())) {
1333       OS << "anonymous";
1334     } else {
1335       OS << "unnamed";
1336     }
1337 
1338     if (Policy.AnonymousTagLocations) {
1339       // Suppress the redundant tag keyword if we just printed one.
1340       // We don't have to worry about ElaboratedTypes here because you can't
1341       // refer to an anonymous type with one.
1342       if (!HasKindDecoration)
1343         OS << " " << D->getKindName();
1344 
1345       PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
1346           D->getLocation());
1347       if (PLoc.isValid()) {
1348         OS << " at ";
1349         StringRef File = PLoc.getFilename();
1350         if (auto *Callbacks = Policy.Callbacks)
1351           OS << Callbacks->remapPath(File);
1352         else
1353           OS << File;
1354         OS << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
1355       }
1356     }
1357 
1358     OS << (Policy.MSVCFormatting ? '\'' : ')');
1359   }
1360 
1361   // If this is a class template specialization, print the template
1362   // arguments.
1363   if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1364     ArrayRef<TemplateArgument> Args;
1365     TypeSourceInfo *TAW = Spec->getTypeAsWritten();
1366     if (!Policy.PrintCanonicalTypes && TAW) {
1367       const TemplateSpecializationType *TST =
1368         cast<TemplateSpecializationType>(TAW->getType());
1369       Args = TST->template_arguments();
1370     } else {
1371       const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1372       Args = TemplateArgs.asArray();
1373     }
1374     IncludeStrongLifetimeRAII Strong(Policy);
1375     printTemplateArgumentList(
1376         OS, Args, Policy,
1377         Spec->getSpecializedTemplate()->getTemplateParameters());
1378   }
1379 
1380   spaceBeforePlaceHolder(OS);
1381 }
1382 
1383 void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) {
1384   // Print the preferred name if we have one for this type.
1385   if (Policy.UsePreferredNames) {
1386     for (const auto *PNA : T->getDecl()->specific_attrs<PreferredNameAttr>()) {
1387       if (!declaresSameEntity(PNA->getTypedefType()->getAsCXXRecordDecl(),
1388                               T->getDecl()))
1389         continue;
1390       // Find the outermost typedef or alias template.
1391       QualType T = PNA->getTypedefType();
1392       while (true) {
1393         if (auto *TT = dyn_cast<TypedefType>(T))
1394           return printTypeSpec(TT->getDecl(), OS);
1395         if (auto *TST = dyn_cast<TemplateSpecializationType>(T))
1396           return printTemplateId(TST, OS, /*FullyQualify=*/true);
1397         T = T->getLocallyUnqualifiedSingleStepDesugaredType();
1398       }
1399     }
1400   }
1401 
1402   printTag(T->getDecl(), OS);
1403 }
1404 
1405 void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) {}
1406 
1407 void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) {
1408   printTag(T->getDecl(), OS);
1409 }
1410 
1411 void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) {}
1412 
1413 void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T,
1414                                               raw_ostream &OS) {
1415   TemplateTypeParmDecl *D = T->getDecl();
1416   if (D && D->isImplicit()) {
1417     if (auto *TC = D->getTypeConstraint()) {
1418       TC->print(OS, Policy);
1419       OS << ' ';
1420     }
1421     OS << "auto";
1422   } else if (IdentifierInfo *Id = T->getIdentifier())
1423     OS << (Policy.CleanUglifiedParameters ? Id->deuglifiedName()
1424                                           : Id->getName());
1425   else
1426     OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex();
1427 
1428   spaceBeforePlaceHolder(OS);
1429 }
1430 
1431 void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T,
1432                                              raw_ostream &OS) {}
1433 
1434 void TypePrinter::printSubstTemplateTypeParmBefore(
1435                                              const SubstTemplateTypeParmType *T,
1436                                              raw_ostream &OS) {
1437   IncludeStrongLifetimeRAII Strong(Policy);
1438   printBefore(T->getReplacementType(), OS);
1439 }
1440 
1441 void TypePrinter::printSubstTemplateTypeParmAfter(
1442                                              const SubstTemplateTypeParmType *T,
1443                                              raw_ostream &OS) {
1444   IncludeStrongLifetimeRAII Strong(Policy);
1445   printAfter(T->getReplacementType(), OS);
1446 }
1447 
1448 void TypePrinter::printSubstTemplateTypeParmPackBefore(
1449                                         const SubstTemplateTypeParmPackType *T,
1450                                         raw_ostream &OS) {
1451   IncludeStrongLifetimeRAII Strong(Policy);
1452   printTemplateTypeParmBefore(T->getReplacedParameter(), OS);
1453 }
1454 
1455 void TypePrinter::printSubstTemplateTypeParmPackAfter(
1456                                         const SubstTemplateTypeParmPackType *T,
1457                                         raw_ostream &OS) {
1458   IncludeStrongLifetimeRAII Strong(Policy);
1459   printTemplateTypeParmAfter(T->getReplacedParameter(), OS);
1460 }
1461 
1462 void TypePrinter::printTemplateId(const TemplateSpecializationType *T,
1463                                   raw_ostream &OS, bool FullyQualify) {
1464   IncludeStrongLifetimeRAII Strong(Policy);
1465 
1466   TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl();
1467   if (FullyQualify && TD) {
1468     if (!Policy.SuppressScope)
1469       AppendScope(TD->getDeclContext(), OS, TD->getDeclName());
1470 
1471     OS << TD->getName();
1472   } else {
1473     T->getTemplateName().print(OS, Policy);
1474   }
1475 
1476   printTemplateArgumentList(OS, T->template_arguments(), Policy);
1477   spaceBeforePlaceHolder(OS);
1478 }
1479 
1480 void TypePrinter::printTemplateSpecializationBefore(
1481                                             const TemplateSpecializationType *T,
1482                                             raw_ostream &OS) {
1483   printTemplateId(T, OS, Policy.FullyQualifiedName);
1484 }
1485 
1486 void TypePrinter::printTemplateSpecializationAfter(
1487                                             const TemplateSpecializationType *T,
1488                                             raw_ostream &OS) {}
1489 
1490 void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T,
1491                                                raw_ostream &OS) {
1492   if (Policy.PrintInjectedClassNameWithArguments)
1493     return printTemplateSpecializationBefore(T->getInjectedTST(), OS);
1494 
1495   IncludeStrongLifetimeRAII Strong(Policy);
1496   T->getTemplateName().print(OS, Policy);
1497   spaceBeforePlaceHolder(OS);
1498 }
1499 
1500 void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T,
1501                                                raw_ostream &OS) {}
1502 
1503 void TypePrinter::printElaboratedBefore(const ElaboratedType *T,
1504                                         raw_ostream &OS) {
1505   if (Policy.IncludeTagDefinition && T->getOwnedTagDecl()) {
1506     TagDecl *OwnedTagDecl = T->getOwnedTagDecl();
1507     assert(OwnedTagDecl->getTypeForDecl() == T->getNamedType().getTypePtr() &&
1508            "OwnedTagDecl expected to be a declaration for the type");
1509     PrintingPolicy SubPolicy = Policy;
1510     SubPolicy.IncludeTagDefinition = false;
1511     OwnedTagDecl->print(OS, SubPolicy, Indentation);
1512     spaceBeforePlaceHolder(OS);
1513     return;
1514   }
1515 
1516   // The tag definition will take care of these.
1517   if (!Policy.IncludeTagDefinition)
1518   {
1519     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1520     if (T->getKeyword() != ETK_None)
1521       OS << " ";
1522     NestedNameSpecifier *Qualifier = T->getQualifier();
1523     if (Qualifier)
1524       Qualifier->print(OS, Policy);
1525   }
1526 
1527   ElaboratedTypePolicyRAII PolicyRAII(Policy);
1528   printBefore(T->getNamedType(), OS);
1529 }
1530 
1531 void TypePrinter::printElaboratedAfter(const ElaboratedType *T,
1532                                         raw_ostream &OS) {
1533   if (Policy.IncludeTagDefinition && T->getOwnedTagDecl())
1534     return;
1535   ElaboratedTypePolicyRAII PolicyRAII(Policy);
1536   printAfter(T->getNamedType(), OS);
1537 }
1538 
1539 void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) {
1540   if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1541     printBefore(T->getInnerType(), OS);
1542     OS << '(';
1543   } else
1544     printBefore(T->getInnerType(), OS);
1545 }
1546 
1547 void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) {
1548   if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1549     OS << ')';
1550     printAfter(T->getInnerType(), OS);
1551   } else
1552     printAfter(T->getInnerType(), OS);
1553 }
1554 
1555 void TypePrinter::printDependentNameBefore(const DependentNameType *T,
1556                                            raw_ostream &OS) {
1557   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1558   if (T->getKeyword() != ETK_None)
1559     OS << " ";
1560 
1561   T->getQualifier()->print(OS, Policy);
1562 
1563   OS << T->getIdentifier()->getName();
1564   spaceBeforePlaceHolder(OS);
1565 }
1566 
1567 void TypePrinter::printDependentNameAfter(const DependentNameType *T,
1568                                           raw_ostream &OS) {}
1569 
1570 void TypePrinter::printDependentTemplateSpecializationBefore(
1571         const DependentTemplateSpecializationType *T, raw_ostream &OS) {
1572   IncludeStrongLifetimeRAII Strong(Policy);
1573 
1574   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1575   if (T->getKeyword() != ETK_None)
1576     OS << " ";
1577 
1578   if (T->getQualifier())
1579     T->getQualifier()->print(OS, Policy);
1580   OS << "template " << T->getIdentifier()->getName();
1581   printTemplateArgumentList(OS, T->template_arguments(), Policy);
1582   spaceBeforePlaceHolder(OS);
1583 }
1584 
1585 void TypePrinter::printDependentTemplateSpecializationAfter(
1586         const DependentTemplateSpecializationType *T, raw_ostream &OS) {}
1587 
1588 void TypePrinter::printPackExpansionBefore(const PackExpansionType *T,
1589                                            raw_ostream &OS) {
1590   printBefore(T->getPattern(), OS);
1591 }
1592 
1593 void TypePrinter::printPackExpansionAfter(const PackExpansionType *T,
1594                                           raw_ostream &OS) {
1595   printAfter(T->getPattern(), OS);
1596   OS << "...";
1597 }
1598 
1599 void TypePrinter::printAttributedBefore(const AttributedType *T,
1600                                         raw_ostream &OS) {
1601   // FIXME: Generate this with TableGen.
1602 
1603   // Prefer the macro forms of the GC and ownership qualifiers.
1604   if (T->getAttrKind() == attr::ObjCGC ||
1605       T->getAttrKind() == attr::ObjCOwnership)
1606     return printBefore(T->getEquivalentType(), OS);
1607 
1608   if (T->getAttrKind() == attr::ObjCKindOf)
1609     OS << "__kindof ";
1610 
1611   if (T->getAttrKind() == attr::AddressSpace)
1612     printBefore(T->getEquivalentType(), OS);
1613   else
1614     printBefore(T->getModifiedType(), OS);
1615 
1616   if (T->isMSTypeSpec()) {
1617     switch (T->getAttrKind()) {
1618     default: return;
1619     case attr::Ptr32: OS << " __ptr32"; break;
1620     case attr::Ptr64: OS << " __ptr64"; break;
1621     case attr::SPtr: OS << " __sptr"; break;
1622     case attr::UPtr: OS << " __uptr"; break;
1623     }
1624     spaceBeforePlaceHolder(OS);
1625   }
1626 
1627   // Print nullability type specifiers.
1628   if (T->getImmediateNullability()) {
1629     if (T->getAttrKind() == attr::TypeNonNull)
1630       OS << " _Nonnull";
1631     else if (T->getAttrKind() == attr::TypeNullable)
1632       OS << " _Nullable";
1633     else if (T->getAttrKind() == attr::TypeNullUnspecified)
1634       OS << " _Null_unspecified";
1635     else if (T->getAttrKind() == attr::TypeNullableResult)
1636       OS << " _Nullable_result";
1637     else
1638       llvm_unreachable("unhandled nullability");
1639     spaceBeforePlaceHolder(OS);
1640   }
1641 }
1642 
1643 void TypePrinter::printAttributedAfter(const AttributedType *T,
1644                                        raw_ostream &OS) {
1645   // FIXME: Generate this with TableGen.
1646 
1647   // Prefer the macro forms of the GC and ownership qualifiers.
1648   if (T->getAttrKind() == attr::ObjCGC ||
1649       T->getAttrKind() == attr::ObjCOwnership)
1650     return printAfter(T->getEquivalentType(), OS);
1651 
1652   // If this is a calling convention attribute, don't print the implicit CC from
1653   // the modified type.
1654   SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv());
1655 
1656   printAfter(T->getModifiedType(), OS);
1657 
1658   // Some attributes are printed as qualifiers before the type, so we have
1659   // nothing left to do.
1660   if (T->getAttrKind() == attr::ObjCKindOf ||
1661       T->isMSTypeSpec() || T->getImmediateNullability())
1662     return;
1663 
1664   // Don't print the inert __unsafe_unretained attribute at all.
1665   if (T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1666     return;
1667 
1668   // Don't print ns_returns_retained unless it had an effect.
1669   if (T->getAttrKind() == attr::NSReturnsRetained &&
1670       !T->getEquivalentType()->castAs<FunctionType>()
1671                              ->getExtInfo().getProducesResult())
1672     return;
1673 
1674   if (T->getAttrKind() == attr::LifetimeBound) {
1675     OS << " [[clang::lifetimebound]]";
1676     return;
1677   }
1678 
1679   // The printing of the address_space attribute is handled by the qualifier
1680   // since it is still stored in the qualifier. Return early to prevent printing
1681   // this twice.
1682   if (T->getAttrKind() == attr::AddressSpace)
1683     return;
1684 
1685   OS << " __attribute__((";
1686   switch (T->getAttrKind()) {
1687 #define TYPE_ATTR(NAME)
1688 #define DECL_OR_TYPE_ATTR(NAME)
1689 #define ATTR(NAME) case attr::NAME:
1690 #include "clang/Basic/AttrList.inc"
1691     llvm_unreachable("non-type attribute attached to type");
1692 
1693   case attr::BTFTypeTag:
1694     llvm_unreachable("BTFTypeTag attribute handled separately");
1695 
1696   case attr::OpenCLPrivateAddressSpace:
1697   case attr::OpenCLGlobalAddressSpace:
1698   case attr::OpenCLGlobalDeviceAddressSpace:
1699   case attr::OpenCLGlobalHostAddressSpace:
1700   case attr::OpenCLLocalAddressSpace:
1701   case attr::OpenCLConstantAddressSpace:
1702   case attr::OpenCLGenericAddressSpace:
1703     // FIXME: Update printAttributedBefore to print these once we generate
1704     // AttributedType nodes for them.
1705     break;
1706 
1707   case attr::LifetimeBound:
1708   case attr::TypeNonNull:
1709   case attr::TypeNullable:
1710   case attr::TypeNullableResult:
1711   case attr::TypeNullUnspecified:
1712   case attr::ObjCGC:
1713   case attr::ObjCInertUnsafeUnretained:
1714   case attr::ObjCKindOf:
1715   case attr::ObjCOwnership:
1716   case attr::Ptr32:
1717   case attr::Ptr64:
1718   case attr::SPtr:
1719   case attr::UPtr:
1720   case attr::AddressSpace:
1721   case attr::CmseNSCall:
1722     llvm_unreachable("This attribute should have been handled already");
1723 
1724   case attr::NSReturnsRetained:
1725     OS << "ns_returns_retained";
1726     break;
1727 
1728   // FIXME: When Sema learns to form this AttributedType, avoid printing the
1729   // attribute again in printFunctionProtoAfter.
1730   case attr::AnyX86NoCfCheck: OS << "nocf_check"; break;
1731   case attr::CDecl: OS << "cdecl"; break;
1732   case attr::FastCall: OS << "fastcall"; break;
1733   case attr::StdCall: OS << "stdcall"; break;
1734   case attr::ThisCall: OS << "thiscall"; break;
1735   case attr::SwiftCall: OS << "swiftcall"; break;
1736   case attr::SwiftAsyncCall: OS << "swiftasynccall"; break;
1737   case attr::VectorCall: OS << "vectorcall"; break;
1738   case attr::Pascal: OS << "pascal"; break;
1739   case attr::MSABI: OS << "ms_abi"; break;
1740   case attr::SysVABI: OS << "sysv_abi"; break;
1741   case attr::RegCall: OS << "regcall"; break;
1742   case attr::Pcs: {
1743     OS << "pcs(";
1744    QualType t = T->getEquivalentType();
1745    while (!t->isFunctionType())
1746      t = t->getPointeeType();
1747    OS << (t->castAs<FunctionType>()->getCallConv() == CC_AAPCS ?
1748          "\"aapcs\"" : "\"aapcs-vfp\"");
1749    OS << ')';
1750    break;
1751   }
1752   case attr::AArch64VectorPcs: OS << "aarch64_vector_pcs"; break;
1753   case attr::IntelOclBicc: OS << "inteloclbicc"; break;
1754   case attr::PreserveMost:
1755     OS << "preserve_most";
1756     break;
1757 
1758   case attr::PreserveAll:
1759     OS << "preserve_all";
1760     break;
1761   case attr::NoDeref:
1762     OS << "noderef";
1763     break;
1764   case attr::AcquireHandle:
1765     OS << "acquire_handle";
1766     break;
1767   case attr::ArmMveStrictPolymorphism:
1768     OS << "__clang_arm_mve_strict_polymorphism";
1769     break;
1770   }
1771   OS << "))";
1772 }
1773 
1774 void TypePrinter::printBTFTagAttributedBefore(const BTFTagAttributedType *T,
1775                                               raw_ostream &OS) {
1776   printBefore(T->getWrappedType(), OS);
1777   OS << " btf_type_tag(" << T->getAttr()->getBTFTypeTag() << ")";
1778 }
1779 
1780 void TypePrinter::printBTFTagAttributedAfter(const BTFTagAttributedType *T,
1781                                              raw_ostream &OS) {
1782   printAfter(T->getWrappedType(), OS);
1783 }
1784 
1785 void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T,
1786                                            raw_ostream &OS) {
1787   OS << T->getDecl()->getName();
1788   spaceBeforePlaceHolder(OS);
1789 }
1790 
1791 void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T,
1792                                           raw_ostream &OS) {}
1793 
1794 void TypePrinter::printObjCTypeParamBefore(const ObjCTypeParamType *T,
1795                                           raw_ostream &OS) {
1796   OS << T->getDecl()->getName();
1797   if (!T->qual_empty()) {
1798     bool isFirst = true;
1799     OS << '<';
1800     for (const auto *I : T->quals()) {
1801       if (isFirst)
1802         isFirst = false;
1803       else
1804         OS << ',';
1805       OS << I->getName();
1806     }
1807     OS << '>';
1808   }
1809 
1810   spaceBeforePlaceHolder(OS);
1811 }
1812 
1813 void TypePrinter::printObjCTypeParamAfter(const ObjCTypeParamType *T,
1814                                           raw_ostream &OS) {}
1815 
1816 void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T,
1817                                         raw_ostream &OS) {
1818   if (T->qual_empty() && T->isUnspecializedAsWritten() &&
1819       !T->isKindOfTypeAsWritten())
1820     return printBefore(T->getBaseType(), OS);
1821 
1822   if (T->isKindOfTypeAsWritten())
1823     OS << "__kindof ";
1824 
1825   print(T->getBaseType(), OS, StringRef());
1826 
1827   if (T->isSpecializedAsWritten()) {
1828     bool isFirst = true;
1829     OS << '<';
1830     for (auto typeArg : T->getTypeArgsAsWritten()) {
1831       if (isFirst)
1832         isFirst = false;
1833       else
1834         OS << ",";
1835 
1836       print(typeArg, OS, StringRef());
1837     }
1838     OS << '>';
1839   }
1840 
1841   if (!T->qual_empty()) {
1842     bool isFirst = true;
1843     OS << '<';
1844     for (const auto *I : T->quals()) {
1845       if (isFirst)
1846         isFirst = false;
1847       else
1848         OS << ',';
1849       OS << I->getName();
1850     }
1851     OS << '>';
1852   }
1853 
1854   spaceBeforePlaceHolder(OS);
1855 }
1856 
1857 void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T,
1858                                         raw_ostream &OS) {
1859   if (T->qual_empty() && T->isUnspecializedAsWritten() &&
1860       !T->isKindOfTypeAsWritten())
1861     return printAfter(T->getBaseType(), OS);
1862 }
1863 
1864 void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T,
1865                                                raw_ostream &OS) {
1866   printBefore(T->getPointeeType(), OS);
1867 
1868   // If we need to print the pointer, print it now.
1869   if (!T->isObjCIdType() && !T->isObjCQualifiedIdType() &&
1870       !T->isObjCClassType() && !T->isObjCQualifiedClassType()) {
1871     if (HasEmptyPlaceHolder)
1872       OS << ' ';
1873     OS << '*';
1874   }
1875 }
1876 
1877 void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T,
1878                                               raw_ostream &OS) {}
1879 
1880 static
1881 const TemplateArgument &getArgument(const TemplateArgument &A) { return A; }
1882 
1883 static const TemplateArgument &getArgument(const TemplateArgumentLoc &A) {
1884   return A.getArgument();
1885 }
1886 
1887 static void printArgument(const TemplateArgument &A, const PrintingPolicy &PP,
1888                           llvm::raw_ostream &OS, bool IncludeType) {
1889   A.print(PP, OS, IncludeType);
1890 }
1891 
1892 static void printArgument(const TemplateArgumentLoc &A,
1893                           const PrintingPolicy &PP, llvm::raw_ostream &OS,
1894                           bool IncludeType) {
1895   const TemplateArgument::ArgKind &Kind = A.getArgument().getKind();
1896   if (Kind == TemplateArgument::ArgKind::Type)
1897     return A.getTypeSourceInfo()->getType().print(OS, PP);
1898   return A.getArgument().print(PP, OS, IncludeType);
1899 }
1900 
1901 static bool isSubstitutedTemplateArgument(ASTContext &Ctx, TemplateArgument Arg,
1902                                           TemplateArgument Pattern,
1903                                           ArrayRef<TemplateArgument> Args,
1904                                           unsigned Depth);
1905 
1906 static bool isSubstitutedType(ASTContext &Ctx, QualType T, QualType Pattern,
1907                               ArrayRef<TemplateArgument> Args, unsigned Depth) {
1908   if (Ctx.hasSameType(T, Pattern))
1909     return true;
1910 
1911   // A type parameter matches its argument.
1912   if (auto *TTPT = Pattern->getAs<TemplateTypeParmType>()) {
1913     if (TTPT->getDepth() == Depth && TTPT->getIndex() < Args.size() &&
1914         Args[TTPT->getIndex()].getKind() == TemplateArgument::Type) {
1915       QualType SubstArg = Ctx.getQualifiedType(
1916           Args[TTPT->getIndex()].getAsType(), Pattern.getQualifiers());
1917       return Ctx.hasSameType(SubstArg, T);
1918     }
1919     return false;
1920   }
1921 
1922   // FIXME: Recurse into array types.
1923 
1924   // All other cases will need the types to be identically qualified.
1925   Qualifiers TQual, PatQual;
1926   T = Ctx.getUnqualifiedArrayType(T, TQual);
1927   Pattern = Ctx.getUnqualifiedArrayType(Pattern, PatQual);
1928   if (TQual != PatQual)
1929     return false;
1930 
1931   // Recurse into pointer-like types.
1932   {
1933     QualType TPointee = T->getPointeeType();
1934     QualType PPointee = Pattern->getPointeeType();
1935     if (!TPointee.isNull() && !PPointee.isNull())
1936       return T->getTypeClass() == Pattern->getTypeClass() &&
1937              isSubstitutedType(Ctx, TPointee, PPointee, Args, Depth);
1938   }
1939 
1940   // Recurse into template specialization types.
1941   if (auto *PTST =
1942           Pattern.getCanonicalType()->getAs<TemplateSpecializationType>()) {
1943     TemplateName Template;
1944     ArrayRef<TemplateArgument> TemplateArgs;
1945     if (auto *TTST = T->getAs<TemplateSpecializationType>()) {
1946       Template = TTST->getTemplateName();
1947       TemplateArgs = TTST->template_arguments();
1948     } else if (auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
1949                    T->getAsCXXRecordDecl())) {
1950       Template = TemplateName(CTSD->getSpecializedTemplate());
1951       TemplateArgs = CTSD->getTemplateArgs().asArray();
1952     } else {
1953       return false;
1954     }
1955 
1956     if (!isSubstitutedTemplateArgument(Ctx, Template, PTST->getTemplateName(),
1957                                        Args, Depth))
1958       return false;
1959     if (TemplateArgs.size() != PTST->getNumArgs())
1960       return false;
1961     for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
1962       if (!isSubstitutedTemplateArgument(Ctx, TemplateArgs[I], PTST->getArg(I),
1963                                          Args, Depth))
1964         return false;
1965     return true;
1966   }
1967 
1968   // FIXME: Handle more cases.
1969   return false;
1970 }
1971 
1972 static bool isSubstitutedTemplateArgument(ASTContext &Ctx, TemplateArgument Arg,
1973                                           TemplateArgument Pattern,
1974                                           ArrayRef<TemplateArgument> Args,
1975                                           unsigned Depth) {
1976   Arg = Ctx.getCanonicalTemplateArgument(Arg);
1977   Pattern = Ctx.getCanonicalTemplateArgument(Pattern);
1978   if (Arg.structurallyEquals(Pattern))
1979     return true;
1980 
1981   if (Pattern.getKind() == TemplateArgument::Expression) {
1982     if (auto *DRE =
1983             dyn_cast<DeclRefExpr>(Pattern.getAsExpr()->IgnoreParenImpCasts())) {
1984       if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
1985         return NTTP->getDepth() == Depth && Args.size() > NTTP->getIndex() &&
1986                Args[NTTP->getIndex()].structurallyEquals(Arg);
1987     }
1988   }
1989 
1990   if (Arg.getKind() != Pattern.getKind())
1991     return false;
1992 
1993   if (Arg.getKind() == TemplateArgument::Type)
1994     return isSubstitutedType(Ctx, Arg.getAsType(), Pattern.getAsType(), Args,
1995                              Depth);
1996 
1997   if (Arg.getKind() == TemplateArgument::Template) {
1998     TemplateDecl *PatTD = Pattern.getAsTemplate().getAsTemplateDecl();
1999     if (auto *TTPD = dyn_cast_or_null<TemplateTemplateParmDecl>(PatTD))
2000       return TTPD->getDepth() == Depth && Args.size() > TTPD->getIndex() &&
2001              Ctx.getCanonicalTemplateArgument(Args[TTPD->getIndex()])
2002                  .structurallyEquals(Arg);
2003   }
2004 
2005   // FIXME: Handle more cases.
2006   return false;
2007 }
2008 
2009 /// Make a best-effort determination of whether the type T can be produced by
2010 /// substituting Args into the default argument of Param.
2011 static bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
2012                                          const NamedDecl *Param,
2013                                          ArrayRef<TemplateArgument> Args,
2014                                          unsigned Depth) {
2015   // An empty pack is equivalent to not providing a pack argument.
2016   if (Arg.getKind() == TemplateArgument::Pack && Arg.pack_size() == 0)
2017     return true;
2018 
2019   if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
2020     return TTPD->hasDefaultArgument() &&
2021            isSubstitutedTemplateArgument(Ctx, Arg, TTPD->getDefaultArgument(),
2022                                          Args, Depth);
2023   } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2024     return TTPD->hasDefaultArgument() &&
2025            isSubstitutedTemplateArgument(
2026                Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2027   } else if (auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2028     return NTTPD->hasDefaultArgument() &&
2029            isSubstitutedTemplateArgument(Ctx, Arg, NTTPD->getDefaultArgument(),
2030                                          Args, Depth);
2031   }
2032   return false;
2033 }
2034 
2035 template <typename TA>
2036 static void
2037 printTo(raw_ostream &OS, ArrayRef<TA> Args, const PrintingPolicy &Policy,
2038         const TemplateParameterList *TPL, bool IsPack, unsigned ParmIndex) {
2039   // Drop trailing template arguments that match default arguments.
2040   if (TPL && Policy.SuppressDefaultTemplateArgs &&
2041       !Policy.PrintCanonicalTypes && !Args.empty() && !IsPack &&
2042       Args.size() <= TPL->size()) {
2043     ASTContext &Ctx = TPL->getParam(0)->getASTContext();
2044     llvm::SmallVector<TemplateArgument, 8> OrigArgs;
2045     for (const TA &A : Args)
2046       OrigArgs.push_back(getArgument(A));
2047     while (!Args.empty() &&
2048            isSubstitutedDefaultArgument(Ctx, getArgument(Args.back()),
2049                                         TPL->getParam(Args.size() - 1),
2050                                         OrigArgs, TPL->getDepth()))
2051       Args = Args.drop_back();
2052   }
2053 
2054   const char *Comma = Policy.MSVCFormatting ? "," : ", ";
2055   if (!IsPack)
2056     OS << '<';
2057 
2058   bool NeedSpace = false;
2059   bool FirstArg = true;
2060   for (const auto &Arg : Args) {
2061     // Print the argument into a string.
2062     SmallString<128> Buf;
2063     llvm::raw_svector_ostream ArgOS(Buf);
2064     const TemplateArgument &Argument = getArgument(Arg);
2065     if (Argument.getKind() == TemplateArgument::Pack) {
2066       if (Argument.pack_size() && !FirstArg)
2067         OS << Comma;
2068       printTo(ArgOS, Argument.getPackAsArray(), Policy, TPL,
2069               /*IsPack*/ true, ParmIndex);
2070     } else {
2071       if (!FirstArg)
2072         OS << Comma;
2073       // Tries to print the argument with location info if exists.
2074       printArgument(Arg, Policy, ArgOS,
2075                     TemplateParameterList::shouldIncludeTypeForArgument(
2076                         Policy, TPL, ParmIndex));
2077     }
2078     StringRef ArgString = ArgOS.str();
2079 
2080     // If this is the first argument and its string representation
2081     // begins with the global scope specifier ('::foo'), add a space
2082     // to avoid printing the diagraph '<:'.
2083     if (FirstArg && !ArgString.empty() && ArgString[0] == ':')
2084       OS << ' ';
2085 
2086     OS << ArgString;
2087 
2088     // If the last character of our string is '>', add another space to
2089     // keep the two '>''s separate tokens.
2090     if (!ArgString.empty()) {
2091       NeedSpace = Policy.SplitTemplateClosers && ArgString.back() == '>';
2092       FirstArg = false;
2093     }
2094 
2095     // Use same template parameter for all elements of Pack
2096     if (!IsPack)
2097       ParmIndex++;
2098   }
2099 
2100   if (!IsPack) {
2101     if (NeedSpace)
2102       OS << ' ';
2103     OS << '>';
2104   }
2105 }
2106 
2107 void clang::printTemplateArgumentList(raw_ostream &OS,
2108                                       const TemplateArgumentListInfo &Args,
2109                                       const PrintingPolicy &Policy,
2110                                       const TemplateParameterList *TPL) {
2111   printTemplateArgumentList(OS, Args.arguments(), Policy, TPL);
2112 }
2113 
2114 void clang::printTemplateArgumentList(raw_ostream &OS,
2115                                       ArrayRef<TemplateArgument> Args,
2116                                       const PrintingPolicy &Policy,
2117                                       const TemplateParameterList *TPL) {
2118   printTo(OS, Args, Policy, TPL, /*isPack*/ false, /*parmIndex*/ 0);
2119 }
2120 
2121 void clang::printTemplateArgumentList(raw_ostream &OS,
2122                                       ArrayRef<TemplateArgumentLoc> Args,
2123                                       const PrintingPolicy &Policy,
2124                                       const TemplateParameterList *TPL) {
2125   printTo(OS, Args, Policy, TPL, /*isPack*/ false, /*parmIndex*/ 0);
2126 }
2127 
2128 std::string Qualifiers::getAsString() const {
2129   LangOptions LO;
2130   return getAsString(PrintingPolicy(LO));
2131 }
2132 
2133 // Appends qualifiers to the given string, separated by spaces.  Will
2134 // prefix a space if the string is non-empty.  Will not append a final
2135 // space.
2136 std::string Qualifiers::getAsString(const PrintingPolicy &Policy) const {
2137   SmallString<64> Buf;
2138   llvm::raw_svector_ostream StrOS(Buf);
2139   print(StrOS, Policy);
2140   return std::string(StrOS.str());
2141 }
2142 
2143 bool Qualifiers::isEmptyWhenPrinted(const PrintingPolicy &Policy) const {
2144   if (getCVRQualifiers())
2145     return false;
2146 
2147   if (getAddressSpace() != LangAS::Default)
2148     return false;
2149 
2150   if (getObjCGCAttr())
2151     return false;
2152 
2153   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime())
2154     if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
2155       return false;
2156 
2157   return true;
2158 }
2159 
2160 std::string Qualifiers::getAddrSpaceAsString(LangAS AS) {
2161   switch (AS) {
2162   case LangAS::Default:
2163     return "";
2164   case LangAS::opencl_global:
2165   case LangAS::sycl_global:
2166     return "__global";
2167   case LangAS::opencl_local:
2168   case LangAS::sycl_local:
2169     return "__local";
2170   case LangAS::opencl_private:
2171   case LangAS::sycl_private:
2172     return "__private";
2173   case LangAS::opencl_constant:
2174     return "__constant";
2175   case LangAS::opencl_generic:
2176     return "__generic";
2177   case LangAS::opencl_global_device:
2178   case LangAS::sycl_global_device:
2179     return "__global_device";
2180   case LangAS::opencl_global_host:
2181   case LangAS::sycl_global_host:
2182     return "__global_host";
2183   case LangAS::cuda_device:
2184     return "__device__";
2185   case LangAS::cuda_constant:
2186     return "__constant__";
2187   case LangAS::cuda_shared:
2188     return "__shared__";
2189   case LangAS::ptr32_sptr:
2190     return "__sptr __ptr32";
2191   case LangAS::ptr32_uptr:
2192     return "__uptr __ptr32";
2193   case LangAS::ptr64:
2194     return "__ptr64";
2195   default:
2196     return std::to_string(toTargetAddressSpace(AS));
2197   }
2198 }
2199 
2200 // Appends qualifiers to the given string, separated by spaces.  Will
2201 // prefix a space if the string is non-empty.  Will not append a final
2202 // space.
2203 void Qualifiers::print(raw_ostream &OS, const PrintingPolicy& Policy,
2204                        bool appendSpaceIfNonEmpty) const {
2205   bool addSpace = false;
2206 
2207   unsigned quals = getCVRQualifiers();
2208   if (quals) {
2209     AppendTypeQualList(OS, quals, Policy.Restrict);
2210     addSpace = true;
2211   }
2212   if (hasUnaligned()) {
2213     if (addSpace)
2214       OS << ' ';
2215     OS << "__unaligned";
2216     addSpace = true;
2217   }
2218   auto ASStr = getAddrSpaceAsString(getAddressSpace());
2219   if (!ASStr.empty()) {
2220     if (addSpace)
2221       OS << ' ';
2222     addSpace = true;
2223     // Wrap target address space into an attribute syntax
2224     if (isTargetAddressSpace(getAddressSpace()))
2225       OS << "__attribute__((address_space(" << ASStr << ")))";
2226     else
2227       OS << ASStr;
2228   }
2229 
2230   if (Qualifiers::GC gc = getObjCGCAttr()) {
2231     if (addSpace)
2232       OS << ' ';
2233     addSpace = true;
2234     if (gc == Qualifiers::Weak)
2235       OS << "__weak";
2236     else
2237       OS << "__strong";
2238   }
2239   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
2240     if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)){
2241       if (addSpace)
2242         OS << ' ';
2243       addSpace = true;
2244     }
2245 
2246     switch (lifetime) {
2247     case Qualifiers::OCL_None: llvm_unreachable("none but true");
2248     case Qualifiers::OCL_ExplicitNone: OS << "__unsafe_unretained"; break;
2249     case Qualifiers::OCL_Strong:
2250       if (!Policy.SuppressStrongLifetime)
2251         OS << "__strong";
2252       break;
2253 
2254     case Qualifiers::OCL_Weak: OS << "__weak"; break;
2255     case Qualifiers::OCL_Autoreleasing: OS << "__autoreleasing"; break;
2256     }
2257   }
2258 
2259   if (appendSpaceIfNonEmpty && addSpace)
2260     OS << ' ';
2261 }
2262 
2263 std::string QualType::getAsString() const {
2264   return getAsString(split(), LangOptions());
2265 }
2266 
2267 std::string QualType::getAsString(const PrintingPolicy &Policy) const {
2268   std::string S;
2269   getAsStringInternal(S, Policy);
2270   return S;
2271 }
2272 
2273 std::string QualType::getAsString(const Type *ty, Qualifiers qs,
2274                                   const PrintingPolicy &Policy) {
2275   std::string buffer;
2276   getAsStringInternal(ty, qs, buffer, Policy);
2277   return buffer;
2278 }
2279 
2280 void QualType::print(raw_ostream &OS, const PrintingPolicy &Policy,
2281                      const Twine &PlaceHolder, unsigned Indentation) const {
2282   print(splitAccordingToPolicy(*this, Policy), OS, Policy, PlaceHolder,
2283         Indentation);
2284 }
2285 
2286 void QualType::print(const Type *ty, Qualifiers qs,
2287                      raw_ostream &OS, const PrintingPolicy &policy,
2288                      const Twine &PlaceHolder, unsigned Indentation) {
2289   SmallString<128> PHBuf;
2290   StringRef PH = PlaceHolder.toStringRef(PHBuf);
2291 
2292   TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
2293 }
2294 
2295 void QualType::getAsStringInternal(std::string &Str,
2296                                    const PrintingPolicy &Policy) const {
2297   return getAsStringInternal(splitAccordingToPolicy(*this, Policy), Str,
2298                              Policy);
2299 }
2300 
2301 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
2302                                    std::string &buffer,
2303                                    const PrintingPolicy &policy) {
2304   SmallString<256> Buf;
2305   llvm::raw_svector_ostream StrOS(Buf);
2306   TypePrinter(policy).print(ty, qs, StrOS, buffer);
2307   std::string str = std::string(StrOS.str());
2308   buffer.swap(str);
2309 }
2310 
2311 raw_ostream &clang::operator<<(raw_ostream &OS, QualType QT) {
2312   SplitQualType S = QT.split();
2313   TypePrinter(LangOptions()).print(S.Ty, S.Quals, OS, /*PlaceHolder=*/"");
2314   return OS;
2315 }
2316