clang  8.0.0svn
TypePrinter.cpp
Go to the documentation of this file.
1 //===- TypePrinter.cpp - Pretty-Print Clang Types -------------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This contains code to print types from Clang's type system.
11 //
12 //===----------------------------------------------------------------------===//
13 
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/Decl.h"
17 #include "clang/AST/DeclBase.h"
18 #include "clang/AST/DeclCXX.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
23 #include "clang/AST/TemplateBase.h"
24 #include "clang/AST/TemplateName.h"
25 #include "clang/AST/Type.h"
29 #include "clang/Basic/LLVM.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 
120  void printBefore(const Type *ty, Qualifiers qs, raw_ostream &OS);
121  void printBefore(QualType T, raw_ostream &OS);
122  void printAfter(const Type *ty, Qualifiers qs, raw_ostream &OS);
123  void printAfter(QualType T, raw_ostream &OS);
124  void AppendScope(DeclContext *DC, raw_ostream &OS);
125  void printTag(TagDecl *T, raw_ostream &OS);
126  void printFunctionAfter(const FunctionType::ExtInfo &Info, raw_ostream &OS);
127 #define ABSTRACT_TYPE(CLASS, PARENT)
128 #define TYPE(CLASS, PARENT) \
129  void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \
130  void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS);
131 #include "clang/AST/TypeNodes.def"
132  };
133 
134 } // namespace
135 
136 static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals,
137  bool HasRestrictKeyword) {
138  bool appendSpace = false;
139  if (TypeQuals & Qualifiers::Const) {
140  OS << "const";
141  appendSpace = true;
142  }
143  if (TypeQuals & Qualifiers::Volatile) {
144  if (appendSpace) OS << ' ';
145  OS << "volatile";
146  appendSpace = true;
147  }
148  if (TypeQuals & Qualifiers::Restrict) {
149  if (appendSpace) OS << ' ';
150  if (HasRestrictKeyword) {
151  OS << "restrict";
152  } else {
153  OS << "__restrict";
154  }
155  }
156 }
157 
158 void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
159  if (!HasEmptyPlaceHolder)
160  OS << ' ';
161 }
162 
163 void TypePrinter::print(QualType t, raw_ostream &OS, StringRef PlaceHolder) {
164  SplitQualType split = t.split();
165  print(split.Ty, split.Quals, OS, PlaceHolder);
166 }
167 
168 void TypePrinter::print(const Type *T, Qualifiers Quals, raw_ostream &OS,
169  StringRef PlaceHolder) {
170  if (!T) {
171  OS << "NULL TYPE";
172  return;
173  }
174 
175  SaveAndRestore<bool> PHVal(HasEmptyPlaceHolder, PlaceHolder.empty());
176 
177  printBefore(T, Quals, OS);
178  OS << PlaceHolder;
179  printAfter(T, Quals, OS);
180 }
181 
182 bool TypePrinter::canPrefixQualifiers(const Type *T,
183  bool &NeedARCStrongQualifier) {
184  // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
185  // so that we get "const int" instead of "int const", but we can't do this if
186  // the type is complex. For example if the type is "int*", we *must* print
187  // "int * const", printing "const int *" is different. Only do this when the
188  // type expands to a simple string.
189  bool CanPrefixQualifiers = false;
190  NeedARCStrongQualifier = false;
191  Type::TypeClass TC = T->getTypeClass();
192  if (const auto *AT = dyn_cast<AutoType>(T))
193  TC = AT->desugar()->getTypeClass();
194  if (const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(T))
195  TC = Subst->getReplacementType()->getTypeClass();
196 
197  switch (TC) {
198  case Type::Auto:
199  case Type::Builtin:
200  case Type::Complex:
201  case Type::UnresolvedUsing:
202  case Type::Typedef:
203  case Type::TypeOfExpr:
204  case Type::TypeOf:
205  case Type::Decltype:
206  case Type::UnaryTransform:
207  case Type::Record:
208  case Type::Enum:
209  case Type::Elaborated:
210  case Type::TemplateTypeParm:
211  case Type::SubstTemplateTypeParmPack:
212  case Type::DeducedTemplateSpecialization:
213  case Type::TemplateSpecialization:
214  case Type::InjectedClassName:
215  case Type::DependentName:
216  case Type::DependentTemplateSpecialization:
217  case Type::ObjCObject:
218  case Type::ObjCTypeParam:
219  case Type::ObjCInterface:
220  case Type::Atomic:
221  case Type::Pipe:
222  CanPrefixQualifiers = true;
223  break;
224 
225  case Type::ObjCObjectPointer:
226  CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
228  break;
229 
230  case Type::ConstantArray:
231  case Type::IncompleteArray:
232  case Type::VariableArray:
233  case Type::DependentSizedArray:
234  NeedARCStrongQualifier = true;
235  LLVM_FALLTHROUGH;
236 
237  case Type::Adjusted:
238  case Type::Decayed:
239  case Type::Pointer:
240  case Type::BlockPointer:
241  case Type::LValueReference:
242  case Type::RValueReference:
243  case Type::MemberPointer:
244  case Type::DependentAddressSpace:
245  case Type::DependentVector:
246  case Type::DependentSizedExtVector:
247  case Type::Vector:
248  case Type::ExtVector:
249  case Type::FunctionProto:
250  case Type::FunctionNoProto:
251  case Type::Paren:
252  case Type::Attributed:
253  case Type::PackExpansion:
254  case Type::SubstTemplateTypeParm:
255  CanPrefixQualifiers = false;
256  break;
257  }
258 
259  return CanPrefixQualifiers;
260 }
261 
262 void TypePrinter::printBefore(QualType T, raw_ostream &OS) {
263  SplitQualType Split = T.split();
264 
265  // If we have cv1 T, where T is substituted for cv2 U, only print cv1 - cv2
266  // at this level.
267  Qualifiers Quals = Split.Quals;
268  if (const auto *Subst = dyn_cast<SubstTemplateTypeParmType>(Split.Ty))
269  Quals -= QualType(Subst, 0).getQualifiers();
270 
271  printBefore(Split.Ty, Quals, OS);
272 }
273 
274 /// Prints the part of the type string before an identifier, e.g. for
275 /// "int foo[10]" it prints "int ".
276 void TypePrinter::printBefore(const Type *T,Qualifiers Quals, raw_ostream &OS) {
277  if (Policy.SuppressSpecifiers && T->isSpecifierType())
278  return;
279 
280  SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder);
281 
282  // Print qualifiers as appropriate.
283 
284  bool CanPrefixQualifiers = false;
285  bool NeedARCStrongQualifier = false;
286  CanPrefixQualifiers = canPrefixQualifiers(T, NeedARCStrongQualifier);
287 
288  if (CanPrefixQualifiers && !Quals.empty()) {
289  if (NeedARCStrongQualifier) {
290  IncludeStrongLifetimeRAII Strong(Policy);
291  Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
292  } else {
293  Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
294  }
295  }
296 
297  bool hasAfterQuals = false;
298  if (!CanPrefixQualifiers && !Quals.empty()) {
299  hasAfterQuals = !Quals.isEmptyWhenPrinted(Policy);
300  if (hasAfterQuals)
301  HasEmptyPlaceHolder = false;
302  }
303 
304  switch (T->getTypeClass()) {
305 #define ABSTRACT_TYPE(CLASS, PARENT)
306 #define TYPE(CLASS, PARENT) case Type::CLASS: \
307  print##CLASS##Before(cast<CLASS##Type>(T), OS); \
308  break;
309 #include "clang/AST/TypeNodes.def"
310  }
311 
312  if (hasAfterQuals) {
313  if (NeedARCStrongQualifier) {
314  IncludeStrongLifetimeRAII Strong(Policy);
315  Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
316  } else {
317  Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
318  }
319  }
320 }
321 
322 void TypePrinter::printAfter(QualType t, raw_ostream &OS) {
323  SplitQualType split = t.split();
324  printAfter(split.Ty, split.Quals, OS);
325 }
326 
327 /// Prints the part of the type string after an identifier, e.g. for
328 /// "int foo[10]" it prints "[10]".
329 void TypePrinter::printAfter(const Type *T, Qualifiers Quals, raw_ostream &OS) {
330  switch (T->getTypeClass()) {
331 #define ABSTRACT_TYPE(CLASS, PARENT)
332 #define TYPE(CLASS, PARENT) case Type::CLASS: \
333  print##CLASS##After(cast<CLASS##Type>(T), OS); \
334  break;
335 #include "clang/AST/TypeNodes.def"
336  }
337 }
338 
339 void TypePrinter::printBuiltinBefore(const BuiltinType *T, raw_ostream &OS) {
340  OS << T->getName(Policy);
341  spaceBeforePlaceHolder(OS);
342 }
343 
344 void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) {}
345 
346 void TypePrinter::printComplexBefore(const ComplexType *T, raw_ostream &OS) {
347  OS << "_Complex ";
348  printBefore(T->getElementType(), OS);
349 }
350 
351 void TypePrinter::printComplexAfter(const ComplexType *T, raw_ostream &OS) {
352  printAfter(T->getElementType(), OS);
353 }
354 
355 void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) {
356  IncludeStrongLifetimeRAII Strong(Policy);
357  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
358  printBefore(T->getPointeeType(), OS);
359  // Handle things like 'int (*A)[4];' correctly.
360  // FIXME: this should include vectors, but vectors use attributes I guess.
361  if (isa<ArrayType>(T->getPointeeType()))
362  OS << '(';
363  OS << '*';
364 }
365 
366 void TypePrinter::printPointerAfter(const PointerType *T, raw_ostream &OS) {
367  IncludeStrongLifetimeRAII Strong(Policy);
368  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
369  // Handle things like 'int (*A)[4];' correctly.
370  // FIXME: this should include vectors, but vectors use attributes I guess.
371  if (isa<ArrayType>(T->getPointeeType()))
372  OS << ')';
373  printAfter(T->getPointeeType(), OS);
374 }
375 
376 void TypePrinter::printBlockPointerBefore(const BlockPointerType *T,
377  raw_ostream &OS) {
378  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
379  printBefore(T->getPointeeType(), OS);
380  OS << '^';
381 }
382 
383 void TypePrinter::printBlockPointerAfter(const BlockPointerType *T,
384  raw_ostream &OS) {
385  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
386  printAfter(T->getPointeeType(), OS);
387 }
388 
389 // When printing a reference, the referenced type might also be a reference.
390 // If so, we want to skip that before printing the inner type.
392  if (auto *Ref = T->getAs<ReferenceType>())
393  return skipTopLevelReferences(Ref->getPointeeTypeAsWritten());
394  return T;
395 }
396 
397 void TypePrinter::printLValueReferenceBefore(const LValueReferenceType *T,
398  raw_ostream &OS) {
399  IncludeStrongLifetimeRAII Strong(Policy);
400  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
402  printBefore(Inner, OS);
403  // Handle things like 'int (&A)[4];' correctly.
404  // FIXME: this should include vectors, but vectors use attributes I guess.
405  if (isa<ArrayType>(Inner))
406  OS << '(';
407  OS << '&';
408 }
409 
410 void TypePrinter::printLValueReferenceAfter(const LValueReferenceType *T,
411  raw_ostream &OS) {
412  IncludeStrongLifetimeRAII Strong(Policy);
413  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>(Inner))
418  OS << ')';
419  printAfter(Inner, OS);
420 }
421 
422 void TypePrinter::printRValueReferenceBefore(const RValueReferenceType *T,
423  raw_ostream &OS) {
424  IncludeStrongLifetimeRAII Strong(Policy);
425  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
427  printBefore(Inner, OS);
428  // Handle things like 'int (&&A)[4];' correctly.
429  // FIXME: this should include vectors, but vectors use attributes I guess.
430  if (isa<ArrayType>(Inner))
431  OS << '(';
432  OS << "&&";
433 }
434 
435 void TypePrinter::printRValueReferenceAfter(const RValueReferenceType *T,
436  raw_ostream &OS) {
437  IncludeStrongLifetimeRAII Strong(Policy);
438  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
440  // Handle things like 'int (&&A)[4];' correctly.
441  // FIXME: this should include vectors, but vectors use attributes I guess.
442  if (isa<ArrayType>(Inner))
443  OS << ')';
444  printAfter(Inner, OS);
445 }
446 
447 void TypePrinter::printMemberPointerBefore(const MemberPointerType *T,
448  raw_ostream &OS) {
449  IncludeStrongLifetimeRAII Strong(Policy);
450  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
451  printBefore(T->getPointeeType(), OS);
452  // Handle things like 'int (Cls::*A)[4];' correctly.
453  // FIXME: this should include vectors, but vectors use attributes I guess.
454  if (isa<ArrayType>(T->getPointeeType()))
455  OS << '(';
456 
457  PrintingPolicy InnerPolicy(Policy);
458  InnerPolicy.IncludeTagDefinition = false;
459  TypePrinter(InnerPolicy).print(QualType(T->getClass(), 0), OS, StringRef());
460 
461  OS << "::*";
462 }
463 
464 void TypePrinter::printMemberPointerAfter(const MemberPointerType *T,
465  raw_ostream &OS) {
466  IncludeStrongLifetimeRAII Strong(Policy);
467  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
468  // Handle things like 'int (Cls::*A)[4];' correctly.
469  // FIXME: this should include vectors, but vectors use attributes I guess.
470  if (isa<ArrayType>(T->getPointeeType()))
471  OS << ')';
472  printAfter(T->getPointeeType(), OS);
473 }
474 
475 void TypePrinter::printConstantArrayBefore(const ConstantArrayType *T,
476  raw_ostream &OS) {
477  IncludeStrongLifetimeRAII Strong(Policy);
478  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
479  printBefore(T->getElementType(), OS);
480 }
481 
482 void TypePrinter::printConstantArrayAfter(const ConstantArrayType *T,
483  raw_ostream &OS) {
484  OS << '[';
487  Policy.Restrict);
488  OS << ' ';
489  }
490 
492  OS << "static ";
493 
494  OS << T->getSize().getZExtValue() << ']';
495  printAfter(T->getElementType(), OS);
496 }
497 
498 void TypePrinter::printIncompleteArrayBefore(const IncompleteArrayType *T,
499  raw_ostream &OS) {
500  IncludeStrongLifetimeRAII Strong(Policy);
501  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
502  printBefore(T->getElementType(), OS);
503 }
504 
505 void TypePrinter::printIncompleteArrayAfter(const IncompleteArrayType *T,
506  raw_ostream &OS) {
507  OS << "[]";
508  printAfter(T->getElementType(), OS);
509 }
510 
511 void TypePrinter::printVariableArrayBefore(const VariableArrayType *T,
512  raw_ostream &OS) {
513  IncludeStrongLifetimeRAII Strong(Policy);
514  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
515  printBefore(T->getElementType(), OS);
516 }
517 
518 void TypePrinter::printVariableArrayAfter(const VariableArrayType *T,
519  raw_ostream &OS) {
520  OS << '[';
522  AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers(), Policy.Restrict);
523  OS << ' ';
524  }
525 
527  OS << "static ";
528  else if (T->getSizeModifier() == VariableArrayType::Star)
529  OS << '*';
530 
531  if (T->getSizeExpr())
532  T->getSizeExpr()->printPretty(OS, nullptr, Policy);
533  OS << ']';
534 
535  printAfter(T->getElementType(), OS);
536 }
537 
538 void TypePrinter::printAdjustedBefore(const AdjustedType *T, raw_ostream &OS) {
539  // Print the adjusted representation, otherwise the adjustment will be
540  // invisible.
541  printBefore(T->getAdjustedType(), OS);
542 }
543 
544 void TypePrinter::printAdjustedAfter(const AdjustedType *T, raw_ostream &OS) {
545  printAfter(T->getAdjustedType(), OS);
546 }
547 
548 void TypePrinter::printDecayedBefore(const DecayedType *T, raw_ostream &OS) {
549  // Print as though it's a pointer.
550  printAdjustedBefore(T, OS);
551 }
552 
553 void TypePrinter::printDecayedAfter(const DecayedType *T, raw_ostream &OS) {
554  printAdjustedAfter(T, OS);
555 }
556 
557 void TypePrinter::printDependentSizedArrayBefore(
558  const DependentSizedArrayType *T,
559  raw_ostream &OS) {
560  IncludeStrongLifetimeRAII Strong(Policy);
561  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
562  printBefore(T->getElementType(), OS);
563 }
564 
565 void TypePrinter::printDependentSizedArrayAfter(
566  const DependentSizedArrayType *T,
567  raw_ostream &OS) {
568  OS << '[';
569  if (T->getSizeExpr())
570  T->getSizeExpr()->printPretty(OS, nullptr, Policy);
571  OS << ']';
572  printAfter(T->getElementType(), OS);
573 }
574 
575 void TypePrinter::printDependentAddressSpaceBefore(
576  const DependentAddressSpaceType *T, raw_ostream &OS) {
577  printBefore(T->getPointeeType(), OS);
578 }
579 
580 void TypePrinter::printDependentAddressSpaceAfter(
581  const DependentAddressSpaceType *T, raw_ostream &OS) {
582  OS << " __attribute__((address_space(";
583  if (T->getAddrSpaceExpr())
584  T->getAddrSpaceExpr()->printPretty(OS, nullptr, Policy);
585  OS << ")))";
586  printAfter(T->getPointeeType(), OS);
587 }
588 
589 void TypePrinter::printDependentSizedExtVectorBefore(
591  raw_ostream &OS) {
592  printBefore(T->getElementType(), OS);
593 }
594 
595 void TypePrinter::printDependentSizedExtVectorAfter(
597  raw_ostream &OS) {
598  OS << " __attribute__((ext_vector_type(";
599  if (T->getSizeExpr())
600  T->getSizeExpr()->printPretty(OS, nullptr, Policy);
601  OS << ")))";
602  printAfter(T->getElementType(), OS);
603 }
604 
605 void TypePrinter::printVectorBefore(const VectorType *T, raw_ostream &OS) {
606  switch (T->getVectorKind()) {
608  OS << "__vector __pixel ";
609  break;
611  OS << "__vector __bool ";
612  printBefore(T->getElementType(), OS);
613  break;
615  OS << "__vector ";
616  printBefore(T->getElementType(), OS);
617  break;
619  OS << "__attribute__((neon_vector_type("
620  << T->getNumElements() << "))) ";
621  printBefore(T->getElementType(), OS);
622  break;
624  OS << "__attribute__((neon_polyvector_type(" <<
625  T->getNumElements() << "))) ";
626  printBefore(T->getElementType(), OS);
627  break;
629  // FIXME: We prefer to print the size directly here, but have no way
630  // to get the size of the type.
631  OS << "__attribute__((__vector_size__("
632  << T->getNumElements()
633  << " * sizeof(";
634  print(T->getElementType(), OS, StringRef());
635  OS << ")))) ";
636  printBefore(T->getElementType(), OS);
637  break;
638  }
639  }
640 }
641 
642 void TypePrinter::printVectorAfter(const VectorType *T, raw_ostream &OS) {
643  printAfter(T->getElementType(), OS);
644 }
645 
646 void TypePrinter::printDependentVectorBefore(
647  const DependentVectorType *T, raw_ostream &OS) {
648  switch (T->getVectorKind()) {
650  OS << "__vector __pixel ";
651  break;
653  OS << "__vector __bool ";
654  printBefore(T->getElementType(), OS);
655  break;
657  OS << "__vector ";
658  printBefore(T->getElementType(), OS);
659  break;
661  OS << "__attribute__((neon_vector_type(";
662  if (T->getSizeExpr())
663  T->getSizeExpr()->printPretty(OS, nullptr, Policy);
664  OS << "))) ";
665  printBefore(T->getElementType(), OS);
666  break;
668  OS << "__attribute__((neon_polyvector_type(";
669  if (T->getSizeExpr())
670  T->getSizeExpr()->printPretty(OS, nullptr, Policy);
671  OS << "))) ";
672  printBefore(T->getElementType(), OS);
673  break;
675  // FIXME: We prefer to print the size directly here, but have no way
676  // to get the size of the type.
677  OS << "__attribute__((__vector_size__(";
678  if (T->getSizeExpr())
679  T->getSizeExpr()->printPretty(OS, nullptr, Policy);
680  OS << " * sizeof(";
681  print(T->getElementType(), OS, StringRef());
682  OS << ")))) ";
683  printBefore(T->getElementType(), OS);
684  break;
685  }
686  }
687 }
688 
689 void TypePrinter::printDependentVectorAfter(
690  const DependentVectorType *T, raw_ostream &OS) {
691  printAfter(T->getElementType(), OS);
692 }
693 
694 void TypePrinter::printExtVectorBefore(const ExtVectorType *T,
695  raw_ostream &OS) {
696  printBefore(T->getElementType(), OS);
697 }
698 
699 void TypePrinter::printExtVectorAfter(const ExtVectorType *T, raw_ostream &OS) {
700  printAfter(T->getElementType(), OS);
701  OS << " __attribute__((ext_vector_type(";
702  OS << T->getNumElements();
703  OS << ")))";
704 }
705 
706 void
708  const PrintingPolicy &Policy)
709  const {
710  if (hasDynamicExceptionSpec()) {
711  OS << " throw(";
712  if (getExceptionSpecType() == EST_MSAny)
713  OS << "...";
714  else
715  for (unsigned I = 0, N = getNumExceptions(); I != N; ++I) {
716  if (I)
717  OS << ", ";
718 
719  OS << getExceptionType(I).stream(Policy);
720  }
721  OS << ')';
722  } else if (isNoexceptExceptionSpec(getExceptionSpecType())) {
723  OS << " noexcept";
724  // FIXME:Is it useful to print out the expression for a non-dependent
725  // noexcept specification?
726  if (isComputedNoexcept(getExceptionSpecType())) {
727  OS << '(';
728  if (getNoexceptExpr())
729  getNoexceptExpr()->printPretty(OS, nullptr, Policy);
730  OS << ')';
731  }
732  }
733 }
734 
735 void TypePrinter::printFunctionProtoBefore(const FunctionProtoType *T,
736  raw_ostream &OS) {
737  if (T->hasTrailingReturn()) {
738  OS << "auto ";
739  if (!HasEmptyPlaceHolder)
740  OS << '(';
741  } else {
742  // If needed for precedence reasons, wrap the inner part in grouping parens.
743  SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
744  printBefore(T->getReturnType(), OS);
745  if (!PrevPHIsEmpty.get())
746  OS << '(';
747  }
748 }
749 
751  switch (ABI) {
753  llvm_unreachable("asking for spelling of ordinary parameter ABI");
755  return "swift_context";
757  return "swift_error_result";
759  return "swift_indirect_result";
760  }
761  llvm_unreachable("bad parameter ABI kind");
762 }
763 
764 void TypePrinter::printFunctionProtoAfter(const FunctionProtoType *T,
765  raw_ostream &OS) {
766  // If needed for precedence reasons, wrap the inner part in grouping parens.
767  if (!HasEmptyPlaceHolder)
768  OS << ')';
769  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
770 
771  OS << '(';
772  {
773  ParamPolicyRAII ParamPolicy(Policy);
774  for (unsigned i = 0, e = T->getNumParams(); i != e; ++i) {
775  if (i) OS << ", ";
776 
777  auto EPI = T->getExtParameterInfo(i);
778  if (EPI.isConsumed()) OS << "__attribute__((ns_consumed)) ";
779  if (EPI.isNoEscape())
780  OS << "__attribute__((noescape)) ";
781  auto ABI = EPI.getABI();
782  if (ABI != ParameterABI::Ordinary)
783  OS << "__attribute__((" << getParameterABISpelling(ABI) << ")) ";
784 
785  print(T->getParamType(i), OS, StringRef());
786  }
787  }
788 
789  if (T->isVariadic()) {
790  if (T->getNumParams())
791  OS << ", ";
792  OS << "...";
793  } else if (T->getNumParams() == 0 && Policy.UseVoidForZeroParams) {
794  // Do not emit int() if we have a proto, emit 'int(void)'.
795  OS << "void";
796  }
797 
798  OS << ')';
799 
800  FunctionType::ExtInfo Info = T->getExtInfo();
801 
802  printFunctionAfter(Info, OS);
803 
804  if (!T->getTypeQuals().empty())
805  OS << " " << T->getTypeQuals().getAsString();
806 
807  switch (T->getRefQualifier()) {
808  case RQ_None:
809  break;
810 
811  case RQ_LValue:
812  OS << " &";
813  break;
814 
815  case RQ_RValue:
816  OS << " &&";
817  break;
818  }
819  T->printExceptionSpecification(OS, Policy);
820 
821  if (T->hasTrailingReturn()) {
822  OS << " -> ";
823  print(T->getReturnType(), OS, StringRef());
824  } else
825  printAfter(T->getReturnType(), OS);
826 }
827 
828 void TypePrinter::printFunctionAfter(const FunctionType::ExtInfo &Info,
829  raw_ostream &OS) {
830  if (!InsideCCAttribute) {
831  switch (Info.getCC()) {
832  case CC_C:
833  // The C calling convention is the default on the vast majority of platforms
834  // we support. If the user wrote it explicitly, it will usually be printed
835  // while traversing the AttributedType. If the type has been desugared, let
836  // the canonical spelling be the implicit calling convention.
837  // FIXME: It would be better to be explicit in certain contexts, such as a
838  // cdecl function typedef used to declare a member function with the
839  // Microsoft C++ ABI.
840  break;
841  case CC_X86StdCall:
842  OS << " __attribute__((stdcall))";
843  break;
844  case CC_X86FastCall:
845  OS << " __attribute__((fastcall))";
846  break;
847  case CC_X86ThisCall:
848  OS << " __attribute__((thiscall))";
849  break;
850  case CC_X86VectorCall:
851  OS << " __attribute__((vectorcall))";
852  break;
853  case CC_X86Pascal:
854  OS << " __attribute__((pascal))";
855  break;
856  case CC_AAPCS:
857  OS << " __attribute__((pcs(\"aapcs\")))";
858  break;
859  case CC_AAPCS_VFP:
860  OS << " __attribute__((pcs(\"aapcs-vfp\")))";
861  break;
863  OS << "__attribute__((aarch64_vector_pcs))";
864  break;
865  case CC_IntelOclBicc:
866  OS << " __attribute__((intel_ocl_bicc))";
867  break;
868  case CC_Win64:
869  OS << " __attribute__((ms_abi))";
870  break;
871  case CC_X86_64SysV:
872  OS << " __attribute__((sysv_abi))";
873  break;
874  case CC_X86RegCall:
875  OS << " __attribute__((regcall))";
876  break;
877  case CC_SpirFunction:
878  case CC_OpenCLKernel:
879  // Do nothing. These CCs are not available as attributes.
880  break;
881  case CC_Swift:
882  OS << " __attribute__((swiftcall))";
883  break;
884  case CC_PreserveMost:
885  OS << " __attribute__((preserve_most))";
886  break;
887  case CC_PreserveAll:
888  OS << " __attribute__((preserve_all))";
889  break;
890  }
891  }
892 
893  if (Info.getNoReturn())
894  OS << " __attribute__((noreturn))";
895  if (Info.getProducesResult())
896  OS << " __attribute__((ns_returns_retained))";
897  if (Info.getRegParm())
898  OS << " __attribute__((regparm ("
899  << Info.getRegParm() << ")))";
900  if (Info.getNoCallerSavedRegs())
901  OS << " __attribute__((no_caller_saved_registers))";
902  if (Info.getNoCfCheck())
903  OS << " __attribute__((nocf_check))";
904 }
905 
906 void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T,
907  raw_ostream &OS) {
908  // If needed for precedence reasons, wrap the inner part in grouping parens.
909  SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
910  printBefore(T->getReturnType(), OS);
911  if (!PrevPHIsEmpty.get())
912  OS << '(';
913 }
914 
915 void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T,
916  raw_ostream &OS) {
917  // If needed for precedence reasons, wrap the inner part in grouping parens.
918  if (!HasEmptyPlaceHolder)
919  OS << ')';
920  SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
921 
922  OS << "()";
923  printFunctionAfter(T->getExtInfo(), OS);
924  printAfter(T->getReturnType(), OS);
925 }
926 
927 void TypePrinter::printTypeSpec(NamedDecl *D, raw_ostream &OS) {
928 
929  // Compute the full nested-name-specifier for this type.
930  // In C, this will always be empty except when the type
931  // being printed is anonymous within other Record.
932  if (!Policy.SuppressScope)
933  AppendScope(D->getDeclContext(), OS);
934 
935  IdentifierInfo *II = D->getIdentifier();
936  OS << II->getName();
937  spaceBeforePlaceHolder(OS);
938 }
939 
940 void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T,
941  raw_ostream &OS) {
942  printTypeSpec(T->getDecl(), OS);
943 }
944 
945 void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T,
946  raw_ostream &OS) {}
947 
948 void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) {
949  printTypeSpec(T->getDecl(), OS);
950 }
951 
952 void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) {}
953 
954 void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T,
955  raw_ostream &OS) {
956  OS << "typeof ";
957  if (T->getUnderlyingExpr())
958  T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
959  spaceBeforePlaceHolder(OS);
960 }
961 
962 void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T,
963  raw_ostream &OS) {}
964 
965 void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) {
966  OS << "typeof(";
967  print(T->getUnderlyingType(), OS, StringRef());
968  OS << ')';
969  spaceBeforePlaceHolder(OS);
970 }
971 
972 void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) {}
973 
974 void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) {
975  OS << "decltype(";
976  if (T->getUnderlyingExpr())
977  T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy);
978  OS << ')';
979  spaceBeforePlaceHolder(OS);
980 }
981 
982 void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) {}
983 
984 void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T,
985  raw_ostream &OS) {
986  IncludeStrongLifetimeRAII Strong(Policy);
987 
988  switch (T->getUTTKind()) {
990  OS << "__underlying_type(";
991  print(T->getBaseType(), OS, StringRef());
992  OS << ')';
993  spaceBeforePlaceHolder(OS);
994  return;
995  }
996 
997  printBefore(T->getBaseType(), OS);
998 }
999 
1000 void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T,
1001  raw_ostream &OS) {
1002  IncludeStrongLifetimeRAII Strong(Policy);
1003 
1004  switch (T->getUTTKind()) {
1006  return;
1007  }
1008 
1009  printAfter(T->getBaseType(), OS);
1010 }
1011 
1012 void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) {
1013  // If the type has been deduced, do not print 'auto'.
1014  if (!T->getDeducedType().isNull()) {
1015  printBefore(T->getDeducedType(), OS);
1016  } else {
1017  switch (T->getKeyword()) {
1018  case AutoTypeKeyword::Auto: OS << "auto"; break;
1019  case AutoTypeKeyword::DecltypeAuto: OS << "decltype(auto)"; break;
1020  case AutoTypeKeyword::GNUAutoType: OS << "__auto_type"; break;
1021  }
1022  spaceBeforePlaceHolder(OS);
1023  }
1024 }
1025 
1026 void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) {
1027  // If the type has been deduced, do not print 'auto'.
1028  if (!T->getDeducedType().isNull())
1029  printAfter(T->getDeducedType(), OS);
1030 }
1031 
1032 void TypePrinter::printDeducedTemplateSpecializationBefore(
1033  const DeducedTemplateSpecializationType *T, raw_ostream &OS) {
1034  // If the type has been deduced, print the deduced type.
1035  if (!T->getDeducedType().isNull()) {
1036  printBefore(T->getDeducedType(), OS);
1037  } else {
1038  IncludeStrongLifetimeRAII Strong(Policy);
1039  T->getTemplateName().print(OS, Policy);
1040  spaceBeforePlaceHolder(OS);
1041  }
1042 }
1043 
1044 void TypePrinter::printDeducedTemplateSpecializationAfter(
1045  const DeducedTemplateSpecializationType *T, raw_ostream &OS) {
1046  // If the type has been deduced, print the deduced type.
1047  if (!T->getDeducedType().isNull())
1048  printAfter(T->getDeducedType(), OS);
1049 }
1050 
1051 void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) {
1052  IncludeStrongLifetimeRAII Strong(Policy);
1053 
1054  OS << "_Atomic(";
1055  print(T->getValueType(), OS, StringRef());
1056  OS << ')';
1057  spaceBeforePlaceHolder(OS);
1058 }
1059 
1060 void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) {}
1061 
1062 void TypePrinter::printPipeBefore(const PipeType *T, raw_ostream &OS) {
1063  IncludeStrongLifetimeRAII Strong(Policy);
1064 
1065  if (T->isReadOnly())
1066  OS << "read_only ";
1067  else
1068  OS << "write_only ";
1069  OS << "pipe ";
1070  print(T->getElementType(), OS, StringRef());
1071  spaceBeforePlaceHolder(OS);
1072 }
1073 
1074 void TypePrinter::printPipeAfter(const PipeType *T, raw_ostream &OS) {}
1075 
1076 /// Appends the given scope to the end of a string.
1077 void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS) {
1078  if (DC->isTranslationUnit()) return;
1079  if (DC->isFunctionOrMethod()) return;
1080  AppendScope(DC->getParent(), OS);
1081 
1082  if (const auto *NS = dyn_cast<NamespaceDecl>(DC)) {
1083  if (Policy.SuppressUnwrittenScope &&
1084  (NS->isAnonymousNamespace() || NS->isInline()))
1085  return;
1086  if (NS->getIdentifier())
1087  OS << NS->getName() << "::";
1088  else
1089  OS << "(anonymous namespace)::";
1090  } else if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
1091  IncludeStrongLifetimeRAII Strong(Policy);
1092  OS << Spec->getIdentifier()->getName();
1093  const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1094  printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy);
1095  OS << "::";
1096  } else if (const auto *Tag = dyn_cast<TagDecl>(DC)) {
1097  if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
1098  OS << Typedef->getIdentifier()->getName() << "::";
1099  else if (Tag->getIdentifier())
1100  OS << Tag->getIdentifier()->getName() << "::";
1101  else
1102  return;
1103  }
1104 }
1105 
1106 void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
1107  if (Policy.IncludeTagDefinition) {
1108  PrintingPolicy SubPolicy = Policy;
1109  SubPolicy.IncludeTagDefinition = false;
1110  D->print(OS, SubPolicy, Indentation);
1111  spaceBeforePlaceHolder(OS);
1112  return;
1113  }
1114 
1115  bool HasKindDecoration = false;
1116 
1117  // We don't print tags unless this is an elaborated type.
1118  // In C, we just assume every RecordType is an elaborated type.
1119  if (!Policy.SuppressTagKeyword && !D->getTypedefNameForAnonDecl()) {
1120  HasKindDecoration = true;
1121  OS << D->getKindName();
1122  OS << ' ';
1123  }
1124 
1125  // Compute the full nested-name-specifier for this type.
1126  // In C, this will always be empty except when the type
1127  // being printed is anonymous within other Record.
1128  if (!Policy.SuppressScope)
1129  AppendScope(D->getDeclContext(), OS);
1130 
1131  if (const IdentifierInfo *II = D->getIdentifier())
1132  OS << II->getName();
1133  else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
1134  assert(Typedef->getIdentifier() && "Typedef without identifier?");
1135  OS << Typedef->getIdentifier()->getName();
1136  } else {
1137  // Make an unambiguous representation for anonymous types, e.g.
1138  // (anonymous enum at /usr/include/string.h:120:9)
1139  OS << (Policy.MSVCFormatting ? '`' : '(');
1140 
1141  if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
1142  OS << "lambda";
1143  HasKindDecoration = true;
1144  } else {
1145  OS << "anonymous";
1146  }
1147 
1148  if (Policy.AnonymousTagLocations) {
1149  // Suppress the redundant tag keyword if we just printed one.
1150  // We don't have to worry about ElaboratedTypes here because you can't
1151  // refer to an anonymous type with one.
1152  if (!HasKindDecoration)
1153  OS << " " << D->getKindName();
1154 
1156  D->getLocation());
1157  if (PLoc.isValid()) {
1158  OS << " at ";
1159  StringRef File = PLoc.getFilename();
1160  if (Policy.RemapFilePaths)
1161  OS << Policy.remapPath(File);
1162  else
1163  OS << File;
1164  OS << ':' << PLoc.getLine() << ':' << PLoc.getColumn();
1165  }
1166  }
1167 
1168  OS << (Policy.MSVCFormatting ? '\'' : ')');
1169  }
1170 
1171  // If this is a class template specialization, print the template
1172  // arguments.
1173  if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
1175  if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
1176  const TemplateSpecializationType *TST =
1177  cast<TemplateSpecializationType>(TAW->getType());
1178  Args = TST->template_arguments();
1179  } else {
1180  const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
1181  Args = TemplateArgs.asArray();
1182  }
1183  IncludeStrongLifetimeRAII Strong(Policy);
1184  printTemplateArgumentList(OS, Args, Policy);
1185  }
1186 
1187  spaceBeforePlaceHolder(OS);
1188 }
1189 
1190 void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) {
1191  printTag(T->getDecl(), OS);
1192 }
1193 
1194 void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) {}
1195 
1196 void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) {
1197  printTag(T->getDecl(), OS);
1198 }
1199 
1200 void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) {}
1201 
1202 void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T,
1203  raw_ostream &OS) {
1204  if (IdentifierInfo *Id = T->getIdentifier())
1205  OS << Id->getName();
1206  else
1207  OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex();
1208  spaceBeforePlaceHolder(OS);
1209 }
1210 
1211 void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T,
1212  raw_ostream &OS) {}
1213 
1214 void TypePrinter::printSubstTemplateTypeParmBefore(
1215  const SubstTemplateTypeParmType *T,
1216  raw_ostream &OS) {
1217  IncludeStrongLifetimeRAII Strong(Policy);
1218  printBefore(T->getReplacementType(), OS);
1219 }
1220 
1221 void TypePrinter::printSubstTemplateTypeParmAfter(
1222  const SubstTemplateTypeParmType *T,
1223  raw_ostream &OS) {
1224  IncludeStrongLifetimeRAII Strong(Policy);
1225  printAfter(T->getReplacementType(), OS);
1226 }
1227 
1228 void TypePrinter::printSubstTemplateTypeParmPackBefore(
1230  raw_ostream &OS) {
1231  IncludeStrongLifetimeRAII Strong(Policy);
1232  printTemplateTypeParmBefore(T->getReplacedParameter(), OS);
1233 }
1234 
1235 void TypePrinter::printSubstTemplateTypeParmPackAfter(
1237  raw_ostream &OS) {
1238  IncludeStrongLifetimeRAII Strong(Policy);
1239  printTemplateTypeParmAfter(T->getReplacedParameter(), OS);
1240 }
1241 
1242 void TypePrinter::printTemplateSpecializationBefore(
1243  const TemplateSpecializationType *T,
1244  raw_ostream &OS) {
1245  IncludeStrongLifetimeRAII Strong(Policy);
1246  T->getTemplateName().print(OS, Policy);
1247 
1249  spaceBeforePlaceHolder(OS);
1250 }
1251 
1252 void TypePrinter::printTemplateSpecializationAfter(
1253  const TemplateSpecializationType *T,
1254  raw_ostream &OS) {}
1255 
1256 void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T,
1257  raw_ostream &OS) {
1258  printTemplateSpecializationBefore(T->getInjectedTST(), OS);
1259 }
1260 
1261 void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T,
1262  raw_ostream &OS) {}
1263 
1264 void TypePrinter::printElaboratedBefore(const ElaboratedType *T,
1265  raw_ostream &OS) {
1266  if (Policy.IncludeTagDefinition && T->getOwnedTagDecl()) {
1267  TagDecl *OwnedTagDecl = T->getOwnedTagDecl();
1268  assert(OwnedTagDecl->getTypeForDecl() == T->getNamedType().getTypePtr() &&
1269  "OwnedTagDecl expected to be a declaration for the type");
1270  PrintingPolicy SubPolicy = Policy;
1271  SubPolicy.IncludeTagDefinition = false;
1272  OwnedTagDecl->print(OS, SubPolicy, Indentation);
1273  spaceBeforePlaceHolder(OS);
1274  return;
1275  }
1276 
1277  // The tag definition will take care of these.
1278  if (!Policy.IncludeTagDefinition)
1279  {
1281  if (T->getKeyword() != ETK_None)
1282  OS << " ";
1283  NestedNameSpecifier *Qualifier = T->getQualifier();
1284  if (Qualifier)
1285  Qualifier->print(OS, Policy);
1286  }
1287 
1288  ElaboratedTypePolicyRAII PolicyRAII(Policy);
1289  printBefore(T->getNamedType(), OS);
1290 }
1291 
1292 void TypePrinter::printElaboratedAfter(const ElaboratedType *T,
1293  raw_ostream &OS) {
1294  if (Policy.IncludeTagDefinition && T->getOwnedTagDecl())
1295  return;
1296  ElaboratedTypePolicyRAII PolicyRAII(Policy);
1297  printAfter(T->getNamedType(), OS);
1298 }
1299 
1300 void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) {
1301  if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1302  printBefore(T->getInnerType(), OS);
1303  OS << '(';
1304  } else
1305  printBefore(T->getInnerType(), OS);
1306 }
1307 
1308 void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) {
1309  if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1310  OS << ')';
1311  printAfter(T->getInnerType(), OS);
1312  } else
1313  printAfter(T->getInnerType(), OS);
1314 }
1315 
1316 void TypePrinter::printDependentNameBefore(const DependentNameType *T,
1317  raw_ostream &OS) {
1319  if (T->getKeyword() != ETK_None)
1320  OS << " ";
1321 
1322  T->getQualifier()->print(OS, Policy);
1323 
1324  OS << T->getIdentifier()->getName();
1325  spaceBeforePlaceHolder(OS);
1326 }
1327 
1328 void TypePrinter::printDependentNameAfter(const DependentNameType *T,
1329  raw_ostream &OS) {}
1330 
1331 void TypePrinter::printDependentTemplateSpecializationBefore(
1332  const DependentTemplateSpecializationType *T, raw_ostream &OS) {
1333  IncludeStrongLifetimeRAII Strong(Policy);
1334 
1336  if (T->getKeyword() != ETK_None)
1337  OS << " ";
1338 
1339  if (T->getQualifier())
1340  T->getQualifier()->print(OS, Policy);
1341  OS << T->getIdentifier()->getName();
1343  spaceBeforePlaceHolder(OS);
1344 }
1345 
1346 void TypePrinter::printDependentTemplateSpecializationAfter(
1347  const DependentTemplateSpecializationType *T, raw_ostream &OS) {}
1348 
1349 void TypePrinter::printPackExpansionBefore(const PackExpansionType *T,
1350  raw_ostream &OS) {
1351  printBefore(T->getPattern(), OS);
1352 }
1353 
1354 void TypePrinter::printPackExpansionAfter(const PackExpansionType *T,
1355  raw_ostream &OS) {
1356  printAfter(T->getPattern(), OS);
1357  OS << "...";
1358 }
1359 
1360 void TypePrinter::printAttributedBefore(const AttributedType *T,
1361  raw_ostream &OS) {
1362  // FIXME: Generate this with TableGen.
1363 
1364  // Prefer the macro forms of the GC and ownership qualifiers.
1365  if (T->getAttrKind() == attr::ObjCGC ||
1366  T->getAttrKind() == attr::ObjCOwnership)
1367  return printBefore(T->getEquivalentType(), OS);
1368 
1369  if (T->getAttrKind() == attr::ObjCKindOf)
1370  OS << "__kindof ";
1371 
1372  printBefore(T->getModifiedType(), OS);
1373 
1374  if (T->isMSTypeSpec()) {
1375  switch (T->getAttrKind()) {
1376  default: return;
1377  case attr::Ptr32: OS << " __ptr32"; break;
1378  case attr::Ptr64: OS << " __ptr64"; break;
1379  case attr::SPtr: OS << " __sptr"; break;
1380  case attr::UPtr: OS << " __uptr"; break;
1381  }
1382  spaceBeforePlaceHolder(OS);
1383  }
1384 
1385  // Print nullability type specifiers.
1386  if (T->getImmediateNullability()) {
1387  if (T->getAttrKind() == attr::TypeNonNull)
1388  OS << " _Nonnull";
1389  else if (T->getAttrKind() == attr::TypeNullable)
1390  OS << " _Nullable";
1391  else if (T->getAttrKind() == attr::TypeNullUnspecified)
1392  OS << " _Null_unspecified";
1393  else
1394  llvm_unreachable("unhandled nullability");
1395  spaceBeforePlaceHolder(OS);
1396  }
1397 }
1398 
1399 void TypePrinter::printAttributedAfter(const AttributedType *T,
1400  raw_ostream &OS) {
1401  // FIXME: Generate this with TableGen.
1402 
1403  // Prefer the macro forms of the GC and ownership qualifiers.
1404  if (T->getAttrKind() == attr::ObjCGC ||
1405  T->getAttrKind() == attr::ObjCOwnership)
1406  return printAfter(T->getEquivalentType(), OS);
1407 
1408  // If this is a calling convention attribute, don't print the implicit CC from
1409  // the modified type.
1410  SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv());
1411 
1412  printAfter(T->getModifiedType(), OS);
1413 
1414  // Some attributes are printed as qualifiers before the type, so we have
1415  // nothing left to do.
1416  if (T->getAttrKind() == attr::ObjCKindOf ||
1418  return;
1419 
1420  // Don't print the inert __unsafe_unretained attribute at all.
1421  if (T->getAttrKind() == attr::ObjCInertUnsafeUnretained)
1422  return;
1423 
1424  // Don't print ns_returns_retained unless it had an effect.
1425  if (T->getAttrKind() == attr::NSReturnsRetained &&
1427  ->getExtInfo().getProducesResult())
1428  return;
1429 
1430  if (T->getAttrKind() == attr::LifetimeBound) {
1431  OS << " [[clang::lifetimebound]]";
1432  return;
1433  }
1434 
1435  // The printing of the address_space attribute is handled by the qualifier
1436  // since it is still stored in the qualifier. Return early to prevent printing
1437  // this twice.
1438  if (T->getAttrKind() == attr::AddressSpace)
1439  return;
1440 
1441  OS << " __attribute__((";
1442  switch (T->getAttrKind()) {
1443 #define TYPE_ATTR(NAME)
1444 #define DECL_OR_TYPE_ATTR(NAME)
1445 #define ATTR(NAME) case attr::NAME:
1446 #include "clang/Basic/AttrList.inc"
1447  llvm_unreachable("non-type attribute attached to type");
1448 
1449  case attr::OpenCLPrivateAddressSpace:
1450  case attr::OpenCLGlobalAddressSpace:
1451  case attr::OpenCLLocalAddressSpace:
1452  case attr::OpenCLConstantAddressSpace:
1453  case attr::OpenCLGenericAddressSpace:
1454  // FIXME: Update printAttributedBefore to print these once we generate
1455  // AttributedType nodes for them.
1456  break;
1457 
1458  case attr::LifetimeBound:
1459  case attr::TypeNonNull:
1460  case attr::TypeNullable:
1461  case attr::TypeNullUnspecified:
1462  case attr::ObjCGC:
1463  case attr::ObjCInertUnsafeUnretained:
1464  case attr::ObjCKindOf:
1465  case attr::ObjCOwnership:
1466  case attr::Ptr32:
1467  case attr::Ptr64:
1468  case attr::SPtr:
1469  case attr::UPtr:
1470  case attr::AddressSpace:
1471  llvm_unreachable("This attribute should have been handled already");
1472 
1473  case attr::NSReturnsRetained:
1474  OS << "ns_returns_retained";
1475  break;
1476 
1477  // FIXME: When Sema learns to form this AttributedType, avoid printing the
1478  // attribute again in printFunctionProtoAfter.
1479  case attr::AnyX86NoCfCheck: OS << "nocf_check"; break;
1480  case attr::CDecl: OS << "cdecl"; break;
1481  case attr::FastCall: OS << "fastcall"; break;
1482  case attr::StdCall: OS << "stdcall"; break;
1483  case attr::ThisCall: OS << "thiscall"; break;
1484  case attr::SwiftCall: OS << "swiftcall"; break;
1485  case attr::VectorCall: OS << "vectorcall"; break;
1486  case attr::Pascal: OS << "pascal"; break;
1487  case attr::MSABI: OS << "ms_abi"; break;
1488  case attr::SysVABI: OS << "sysv_abi"; break;
1489  case attr::RegCall: OS << "regcall"; break;
1490  case attr::Pcs: {
1491  OS << "pcs(";
1492  QualType t = T->getEquivalentType();
1493  while (!t->isFunctionType())
1494  t = t->getPointeeType();
1495  OS << (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
1496  "\"aapcs\"" : "\"aapcs-vfp\"");
1497  OS << ')';
1498  break;
1499  }
1500  case attr::AArch64VectorPcs: OS << "aarch64_vector_pcs"; break;
1501  case attr::IntelOclBicc: OS << "inteloclbicc"; break;
1502  case attr::PreserveMost:
1503  OS << "preserve_most";
1504  break;
1505 
1506  case attr::PreserveAll:
1507  OS << "preserve_all";
1508  break;
1509  case attr::NoDeref:
1510  OS << "noderef";
1511  break;
1512  }
1513  OS << "))";
1514 }
1515 
1516 void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T,
1517  raw_ostream &OS) {
1518  OS << T->getDecl()->getName();
1519  spaceBeforePlaceHolder(OS);
1520 }
1521 
1522 void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T,
1523  raw_ostream &OS) {}
1524 
1525 void TypePrinter::printObjCTypeParamBefore(const ObjCTypeParamType *T,
1526  raw_ostream &OS) {
1527  OS << T->getDecl()->getName();
1528  if (!T->qual_empty()) {
1529  bool isFirst = true;
1530  OS << '<';
1531  for (const auto *I : T->quals()) {
1532  if (isFirst)
1533  isFirst = false;
1534  else
1535  OS << ',';
1536  OS << I->getName();
1537  }
1538  OS << '>';
1539  }
1540 
1541  spaceBeforePlaceHolder(OS);
1542 }
1543 
1544 void TypePrinter::printObjCTypeParamAfter(const ObjCTypeParamType *T,
1545  raw_ostream &OS) {}
1546 
1547 void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T,
1548  raw_ostream &OS) {
1549  if (T->qual_empty() && T->isUnspecializedAsWritten() &&
1550  !T->isKindOfTypeAsWritten())
1551  return printBefore(T->getBaseType(), OS);
1552 
1553  if (T->isKindOfTypeAsWritten())
1554  OS << "__kindof ";
1555 
1556  print(T->getBaseType(), OS, StringRef());
1557 
1558  if (T->isSpecializedAsWritten()) {
1559  bool isFirst = true;
1560  OS << '<';
1561  for (auto typeArg : T->getTypeArgsAsWritten()) {
1562  if (isFirst)
1563  isFirst = false;
1564  else
1565  OS << ",";
1566 
1567  print(typeArg, OS, StringRef());
1568  }
1569  OS << '>';
1570  }
1571 
1572  if (!T->qual_empty()) {
1573  bool isFirst = true;
1574  OS << '<';
1575  for (const auto *I : T->quals()) {
1576  if (isFirst)
1577  isFirst = false;
1578  else
1579  OS << ',';
1580  OS << I->getName();
1581  }
1582  OS << '>';
1583  }
1584 
1585  spaceBeforePlaceHolder(OS);
1586 }
1587 
1588 void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T,
1589  raw_ostream &OS) {
1590  if (T->qual_empty() && T->isUnspecializedAsWritten() &&
1591  !T->isKindOfTypeAsWritten())
1592  return printAfter(T->getBaseType(), OS);
1593 }
1594 
1595 void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T,
1596  raw_ostream &OS) {
1597  printBefore(T->getPointeeType(), OS);
1598 
1599  // If we need to print the pointer, print it now.
1600  if (!T->isObjCIdType() && !T->isObjCQualifiedIdType() &&
1601  !T->isObjCClassType() && !T->isObjCQualifiedClassType()) {
1602  if (HasEmptyPlaceHolder)
1603  OS << ' ';
1604  OS << '*';
1605  }
1606 }
1607 
1608 void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T,
1609  raw_ostream &OS) {}
1610 
1611 static
1612 const TemplateArgument &getArgument(const TemplateArgument &A) { return A; }
1613 
1614 static const TemplateArgument &getArgument(const TemplateArgumentLoc &A) {
1615  return A.getArgument();
1616 }
1617 
1618 template<typename TA>
1619 static void printTo(raw_ostream &OS, ArrayRef<TA> Args,
1620  const PrintingPolicy &Policy, bool SkipBrackets) {
1621  const char *Comma = Policy.MSVCFormatting ? "," : ", ";
1622  if (!SkipBrackets)
1623  OS << '<';
1624 
1625  bool NeedSpace = false;
1626  bool FirstArg = true;
1627  for (const auto &Arg : Args) {
1628  // Print the argument into a string.
1629  SmallString<128> Buf;
1630  llvm::raw_svector_ostream ArgOS(Buf);
1631  const TemplateArgument &Argument = getArgument(Arg);
1632  if (Argument.getKind() == TemplateArgument::Pack) {
1633  if (Argument.pack_size() && !FirstArg)
1634  OS << Comma;
1635  printTo(ArgOS, Argument.getPackAsArray(), Policy, true);
1636  } else {
1637  if (!FirstArg)
1638  OS << Comma;
1639  Argument.print(Policy, ArgOS);
1640  }
1641  StringRef ArgString = ArgOS.str();
1642 
1643  // If this is the first argument and its string representation
1644  // begins with the global scope specifier ('::foo'), add a space
1645  // to avoid printing the diagraph '<:'.
1646  if (FirstArg && !ArgString.empty() && ArgString[0] == ':')
1647  OS << ' ';
1648 
1649  OS << ArgString;
1650 
1651  NeedSpace = (!ArgString.empty() && ArgString.back() == '>');
1652  FirstArg = false;
1653  }
1654 
1655  // If the last character of our string is '>', add another space to
1656  // keep the two '>''s separate tokens. We don't *have* to do this in
1657  // C++0x, but it's still good hygiene.
1658  if (NeedSpace)
1659  OS << ' ';
1660 
1661  if (!SkipBrackets)
1662  OS << '>';
1663 }
1664 
1665 void clang::printTemplateArgumentList(raw_ostream &OS,
1666  const TemplateArgumentListInfo &Args,
1667  const PrintingPolicy &Policy) {
1668  return printTo(OS, Args.arguments(), Policy, false);
1669 }
1670 
1671 void clang::printTemplateArgumentList(raw_ostream &OS,
1672  ArrayRef<TemplateArgument> Args,
1673  const PrintingPolicy &Policy) {
1674  printTo(OS, Args, Policy, false);
1675 }
1676 
1677 void clang::printTemplateArgumentList(raw_ostream &OS,
1678  ArrayRef<TemplateArgumentLoc> Args,
1679  const PrintingPolicy &Policy) {
1680  printTo(OS, Args, Policy, false);
1681 }
1682 
1683 std::string Qualifiers::getAsString() const {
1684  LangOptions LO;
1685  return getAsString(PrintingPolicy(LO));
1686 }
1687 
1688 // Appends qualifiers to the given string, separated by spaces. Will
1689 // prefix a space if the string is non-empty. Will not append a final
1690 // space.
1691 std::string Qualifiers::getAsString(const PrintingPolicy &Policy) const {
1692  SmallString<64> Buf;
1693  llvm::raw_svector_ostream StrOS(Buf);
1694  print(StrOS, Policy);
1695  return StrOS.str();
1696 }
1697 
1698 bool Qualifiers::isEmptyWhenPrinted(const PrintingPolicy &Policy) const {
1699  if (getCVRQualifiers())
1700  return false;
1701 
1702  if (getAddressSpace() != LangAS::Default)
1703  return false;
1704 
1705  if (getObjCGCAttr())
1706  return false;
1707 
1708  if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime())
1709  if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
1710  return false;
1711 
1712  return true;
1713 }
1714 
1715 // Appends qualifiers to the given string, separated by spaces. Will
1716 // prefix a space if the string is non-empty. Will not append a final
1717 // space.
1718 void Qualifiers::print(raw_ostream &OS, const PrintingPolicy& Policy,
1719  bool appendSpaceIfNonEmpty) const {
1720  bool addSpace = false;
1721 
1722  unsigned quals = getCVRQualifiers();
1723  if (quals) {
1724  AppendTypeQualList(OS, quals, Policy.Restrict);
1725  addSpace = true;
1726  }
1727  if (hasUnaligned()) {
1728  if (addSpace)
1729  OS << ' ';
1730  OS << "__unaligned";
1731  addSpace = true;
1732  }
1733  LangAS addrspace = getAddressSpace();
1734  if (addrspace != LangAS::Default) {
1735  if (addrspace != LangAS::opencl_private) {
1736  if (addSpace)
1737  OS << ' ';
1738  addSpace = true;
1739  switch (addrspace) {
1740  case LangAS::opencl_global:
1741  OS << "__global";
1742  break;
1743  case LangAS::opencl_local:
1744  OS << "__local";
1745  break;
1746  case LangAS::opencl_private:
1747  break;
1748  case LangAS::opencl_constant:
1749  case LangAS::cuda_constant:
1750  OS << "__constant";
1751  break;
1752  case LangAS::opencl_generic:
1753  OS << "__generic";
1754  break;
1755  case LangAS::cuda_device:
1756  OS << "__device";
1757  break;
1758  case LangAS::cuda_shared:
1759  OS << "__shared";
1760  break;
1761  default:
1762  OS << "__attribute__((address_space(";
1763  OS << toTargetAddressSpace(addrspace);
1764  OS << ")))";
1765  }
1766  }
1767  }
1768  if (Qualifiers::GC gc = getObjCGCAttr()) {
1769  if (addSpace)
1770  OS << ' ';
1771  addSpace = true;
1772  if (gc == Qualifiers::Weak)
1773  OS << "__weak";
1774  else
1775  OS << "__strong";
1776  }
1777  if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
1778  if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)){
1779  if (addSpace)
1780  OS << ' ';
1781  addSpace = true;
1782  }
1783 
1784  switch (lifetime) {
1785  case Qualifiers::OCL_None: llvm_unreachable("none but true");
1786  case Qualifiers::OCL_ExplicitNone: OS << "__unsafe_unretained"; break;
1787  case Qualifiers::OCL_Strong:
1788  if (!Policy.SuppressStrongLifetime)
1789  OS << "__strong";
1790  break;
1791 
1792  case Qualifiers::OCL_Weak: OS << "__weak"; break;
1793  case Qualifiers::OCL_Autoreleasing: OS << "__autoreleasing"; break;
1794  }
1795  }
1796 
1797  if (appendSpaceIfNonEmpty && addSpace)
1798  OS << ' ';
1799 }
1800 
1801 std::string QualType::getAsString() const {
1802  return getAsString(split(), LangOptions());
1803 }
1804 
1805 std::string QualType::getAsString(const PrintingPolicy &Policy) const {
1806  std::string S;
1807  getAsStringInternal(S, Policy);
1808  return S;
1809 }
1810 
1811 std::string QualType::getAsString(const Type *ty, Qualifiers qs,
1812  const PrintingPolicy &Policy) {
1813  std::string buffer;
1814  getAsStringInternal(ty, qs, buffer, Policy);
1815  return buffer;
1816 }
1817 
1818 void QualType::print(const Type *ty, Qualifiers qs,
1819  raw_ostream &OS, const PrintingPolicy &policy,
1820  const Twine &PlaceHolder, unsigned Indentation) {
1821  SmallString<128> PHBuf;
1822  StringRef PH = PlaceHolder.toStringRef(PHBuf);
1823 
1824  TypePrinter(policy, Indentation).print(ty, qs, OS, PH);
1825 }
1826 
1827 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1828  std::string &buffer,
1829  const PrintingPolicy &policy) {
1830  SmallString<256> Buf;
1831  llvm::raw_svector_ostream StrOS(Buf);
1832  TypePrinter(policy).print(ty, qs, StrOS, buffer);
1833  std::string str = StrOS.str();
1834  buffer.swap(str);
1835 }
static StringRef getKeywordName(ElaboratedTypeKeyword Keyword)
Definition: Type.cpp:2582
QualType getPattern() const
Retrieve the pattern of this pack expansion, which is the type that will be repeatedly instantiated w...
Definition: Type.h:5380
Defines the clang::ASTContext interface.
QualType getDeducedType() const
Get the type deduced for this placeholder type, or null if it&#39;s either not been deduced or was deduce...
Definition: Type.h:4739
Represents a type that was referred to using an elaborated type keyword, e.g., struct S...
Definition: Type.h:5133
const Type * Ty
The locally-unqualified type.
Definition: Type.h:579
static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals, bool HasRestrictKeyword)
const TemplateSpecializationType * getInjectedTST() const
Definition: Type.h:5016
StringRef getName(const PrintingPolicy &Policy) const
Definition: Type.cpp:2656
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
Definition: Type.h:4027
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:2541
QualType getElementType() const
Definition: Type.h:6020
QualType getPointeeType() const
Definition: Type.h:2554
Represents the dependent type named by a dependently-scoped typename using declaration, e.g.
Definition: Type.h:4125
A (possibly-)qualified type.
Definition: Type.h:638
bool getNoCfCheck() const
Definition: Type.h:3519
__auto_type (GNU extension)
Expr * getUnderlyingExpr() const
Definition: Type.h:4260
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:3359
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee...
Definition: Type.cpp:505
C Language Family Type Representation.
Defines the SourceManager interface.
Represents a qualified type name for which the type name is dependent.
Definition: Type.h:5216
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
Definition: Type.h:5235
const Type * getTypeForDecl() const
Definition: Decl.h:2907
bool isVariadic() const
Whether this function prototype is variadic.
Definition: Type.h:4006
Defines the C++ template declaration subclasses.
Represents a C++11 auto or C++14 decltype(auto) type.
Definition: Type.h:4753
The base class of the type hierarchy.
Definition: Type.h:1411
A container of type source information.
Definition: Decl.h:86
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Definition: Type.h:5987
void printExceptionSpecification(raw_ostream &OS, const PrintingPolicy &Policy) const
QualType getElementType() const
Definition: Type.h:2851
TemplateName getTemplateName() const
Retrieve the name of the template that we are deducing.
Definition: Type.h:4807
unsigned getNumParams() const
Definition: Type.h:3892
const T * getAs() const
Member-template getAs<specific type>&#39;.
Definition: Type.h:6734
Represents a C++17 deduced template specialization type.
Definition: Type.h:4789
bool isCallingConv() const
Definition: Type.cpp:3231
Describes how types, statements, expressions, and declarations should be printed. ...
Definition: PrettyPrinter.h:38
Represents the result of substituting a type for a template type parameter.
Definition: Type.h:4607
The collection of all-type qualifiers we support.
Definition: Type.h:141
bool isNoexceptExceptionSpec(ExceptionSpecificationType ESpecType)
PipeType - OpenCL20.
Definition: Type.h:6006
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition: Decl.h:269
One of these records is kept for each identifier that is lexed.
unsigned SuppressLifetimeQualifiers
When true, suppress printing of lifetime qualifier in ARC.
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool SuppressNNS=false) const
Print the template name.
unsigned getRegParm() const
Definition: Type.h:3522
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
QualType getPointeeType() const
Definition: Type.h:2658
is ARM Neon vector
Definition: Type.h:3188
bool isObjCIdType() const
Definition: Type.h:6426
TemplateName getTemplateName() const
Retrieve the name of the template that we are specializing.
Definition: Type.h:4908
Defines the ExceptionSpecificationType enumeration and various utility functions. ...
Represents the result of substituting a set of types for a template type parameter pack...
Definition: Type.h:4663
TagDecl * getOwnedTagDecl() const
Return the (re)declaration of this type owned by this occurrence of this type, or nullptr if there is...
Definition: Type.h:5183
bool isObjCQualifiedClassType() const
Definition: Type.h:6420
unsigned SuppressStrongLifetime
When true, suppress printing of the __strong lifetime qualifier in ARC.
bool getProducesResult() const
Definition: Type.h:3517
This parameter (which must have pointer type) uses the special Swift context-pointer ABI treatment...
An rvalue reference type, per C++11 [dcl.ref].
Definition: Type.h:2742
UnresolvedUsingTypenameDecl * getDecl() const
Definition: Type.h:4136
bool isMSTypeSpec() const
Definition: Type.cpp:3218
An lvalue ref-qualifier was provided (&).
Definition: Type.h:1367
Microsoft throw(...) extension.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
Represents a typeof (or typeof) expression (a GCC extension).
Definition: Type.h:4180
const Type * getClass() const
Definition: Type.h:2794
Expr * getSizeExpr() const
Definition: Type.h:2995
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition: Type.h:6076
bool getNoReturn() const
Definition: Type.h:3516
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false) const
Print this nested name specifier to the given output stream.
is ARM Neon polynomial vector
Definition: Type.h:3191
Qualifiers getTypeQuals() const
Definition: Type.h:4019
Expr * getSizeExpr() const
Definition: Type.h:3052
bool getNoCallerSavedRegs() const
Definition: Type.h:3518
QualType getPointeeTypeAsWritten() const
Definition: Type.h:2696
Expr * getSizeExpr() const
Definition: Type.h:3262
QualType getElementType() const
Definition: Type.h:3148
This parameter (which must have pointer-to-pointer type) uses the special Swift error-result ABI trea...
Represents an extended vector type where either the type or size is dependent.
Definition: Type.h:3132
unsigned IncludeTagDefinition
When true, include the body of a tag definition.
Represents a K&R-style &#39;int foo()&#39; function, which has no information available about its arguments...
Definition: Type.h:3654
Expr * getAddrSpaceExpr() const
Definition: Type.h:3103
Provides definitions for the various language-specific address spaces.
llvm::StringRef getParameterABISpelling(ParameterABI kind)
Represents a prototype with parameter type info, e.g.
Definition: Type.h:3691
qual_range quals() const
Definition: Type.h:5442
ObjCTypeParamDecl * getDecl() const
Definition: Type.h:5511
Represents an array type in C++ whose size is a value-dependent expression.
Definition: Type.h:3030
bool isValid() const
QualType getElementType() const
Definition: Type.h:2494
unsigned SuppressTagKeyword
Whether type printing should skip printing the tag keyword.
Definition: PrettyPrinter.h:93
IdentifierInfo * getIdentifier() const
Definition: Type.cpp:3259
Defines the clang::LangOptions interface.
StringRef getKindName() const
Definition: Decl.h:3248
int Id
Definition: ASTDiff.cpp:191
unsigned getIndex() const
Definition: Type.h:4570
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:6797
unsigned getLine() const
Return the presumed line number of this location.
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool appendSpaceIfNonEmpty=false) const
bool isObjCClassType() const
Definition: Type.h:6432
DeclContext * getDeclContext()
Definition: DeclBase.h:427
QualType getBaseType() const
Definition: Type.h:4319
const IdentifierInfo * getIdentifier() const
Retrieve the type named by the typename specifier as an identifier.
Definition: Type.h:5242
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Definition: DeclTemplate.h:264
Represents the type decltype(expr) (C++11).
Definition: Type.h:4250
void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy)
Print a template argument list, including the &#39;<&#39; and &#39;>&#39; enclosing the template arguments.
A std::pair-like structure for storing a qualified type split into its local qualifiers and its local...
Definition: Type.h:577
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
bool isFunctionOrMethod() const
Definition: DeclBase.h:1800
A unary type transform, which is a type constructed from another.
Definition: Type.h:4293
Qualifiers Quals
The local qualifiers.
Definition: Type.h:582
bool isSpecifierType() const
Returns true if this type can be represented by some set of type specifiers.
Definition: Type.cpp:2488
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:1752
Represents an unpacked "presumed" location which can be presented to the user.
Represents a GCC generic vector type.
Definition: Type.h:3172
ArraySizeModifier getSizeModifier() const
Definition: Type.h:2853
An lvalue reference type, per C++11 [dcl.ref].
Definition: Type.h:2724
unsigned SuppressSpecifiers
Whether we should suppress printing of the actual specifiers for the given type or declaration...
Definition: PrettyPrinter.h:83
UTTKind getUTTKind() const
Definition: Type.h:4321
bool isNull() const
Return true if this QualType doesn&#39;t point to a type yet.
Definition: Type.h:703
Expr * getUnderlyingExpr() const
Definition: Type.h:4189
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
Definition: Type.h:4017
bool hasQualifiers() const
Return true if the set contains any qualifiers.
Definition: Type.h:413
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
Definition: Type.h:6084
RecordDecl * getDecl() const
Definition: Type.h:4384
const char * getFilename() const
Return the presumed filename of this location.
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
is AltiVec &#39;vector Pixel&#39;
Definition: Type.h:3182
not a target-specific vector type
Definition: Type.h:3176
ExtParameterInfo getExtParameterInfo(unsigned I) const
Definition: Type.h:4082
ElaboratedTypeKeyword getKeyword() const
Definition: Type.h:5094
unsigned getColumn() const
Return the presumed column number of this location.
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
Definition: Type.h:5755
Sugar for parentheses used when specifying types.
Definition: Type.h:2511
QualType getAdjustedType() const
Definition: Type.h:2606
QualType getReturnType() const
Definition: Type.h:3617
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums...
Definition: Type.h:4400
Represents typeof(type), a GCC extension.
Definition: Type.h:4223
Interfaces are the core concept in Objective-C for object oriented design.
Definition: Type.h:5742
unsigned SuppressScope
Suppresses printing of scope specifiers.
ParameterABI getABI() const
Return the ABI treatment of this parameter.
Definition: Type.h:3398
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3073
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:376
CallingConv getCC() const
Definition: Type.h:3529
QualType getElementType() const
Definition: Type.h:3207
Represents a vector type where either the type or size is dependent.
Definition: Type.h:3249
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
No ref-qualifier was provided.
Definition: Type.h:1364
const TemplateTypeParmType * getReplacedParameter() const
Gets the template parameter that was substituted for.
Definition: Type.h:4681
QualType getEquivalentType() const
Definition: Type.h:4455
QualType getInnerType() const
Definition: Type.h:2524
is AltiVec &#39;vector bool ...&#39;
Definition: Type.h:3185
NestedNameSpecifier * getQualifier() const
Retrieve the qualification on this type.
Definition: Type.h:5170
is AltiVec vector
Definition: Type.h:3179
AutoTypeKeyword getKeyword() const
Definition: Type.h:4768
Qualifiers getIndexTypeQualifiers() const
Definition: Type.h:2857
TypeClass getTypeClass() const
Definition: Type.h:1815
ArrayRef< TemplateArgument > template_arguments() const
Definition: Type.h:5309
EnumDecl * getDecl() const
Definition: Type.h:4407
An rvalue ref-qualifier was provided (&&).
Definition: Type.h:1370
ParameterABI
Kinds of parameter ABI.
Definition: Specifiers.h:309
std::string getAsString() const
Represents a pointer type decayed from an array or function type.
Definition: Type.h:2626
The injected class name of a C++ class template or class template partial specialization.
Definition: Type.h:4982
QualType getPointeeType() const
Definition: Type.h:3104
Represents a pack expansion of types.
Definition: Type.h:5359
Defines various enumerations that describe declaration and type specifiers.
StringRef getName() const
Return the actual identifier string.
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:2925
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons...
Definition: Type.h:2589
Dataflow Directional Tag Classes.
ExtInfo getExtInfo() const
Definition: Type.h:3628
NestedNameSpecifier * getQualifier() const
Definition: Type.h:5294
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1262
VectorKind getVectorKind() const
Definition: Type.h:3217
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition: Type.h:2760
QualType getModifiedType() const
Definition: Type.h:4454
Pointer to a block type.
Definition: Type.h:2643
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:4374
Complex values, per C99 6.2.5p11.
Definition: Type.h:2481
unsigned getIndexTypeCVRQualifiers() const
Definition: Type.h:2861
bool empty() const
Definition: Type.h:414
const llvm::APInt & getSize() const
Definition: Type.h:2894
Kind getAttrKind() const
Definition: Type.h:4450
bool isFunctionType() const
Definition: Type.h:6296
bool isObjCQualifiedIdType() const
Definition: Type.h:6414
ExtVectorType - Extended vector type.
Definition: Type.h:3291
Base for LValueReferenceType and RValueReferenceType.
Definition: Type.h:2677
bool isEmptyWhenPrinted(const PrintingPolicy &Policy) const
QualType getUnderlyingType() const
Definition: Type.h:4238
SourceManager & getSourceManager()
Definition: ASTContext.h:661
A template argument list.
Definition: DeclTemplate.h:210
VectorType::VectorKind getVectorKind() const
Definition: Type.h:3265
TypedefNameDecl * getDecl() const
Definition: Type.h:4171
unsigned getDepth() const
Definition: Type.h:4569
An attributed type is a type to which a type attribute has been applied.
Definition: Type.h:4429
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
QualType getParamType(unsigned i) const
Definition: Type.h:3894
Represents a type parameter type in Objective C.
Definition: Type.h:5468
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\, const ASTContext *Context=nullptr) const
Defines the clang::SourceLocation class and associated facilities.
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition: Decl.h:3283
Represents a template specialization type whose template cannot be resolved, e.g. ...
Definition: Type.h:5268
ArrayRef< TemplateArgument > template_arguments() const
Definition: Type.h:4924
Represents a C array with an unspecified size.
Definition: Type.h:2930
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition: Type.h:6103
QualType getNamedType() const
Retrieve the type named by the qualified-id.
Definition: Type.h:5173
QualType getReplacementType() const
Gets the type that was substituted for the template parameter.
Definition: Type.h:4628
This class is used for builtin types like &#39;int&#39;.
Definition: Type.h:2395
static QualType skipTopLevelReferences(QualType T)
bool qual_empty() const
Definition: Type.h:5446
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Definition: Decl.h:275
unsigned getNumElements() const
Definition: Type.h:3208
bool isReadOnly() const
Definition: Type.h:6039
Represents an extended address space qualifier where the input address space value is dependent...
Definition: Type.h:3090
Represents a type template specialization; the template must be a class template, a type alias templa...
Definition: Type.h:4845
This represents a decl that may have a name.
Definition: Decl.h:248
bool isTranslationUnit() const
Definition: DeclBase.h:1823
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: Type.h:2975
No keyword precedes the qualified type name.
Definition: Type.h:5075
QualType getElementType() const
Definition: Type.h:3263
llvm::Optional< NullabilityKind > getImmediateNullability() const
Definition: Type.cpp:3823
Represents the canonical version of C arrays with a specified constant size.
Definition: Type.h:2876
A class which abstracts out some details necessary for making a call.
Definition: Type.h:3470
SourceLocation getLocation() const
Definition: DeclBase.h:418
QualType getPointeeType() const
Definition: Type.h:2780
This parameter (which must have pointer type) is a Swift indirect result parameter.
const IdentifierInfo * getIdentifier() const
Definition: Type.h:5295