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_AArch64SVEPCS:
965       OS << "__attribute__((aarch64_sve_pcs))";
966       break;
967     case CC_AMDGPUKernelCall:
968       OS << "__attribute__((amdgpu_kernel))";
969       break;
970     case CC_IntelOclBicc:
971       OS << " __attribute__((intel_ocl_bicc))";
972       break;
973     case CC_Win64:
974       OS << " __attribute__((ms_abi))";
975       break;
976     case CC_X86_64SysV:
977       OS << " __attribute__((sysv_abi))";
978       break;
979     case CC_X86RegCall:
980       OS << " __attribute__((regcall))";
981       break;
982     case CC_SpirFunction:
983     case CC_OpenCLKernel:
984       // Do nothing. These CCs are not available as attributes.
985       break;
986     case CC_Swift:
987       OS << " __attribute__((swiftcall))";
988       break;
989     case CC_SwiftAsync:
990       OS << "__attribute__((swiftasynccall))";
991       break;
992     case CC_PreserveMost:
993       OS << " __attribute__((preserve_most))";
994       break;
995     case CC_PreserveAll:
996       OS << " __attribute__((preserve_all))";
997       break;
998     }
999   }
1000 
1001   if (Info.getNoReturn())
1002     OS << " __attribute__((noreturn))";
1003   if (Info.getCmseNSCall())
1004     OS << " __attribute__((cmse_nonsecure_call))";
1005   if (Info.getProducesResult())
1006     OS << " __attribute__((ns_returns_retained))";
1007   if (Info.getRegParm())
1008     OS << " __attribute__((regparm ("
1009        << Info.getRegParm() << ")))";
1010   if (Info.getNoCallerSavedRegs())
1011     OS << " __attribute__((no_caller_saved_registers))";
1012   if (Info.getNoCfCheck())
1013     OS << " __attribute__((nocf_check))";
1014 }
1015 
1016 void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T,
1017                                              raw_ostream &OS) {
1018   // If needed for precedence reasons, wrap the inner part in grouping parens.
1019   SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
1020   printBefore(T->getReturnType(), OS);
1021   if (!PrevPHIsEmpty.get())
1022     OS << '(';
1023 }
1024 
1025 void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T,
1026                                             raw_ostream &OS) {
1027   // If needed for precedence reasons, wrap the inner part in grouping parens.
1028   if (!HasEmptyPlaceHolder)
1029     OS << ')';
1030   SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
1031 
1032   OS << "()";
1033   printFunctionAfter(T->getExtInfo(), OS);
1034   printAfter(T->getReturnType(), OS);
1035 }
1036 
1037 void TypePrinter::printTypeSpec(NamedDecl *D, raw_ostream &OS) {
1038 
1039   // Compute the full nested-name-specifier for this type.
1040   // In C, this will always be empty except when the type
1041   // being printed is anonymous within other Record.
1042   if (!Policy.SuppressScope)
1043     AppendScope(D->getDeclContext(), OS, D->getDeclName());
1044 
1045   IdentifierInfo *II = D->getIdentifier();
1046   OS << II->getName();
1047   spaceBeforePlaceHolder(OS);
1048 }
1049 
1050 void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T,
1051                                              raw_ostream &OS) {
1052   printTypeSpec(T->getDecl(), OS);
1053 }
1054 
1055 void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T,
1056                                             raw_ostream &OS) {}
1057 
1058 void TypePrinter::printUsingBefore(const UsingType *T, raw_ostream &OS) {
1059   // After `namespace b { using a::X }`, is the type X within B a::X or b::X?
1060   //
1061   // - b::X is more formally correct given the UsingType model
1062   // - b::X makes sense if "re-exporting" a symbol in a new namespace
1063   // - a::X makes sense if "importing" a symbol for convenience
1064   //
1065   // The "importing" use seems much more common, so we print a::X.
1066   // This could be a policy option, but the right choice seems to rest more
1067   // with the intent of the code than the caller.
1068   printTypeSpec(T->getFoundDecl()->getUnderlyingDecl(), OS);
1069 }
1070 
1071 void TypePrinter::printUsingAfter(const UsingType *T, raw_ostream &OS) {}
1072 
1073 void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) {
1074   printTypeSpec(T->getDecl(), OS);
1075 }
1076 
1077 void TypePrinter::printMacroQualifiedBefore(const MacroQualifiedType *T,
1078                                             raw_ostream &OS) {
1079   StringRef MacroName = T->getMacroIdentifier()->getName();
1080   OS << MacroName << " ";
1081 
1082   // Since this type is meant to print the macro instead of the whole attribute,
1083   // we trim any attributes and go directly to the original modified type.
1084   printBefore(T->getModifiedType(), OS);
1085 }
1086 
1087 void TypePrinter::printMacroQualifiedAfter(const MacroQualifiedType *T,
1088                                            raw_ostream &OS) {
1089   printAfter(T->getModifiedType(), OS);
1090 }
1091 
1092 void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) {}
1093 
1094 void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T,
1095                                         raw_ostream &OS) {
1096   OS << "typeof ";
1097   if (T->getUnderlyingExpr())
1098     T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
1099   spaceBeforePlaceHolder(OS);
1100 }
1101 
1102 void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T,
1103                                        raw_ostream &OS) {}
1104 
1105 void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) {
1106   OS << "typeof(";
1107   print(T->getUnderlyingType(), OS, StringRef());
1108   OS << ')';
1109   spaceBeforePlaceHolder(OS);
1110 }
1111 
1112 void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) {}
1113 
1114 void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) {
1115   OS << "decltype(";
1116   if (T->getUnderlyingExpr())
1117     T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
1118   OS << ')';
1119   spaceBeforePlaceHolder(OS);
1120 }
1121 
1122 void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) {}
1123 
1124 void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T,
1125                                             raw_ostream &OS) {
1126   IncludeStrongLifetimeRAII Strong(Policy);
1127 
1128   switch (T->getUTTKind()) {
1129     case UnaryTransformType::EnumUnderlyingType:
1130       OS << "__underlying_type(";
1131       print(T->getBaseType(), OS, StringRef());
1132       OS << ')';
1133       spaceBeforePlaceHolder(OS);
1134       return;
1135   }
1136 
1137   printBefore(T->getBaseType(), OS);
1138 }
1139 
1140 void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T,
1141                                            raw_ostream &OS) {
1142   IncludeStrongLifetimeRAII Strong(Policy);
1143 
1144   switch (T->getUTTKind()) {
1145     case UnaryTransformType::EnumUnderlyingType:
1146       return;
1147   }
1148 
1149   printAfter(T->getBaseType(), OS);
1150 }
1151 
1152 void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) {
1153   // If the type has been deduced, do not print 'auto'.
1154   if (!T->getDeducedType().isNull()) {
1155     printBefore(T->getDeducedType(), OS);
1156   } else {
1157     if (T->isConstrained()) {
1158       // FIXME: Track a TypeConstraint as type sugar, so that we can print the
1159       // type as it was written.
1160       T->getTypeConstraintConcept()->getDeclName().print(OS, Policy);
1161       auto Args = T->getTypeConstraintArguments();
1162       if (!Args.empty())
1163         printTemplateArgumentList(
1164             OS, Args, Policy,
1165             T->getTypeConstraintConcept()->getTemplateParameters());
1166       OS << ' ';
1167     }
1168     switch (T->getKeyword()) {
1169     case AutoTypeKeyword::Auto: OS << "auto"; break;
1170     case AutoTypeKeyword::DecltypeAuto: OS << "decltype(auto)"; break;
1171     case AutoTypeKeyword::GNUAutoType: OS << "__auto_type"; break;
1172     }
1173     spaceBeforePlaceHolder(OS);
1174   }
1175 }
1176 
1177 void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) {
1178   // If the type has been deduced, do not print 'auto'.
1179   if (!T->getDeducedType().isNull())
1180     printAfter(T->getDeducedType(), OS);
1181 }
1182 
1183 void TypePrinter::printDeducedTemplateSpecializationBefore(
1184     const DeducedTemplateSpecializationType *T, raw_ostream &OS) {
1185   // If the type has been deduced, print the deduced type.
1186   if (!T->getDeducedType().isNull()) {
1187     printBefore(T->getDeducedType(), OS);
1188   } else {
1189     IncludeStrongLifetimeRAII Strong(Policy);
1190     T->getTemplateName().print(OS, Policy);
1191     spaceBeforePlaceHolder(OS);
1192   }
1193 }
1194 
1195 void TypePrinter::printDeducedTemplateSpecializationAfter(
1196     const DeducedTemplateSpecializationType *T, raw_ostream &OS) {
1197   // If the type has been deduced, print the deduced type.
1198   if (!T->getDeducedType().isNull())
1199     printAfter(T->getDeducedType(), OS);
1200 }
1201 
1202 void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) {
1203   IncludeStrongLifetimeRAII Strong(Policy);
1204 
1205   OS << "_Atomic(";
1206   print(T->getValueType(), OS, StringRef());
1207   OS << ')';
1208   spaceBeforePlaceHolder(OS);
1209 }
1210 
1211 void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) {}
1212 
1213 void TypePrinter::printPipeBefore(const PipeType *T, raw_ostream &OS) {
1214   IncludeStrongLifetimeRAII Strong(Policy);
1215 
1216   if (T->isReadOnly())
1217     OS << "read_only ";
1218   else
1219     OS << "write_only ";
1220   OS << "pipe ";
1221   print(T->getElementType(), OS, StringRef());
1222   spaceBeforePlaceHolder(OS);
1223 }
1224 
1225 void TypePrinter::printPipeAfter(const PipeType *T, raw_ostream &OS) {}
1226 
1227 void TypePrinter::printBitIntBefore(const BitIntType *T, raw_ostream &OS) {
1228   if (T->isUnsigned())
1229     OS << "unsigned ";
1230   OS << "_BitInt(" << T->getNumBits() << ")";
1231   spaceBeforePlaceHolder(OS);
1232 }
1233 
1234 void TypePrinter::printBitIntAfter(const BitIntType *T, raw_ostream &OS) {}
1235 
1236 void TypePrinter::printDependentBitIntBefore(const DependentBitIntType *T,
1237                                              raw_ostream &OS) {
1238   if (T->isUnsigned())
1239     OS << "unsigned ";
1240   OS << "_BitInt(";
1241   T->getNumBitsExpr()->printPretty(OS, nullptr, Policy);
1242   OS << ")";
1243   spaceBeforePlaceHolder(OS);
1244 }
1245 
1246 void TypePrinter::printDependentBitIntAfter(const DependentBitIntType *T,
1247                                             raw_ostream &OS) {}
1248 
1249 /// Appends the given scope to the end of a string.
1250 void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS,
1251                               DeclarationName NameInScope) {
1252   if (DC->isTranslationUnit())
1253     return;
1254 
1255   // FIXME: Consider replacing this with NamedDecl::printNestedNameSpecifier,
1256   // which can also print names for function and method scopes.
1257   if (DC->isFunctionOrMethod())
1258     return;
1259 
1260   if (Policy.Callbacks && Policy.Callbacks->isScopeVisible(DC))
1261     return;
1262 
1263   if (const auto *NS = dyn_cast<NamespaceDecl>(DC)) {
1264     if (Policy.SuppressUnwrittenScope && NS->isAnonymousNamespace())
1265       return AppendScope(DC->getParent(), OS, NameInScope);
1266 
1267     // Only suppress an inline namespace if the name has the same lookup
1268     // results in the enclosing namespace.
1269     if (Policy.SuppressInlineNamespace && NS->isInline() && NameInScope &&
1270         NS->isRedundantInlineQualifierFor(NameInScope))
1271       return AppendScope(DC->getParent(), OS, NameInScope);
1272 
1273     AppendScope(DC->getParent(), OS, NS->getDeclName());
1274     if (NS->getIdentifier())
1275       OS << NS->getName() << "::";
1276     else
1277       OS << "(anonymous namespace)::";
1278   } else if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1279     AppendScope(DC->getParent(), OS, Spec->getDeclName());
1280     IncludeStrongLifetimeRAII Strong(Policy);
1281     OS << Spec->getIdentifier()->getName();
1282     const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1283     printTemplateArgumentList(
1284         OS, TemplateArgs.asArray(), Policy,
1285         Spec->getSpecializedTemplate()->getTemplateParameters());
1286     OS << "::";
1287   } else if (const auto *Tag = dyn_cast<TagDecl>(DC)) {
1288     AppendScope(DC->getParent(), OS, Tag->getDeclName());
1289     if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
1290       OS << Typedef->getIdentifier()->getName() << "::";
1291     else if (Tag->getIdentifier())
1292       OS << Tag->getIdentifier()->getName() << "::";
1293     else
1294       return;
1295   } else {
1296     AppendScope(DC->getParent(), OS, NameInScope);
1297   }
1298 }
1299 
1300 void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
1301   if (Policy.IncludeTagDefinition) {
1302     PrintingPolicy SubPolicy = Policy;
1303     SubPolicy.IncludeTagDefinition = false;
1304     D->print(OS, SubPolicy, Indentation);
1305     spaceBeforePlaceHolder(OS);
1306     return;
1307   }
1308 
1309   bool HasKindDecoration = false;
1310 
1311   // We don't print tags unless this is an elaborated type.
1312   // In C, we just assume every RecordType is an elaborated type.
1313   if (!Policy.SuppressTagKeyword && !D->getTypedefNameForAnonDecl()) {
1314     HasKindDecoration = true;
1315     OS << D->getKindName();
1316     OS << ' ';
1317   }
1318 
1319   // Compute the full nested-name-specifier for this type.
1320   // In C, this will always be empty except when the type
1321   // being printed is anonymous within other Record.
1322   if (!Policy.SuppressScope)
1323     AppendScope(D->getDeclContext(), OS, D->getDeclName());
1324 
1325   if (const IdentifierInfo *II = D->getIdentifier())
1326     OS << II->getName();
1327   else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
1328     assert(Typedef->getIdentifier() && "Typedef without identifier?");
1329     OS << Typedef->getIdentifier()->getName();
1330   } else {
1331     // Make an unambiguous representation for anonymous types, e.g.
1332     //   (anonymous enum at /usr/include/string.h:120:9)
1333     OS << (Policy.MSVCFormatting ? '`' : '(');
1334 
1335     if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
1336       OS << "lambda";
1337       HasKindDecoration = true;
1338     } else if ((isa<RecordDecl>(D) && cast<RecordDecl>(D)->isAnonymousStructOrUnion())) {
1339       OS << "anonymous";
1340     } else {
1341       OS << "unnamed";
1342     }
1343 
1344     if (Policy.AnonymousTagLocations) {
1345       // Suppress the redundant tag keyword if we just printed one.
1346       // We don't have to worry about ElaboratedTypes here because you can't
1347       // refer to an anonymous type with one.
1348       if (!HasKindDecoration)
1349         OS << " " << D->getKindName();
1350 
1351       PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
1352           D->getLocation());
1353       if (PLoc.isValid()) {
1354         OS << " at ";
1355         StringRef File = PLoc.getFilename();
1356         if (auto *Callbacks = Policy.Callbacks)
1357           OS << Callbacks->remapPath(File);
1358         else
1359           OS << File;
1360         OS << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
1361       }
1362     }
1363 
1364     OS << (Policy.MSVCFormatting ? '\'' : ')');
1365   }
1366 
1367   // If this is a class template specialization, print the template
1368   // arguments.
1369   if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1370     ArrayRef<TemplateArgument> Args;
1371     TypeSourceInfo *TAW = Spec->getTypeAsWritten();
1372     if (!Policy.PrintCanonicalTypes && TAW) {
1373       const TemplateSpecializationType *TST =
1374         cast<TemplateSpecializationType>(TAW->getType());
1375       Args = TST->template_arguments();
1376     } else {
1377       const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1378       Args = TemplateArgs.asArray();
1379     }
1380     IncludeStrongLifetimeRAII Strong(Policy);
1381     printTemplateArgumentList(
1382         OS, Args, Policy,
1383         Spec->getSpecializedTemplate()->getTemplateParameters());
1384   }
1385 
1386   spaceBeforePlaceHolder(OS);
1387 }
1388 
1389 void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) {
1390   // Print the preferred name if we have one for this type.
1391   if (Policy.UsePreferredNames) {
1392     for (const auto *PNA : T->getDecl()->specific_attrs<PreferredNameAttr>()) {
1393       if (!declaresSameEntity(PNA->getTypedefType()->getAsCXXRecordDecl(),
1394                               T->getDecl()))
1395         continue;
1396       // Find the outermost typedef or alias template.
1397       QualType T = PNA->getTypedefType();
1398       while (true) {
1399         if (auto *TT = dyn_cast<TypedefType>(T))
1400           return printTypeSpec(TT->getDecl(), OS);
1401         if (auto *TST = dyn_cast<TemplateSpecializationType>(T))
1402           return printTemplateId(TST, OS, /*FullyQualify=*/true);
1403         T = T->getLocallyUnqualifiedSingleStepDesugaredType();
1404       }
1405     }
1406   }
1407 
1408   printTag(T->getDecl(), OS);
1409 }
1410 
1411 void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) {}
1412 
1413 void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) {
1414   printTag(T->getDecl(), OS);
1415 }
1416 
1417 void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) {}
1418 
1419 void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T,
1420                                               raw_ostream &OS) {
1421   TemplateTypeParmDecl *D = T->getDecl();
1422   if (D && D->isImplicit()) {
1423     if (auto *TC = D->getTypeConstraint()) {
1424       TC->print(OS, Policy);
1425       OS << ' ';
1426     }
1427     OS << "auto";
1428   } else if (IdentifierInfo *Id = T->getIdentifier())
1429     OS << (Policy.CleanUglifiedParameters ? Id->deuglifiedName()
1430                                           : Id->getName());
1431   else
1432     OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex();
1433 
1434   spaceBeforePlaceHolder(OS);
1435 }
1436 
1437 void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T,
1438                                              raw_ostream &OS) {}
1439 
1440 void TypePrinter::printSubstTemplateTypeParmBefore(
1441                                              const SubstTemplateTypeParmType *T,
1442                                              raw_ostream &OS) {
1443   IncludeStrongLifetimeRAII Strong(Policy);
1444   printBefore(T->getReplacementType(), OS);
1445 }
1446 
1447 void TypePrinter::printSubstTemplateTypeParmAfter(
1448                                              const SubstTemplateTypeParmType *T,
1449                                              raw_ostream &OS) {
1450   IncludeStrongLifetimeRAII Strong(Policy);
1451   printAfter(T->getReplacementType(), OS);
1452 }
1453 
1454 void TypePrinter::printSubstTemplateTypeParmPackBefore(
1455                                         const SubstTemplateTypeParmPackType *T,
1456                                         raw_ostream &OS) {
1457   IncludeStrongLifetimeRAII Strong(Policy);
1458   printTemplateTypeParmBefore(T->getReplacedParameter(), OS);
1459 }
1460 
1461 void TypePrinter::printSubstTemplateTypeParmPackAfter(
1462                                         const SubstTemplateTypeParmPackType *T,
1463                                         raw_ostream &OS) {
1464   IncludeStrongLifetimeRAII Strong(Policy);
1465   printTemplateTypeParmAfter(T->getReplacedParameter(), OS);
1466 }
1467 
1468 void TypePrinter::printTemplateId(const TemplateSpecializationType *T,
1469                                   raw_ostream &OS, bool FullyQualify) {
1470   IncludeStrongLifetimeRAII Strong(Policy);
1471 
1472   TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl();
1473   if (FullyQualify && TD) {
1474     if (!Policy.SuppressScope)
1475       AppendScope(TD->getDeclContext(), OS, TD->getDeclName());
1476 
1477     OS << TD->getName();
1478   } else {
1479     T->getTemplateName().print(OS, Policy);
1480   }
1481 
1482   printTemplateArgumentList(OS, T->template_arguments(), Policy);
1483   spaceBeforePlaceHolder(OS);
1484 }
1485 
1486 void TypePrinter::printTemplateSpecializationBefore(
1487                                             const TemplateSpecializationType *T,
1488                                             raw_ostream &OS) {
1489   printTemplateId(T, OS, Policy.FullyQualifiedName);
1490 }
1491 
1492 void TypePrinter::printTemplateSpecializationAfter(
1493                                             const TemplateSpecializationType *T,
1494                                             raw_ostream &OS) {}
1495 
1496 void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T,
1497                                                raw_ostream &OS) {
1498   if (Policy.PrintInjectedClassNameWithArguments)
1499     return printTemplateSpecializationBefore(T->getInjectedTST(), OS);
1500 
1501   IncludeStrongLifetimeRAII Strong(Policy);
1502   T->getTemplateName().print(OS, Policy);
1503   spaceBeforePlaceHolder(OS);
1504 }
1505 
1506 void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T,
1507                                                raw_ostream &OS) {}
1508 
1509 void TypePrinter::printElaboratedBefore(const ElaboratedType *T,
1510                                         raw_ostream &OS) {
1511   if (Policy.IncludeTagDefinition && T->getOwnedTagDecl()) {
1512     TagDecl *OwnedTagDecl = T->getOwnedTagDecl();
1513     assert(OwnedTagDecl->getTypeForDecl() == T->getNamedType().getTypePtr() &&
1514            "OwnedTagDecl expected to be a declaration for the type");
1515     PrintingPolicy SubPolicy = Policy;
1516     SubPolicy.IncludeTagDefinition = false;
1517     OwnedTagDecl->print(OS, SubPolicy, Indentation);
1518     spaceBeforePlaceHolder(OS);
1519     return;
1520   }
1521 
1522   // The tag definition will take care of these.
1523   if (!Policy.IncludeTagDefinition)
1524   {
1525     OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1526     if (T->getKeyword() != ETK_None)
1527       OS << " ";
1528     NestedNameSpecifier *Qualifier = T->getQualifier();
1529     if (Qualifier)
1530       Qualifier->print(OS, Policy);
1531   }
1532 
1533   ElaboratedTypePolicyRAII PolicyRAII(Policy);
1534   printBefore(T->getNamedType(), OS);
1535 }
1536 
1537 void TypePrinter::printElaboratedAfter(const ElaboratedType *T,
1538                                         raw_ostream &OS) {
1539   if (Policy.IncludeTagDefinition && T->getOwnedTagDecl())
1540     return;
1541   ElaboratedTypePolicyRAII PolicyRAII(Policy);
1542   printAfter(T->getNamedType(), OS);
1543 }
1544 
1545 void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) {
1546   if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1547     printBefore(T->getInnerType(), OS);
1548     OS << '(';
1549   } else
1550     printBefore(T->getInnerType(), OS);
1551 }
1552 
1553 void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) {
1554   if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1555     OS << ')';
1556     printAfter(T->getInnerType(), OS);
1557   } else
1558     printAfter(T->getInnerType(), OS);
1559 }
1560 
1561 void TypePrinter::printDependentNameBefore(const DependentNameType *T,
1562                                            raw_ostream &OS) {
1563   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1564   if (T->getKeyword() != ETK_None)
1565     OS << " ";
1566 
1567   T->getQualifier()->print(OS, Policy);
1568 
1569   OS << T->getIdentifier()->getName();
1570   spaceBeforePlaceHolder(OS);
1571 }
1572 
1573 void TypePrinter::printDependentNameAfter(const DependentNameType *T,
1574                                           raw_ostream &OS) {}
1575 
1576 void TypePrinter::printDependentTemplateSpecializationBefore(
1577         const DependentTemplateSpecializationType *T, raw_ostream &OS) {
1578   IncludeStrongLifetimeRAII Strong(Policy);
1579 
1580   OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1581   if (T->getKeyword() != ETK_None)
1582     OS << " ";
1583 
1584   if (T->getQualifier())
1585     T->getQualifier()->print(OS, Policy);
1586   OS << "template " << T->getIdentifier()->getName();
1587   printTemplateArgumentList(OS, T->template_arguments(), Policy);
1588   spaceBeforePlaceHolder(OS);
1589 }
1590 
1591 void TypePrinter::printDependentTemplateSpecializationAfter(
1592         const DependentTemplateSpecializationType *T, raw_ostream &OS) {}
1593 
1594 void TypePrinter::printPackExpansionBefore(const PackExpansionType *T,
1595                                            raw_ostream &OS) {
1596   printBefore(T->getPattern(), OS);
1597 }
1598 
1599 void TypePrinter::printPackExpansionAfter(const PackExpansionType *T,
1600                                           raw_ostream &OS) {
1601   printAfter(T->getPattern(), OS);
1602   OS << "...";
1603 }
1604 
1605 void TypePrinter::printAttributedBefore(const AttributedType *T,
1606                                         raw_ostream &OS) {
1607   // FIXME: Generate this with TableGen.
1608 
1609   // Prefer the macro forms of the GC and ownership qualifiers.
1610   if (T->getAttrKind() == attr::ObjCGC ||
1611       T->getAttrKind() == attr::ObjCOwnership)
1612     return printBefore(T->getEquivalentType(), OS);
1613 
1614   if (T->getAttrKind() == attr::ObjCKindOf)
1615     OS << "__kindof ";
1616 
1617   if (T->getAttrKind() == attr::AddressSpace)
1618     printBefore(T->getEquivalentType(), OS);
1619   else
1620     printBefore(T->getModifiedType(), OS);
1621 
1622   if (T->isMSTypeSpec()) {
1623     switch (T->getAttrKind()) {
1624     default: return;
1625     case attr::Ptr32: OS << " __ptr32"; break;
1626     case attr::Ptr64: OS << " __ptr64"; break;
1627     case attr::SPtr: OS << " __sptr"; break;
1628     case attr::UPtr: OS << " __uptr"; break;
1629     }
1630     spaceBeforePlaceHolder(OS);
1631   }
1632 
1633   // Print nullability type specifiers.
1634   if (T->getImmediateNullability()) {
1635     if (T->getAttrKind() == attr::TypeNonNull)
1636       OS << " _Nonnull";
1637     else if (T->getAttrKind() == attr::TypeNullable)
1638       OS << " _Nullable";
1639     else if (T->getAttrKind() == attr::TypeNullUnspecified)
1640       OS << " _Null_unspecified";
1641     else if (T->getAttrKind() == attr::TypeNullableResult)
1642       OS << " _Nullable_result";
1643     else
1644       llvm_unreachable("unhandled nullability");
1645     spaceBeforePlaceHolder(OS);
1646   }
1647 }
1648 
1649 void TypePrinter::printAttributedAfter(const AttributedType *T,
1650                                        raw_ostream &OS) {
1651   // FIXME: Generate this with TableGen.
1652 
1653   // Prefer the macro forms of the GC and ownership qualifiers.
1654   if (T->getAttrKind() == attr::ObjCGC ||
1655       T->getAttrKind() == attr::ObjCOwnership)
1656     return printAfter(T->getEquivalentType(), OS);
1657 
1658   // If this is a calling convention attribute, don't print the implicit CC from
1659   // the modified type.
1660   SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv());
1661 
1662   printAfter(T->getModifiedType(), OS);
1663 
1664   // Some attributes are printed as qualifiers before the type, so we have
1665   // nothing left to do.
1666   if (T->getAttrKind() == attr::ObjCKindOf ||
1667       T->isMSTypeSpec() || T->getImmediateNullability())
1668     return;
1669 
1670   // Don't print the inert __unsafe_unretained attribute at all.
1671   if (T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1672     return;
1673 
1674   // Don't print ns_returns_retained unless it had an effect.
1675   if (T->getAttrKind() == attr::NSReturnsRetained &&
1676       !T->getEquivalentType()->castAs<FunctionType>()
1677                              ->getExtInfo().getProducesResult())
1678     return;
1679 
1680   if (T->getAttrKind() == attr::LifetimeBound) {
1681     OS << " [[clang::lifetimebound]]";
1682     return;
1683   }
1684 
1685   // The printing of the address_space attribute is handled by the qualifier
1686   // since it is still stored in the qualifier. Return early to prevent printing
1687   // this twice.
1688   if (T->getAttrKind() == attr::AddressSpace)
1689     return;
1690 
1691   OS << " __attribute__((";
1692   switch (T->getAttrKind()) {
1693 #define TYPE_ATTR(NAME)
1694 #define DECL_OR_TYPE_ATTR(NAME)
1695 #define ATTR(NAME) case attr::NAME:
1696 #include "clang/Basic/AttrList.inc"
1697     llvm_unreachable("non-type attribute attached to type");
1698 
1699   case attr::BTFTypeTag:
1700     llvm_unreachable("BTFTypeTag attribute handled separately");
1701 
1702   case attr::OpenCLPrivateAddressSpace:
1703   case attr::OpenCLGlobalAddressSpace:
1704   case attr::OpenCLGlobalDeviceAddressSpace:
1705   case attr::OpenCLGlobalHostAddressSpace:
1706   case attr::OpenCLLocalAddressSpace:
1707   case attr::OpenCLConstantAddressSpace:
1708   case attr::OpenCLGenericAddressSpace:
1709     // FIXME: Update printAttributedBefore to print these once we generate
1710     // AttributedType nodes for them.
1711     break;
1712 
1713   case attr::LifetimeBound:
1714   case attr::TypeNonNull:
1715   case attr::TypeNullable:
1716   case attr::TypeNullableResult:
1717   case attr::TypeNullUnspecified:
1718   case attr::ObjCGC:
1719   case attr::ObjCInertUnsafeUnretained:
1720   case attr::ObjCKindOf:
1721   case attr::ObjCOwnership:
1722   case attr::Ptr32:
1723   case attr::Ptr64:
1724   case attr::SPtr:
1725   case attr::UPtr:
1726   case attr::AddressSpace:
1727   case attr::CmseNSCall:
1728     llvm_unreachable("This attribute should have been handled already");
1729 
1730   case attr::NSReturnsRetained:
1731     OS << "ns_returns_retained";
1732     break;
1733 
1734   // FIXME: When Sema learns to form this AttributedType, avoid printing the
1735   // attribute again in printFunctionProtoAfter.
1736   case attr::AnyX86NoCfCheck: OS << "nocf_check"; break;
1737   case attr::CDecl: OS << "cdecl"; break;
1738   case attr::FastCall: OS << "fastcall"; break;
1739   case attr::StdCall: OS << "stdcall"; break;
1740   case attr::ThisCall: OS << "thiscall"; break;
1741   case attr::SwiftCall: OS << "swiftcall"; break;
1742   case attr::SwiftAsyncCall: OS << "swiftasynccall"; break;
1743   case attr::VectorCall: OS << "vectorcall"; break;
1744   case attr::Pascal: OS << "pascal"; break;
1745   case attr::MSABI: OS << "ms_abi"; break;
1746   case attr::SysVABI: OS << "sysv_abi"; break;
1747   case attr::RegCall: OS << "regcall"; break;
1748   case attr::Pcs: {
1749     OS << "pcs(";
1750    QualType t = T->getEquivalentType();
1751    while (!t->isFunctionType())
1752      t = t->getPointeeType();
1753    OS << (t->castAs<FunctionType>()->getCallConv() == CC_AAPCS ?
1754          "\"aapcs\"" : "\"aapcs-vfp\"");
1755    OS << ')';
1756    break;
1757   }
1758   case attr::AArch64VectorPcs: OS << "aarch64_vector_pcs"; break;
1759   case attr::AArch64SVEPcs: OS << "aarch64_sve_pcs"; break;
1760   case attr::AMDGPUKernelCall: OS << "amdgpu_kernel"; break;
1761   case attr::IntelOclBicc: OS << "inteloclbicc"; break;
1762   case attr::PreserveMost:
1763     OS << "preserve_most";
1764     break;
1765 
1766   case attr::PreserveAll:
1767     OS << "preserve_all";
1768     break;
1769   case attr::NoDeref:
1770     OS << "noderef";
1771     break;
1772   case attr::AcquireHandle:
1773     OS << "acquire_handle";
1774     break;
1775   case attr::ArmMveStrictPolymorphism:
1776     OS << "__clang_arm_mve_strict_polymorphism";
1777     break;
1778   }
1779   OS << "))";
1780 }
1781 
1782 void TypePrinter::printBTFTagAttributedBefore(const BTFTagAttributedType *T,
1783                                               raw_ostream &OS) {
1784   printBefore(T->getWrappedType(), OS);
1785   OS << " btf_type_tag(" << T->getAttr()->getBTFTypeTag() << ")";
1786 }
1787 
1788 void TypePrinter::printBTFTagAttributedAfter(const BTFTagAttributedType *T,
1789                                              raw_ostream &OS) {
1790   printAfter(T->getWrappedType(), OS);
1791 }
1792 
1793 void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T,
1794                                            raw_ostream &OS) {
1795   OS << T->getDecl()->getName();
1796   spaceBeforePlaceHolder(OS);
1797 }
1798 
1799 void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T,
1800                                           raw_ostream &OS) {}
1801 
1802 void TypePrinter::printObjCTypeParamBefore(const ObjCTypeParamType *T,
1803                                           raw_ostream &OS) {
1804   OS << T->getDecl()->getName();
1805   if (!T->qual_empty()) {
1806     bool isFirst = true;
1807     OS << '<';
1808     for (const auto *I : T->quals()) {
1809       if (isFirst)
1810         isFirst = false;
1811       else
1812         OS << ',';
1813       OS << I->getName();
1814     }
1815     OS << '>';
1816   }
1817 
1818   spaceBeforePlaceHolder(OS);
1819 }
1820 
1821 void TypePrinter::printObjCTypeParamAfter(const ObjCTypeParamType *T,
1822                                           raw_ostream &OS) {}
1823 
1824 void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T,
1825                                         raw_ostream &OS) {
1826   if (T->qual_empty() && T->isUnspecializedAsWritten() &&
1827       !T->isKindOfTypeAsWritten())
1828     return printBefore(T->getBaseType(), OS);
1829 
1830   if (T->isKindOfTypeAsWritten())
1831     OS << "__kindof ";
1832 
1833   print(T->getBaseType(), OS, StringRef());
1834 
1835   if (T->isSpecializedAsWritten()) {
1836     bool isFirst = true;
1837     OS << '<';
1838     for (auto typeArg : T->getTypeArgsAsWritten()) {
1839       if (isFirst)
1840         isFirst = false;
1841       else
1842         OS << ",";
1843 
1844       print(typeArg, OS, StringRef());
1845     }
1846     OS << '>';
1847   }
1848 
1849   if (!T->qual_empty()) {
1850     bool isFirst = true;
1851     OS << '<';
1852     for (const auto *I : T->quals()) {
1853       if (isFirst)
1854         isFirst = false;
1855       else
1856         OS << ',';
1857       OS << I->getName();
1858     }
1859     OS << '>';
1860   }
1861 
1862   spaceBeforePlaceHolder(OS);
1863 }
1864 
1865 void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T,
1866                                         raw_ostream &OS) {
1867   if (T->qual_empty() && T->isUnspecializedAsWritten() &&
1868       !T->isKindOfTypeAsWritten())
1869     return printAfter(T->getBaseType(), OS);
1870 }
1871 
1872 void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T,
1873                                                raw_ostream &OS) {
1874   printBefore(T->getPointeeType(), OS);
1875 
1876   // If we need to print the pointer, print it now.
1877   if (!T->isObjCIdType() && !T->isObjCQualifiedIdType() &&
1878       !T->isObjCClassType() && !T->isObjCQualifiedClassType()) {
1879     if (HasEmptyPlaceHolder)
1880       OS << ' ';
1881     OS << '*';
1882   }
1883 }
1884 
1885 void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T,
1886                                               raw_ostream &OS) {}
1887 
1888 static
1889 const TemplateArgument &getArgument(const TemplateArgument &A) { return A; }
1890 
1891 static const TemplateArgument &getArgument(const TemplateArgumentLoc &A) {
1892   return A.getArgument();
1893 }
1894 
1895 static void printArgument(const TemplateArgument &A, const PrintingPolicy &PP,
1896                           llvm::raw_ostream &OS, bool IncludeType) {
1897   A.print(PP, OS, IncludeType);
1898 }
1899 
1900 static void printArgument(const TemplateArgumentLoc &A,
1901                           const PrintingPolicy &PP, llvm::raw_ostream &OS,
1902                           bool IncludeType) {
1903   const TemplateArgument::ArgKind &Kind = A.getArgument().getKind();
1904   if (Kind == TemplateArgument::ArgKind::Type)
1905     return A.getTypeSourceInfo()->getType().print(OS, PP);
1906   return A.getArgument().print(PP, OS, IncludeType);
1907 }
1908 
1909 static bool isSubstitutedTemplateArgument(ASTContext &Ctx, TemplateArgument Arg,
1910                                           TemplateArgument Pattern,
1911                                           ArrayRef<TemplateArgument> Args,
1912                                           unsigned Depth);
1913 
1914 static bool isSubstitutedType(ASTContext &Ctx, QualType T, QualType Pattern,
1915                               ArrayRef<TemplateArgument> Args, unsigned Depth) {
1916   if (Ctx.hasSameType(T, Pattern))
1917     return true;
1918 
1919   // A type parameter matches its argument.
1920   if (auto *TTPT = Pattern->getAs<TemplateTypeParmType>()) {
1921     if (TTPT->getDepth() == Depth && TTPT->getIndex() < Args.size() &&
1922         Args[TTPT->getIndex()].getKind() == TemplateArgument::Type) {
1923       QualType SubstArg = Ctx.getQualifiedType(
1924           Args[TTPT->getIndex()].getAsType(), Pattern.getQualifiers());
1925       return Ctx.hasSameType(SubstArg, T);
1926     }
1927     return false;
1928   }
1929 
1930   // FIXME: Recurse into array types.
1931 
1932   // All other cases will need the types to be identically qualified.
1933   Qualifiers TQual, PatQual;
1934   T = Ctx.getUnqualifiedArrayType(T, TQual);
1935   Pattern = Ctx.getUnqualifiedArrayType(Pattern, PatQual);
1936   if (TQual != PatQual)
1937     return false;
1938 
1939   // Recurse into pointer-like types.
1940   {
1941     QualType TPointee = T->getPointeeType();
1942     QualType PPointee = Pattern->getPointeeType();
1943     if (!TPointee.isNull() && !PPointee.isNull())
1944       return T->getTypeClass() == Pattern->getTypeClass() &&
1945              isSubstitutedType(Ctx, TPointee, PPointee, Args, Depth);
1946   }
1947 
1948   // Recurse into template specialization types.
1949   if (auto *PTST =
1950           Pattern.getCanonicalType()->getAs<TemplateSpecializationType>()) {
1951     TemplateName Template;
1952     ArrayRef<TemplateArgument> TemplateArgs;
1953     if (auto *TTST = T->getAs<TemplateSpecializationType>()) {
1954       Template = TTST->getTemplateName();
1955       TemplateArgs = TTST->template_arguments();
1956     } else if (auto *CTSD = dyn_cast_or_null<ClassTemplateSpecializationDecl>(
1957                    T->getAsCXXRecordDecl())) {
1958       Template = TemplateName(CTSD->getSpecializedTemplate());
1959       TemplateArgs = CTSD->getTemplateArgs().asArray();
1960     } else {
1961       return false;
1962     }
1963 
1964     if (!isSubstitutedTemplateArgument(Ctx, Template, PTST->getTemplateName(),
1965                                        Args, Depth))
1966       return false;
1967     if (TemplateArgs.size() != PTST->getNumArgs())
1968       return false;
1969     for (unsigned I = 0, N = TemplateArgs.size(); I != N; ++I)
1970       if (!isSubstitutedTemplateArgument(Ctx, TemplateArgs[I], PTST->getArg(I),
1971                                          Args, Depth))
1972         return false;
1973     return true;
1974   }
1975 
1976   // FIXME: Handle more cases.
1977   return false;
1978 }
1979 
1980 static bool isSubstitutedTemplateArgument(ASTContext &Ctx, TemplateArgument Arg,
1981                                           TemplateArgument Pattern,
1982                                           ArrayRef<TemplateArgument> Args,
1983                                           unsigned Depth) {
1984   Arg = Ctx.getCanonicalTemplateArgument(Arg);
1985   Pattern = Ctx.getCanonicalTemplateArgument(Pattern);
1986   if (Arg.structurallyEquals(Pattern))
1987     return true;
1988 
1989   if (Pattern.getKind() == TemplateArgument::Expression) {
1990     if (auto *DRE =
1991             dyn_cast<DeclRefExpr>(Pattern.getAsExpr()->IgnoreParenImpCasts())) {
1992       if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(DRE->getDecl()))
1993         return NTTP->getDepth() == Depth && Args.size() > NTTP->getIndex() &&
1994                Args[NTTP->getIndex()].structurallyEquals(Arg);
1995     }
1996   }
1997 
1998   if (Arg.getKind() != Pattern.getKind())
1999     return false;
2000 
2001   if (Arg.getKind() == TemplateArgument::Type)
2002     return isSubstitutedType(Ctx, Arg.getAsType(), Pattern.getAsType(), Args,
2003                              Depth);
2004 
2005   if (Arg.getKind() == TemplateArgument::Template) {
2006     TemplateDecl *PatTD = Pattern.getAsTemplate().getAsTemplateDecl();
2007     if (auto *TTPD = dyn_cast_or_null<TemplateTemplateParmDecl>(PatTD))
2008       return TTPD->getDepth() == Depth && Args.size() > TTPD->getIndex() &&
2009              Ctx.getCanonicalTemplateArgument(Args[TTPD->getIndex()])
2010                  .structurallyEquals(Arg);
2011   }
2012 
2013   // FIXME: Handle more cases.
2014   return false;
2015 }
2016 
2017 /// Make a best-effort determination of whether the type T can be produced by
2018 /// substituting Args into the default argument of Param.
2019 static bool isSubstitutedDefaultArgument(ASTContext &Ctx, TemplateArgument Arg,
2020                                          const NamedDecl *Param,
2021                                          ArrayRef<TemplateArgument> Args,
2022                                          unsigned Depth) {
2023   // An empty pack is equivalent to not providing a pack argument.
2024   if (Arg.getKind() == TemplateArgument::Pack && Arg.pack_size() == 0)
2025     return true;
2026 
2027   if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Param)) {
2028     return TTPD->hasDefaultArgument() &&
2029            isSubstitutedTemplateArgument(Ctx, Arg, TTPD->getDefaultArgument(),
2030                                          Args, Depth);
2031   } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Param)) {
2032     return TTPD->hasDefaultArgument() &&
2033            isSubstitutedTemplateArgument(
2034                Ctx, Arg, TTPD->getDefaultArgument().getArgument(), Args, Depth);
2035   } else if (auto *NTTPD = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
2036     return NTTPD->hasDefaultArgument() &&
2037            isSubstitutedTemplateArgument(Ctx, Arg, NTTPD->getDefaultArgument(),
2038                                          Args, Depth);
2039   }
2040   return false;
2041 }
2042 
2043 template <typename TA>
2044 static void
2045 printTo(raw_ostream &OS, ArrayRef<TA> Args, const PrintingPolicy &Policy,
2046         const TemplateParameterList *TPL, bool IsPack, unsigned ParmIndex) {
2047   // Drop trailing template arguments that match default arguments.
2048   if (TPL && Policy.SuppressDefaultTemplateArgs &&
2049       !Policy.PrintCanonicalTypes && !Args.empty() && !IsPack &&
2050       Args.size() <= TPL->size()) {
2051     ASTContext &Ctx = TPL->getParam(0)->getASTContext();
2052     llvm::SmallVector<TemplateArgument, 8> OrigArgs;
2053     for (const TA &A : Args)
2054       OrigArgs.push_back(getArgument(A));
2055     while (!Args.empty() &&
2056            isSubstitutedDefaultArgument(Ctx, getArgument(Args.back()),
2057                                         TPL->getParam(Args.size() - 1),
2058                                         OrigArgs, TPL->getDepth()))
2059       Args = Args.drop_back();
2060   }
2061 
2062   const char *Comma = Policy.MSVCFormatting ? "," : ", ";
2063   if (!IsPack)
2064     OS << '<';
2065 
2066   bool NeedSpace = false;
2067   bool FirstArg = true;
2068   for (const auto &Arg : Args) {
2069     // Print the argument into a string.
2070     SmallString<128> Buf;
2071     llvm::raw_svector_ostream ArgOS(Buf);
2072     const TemplateArgument &Argument = getArgument(Arg);
2073     if (Argument.getKind() == TemplateArgument::Pack) {
2074       if (Argument.pack_size() && !FirstArg)
2075         OS << Comma;
2076       printTo(ArgOS, Argument.getPackAsArray(), Policy, TPL,
2077               /*IsPack*/ true, ParmIndex);
2078     } else {
2079       if (!FirstArg)
2080         OS << Comma;
2081       // Tries to print the argument with location info if exists.
2082       printArgument(Arg, Policy, ArgOS,
2083                     TemplateParameterList::shouldIncludeTypeForArgument(
2084                         Policy, TPL, ParmIndex));
2085     }
2086     StringRef ArgString = ArgOS.str();
2087 
2088     // If this is the first argument and its string representation
2089     // begins with the global scope specifier ('::foo'), add a space
2090     // to avoid printing the diagraph '<:'.
2091     if (FirstArg && !ArgString.empty() && ArgString[0] == ':')
2092       OS << ' ';
2093 
2094     OS << ArgString;
2095 
2096     // If the last character of our string is '>', add another space to
2097     // keep the two '>''s separate tokens.
2098     if (!ArgString.empty()) {
2099       NeedSpace = Policy.SplitTemplateClosers && ArgString.back() == '>';
2100       FirstArg = false;
2101     }
2102 
2103     // Use same template parameter for all elements of Pack
2104     if (!IsPack)
2105       ParmIndex++;
2106   }
2107 
2108   if (!IsPack) {
2109     if (NeedSpace)
2110       OS << ' ';
2111     OS << '>';
2112   }
2113 }
2114 
2115 void clang::printTemplateArgumentList(raw_ostream &OS,
2116                                       const TemplateArgumentListInfo &Args,
2117                                       const PrintingPolicy &Policy,
2118                                       const TemplateParameterList *TPL) {
2119   printTemplateArgumentList(OS, Args.arguments(), Policy, TPL);
2120 }
2121 
2122 void clang::printTemplateArgumentList(raw_ostream &OS,
2123                                       ArrayRef<TemplateArgument> Args,
2124                                       const PrintingPolicy &Policy,
2125                                       const TemplateParameterList *TPL) {
2126   printTo(OS, Args, Policy, TPL, /*isPack*/ false, /*parmIndex*/ 0);
2127 }
2128 
2129 void clang::printTemplateArgumentList(raw_ostream &OS,
2130                                       ArrayRef<TemplateArgumentLoc> Args,
2131                                       const PrintingPolicy &Policy,
2132                                       const TemplateParameterList *TPL) {
2133   printTo(OS, Args, Policy, TPL, /*isPack*/ false, /*parmIndex*/ 0);
2134 }
2135 
2136 std::string Qualifiers::getAsString() const {
2137   LangOptions LO;
2138   return getAsString(PrintingPolicy(LO));
2139 }
2140 
2141 // Appends qualifiers to the given string, separated by spaces.  Will
2142 // prefix a space if the string is non-empty.  Will not append a final
2143 // space.
2144 std::string Qualifiers::getAsString(const PrintingPolicy &Policy) const {
2145   SmallString<64> Buf;
2146   llvm::raw_svector_ostream StrOS(Buf);
2147   print(StrOS, Policy);
2148   return std::string(StrOS.str());
2149 }
2150 
2151 bool Qualifiers::isEmptyWhenPrinted(const PrintingPolicy &Policy) const {
2152   if (getCVRQualifiers())
2153     return false;
2154 
2155   if (getAddressSpace() != LangAS::Default)
2156     return false;
2157 
2158   if (getObjCGCAttr())
2159     return false;
2160 
2161   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime())
2162     if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
2163       return false;
2164 
2165   return true;
2166 }
2167 
2168 std::string Qualifiers::getAddrSpaceAsString(LangAS AS) {
2169   switch (AS) {
2170   case LangAS::Default:
2171     return "";
2172   case LangAS::opencl_global:
2173   case LangAS::sycl_global:
2174     return "__global";
2175   case LangAS::opencl_local:
2176   case LangAS::sycl_local:
2177     return "__local";
2178   case LangAS::opencl_private:
2179   case LangAS::sycl_private:
2180     return "__private";
2181   case LangAS::opencl_constant:
2182     return "__constant";
2183   case LangAS::opencl_generic:
2184     return "__generic";
2185   case LangAS::opencl_global_device:
2186   case LangAS::sycl_global_device:
2187     return "__global_device";
2188   case LangAS::opencl_global_host:
2189   case LangAS::sycl_global_host:
2190     return "__global_host";
2191   case LangAS::cuda_device:
2192     return "__device__";
2193   case LangAS::cuda_constant:
2194     return "__constant__";
2195   case LangAS::cuda_shared:
2196     return "__shared__";
2197   case LangAS::ptr32_sptr:
2198     return "__sptr __ptr32";
2199   case LangAS::ptr32_uptr:
2200     return "__uptr __ptr32";
2201   case LangAS::ptr64:
2202     return "__ptr64";
2203   default:
2204     return std::to_string(toTargetAddressSpace(AS));
2205   }
2206 }
2207 
2208 // Appends qualifiers to the given string, separated by spaces.  Will
2209 // prefix a space if the string is non-empty.  Will not append a final
2210 // space.
2211 void Qualifiers::print(raw_ostream &OS, const PrintingPolicy& Policy,
2212                        bool appendSpaceIfNonEmpty) const {
2213   bool addSpace = false;
2214 
2215   unsigned quals = getCVRQualifiers();
2216   if (quals) {
2217     AppendTypeQualList(OS, quals, Policy.Restrict);
2218     addSpace = true;
2219   }
2220   if (hasUnaligned()) {
2221     if (addSpace)
2222       OS << ' ';
2223     OS << "__unaligned";
2224     addSpace = true;
2225   }
2226   auto ASStr = getAddrSpaceAsString(getAddressSpace());
2227   if (!ASStr.empty()) {
2228     if (addSpace)
2229       OS << ' ';
2230     addSpace = true;
2231     // Wrap target address space into an attribute syntax
2232     if (isTargetAddressSpace(getAddressSpace()))
2233       OS << "__attribute__((address_space(" << ASStr << ")))";
2234     else
2235       OS << ASStr;
2236   }
2237 
2238   if (Qualifiers::GC gc = getObjCGCAttr()) {
2239     if (addSpace)
2240       OS << ' ';
2241     addSpace = true;
2242     if (gc == Qualifiers::Weak)
2243       OS << "__weak";
2244     else
2245       OS << "__strong";
2246   }
2247   if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
2248     if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)){
2249       if (addSpace)
2250         OS << ' ';
2251       addSpace = true;
2252     }
2253 
2254     switch (lifetime) {
2255     case Qualifiers::OCL_None: llvm_unreachable("none but true");
2256     case Qualifiers::OCL_ExplicitNone: OS << "__unsafe_unretained"; break;
2257     case Qualifiers::OCL_Strong:
2258       if (!Policy.SuppressStrongLifetime)
2259         OS << "__strong";
2260       break;
2261 
2262     case Qualifiers::OCL_Weak: OS << "__weak"; break;
2263     case Qualifiers::OCL_Autoreleasing: OS << "__autoreleasing"; break;
2264     }
2265   }
2266 
2267   if (appendSpaceIfNonEmpty && addSpace)
2268     OS << ' ';
2269 }
2270 
2271 std::string QualType::getAsString() const {
2272   return getAsString(split(), LangOptions());
2273 }
2274 
2275 std::string QualType::getAsString(const PrintingPolicy &Policy) const {
2276   std::string S;
2277   getAsStringInternal(S, Policy);
2278   return S;
2279 }
2280 
2281 std::string QualType::getAsString(const Type *ty, Qualifiers qs,
2282                                   const PrintingPolicy &Policy) {
2283   std::string buffer;
2284   getAsStringInternal(ty, qs, buffer, Policy);
2285   return buffer;
2286 }
2287 
2288 void QualType::print(raw_ostream &OS, const PrintingPolicy &Policy,
2289                      const Twine &PlaceHolder, unsigned Indentation) const {
2290   print(splitAccordingToPolicy(*this, Policy), OS, Policy, PlaceHolder,
2291         Indentation);
2292 }
2293 
2294 void QualType::print(const Type *ty, Qualifiers qs,
2295                      raw_ostream &OS, const PrintingPolicy &policy,
2296                      const Twine &PlaceHolder, unsigned Indentation) {
2297   SmallString<128> PHBuf;
2298   StringRef PH = PlaceHolder.toStringRef(PHBuf);
2299 
2300   TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
2301 }
2302 
2303 void QualType::getAsStringInternal(std::string &Str,
2304                                    const PrintingPolicy &Policy) const {
2305   return getAsStringInternal(splitAccordingToPolicy(*this, Policy), Str,
2306                              Policy);
2307 }
2308 
2309 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
2310                                    std::string &buffer,
2311                                    const PrintingPolicy &policy) {
2312   SmallString<256> Buf;
2313   llvm::raw_svector_ostream StrOS(Buf);
2314   TypePrinter(policy).print(ty, qs, StrOS, buffer);
2315   std::string str = std::string(StrOS.str());
2316   buffer.swap(str);
2317 }
2318 
2319 raw_ostream &clang::operator<<(raw_ostream &OS, QualType QT) {
2320   SplitQualType S = QT.split();
2321   TypePrinter(LangOptions()).print(S.Ty, S.Quals, OS, /*PlaceHolder=*/"");
2322   return OS;
2323 }
2324