1 //===--- TypePrinter.cpp - Pretty-Print Clang Types -----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This contains code to print types from Clang's type system.
12 //===----------------------------------------------------------------------===//
14 #include "clang/AST/ASTContext.h"
15 #include "clang/AST/Decl.h"
16 #include "clang/AST/DeclObjC.h"
17 #include "clang/AST/DeclTemplate.h"
18 #include "clang/AST/Expr.h"
19 #include "clang/AST/Type.h"
20 #include "clang/AST/PrettyPrinter.h"
21 #include "clang/Basic/LangOptions.h"
22 #include "clang/Basic/SourceManager.h"
23 #include "llvm/ADT/SmallString.h"
24 #include "llvm/ADT/StringExtras.h"
25 #include "llvm/Support/raw_ostream.h"
26 #include "llvm/Support/SaveAndRestore.h"
27 using namespace clang;
30 /// \brief RAII object that enables printing of the ARC __strong lifetime
32 class IncludeStrongLifetimeRAII {
33 PrintingPolicy &Policy;
37 explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy)
38 : Policy(Policy), Old(Policy.SuppressStrongLifetime) {
39 Policy.SuppressStrongLifetime = false;
42 ~IncludeStrongLifetimeRAII() {
43 Policy.SuppressStrongLifetime = Old;
47 class ParamPolicyRAII {
48 PrintingPolicy &Policy;
52 explicit ParamPolicyRAII(PrintingPolicy &Policy)
53 : Policy(Policy), Old(Policy.SuppressSpecifiers) {
54 Policy.SuppressSpecifiers = false;
58 Policy.SuppressSpecifiers = Old;
62 class ElaboratedTypePolicyRAII {
63 PrintingPolicy &Policy;
64 bool SuppressTagKeyword;
68 explicit ElaboratedTypePolicyRAII(PrintingPolicy &Policy) : Policy(Policy) {
69 SuppressTagKeyword = Policy.SuppressTagKeyword;
70 SuppressScope = Policy.SuppressScope;
71 Policy.SuppressTagKeyword = true;
72 Policy.SuppressScope = true;
75 ~ElaboratedTypePolicyRAII() {
76 Policy.SuppressTagKeyword = SuppressTagKeyword;
77 Policy.SuppressScope = SuppressScope;
82 PrintingPolicy Policy;
83 bool HasEmptyPlaceHolder;
86 explicit TypePrinter(const PrintingPolicy &Policy)
87 : Policy(Policy), HasEmptyPlaceHolder(false) { }
89 void print(const Type *ty, Qualifiers qs, raw_ostream &OS,
90 StringRef PlaceHolder);
91 void print(QualType T, raw_ostream &OS, StringRef PlaceHolder);
93 static bool canPrefixQualifiers(const Type *T, bool &NeedARCStrongQualifier);
94 void spaceBeforePlaceHolder(raw_ostream &OS);
95 void printTypeSpec(const NamedDecl *D, raw_ostream &OS);
97 void printBefore(const Type *ty, Qualifiers qs, raw_ostream &OS);
98 void printBefore(QualType T, raw_ostream &OS);
99 void printAfter(const Type *ty, Qualifiers qs, raw_ostream &OS);
100 void printAfter(QualType T, raw_ostream &OS);
101 void AppendScope(DeclContext *DC, raw_ostream &OS);
102 void printTag(TagDecl *T, raw_ostream &OS);
103 #define ABSTRACT_TYPE(CLASS, PARENT)
104 #define TYPE(CLASS, PARENT) \
105 void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \
106 void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS);
107 #include "clang/AST/TypeNodes.def"
111 static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals) {
112 bool appendSpace = false;
113 if (TypeQuals & Qualifiers::Const) {
117 if (TypeQuals & Qualifiers::Volatile) {
118 if (appendSpace) OS << ' ';
122 if (TypeQuals & Qualifiers::Restrict) {
123 if (appendSpace) OS << ' ';
128 void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) {
129 if (!HasEmptyPlaceHolder)
133 void TypePrinter::print(QualType t, raw_ostream &OS, StringRef PlaceHolder) {
134 SplitQualType split = t.split();
135 print(split.Ty, split.Quals, OS, PlaceHolder);
138 void TypePrinter::print(const Type *T, Qualifiers Quals, raw_ostream &OS,
139 StringRef PlaceHolder) {
145 SaveAndRestore<bool> PHVal(HasEmptyPlaceHolder, PlaceHolder.empty());
147 printBefore(T, Quals, OS);
149 printAfter(T, Quals, OS);
152 bool TypePrinter::canPrefixQualifiers(const Type *T,
153 bool &NeedARCStrongQualifier) {
154 // CanPrefixQualifiers - We prefer to print type qualifiers before the type,
155 // so that we get "const int" instead of "int const", but we can't do this if
156 // the type is complex. For example if the type is "int*", we *must* print
157 // "int * const", printing "const int *" is different. Only do this when the
158 // type expands to a simple string.
159 bool CanPrefixQualifiers = false;
160 NeedARCStrongQualifier = false;
161 Type::TypeClass TC = T->getTypeClass();
162 if (const AutoType *AT = dyn_cast<AutoType>(T))
163 TC = AT->desugar()->getTypeClass();
164 if (const SubstTemplateTypeParmType *Subst
165 = dyn_cast<SubstTemplateTypeParmType>(T))
166 TC = Subst->getReplacementType()->getTypeClass();
171 case Type::UnresolvedUsing:
173 case Type::TypeOfExpr:
176 case Type::UnaryTransform:
179 case Type::Elaborated:
180 case Type::TemplateTypeParm:
181 case Type::SubstTemplateTypeParmPack:
182 case Type::TemplateSpecialization:
183 case Type::InjectedClassName:
184 case Type::DependentName:
185 case Type::DependentTemplateSpecialization:
186 case Type::ObjCObject:
187 case Type::ObjCInterface:
189 CanPrefixQualifiers = true;
192 case Type::ObjCObjectPointer:
193 CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() ||
194 T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType();
197 case Type::ConstantArray:
198 case Type::IncompleteArray:
199 case Type::VariableArray:
200 case Type::DependentSizedArray:
201 NeedARCStrongQualifier = true;
205 case Type::BlockPointer:
206 case Type::LValueReference:
207 case Type::RValueReference:
208 case Type::MemberPointer:
209 case Type::DependentSizedExtVector:
211 case Type::ExtVector:
212 case Type::FunctionProto:
213 case Type::FunctionNoProto:
215 case Type::Attributed:
216 case Type::PackExpansion:
217 case Type::SubstTemplateTypeParm:
219 CanPrefixQualifiers = false;
223 return CanPrefixQualifiers;
226 void TypePrinter::printBefore(QualType T, raw_ostream &OS) {
227 SplitQualType Split = T.split();
229 // If we have cv1 T, where T is substituted for cv2 U, only print cv1 - cv2
231 Qualifiers Quals = Split.Quals;
232 if (const SubstTemplateTypeParmType *Subst =
233 dyn_cast<SubstTemplateTypeParmType>(Split.Ty))
234 Quals -= QualType(Subst, 0).getQualifiers();
236 printBefore(Split.Ty, Quals, OS);
239 /// \brief Prints the part of the type string before an identifier, e.g. for
240 /// "int foo[10]" it prints "int ".
241 void TypePrinter::printBefore(const Type *T,Qualifiers Quals, raw_ostream &OS) {
242 if (Policy.SuppressSpecifiers && T->isSpecifierType())
245 SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder);
247 // Print qualifiers as appropriate.
249 bool CanPrefixQualifiers = false;
250 bool NeedARCStrongQualifier = false;
251 CanPrefixQualifiers = canPrefixQualifiers(T, NeedARCStrongQualifier);
253 if (CanPrefixQualifiers && !Quals.empty()) {
254 if (NeedARCStrongQualifier) {
255 IncludeStrongLifetimeRAII Strong(Policy);
256 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
258 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true);
262 bool hasAfterQuals = false;
263 if (!CanPrefixQualifiers && !Quals.empty()) {
264 hasAfterQuals = !Quals.isEmptyWhenPrinted(Policy);
266 HasEmptyPlaceHolder = false;
269 switch (T->getTypeClass()) {
270 #define ABSTRACT_TYPE(CLASS, PARENT)
271 #define TYPE(CLASS, PARENT) case Type::CLASS: \
272 print##CLASS##Before(cast<CLASS##Type>(T), OS); \
274 #include "clang/AST/TypeNodes.def"
278 if (NeedARCStrongQualifier) {
279 IncludeStrongLifetimeRAII Strong(Policy);
280 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
282 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get());
287 void TypePrinter::printAfter(QualType t, raw_ostream &OS) {
288 SplitQualType split = t.split();
289 printAfter(split.Ty, split.Quals, OS);
292 /// \brief Prints the part of the type string after an identifier, e.g. for
293 /// "int foo[10]" it prints "[10]".
294 void TypePrinter::printAfter(const Type *T, Qualifiers Quals, raw_ostream &OS) {
295 switch (T->getTypeClass()) {
296 #define ABSTRACT_TYPE(CLASS, PARENT)
297 #define TYPE(CLASS, PARENT) case Type::CLASS: \
298 print##CLASS##After(cast<CLASS##Type>(T), OS); \
300 #include "clang/AST/TypeNodes.def"
304 void TypePrinter::printBuiltinBefore(const BuiltinType *T, raw_ostream &OS) {
305 OS << T->getName(Policy);
306 spaceBeforePlaceHolder(OS);
308 void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) { }
310 void TypePrinter::printComplexBefore(const ComplexType *T, raw_ostream &OS) {
312 printBefore(T->getElementType(), OS);
314 void TypePrinter::printComplexAfter(const ComplexType *T, raw_ostream &OS) {
315 printAfter(T->getElementType(), OS);
318 void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) {
319 IncludeStrongLifetimeRAII Strong(Policy);
320 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
321 printBefore(T->getPointeeType(), OS);
322 // Handle things like 'int (*A)[4];' correctly.
323 // FIXME: this should include vectors, but vectors use attributes I guess.
324 if (isa<ArrayType>(T->getPointeeType()))
328 void TypePrinter::printPointerAfter(const PointerType *T, raw_ostream &OS) {
329 IncludeStrongLifetimeRAII Strong(Policy);
330 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
331 // Handle things like 'int (*A)[4];' correctly.
332 // FIXME: this should include vectors, but vectors use attributes I guess.
333 if (isa<ArrayType>(T->getPointeeType()))
335 printAfter(T->getPointeeType(), OS);
338 void TypePrinter::printBlockPointerBefore(const BlockPointerType *T,
340 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
341 printBefore(T->getPointeeType(), OS);
344 void TypePrinter::printBlockPointerAfter(const BlockPointerType *T,
346 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
347 printAfter(T->getPointeeType(), OS);
350 void TypePrinter::printLValueReferenceBefore(const LValueReferenceType *T,
352 IncludeStrongLifetimeRAII Strong(Policy);
353 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
354 printBefore(T->getPointeeTypeAsWritten(), OS);
355 // Handle things like 'int (&A)[4];' correctly.
356 // FIXME: this should include vectors, but vectors use attributes I guess.
357 if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
361 void TypePrinter::printLValueReferenceAfter(const LValueReferenceType *T,
363 IncludeStrongLifetimeRAII Strong(Policy);
364 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
365 // Handle things like 'int (&A)[4];' correctly.
366 // FIXME: this should include vectors, but vectors use attributes I guess.
367 if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
369 printAfter(T->getPointeeTypeAsWritten(), OS);
372 void TypePrinter::printRValueReferenceBefore(const RValueReferenceType *T,
374 IncludeStrongLifetimeRAII Strong(Policy);
375 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
376 printBefore(T->getPointeeTypeAsWritten(), OS);
377 // Handle things like 'int (&&A)[4];' correctly.
378 // FIXME: this should include vectors, but vectors use attributes I guess.
379 if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
383 void TypePrinter::printRValueReferenceAfter(const RValueReferenceType *T,
385 IncludeStrongLifetimeRAII Strong(Policy);
386 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
387 // Handle things like 'int (&&A)[4];' correctly.
388 // FIXME: this should include vectors, but vectors use attributes I guess.
389 if (isa<ArrayType>(T->getPointeeTypeAsWritten()))
391 printAfter(T->getPointeeTypeAsWritten(), OS);
394 void TypePrinter::printMemberPointerBefore(const MemberPointerType *T,
396 IncludeStrongLifetimeRAII Strong(Policy);
397 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
398 printBefore(T->getPointeeType(), OS);
399 // Handle things like 'int (Cls::*A)[4];' correctly.
400 // FIXME: this should include vectors, but vectors use attributes I guess.
401 if (isa<ArrayType>(T->getPointeeType()))
404 PrintingPolicy InnerPolicy(Policy);
405 InnerPolicy.SuppressTag = false;
406 TypePrinter(InnerPolicy).print(QualType(T->getClass(), 0), OS, StringRef());
410 void TypePrinter::printMemberPointerAfter(const MemberPointerType *T,
412 IncludeStrongLifetimeRAII Strong(Policy);
413 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
414 // Handle things like 'int (Cls::*A)[4];' correctly.
415 // FIXME: this should include vectors, but vectors use attributes I guess.
416 if (isa<ArrayType>(T->getPointeeType()))
418 printAfter(T->getPointeeType(), OS);
421 void TypePrinter::printConstantArrayBefore(const ConstantArrayType *T,
423 IncludeStrongLifetimeRAII Strong(Policy);
424 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
425 printBefore(T->getElementType(), OS);
427 void TypePrinter::printConstantArrayAfter(const ConstantArrayType *T,
429 OS << '[' << T->getSize().getZExtValue() << ']';
430 printAfter(T->getElementType(), OS);
433 void TypePrinter::printIncompleteArrayBefore(const IncompleteArrayType *T,
435 IncludeStrongLifetimeRAII Strong(Policy);
436 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
437 printBefore(T->getElementType(), OS);
439 void TypePrinter::printIncompleteArrayAfter(const IncompleteArrayType *T,
442 printAfter(T->getElementType(), OS);
445 void TypePrinter::printVariableArrayBefore(const VariableArrayType *T,
447 IncludeStrongLifetimeRAII Strong(Policy);
448 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
449 printBefore(T->getElementType(), OS);
451 void TypePrinter::printVariableArrayAfter(const VariableArrayType *T,
454 if (T->getIndexTypeQualifiers().hasQualifiers()) {
455 AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers());
459 if (T->getSizeModifier() == VariableArrayType::Static)
461 else if (T->getSizeModifier() == VariableArrayType::Star)
464 if (T->getSizeExpr())
465 T->getSizeExpr()->printPretty(OS, 0, Policy);
468 printAfter(T->getElementType(), OS);
471 void TypePrinter::printDependentSizedArrayBefore(
472 const DependentSizedArrayType *T,
474 IncludeStrongLifetimeRAII Strong(Policy);
475 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
476 printBefore(T->getElementType(), OS);
478 void TypePrinter::printDependentSizedArrayAfter(
479 const DependentSizedArrayType *T,
482 if (T->getSizeExpr())
483 T->getSizeExpr()->printPretty(OS, 0, Policy);
485 printAfter(T->getElementType(), OS);
488 void TypePrinter::printDependentSizedExtVectorBefore(
489 const DependentSizedExtVectorType *T,
491 printBefore(T->getElementType(), OS);
493 void TypePrinter::printDependentSizedExtVectorAfter(
494 const DependentSizedExtVectorType *T,
496 OS << " __attribute__((ext_vector_type(";
497 if (T->getSizeExpr())
498 T->getSizeExpr()->printPretty(OS, 0, Policy);
500 printAfter(T->getElementType(), OS);
503 void TypePrinter::printVectorBefore(const VectorType *T, raw_ostream &OS) {
504 switch (T->getVectorKind()) {
505 case VectorType::AltiVecPixel:
506 OS << "__vector __pixel ";
508 case VectorType::AltiVecBool:
509 OS << "__vector __bool ";
510 printBefore(T->getElementType(), OS);
512 case VectorType::AltiVecVector:
514 printBefore(T->getElementType(), OS);
516 case VectorType::NeonVector:
517 OS << "__attribute__((neon_vector_type("
518 << T->getNumElements() << "))) ";
519 printBefore(T->getElementType(), OS);
521 case VectorType::NeonPolyVector:
522 OS << "__attribute__((neon_polyvector_type(" <<
523 T->getNumElements() << "))) ";
524 printBefore(T->getElementType(), OS);
526 case VectorType::GenericVector: {
527 // FIXME: We prefer to print the size directly here, but have no way
528 // to get the size of the type.
529 OS << "__attribute__((__vector_size__("
530 << T->getNumElements()
532 print(T->getElementType(), OS, StringRef());
534 printBefore(T->getElementType(), OS);
539 void TypePrinter::printVectorAfter(const VectorType *T, raw_ostream &OS) {
540 printAfter(T->getElementType(), OS);
543 void TypePrinter::printExtVectorBefore(const ExtVectorType *T,
545 printBefore(T->getElementType(), OS);
547 void TypePrinter::printExtVectorAfter(const ExtVectorType *T, raw_ostream &OS) {
548 printAfter(T->getElementType(), OS);
549 OS << " __attribute__((ext_vector_type(";
550 OS << T->getNumElements();
555 FunctionProtoType::printExceptionSpecification(raw_ostream &OS,
556 const PrintingPolicy &Policy)
559 if (hasDynamicExceptionSpec()) {
561 if (getExceptionSpecType() == EST_MSAny)
564 for (unsigned I = 0, N = getNumExceptions(); I != N; ++I) {
568 OS << getExceptionType(I).stream(Policy);
571 } else if (isNoexceptExceptionSpec(getExceptionSpecType())) {
573 if (getExceptionSpecType() == EST_ComputedNoexcept) {
575 getNoexceptExpr()->printPretty(OS, 0, Policy);
581 void TypePrinter::printFunctionProtoBefore(const FunctionProtoType *T,
583 if (T->hasTrailingReturn()) {
585 if (!HasEmptyPlaceHolder)
588 // If needed for precedence reasons, wrap the inner part in grouping parens.
589 SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
590 printBefore(T->getResultType(), OS);
591 if (!PrevPHIsEmpty.get())
596 void TypePrinter::printFunctionProtoAfter(const FunctionProtoType *T,
598 // If needed for precedence reasons, wrap the inner part in grouping parens.
599 if (!HasEmptyPlaceHolder)
601 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
605 ParamPolicyRAII ParamPolicy(Policy);
606 for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i) {
608 print(T->getArgType(i), OS, StringRef());
612 if (T->isVariadic()) {
616 } else if (T->getNumArgs() == 0 && !Policy.LangOpts.CPlusPlus) {
617 // Do not emit int() if we have a proto, emit 'int(void)'.
623 FunctionType::ExtInfo Info = T->getExtInfo();
624 switch(Info.getCC()) {
625 case CC_Default: break;
627 OS << " __attribute__((cdecl))";
630 OS << " __attribute__((stdcall))";
633 OS << " __attribute__((fastcall))";
636 OS << " __attribute__((thiscall))";
639 OS << " __attribute__((pascal))";
642 OS << " __attribute__((pcs(\"aapcs\")))";
645 OS << " __attribute__((pcs(\"aapcs-vfp\")))";
648 OS << " __attribute__((pnaclcall))";
651 if (Info.getNoReturn())
652 OS << " __attribute__((noreturn))";
653 if (Info.getRegParm())
654 OS << " __attribute__((regparm ("
655 << Info.getRegParm() << ")))";
657 if (unsigned quals = T->getTypeQuals()) {
659 AppendTypeQualList(OS, quals);
662 switch (T->getRefQualifier()) {
674 T->printExceptionSpecification(OS, Policy);
676 if (T->hasTrailingReturn()) {
678 print(T->getResultType(), OS, StringRef());
680 printAfter(T->getResultType(), OS);
683 void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T,
685 // If needed for precedence reasons, wrap the inner part in grouping parens.
686 SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false);
687 printBefore(T->getResultType(), OS);
688 if (!PrevPHIsEmpty.get())
691 void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T,
693 // If needed for precedence reasons, wrap the inner part in grouping parens.
694 if (!HasEmptyPlaceHolder)
696 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false);
699 if (T->getNoReturnAttr())
700 OS << " __attribute__((noreturn))";
701 printAfter(T->getResultType(), OS);
704 void TypePrinter::printTypeSpec(const NamedDecl *D, raw_ostream &OS) {
705 IdentifierInfo *II = D->getIdentifier();
707 spaceBeforePlaceHolder(OS);
710 void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T,
712 printTypeSpec(T->getDecl(), OS);
714 void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T,
717 void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) {
718 printTypeSpec(T->getDecl(), OS);
720 void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) { }
722 void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T,
725 T->getUnderlyingExpr()->printPretty(OS, 0, Policy);
726 spaceBeforePlaceHolder(OS);
728 void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T,
731 void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) {
733 print(T->getUnderlyingType(), OS, StringRef());
735 spaceBeforePlaceHolder(OS);
737 void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) { }
739 void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) {
741 T->getUnderlyingExpr()->printPretty(OS, 0, Policy);
743 spaceBeforePlaceHolder(OS);
745 void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) { }
747 void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T,
749 IncludeStrongLifetimeRAII Strong(Policy);
751 switch (T->getUTTKind()) {
752 case UnaryTransformType::EnumUnderlyingType:
753 OS << "__underlying_type(";
754 print(T->getBaseType(), OS, StringRef());
756 spaceBeforePlaceHolder(OS);
760 printBefore(T->getBaseType(), OS);
762 void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T,
764 IncludeStrongLifetimeRAII Strong(Policy);
766 switch (T->getUTTKind()) {
767 case UnaryTransformType::EnumUnderlyingType:
771 printAfter(T->getBaseType(), OS);
774 void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) {
775 // If the type has been deduced, do not print 'auto'.
776 if (T->isDeduced()) {
777 printBefore(T->getDeducedType(), OS);
780 spaceBeforePlaceHolder(OS);
783 void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) {
784 // If the type has been deduced, do not print 'auto'.
786 printAfter(T->getDeducedType(), OS);
789 void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) {
790 IncludeStrongLifetimeRAII Strong(Policy);
793 print(T->getValueType(), OS, StringRef());
795 spaceBeforePlaceHolder(OS);
797 void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) { }
799 /// Appends the given scope to the end of a string.
800 void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS) {
801 if (DC->isTranslationUnit()) return;
802 if (DC->isFunctionOrMethod()) return;
803 AppendScope(DC->getParent(), OS);
805 if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) {
806 if (Policy.SuppressUnwrittenScope &&
807 (NS->isAnonymousNamespace() || NS->isInline()))
809 if (NS->getIdentifier())
810 OS << NS->getName() << "::";
812 OS << "<anonymous>::";
813 } else if (ClassTemplateSpecializationDecl *Spec
814 = dyn_cast<ClassTemplateSpecializationDecl>(DC)) {
815 IncludeStrongLifetimeRAII Strong(Policy);
816 OS << Spec->getIdentifier()->getName();
817 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
818 TemplateSpecializationType::PrintTemplateArgumentList(OS,
823 } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) {
824 if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl())
825 OS << Typedef->getIdentifier()->getName() << "::";
826 else if (Tag->getIdentifier())
827 OS << Tag->getIdentifier()->getName() << "::";
833 void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) {
834 if (Policy.SuppressTag)
837 bool HasKindDecoration = false;
839 // bool SuppressTagKeyword
840 // = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword;
842 // We don't print tags unless this is an elaborated type.
843 // In C, we just assume every RecordType is an elaborated type.
844 if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword ||
845 D->getTypedefNameForAnonDecl())) {
846 HasKindDecoration = true;
847 OS << D->getKindName();
851 // Compute the full nested-name-specifier for this type.
852 // In C, this will always be empty except when the type
853 // being printed is anonymous within other Record.
854 if (!Policy.SuppressScope)
855 AppendScope(D->getDeclContext(), OS);
857 if (const IdentifierInfo *II = D->getIdentifier())
859 else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) {
860 assert(Typedef->getIdentifier() && "Typedef without identifier?");
861 OS << Typedef->getIdentifier()->getName();
863 // Make an unambiguous representation for anonymous types, e.g.
864 // <anonymous enum at /usr/include/string.h:120:9>
866 if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) {
868 HasKindDecoration = true;
873 if (Policy.AnonymousTagLocations) {
874 // Suppress the redundant tag keyword if we just printed one.
875 // We don't have to worry about ElaboratedTypes here because you can't
876 // refer to an anonymous type with one.
877 if (!HasKindDecoration)
878 OS << " " << D->getKindName();
880 PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc(
882 if (PLoc.isValid()) {
883 OS << " at " << PLoc.getFilename()
884 << ':' << PLoc.getLine()
885 << ':' << PLoc.getColumn();
892 // If this is a class template specialization, print the template
894 if (ClassTemplateSpecializationDecl *Spec
895 = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
896 const TemplateArgument *Args;
898 if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) {
899 const TemplateSpecializationType *TST =
900 cast<TemplateSpecializationType>(TAW->getType());
901 Args = TST->getArgs();
902 NumArgs = TST->getNumArgs();
904 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs();
905 Args = TemplateArgs.data();
906 NumArgs = TemplateArgs.size();
908 IncludeStrongLifetimeRAII Strong(Policy);
909 TemplateSpecializationType::PrintTemplateArgumentList(OS,
914 spaceBeforePlaceHolder(OS);
917 void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) {
918 printTag(T->getDecl(), OS);
920 void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) { }
922 void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) {
923 printTag(T->getDecl(), OS);
925 void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) { }
927 void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T,
929 if (IdentifierInfo *Id = T->getIdentifier())
932 OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex();
933 spaceBeforePlaceHolder(OS);
935 void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T,
938 void TypePrinter::printSubstTemplateTypeParmBefore(
939 const SubstTemplateTypeParmType *T,
941 IncludeStrongLifetimeRAII Strong(Policy);
942 printBefore(T->getReplacementType(), OS);
944 void TypePrinter::printSubstTemplateTypeParmAfter(
945 const SubstTemplateTypeParmType *T,
947 IncludeStrongLifetimeRAII Strong(Policy);
948 printAfter(T->getReplacementType(), OS);
951 void TypePrinter::printSubstTemplateTypeParmPackBefore(
952 const SubstTemplateTypeParmPackType *T,
954 IncludeStrongLifetimeRAII Strong(Policy);
955 printTemplateTypeParmBefore(T->getReplacedParameter(), OS);
957 void TypePrinter::printSubstTemplateTypeParmPackAfter(
958 const SubstTemplateTypeParmPackType *T,
960 IncludeStrongLifetimeRAII Strong(Policy);
961 printTemplateTypeParmAfter(T->getReplacedParameter(), OS);
964 void TypePrinter::printTemplateSpecializationBefore(
965 const TemplateSpecializationType *T,
967 IncludeStrongLifetimeRAII Strong(Policy);
968 T->getTemplateName().print(OS, Policy);
970 TemplateSpecializationType::PrintTemplateArgumentList(OS,
974 spaceBeforePlaceHolder(OS);
976 void TypePrinter::printTemplateSpecializationAfter(
977 const TemplateSpecializationType *T,
980 void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T,
982 printTemplateSpecializationBefore(T->getInjectedTST(), OS);
984 void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T,
987 void TypePrinter::printElaboratedBefore(const ElaboratedType *T,
989 OS << TypeWithKeyword::getKeywordName(T->getKeyword());
990 if (T->getKeyword() != ETK_None)
992 NestedNameSpecifier* Qualifier = T->getQualifier();
994 Qualifier->print(OS, Policy);
996 ElaboratedTypePolicyRAII PolicyRAII(Policy);
997 printBefore(T->getNamedType(), OS);
999 void TypePrinter::printElaboratedAfter(const ElaboratedType *T,
1001 ElaboratedTypePolicyRAII PolicyRAII(Policy);
1002 printAfter(T->getNamedType(), OS);
1005 void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) {
1006 if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1007 printBefore(T->getInnerType(), OS);
1010 printBefore(T->getInnerType(), OS);
1012 void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) {
1013 if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) {
1015 printAfter(T->getInnerType(), OS);
1017 printAfter(T->getInnerType(), OS);
1020 void TypePrinter::printDependentNameBefore(const DependentNameType *T,
1022 OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1023 if (T->getKeyword() != ETK_None)
1026 T->getQualifier()->print(OS, Policy);
1028 OS << T->getIdentifier()->getName();
1029 spaceBeforePlaceHolder(OS);
1031 void TypePrinter::printDependentNameAfter(const DependentNameType *T,
1032 raw_ostream &OS) { }
1034 void TypePrinter::printDependentTemplateSpecializationBefore(
1035 const DependentTemplateSpecializationType *T, raw_ostream &OS) {
1036 IncludeStrongLifetimeRAII Strong(Policy);
1038 OS << TypeWithKeyword::getKeywordName(T->getKeyword());
1039 if (T->getKeyword() != ETK_None)
1042 if (T->getQualifier())
1043 T->getQualifier()->print(OS, Policy);
1044 OS << T->getIdentifier()->getName();
1045 TemplateSpecializationType::PrintTemplateArgumentList(OS,
1049 spaceBeforePlaceHolder(OS);
1051 void TypePrinter::printDependentTemplateSpecializationAfter(
1052 const DependentTemplateSpecializationType *T, raw_ostream &OS) { }
1054 void TypePrinter::printPackExpansionBefore(const PackExpansionType *T,
1056 printBefore(T->getPattern(), OS);
1058 void TypePrinter::printPackExpansionAfter(const PackExpansionType *T,
1060 printAfter(T->getPattern(), OS);
1064 void TypePrinter::printAttributedBefore(const AttributedType *T,
1066 // Prefer the macro forms of the GC and ownership qualifiers.
1067 if (T->getAttrKind() == AttributedType::attr_objc_gc ||
1068 T->getAttrKind() == AttributedType::attr_objc_ownership)
1069 return printBefore(T->getEquivalentType(), OS);
1071 printBefore(T->getModifiedType(), OS);
1074 void TypePrinter::printAttributedAfter(const AttributedType *T,
1076 // Prefer the macro forms of the GC and ownership qualifiers.
1077 if (T->getAttrKind() == AttributedType::attr_objc_gc ||
1078 T->getAttrKind() == AttributedType::attr_objc_ownership)
1079 return printAfter(T->getEquivalentType(), OS);
1081 // TODO: not all attributes are GCC-style attributes.
1082 OS << " __attribute__((";
1083 switch (T->getAttrKind()) {
1084 case AttributedType::attr_address_space:
1085 OS << "address_space(";
1086 OS << T->getEquivalentType().getAddressSpace();
1090 case AttributedType::attr_vector_size: {
1091 OS << "__vector_size__(";
1092 if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) {
1093 OS << vector->getNumElements();
1095 print(vector->getElementType(), OS, StringRef());
1102 case AttributedType::attr_neon_vector_type:
1103 case AttributedType::attr_neon_polyvector_type: {
1104 if (T->getAttrKind() == AttributedType::attr_neon_vector_type)
1105 OS << "neon_vector_type(";
1107 OS << "neon_polyvector_type(";
1108 const VectorType *vector = T->getEquivalentType()->getAs<VectorType>();
1109 OS << vector->getNumElements();
1114 case AttributedType::attr_regparm: {
1116 QualType t = T->getEquivalentType();
1117 while (!t->isFunctionType())
1118 t = t->getPointeeType();
1119 OS << t->getAs<FunctionType>()->getRegParmType();
1124 case AttributedType::attr_objc_gc: {
1127 QualType tmp = T->getEquivalentType();
1128 while (tmp.getObjCGCAttr() == Qualifiers::GCNone) {
1129 QualType next = tmp->getPointeeType();
1130 if (next == tmp) break;
1134 if (tmp.isObjCGCWeak())
1142 case AttributedType::attr_objc_ownership:
1143 OS << "objc_ownership(";
1144 switch (T->getEquivalentType().getObjCLifetime()) {
1145 case Qualifiers::OCL_None: llvm_unreachable("no ownership!");
1146 case Qualifiers::OCL_ExplicitNone: OS << "none"; break;
1147 case Qualifiers::OCL_Strong: OS << "strong"; break;
1148 case Qualifiers::OCL_Weak: OS << "weak"; break;
1149 case Qualifiers::OCL_Autoreleasing: OS << "autoreleasing"; break;
1154 case AttributedType::attr_noreturn: OS << "noreturn"; break;
1155 case AttributedType::attr_cdecl: OS << "cdecl"; break;
1156 case AttributedType::attr_fastcall: OS << "fastcall"; break;
1157 case AttributedType::attr_stdcall: OS << "stdcall"; break;
1158 case AttributedType::attr_thiscall: OS << "thiscall"; break;
1159 case AttributedType::attr_pascal: OS << "pascal"; break;
1160 case AttributedType::attr_pcs: {
1162 QualType t = T->getEquivalentType();
1163 while (!t->isFunctionType())
1164 t = t->getPointeeType();
1165 OS << (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ?
1166 "\"aapcs\"" : "\"aapcs-vfp\"");
1170 case AttributedType::attr_pnaclcall: OS << "pnaclcall"; break;
1175 void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T,
1177 OS << T->getDecl()->getName();
1178 spaceBeforePlaceHolder(OS);
1180 void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T,
1181 raw_ostream &OS) { }
1183 void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T,
1185 if (T->qual_empty())
1186 return printBefore(T->getBaseType(), OS);
1188 print(T->getBaseType(), OS, StringRef());
1190 bool isFirst = true;
1191 for (ObjCObjectType::qual_iterator
1192 I = T->qual_begin(), E = T->qual_end(); I != E; ++I) {
1197 OS << (*I)->getName();
1200 spaceBeforePlaceHolder(OS);
1202 void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T,
1204 if (T->qual_empty())
1205 return printAfter(T->getBaseType(), OS);
1208 void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T,
1210 T->getPointeeType().getLocalQualifiers().print(OS, Policy,
1211 /*appendSpaceIfNonEmpty=*/true);
1213 if (T->isObjCIdType() || T->isObjCQualifiedIdType())
1215 else if (T->isObjCClassType() || T->isObjCQualifiedClassType())
1217 else if (T->isObjCSelType())
1220 OS << T->getInterfaceDecl()->getName();
1222 if (!T->qual_empty()) {
1224 for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(),
1227 OS << (*I)->getName();
1234 if (!T->isObjCIdType() && !T->isObjCQualifiedIdType()) {
1235 OS << " *"; // Don't forget the implicit pointer.
1237 spaceBeforePlaceHolder(OS);
1240 void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T,
1241 raw_ostream &OS) { }
1243 void TemplateSpecializationType::
1244 PrintTemplateArgumentList(raw_ostream &OS,
1245 const TemplateArgumentListInfo &Args,
1246 const PrintingPolicy &Policy) {
1247 return PrintTemplateArgumentList(OS,
1248 Args.getArgumentArray(),
1254 TemplateSpecializationType::PrintTemplateArgumentList(
1256 const TemplateArgument *Args,
1258 const PrintingPolicy &Policy,
1259 bool SkipBrackets) {
1263 bool needSpace = false;
1264 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1268 // Print the argument into a string.
1269 SmallString<128> Buf;
1270 llvm::raw_svector_ostream ArgOS(Buf);
1271 if (Args[Arg].getKind() == TemplateArgument::Pack) {
1272 PrintTemplateArgumentList(ArgOS,
1273 Args[Arg].pack_begin(),
1274 Args[Arg].pack_size(),
1277 Args[Arg].print(Policy, ArgOS);
1279 StringRef ArgString = ArgOS.str();
1281 // If this is the first argument and its string representation
1282 // begins with the global scope specifier ('::foo'), add a space
1283 // to avoid printing the diagraph '<:'.
1284 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1289 needSpace = (!ArgString.empty() && ArgString.back() == '>');
1292 // If the last character of our string is '>', add another space to
1293 // keep the two '>''s separate tokens. We don't *have* to do this in
1294 // C++0x, but it's still good hygiene.
1302 // Sadly, repeat all that with TemplateArgLoc.
1303 void TemplateSpecializationType::
1304 PrintTemplateArgumentList(raw_ostream &OS,
1305 const TemplateArgumentLoc *Args, unsigned NumArgs,
1306 const PrintingPolicy &Policy) {
1309 bool needSpace = false;
1310 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1314 // Print the argument into a string.
1315 SmallString<128> Buf;
1316 llvm::raw_svector_ostream ArgOS(Buf);
1317 if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1318 PrintTemplateArgumentList(ArgOS,
1319 Args[Arg].getArgument().pack_begin(),
1320 Args[Arg].getArgument().pack_size(),
1323 Args[Arg].getArgument().print(Policy, ArgOS);
1325 StringRef ArgString = ArgOS.str();
1327 // If this is the first argument and its string representation
1328 // begins with the global scope specifier ('::foo'), add a space
1329 // to avoid printing the diagraph '<:'.
1330 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1335 needSpace = (!ArgString.empty() && ArgString.back() == '>');
1338 // If the last character of our string is '>', add another space to
1339 // keep the two '>''s separate tokens. We don't *have* to do this in
1340 // C++0x, but it's still good hygiene.
1348 FunctionProtoType::printExceptionSpecification(std::string &S,
1349 const PrintingPolicy &Policy)
1352 if (hasDynamicExceptionSpec()) {
1354 if (getExceptionSpecType() == EST_MSAny)
1357 for (unsigned I = 0, N = getNumExceptions(); I != N; ++I) {
1361 S += getExceptionType(I).getAsString(Policy);
1364 } else if (isNoexceptExceptionSpec(getExceptionSpecType())) {
1366 if (getExceptionSpecType() == EST_ComputedNoexcept) {
1368 llvm::raw_string_ostream EOut(S);
1369 getNoexceptExpr()->printPretty(EOut, 0, Policy);
1377 std::string TemplateSpecializationType::
1378 PrintTemplateArgumentList(const TemplateArgumentListInfo &Args,
1379 const PrintingPolicy &Policy) {
1380 return PrintTemplateArgumentList(Args.getArgumentArray(),
1386 TemplateSpecializationType::PrintTemplateArgumentList(
1387 const TemplateArgument *Args,
1389 const PrintingPolicy &Policy,
1390 bool SkipBrackets) {
1391 std::string SpecString;
1395 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1396 if (SpecString.size() > unsigned(!SkipBrackets))
1399 // Print the argument into a string.
1400 std::string ArgString;
1401 if (Args[Arg].getKind() == TemplateArgument::Pack) {
1402 ArgString = PrintTemplateArgumentList(Args[Arg].pack_begin(),
1403 Args[Arg].pack_size(),
1406 llvm::raw_string_ostream ArgOut(ArgString);
1407 Args[Arg].print(Policy, ArgOut);
1410 // If this is the first argument and its string representation
1411 // begins with the global scope specifier ('::foo'), add a space
1412 // to avoid printing the diagraph '<:'.
1413 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1416 SpecString += ArgString;
1419 // If the last character of our string is '>', add another space to
1420 // keep the two '>''s separate tokens. We don't *have* to do this in
1421 // C++0x, but it's still good hygiene.
1422 if (!SpecString.empty() && SpecString[SpecString.size() - 1] == '>')
1431 // Sadly, repeat all that with TemplateArgLoc.
1432 std::string TemplateSpecializationType::
1433 PrintTemplateArgumentList(const TemplateArgumentLoc *Args, unsigned NumArgs,
1434 const PrintingPolicy &Policy) {
1435 std::string SpecString;
1437 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) {
1438 if (SpecString.size() > 1)
1441 // Print the argument into a string.
1442 std::string ArgString;
1443 if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) {
1444 ArgString = PrintTemplateArgumentList(
1445 Args[Arg].getArgument().pack_begin(),
1446 Args[Arg].getArgument().pack_size(),
1449 llvm::raw_string_ostream ArgOut(ArgString);
1450 Args[Arg].getArgument().print(Policy, ArgOut);
1453 // If this is the first argument and its string representation
1454 // begins with the global scope specifier ('::foo'), add a space
1455 // to avoid printing the diagraph '<:'.
1456 if (!Arg && !ArgString.empty() && ArgString[0] == ':')
1459 SpecString += ArgString;
1462 // If the last character of our string is '>', add another space to
1463 // keep the two '>''s separate tokens. We don't *have* to do this in
1464 // C++0x, but it's still good hygiene.
1465 if (SpecString[SpecString.size() - 1] == '>')
1473 void QualType::dump(const char *msg) const {
1475 llvm::errs() << msg << ": ";
1477 print(llvm::errs(), PrintingPolicy(LO), "identifier");
1478 llvm::errs() << '\n';
1480 void QualType::dump() const {
1484 void Type::dump() const {
1485 QualType(this, 0).dump();
1488 std::string Qualifiers::getAsString() const {
1490 return getAsString(PrintingPolicy(LO));
1493 // Appends qualifiers to the given string, separated by spaces. Will
1494 // prefix a space if the string is non-empty. Will not append a final
1496 std::string Qualifiers::getAsString(const PrintingPolicy &Policy) const {
1497 SmallString<64> Buf;
1498 llvm::raw_svector_ostream StrOS(Buf);
1499 print(StrOS, Policy);
1503 bool Qualifiers::isEmptyWhenPrinted(const PrintingPolicy &Policy) const {
1504 if (getCVRQualifiers())
1507 if (getAddressSpace())
1510 if (getObjCGCAttr())
1513 if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime())
1514 if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime))
1520 // Appends qualifiers to the given string, separated by spaces. Will
1521 // prefix a space if the string is non-empty. Will not append a final
1523 void Qualifiers::print(raw_ostream &OS, const PrintingPolicy& Policy,
1524 bool appendSpaceIfNonEmpty) const {
1525 bool addSpace = false;
1527 unsigned quals = getCVRQualifiers();
1529 AppendTypeQualList(OS, quals);
1532 if (unsigned addrspace = getAddressSpace()) {
1536 switch (addrspace) {
1537 case LangAS::opencl_global:
1540 case LangAS::opencl_local:
1543 case LangAS::opencl_constant:
1547 OS << "__attribute__((address_space(";
1552 if (Qualifiers::GC gc = getObjCGCAttr()) {
1556 if (gc == Qualifiers::Weak)
1561 if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) {
1562 if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)){
1569 case Qualifiers::OCL_None: llvm_unreachable("none but true");
1570 case Qualifiers::OCL_ExplicitNone: OS << "__unsafe_unretained"; break;
1571 case Qualifiers::OCL_Strong:
1572 if (!Policy.SuppressStrongLifetime)
1576 case Qualifiers::OCL_Weak: OS << "__weak"; break;
1577 case Qualifiers::OCL_Autoreleasing: OS << "__autoreleasing"; break;
1581 if (appendSpaceIfNonEmpty && addSpace)
1585 std::string QualType::getAsString(const PrintingPolicy &Policy) const {
1587 getAsStringInternal(S, Policy);
1591 std::string QualType::getAsString(const Type *ty, Qualifiers qs) {
1593 LangOptions options;
1594 getAsStringInternal(ty, qs, buffer, PrintingPolicy(options));
1598 void QualType::print(const Type *ty, Qualifiers qs,
1599 raw_ostream &OS, const PrintingPolicy &policy,
1600 const Twine &PlaceHolder) {
1601 SmallString<128> PHBuf;
1603 if (PlaceHolder.isSingleStringRef())
1604 PH = PlaceHolder.getSingleStringRef();
1606 PH = PlaceHolder.toStringRef(PHBuf);
1608 TypePrinter(policy).print(ty, qs, OS, PH);
1611 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs,
1612 std::string &buffer,
1613 const PrintingPolicy &policy) {
1614 SmallString<256> Buf;
1615 llvm::raw_svector_ostream StrOS(Buf);
1616 TypePrinter(policy).print(ty, qs, StrOS, buffer);
1617 std::string str = StrOS.str();