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