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