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/DeclObjC.h" 18 #include "clang/AST/DeclTemplate.h" 19 #include "clang/AST/Expr.h" 20 #include "clang/AST/Type.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/SaveAndRestore.h" 26 #include "llvm/Support/raw_ostream.h" 27 using namespace clang; 28 29 namespace { 30 /// \brief RAII object that enables printing of the ARC __strong lifetime 31 /// qualifier. 32 class IncludeStrongLifetimeRAII { 33 PrintingPolicy &Policy; 34 bool Old; 35 36 public: 37 explicit IncludeStrongLifetimeRAII(PrintingPolicy &Policy) 38 : Policy(Policy), Old(Policy.SuppressStrongLifetime) { 39 if (!Policy.SuppressLifetimeQualifiers) 40 Policy.SuppressStrongLifetime = false; 41 } 42 43 ~IncludeStrongLifetimeRAII() { 44 Policy.SuppressStrongLifetime = Old; 45 } 46 }; 47 48 class ParamPolicyRAII { 49 PrintingPolicy &Policy; 50 bool Old; 51 52 public: 53 explicit ParamPolicyRAII(PrintingPolicy &Policy) 54 : Policy(Policy), Old(Policy.SuppressSpecifiers) { 55 Policy.SuppressSpecifiers = false; 56 } 57 58 ~ParamPolicyRAII() { 59 Policy.SuppressSpecifiers = Old; 60 } 61 }; 62 63 class ElaboratedTypePolicyRAII { 64 PrintingPolicy &Policy; 65 bool SuppressTagKeyword; 66 bool SuppressScope; 67 68 public: 69 explicit ElaboratedTypePolicyRAII(PrintingPolicy &Policy) : Policy(Policy) { 70 SuppressTagKeyword = Policy.SuppressTagKeyword; 71 SuppressScope = Policy.SuppressScope; 72 Policy.SuppressTagKeyword = true; 73 Policy.SuppressScope = true; 74 } 75 76 ~ElaboratedTypePolicyRAII() { 77 Policy.SuppressTagKeyword = SuppressTagKeyword; 78 Policy.SuppressScope = SuppressScope; 79 } 80 }; 81 82 class TypePrinter { 83 PrintingPolicy Policy; 84 bool HasEmptyPlaceHolder; 85 bool InsideCCAttribute; 86 87 public: 88 explicit TypePrinter(const PrintingPolicy &Policy) 89 : Policy(Policy), HasEmptyPlaceHolder(false), InsideCCAttribute(false) { } 90 91 void print(const Type *ty, Qualifiers qs, raw_ostream &OS, 92 StringRef PlaceHolder); 93 void print(QualType T, raw_ostream &OS, StringRef PlaceHolder); 94 95 static bool canPrefixQualifiers(const Type *T, bool &NeedARCStrongQualifier); 96 void spaceBeforePlaceHolder(raw_ostream &OS); 97 void printTypeSpec(const NamedDecl *D, raw_ostream &OS); 98 99 void printBefore(const Type *ty, Qualifiers qs, raw_ostream &OS); 100 void printBefore(QualType T, raw_ostream &OS); 101 void printAfter(const Type *ty, Qualifiers qs, raw_ostream &OS); 102 void printAfter(QualType T, raw_ostream &OS); 103 void AppendScope(DeclContext *DC, raw_ostream &OS); 104 void printTag(TagDecl *T, raw_ostream &OS); 105 #define ABSTRACT_TYPE(CLASS, PARENT) 106 #define TYPE(CLASS, PARENT) \ 107 void print##CLASS##Before(const CLASS##Type *T, raw_ostream &OS); \ 108 void print##CLASS##After(const CLASS##Type *T, raw_ostream &OS); 109 #include "clang/AST/TypeNodes.def" 110 }; 111 } 112 113 static void AppendTypeQualList(raw_ostream &OS, unsigned TypeQuals) { 114 bool appendSpace = false; 115 if (TypeQuals & Qualifiers::Const) { 116 OS << "const"; 117 appendSpace = true; 118 } 119 if (TypeQuals & Qualifiers::Volatile) { 120 if (appendSpace) OS << ' '; 121 OS << "volatile"; 122 appendSpace = true; 123 } 124 if (TypeQuals & Qualifiers::Restrict) { 125 if (appendSpace) OS << ' '; 126 OS << "restrict"; 127 } 128 } 129 130 void TypePrinter::spaceBeforePlaceHolder(raw_ostream &OS) { 131 if (!HasEmptyPlaceHolder) 132 OS << ' '; 133 } 134 135 void TypePrinter::print(QualType t, raw_ostream &OS, StringRef PlaceHolder) { 136 SplitQualType split = t.split(); 137 print(split.Ty, split.Quals, OS, PlaceHolder); 138 } 139 140 void TypePrinter::print(const Type *T, Qualifiers Quals, raw_ostream &OS, 141 StringRef PlaceHolder) { 142 if (!T) { 143 OS << "NULL TYPE"; 144 return; 145 } 146 147 SaveAndRestore<bool> PHVal(HasEmptyPlaceHolder, PlaceHolder.empty()); 148 149 printBefore(T, Quals, OS); 150 OS << PlaceHolder; 151 printAfter(T, Quals, OS); 152 } 153 154 bool TypePrinter::canPrefixQualifiers(const Type *T, 155 bool &NeedARCStrongQualifier) { 156 // CanPrefixQualifiers - We prefer to print type qualifiers before the type, 157 // so that we get "const int" instead of "int const", but we can't do this if 158 // the type is complex. For example if the type is "int*", we *must* print 159 // "int * const", printing "const int *" is different. Only do this when the 160 // type expands to a simple string. 161 bool CanPrefixQualifiers = false; 162 NeedARCStrongQualifier = false; 163 Type::TypeClass TC = T->getTypeClass(); 164 if (const AutoType *AT = dyn_cast<AutoType>(T)) 165 TC = AT->desugar()->getTypeClass(); 166 if (const SubstTemplateTypeParmType *Subst 167 = dyn_cast<SubstTemplateTypeParmType>(T)) 168 TC = Subst->getReplacementType()->getTypeClass(); 169 170 switch (TC) { 171 case Type::Auto: 172 case Type::Builtin: 173 case Type::Complex: 174 case Type::UnresolvedUsing: 175 case Type::Typedef: 176 case Type::TypeOfExpr: 177 case Type::TypeOf: 178 case Type::Decltype: 179 case Type::UnaryTransform: 180 case Type::Record: 181 case Type::Enum: 182 case Type::Elaborated: 183 case Type::TemplateTypeParm: 184 case Type::SubstTemplateTypeParmPack: 185 case Type::TemplateSpecialization: 186 case Type::InjectedClassName: 187 case Type::DependentName: 188 case Type::DependentTemplateSpecialization: 189 case Type::ObjCObject: 190 case Type::ObjCInterface: 191 case Type::Atomic: 192 CanPrefixQualifiers = true; 193 break; 194 195 case Type::ObjCObjectPointer: 196 CanPrefixQualifiers = T->isObjCIdType() || T->isObjCClassType() || 197 T->isObjCQualifiedIdType() || T->isObjCQualifiedClassType(); 198 break; 199 200 case Type::ConstantArray: 201 case Type::IncompleteArray: 202 case Type::VariableArray: 203 case Type::DependentSizedArray: 204 NeedARCStrongQualifier = true; 205 // Fall through 206 207 case Type::Adjusted: 208 case Type::Decayed: 209 case Type::Pointer: 210 case Type::BlockPointer: 211 case Type::LValueReference: 212 case Type::RValueReference: 213 case Type::MemberPointer: 214 case Type::DependentSizedExtVector: 215 case Type::Vector: 216 case Type::ExtVector: 217 case Type::FunctionProto: 218 case Type::FunctionNoProto: 219 case Type::Paren: 220 case Type::Attributed: 221 case Type::PackExpansion: 222 case Type::SubstTemplateTypeParm: 223 CanPrefixQualifiers = false; 224 break; 225 } 226 227 return CanPrefixQualifiers; 228 } 229 230 void TypePrinter::printBefore(QualType T, raw_ostream &OS) { 231 SplitQualType Split = T.split(); 232 233 // If we have cv1 T, where T is substituted for cv2 U, only print cv1 - cv2 234 // at this level. 235 Qualifiers Quals = Split.Quals; 236 if (const SubstTemplateTypeParmType *Subst = 237 dyn_cast<SubstTemplateTypeParmType>(Split.Ty)) 238 Quals -= QualType(Subst, 0).getQualifiers(); 239 240 printBefore(Split.Ty, Quals, OS); 241 } 242 243 /// \brief Prints the part of the type string before an identifier, e.g. for 244 /// "int foo[10]" it prints "int ". 245 void TypePrinter::printBefore(const Type *T,Qualifiers Quals, raw_ostream &OS) { 246 if (Policy.SuppressSpecifiers && T->isSpecifierType()) 247 return; 248 249 SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder); 250 251 // Print qualifiers as appropriate. 252 253 bool CanPrefixQualifiers = false; 254 bool NeedARCStrongQualifier = false; 255 CanPrefixQualifiers = canPrefixQualifiers(T, NeedARCStrongQualifier); 256 257 if (CanPrefixQualifiers && !Quals.empty()) { 258 if (NeedARCStrongQualifier) { 259 IncludeStrongLifetimeRAII Strong(Policy); 260 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true); 261 } else { 262 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/true); 263 } 264 } 265 266 bool hasAfterQuals = false; 267 if (!CanPrefixQualifiers && !Quals.empty()) { 268 hasAfterQuals = !Quals.isEmptyWhenPrinted(Policy); 269 if (hasAfterQuals) 270 HasEmptyPlaceHolder = false; 271 } 272 273 switch (T->getTypeClass()) { 274 #define ABSTRACT_TYPE(CLASS, PARENT) 275 #define TYPE(CLASS, PARENT) case Type::CLASS: \ 276 print##CLASS##Before(cast<CLASS##Type>(T), OS); \ 277 break; 278 #include "clang/AST/TypeNodes.def" 279 } 280 281 if (hasAfterQuals) { 282 if (NeedARCStrongQualifier) { 283 IncludeStrongLifetimeRAII Strong(Policy); 284 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get()); 285 } else { 286 Quals.print(OS, Policy, /*appendSpaceIfNonEmpty=*/!PrevPHIsEmpty.get()); 287 } 288 } 289 } 290 291 void TypePrinter::printAfter(QualType t, raw_ostream &OS) { 292 SplitQualType split = t.split(); 293 printAfter(split.Ty, split.Quals, OS); 294 } 295 296 /// \brief Prints the part of the type string after an identifier, e.g. for 297 /// "int foo[10]" it prints "[10]". 298 void TypePrinter::printAfter(const Type *T, Qualifiers Quals, raw_ostream &OS) { 299 switch (T->getTypeClass()) { 300 #define ABSTRACT_TYPE(CLASS, PARENT) 301 #define TYPE(CLASS, PARENT) case Type::CLASS: \ 302 print##CLASS##After(cast<CLASS##Type>(T), OS); \ 303 break; 304 #include "clang/AST/TypeNodes.def" 305 } 306 } 307 308 void TypePrinter::printBuiltinBefore(const BuiltinType *T, raw_ostream &OS) { 309 OS << T->getName(Policy); 310 spaceBeforePlaceHolder(OS); 311 } 312 void TypePrinter::printBuiltinAfter(const BuiltinType *T, raw_ostream &OS) { } 313 314 void TypePrinter::printComplexBefore(const ComplexType *T, raw_ostream &OS) { 315 OS << "_Complex "; 316 printBefore(T->getElementType(), OS); 317 } 318 void TypePrinter::printComplexAfter(const ComplexType *T, raw_ostream &OS) { 319 printAfter(T->getElementType(), OS); 320 } 321 322 void TypePrinter::printPointerBefore(const PointerType *T, raw_ostream &OS) { 323 IncludeStrongLifetimeRAII Strong(Policy); 324 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 325 printBefore(T->getPointeeType(), OS); 326 // Handle things like 'int (*A)[4];' correctly. 327 // FIXME: this should include vectors, but vectors use attributes I guess. 328 if (isa<ArrayType>(T->getPointeeType())) 329 OS << '('; 330 OS << '*'; 331 } 332 void TypePrinter::printPointerAfter(const PointerType *T, raw_ostream &OS) { 333 IncludeStrongLifetimeRAII Strong(Policy); 334 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 335 // Handle things like 'int (*A)[4];' correctly. 336 // FIXME: this should include vectors, but vectors use attributes I guess. 337 if (isa<ArrayType>(T->getPointeeType())) 338 OS << ')'; 339 printAfter(T->getPointeeType(), OS); 340 } 341 342 void TypePrinter::printBlockPointerBefore(const BlockPointerType *T, 343 raw_ostream &OS) { 344 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 345 printBefore(T->getPointeeType(), OS); 346 OS << '^'; 347 } 348 void TypePrinter::printBlockPointerAfter(const BlockPointerType *T, 349 raw_ostream &OS) { 350 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 351 printAfter(T->getPointeeType(), OS); 352 } 353 354 void TypePrinter::printLValueReferenceBefore(const LValueReferenceType *T, 355 raw_ostream &OS) { 356 IncludeStrongLifetimeRAII Strong(Policy); 357 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 358 printBefore(T->getPointeeTypeAsWritten(), OS); 359 // Handle things like 'int (&A)[4];' correctly. 360 // FIXME: this should include vectors, but vectors use attributes I guess. 361 if (isa<ArrayType>(T->getPointeeTypeAsWritten())) 362 OS << '('; 363 OS << '&'; 364 } 365 void TypePrinter::printLValueReferenceAfter(const LValueReferenceType *T, 366 raw_ostream &OS) { 367 IncludeStrongLifetimeRAII Strong(Policy); 368 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 369 // Handle things like 'int (&A)[4];' correctly. 370 // FIXME: this should include vectors, but vectors use attributes I guess. 371 if (isa<ArrayType>(T->getPointeeTypeAsWritten())) 372 OS << ')'; 373 printAfter(T->getPointeeTypeAsWritten(), OS); 374 } 375 376 void TypePrinter::printRValueReferenceBefore(const RValueReferenceType *T, 377 raw_ostream &OS) { 378 IncludeStrongLifetimeRAII Strong(Policy); 379 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 380 printBefore(T->getPointeeTypeAsWritten(), OS); 381 // Handle things like 'int (&&A)[4];' correctly. 382 // FIXME: this should include vectors, but vectors use attributes I guess. 383 if (isa<ArrayType>(T->getPointeeTypeAsWritten())) 384 OS << '('; 385 OS << "&&"; 386 } 387 void TypePrinter::printRValueReferenceAfter(const RValueReferenceType *T, 388 raw_ostream &OS) { 389 IncludeStrongLifetimeRAII Strong(Policy); 390 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 391 // Handle things like 'int (&&A)[4];' correctly. 392 // FIXME: this should include vectors, but vectors use attributes I guess. 393 if (isa<ArrayType>(T->getPointeeTypeAsWritten())) 394 OS << ')'; 395 printAfter(T->getPointeeTypeAsWritten(), OS); 396 } 397 398 void TypePrinter::printMemberPointerBefore(const MemberPointerType *T, 399 raw_ostream &OS) { 400 IncludeStrongLifetimeRAII Strong(Policy); 401 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 402 printBefore(T->getPointeeType(), OS); 403 // Handle things like 'int (Cls::*A)[4];' correctly. 404 // FIXME: this should include vectors, but vectors use attributes I guess. 405 if (isa<ArrayType>(T->getPointeeType())) 406 OS << '('; 407 408 PrintingPolicy InnerPolicy(Policy); 409 InnerPolicy.SuppressTag = false; 410 TypePrinter(InnerPolicy).print(QualType(T->getClass(), 0), OS, StringRef()); 411 412 OS << "::*"; 413 } 414 void TypePrinter::printMemberPointerAfter(const MemberPointerType *T, 415 raw_ostream &OS) { 416 IncludeStrongLifetimeRAII Strong(Policy); 417 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 418 // Handle things like 'int (Cls::*A)[4];' correctly. 419 // FIXME: this should include vectors, but vectors use attributes I guess. 420 if (isa<ArrayType>(T->getPointeeType())) 421 OS << ')'; 422 printAfter(T->getPointeeType(), OS); 423 } 424 425 void TypePrinter::printConstantArrayBefore(const ConstantArrayType *T, 426 raw_ostream &OS) { 427 IncludeStrongLifetimeRAII Strong(Policy); 428 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 429 printBefore(T->getElementType(), OS); 430 } 431 void TypePrinter::printConstantArrayAfter(const ConstantArrayType *T, 432 raw_ostream &OS) { 433 OS << '['; 434 if (T->getIndexTypeQualifiers().hasQualifiers()) { 435 AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers()); 436 OS << ' '; 437 } 438 439 if (T->getSizeModifier() == ArrayType::Static) 440 OS << "static "; 441 442 OS << T->getSize().getZExtValue() << ']'; 443 printAfter(T->getElementType(), OS); 444 } 445 446 void TypePrinter::printIncompleteArrayBefore(const IncompleteArrayType *T, 447 raw_ostream &OS) { 448 IncludeStrongLifetimeRAII Strong(Policy); 449 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 450 printBefore(T->getElementType(), OS); 451 } 452 void TypePrinter::printIncompleteArrayAfter(const IncompleteArrayType *T, 453 raw_ostream &OS) { 454 OS << "[]"; 455 printAfter(T->getElementType(), OS); 456 } 457 458 void TypePrinter::printVariableArrayBefore(const VariableArrayType *T, 459 raw_ostream &OS) { 460 IncludeStrongLifetimeRAII Strong(Policy); 461 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 462 printBefore(T->getElementType(), OS); 463 } 464 void TypePrinter::printVariableArrayAfter(const VariableArrayType *T, 465 raw_ostream &OS) { 466 OS << '['; 467 if (T->getIndexTypeQualifiers().hasQualifiers()) { 468 AppendTypeQualList(OS, T->getIndexTypeCVRQualifiers()); 469 OS << ' '; 470 } 471 472 if (T->getSizeModifier() == VariableArrayType::Static) 473 OS << "static "; 474 else if (T->getSizeModifier() == VariableArrayType::Star) 475 OS << '*'; 476 477 if (T->getSizeExpr()) 478 T->getSizeExpr()->printPretty(OS, nullptr, Policy); 479 OS << ']'; 480 481 printAfter(T->getElementType(), OS); 482 } 483 484 void TypePrinter::printAdjustedBefore(const AdjustedType *T, raw_ostream &OS) { 485 // Print the adjusted representation, otherwise the adjustment will be 486 // invisible. 487 printBefore(T->getAdjustedType(), OS); 488 } 489 void TypePrinter::printAdjustedAfter(const AdjustedType *T, raw_ostream &OS) { 490 printAfter(T->getAdjustedType(), OS); 491 } 492 493 void TypePrinter::printDecayedBefore(const DecayedType *T, raw_ostream &OS) { 494 // Print as though it's a pointer. 495 printAdjustedBefore(T, OS); 496 } 497 void TypePrinter::printDecayedAfter(const DecayedType *T, raw_ostream &OS) { 498 printAdjustedAfter(T, OS); 499 } 500 501 void TypePrinter::printDependentSizedArrayBefore( 502 const DependentSizedArrayType *T, 503 raw_ostream &OS) { 504 IncludeStrongLifetimeRAII Strong(Policy); 505 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 506 printBefore(T->getElementType(), OS); 507 } 508 void TypePrinter::printDependentSizedArrayAfter( 509 const DependentSizedArrayType *T, 510 raw_ostream &OS) { 511 OS << '['; 512 if (T->getSizeExpr()) 513 T->getSizeExpr()->printPretty(OS, nullptr, Policy); 514 OS << ']'; 515 printAfter(T->getElementType(), OS); 516 } 517 518 void TypePrinter::printDependentSizedExtVectorBefore( 519 const DependentSizedExtVectorType *T, 520 raw_ostream &OS) { 521 printBefore(T->getElementType(), OS); 522 } 523 void TypePrinter::printDependentSizedExtVectorAfter( 524 const DependentSizedExtVectorType *T, 525 raw_ostream &OS) { 526 OS << " __attribute__((ext_vector_type("; 527 if (T->getSizeExpr()) 528 T->getSizeExpr()->printPretty(OS, nullptr, Policy); 529 OS << ")))"; 530 printAfter(T->getElementType(), OS); 531 } 532 533 void TypePrinter::printVectorBefore(const VectorType *T, raw_ostream &OS) { 534 switch (T->getVectorKind()) { 535 case VectorType::AltiVecPixel: 536 OS << "__vector __pixel "; 537 break; 538 case VectorType::AltiVecBool: 539 OS << "__vector __bool "; 540 printBefore(T->getElementType(), OS); 541 break; 542 case VectorType::AltiVecVector: 543 OS << "__vector "; 544 printBefore(T->getElementType(), OS); 545 break; 546 case VectorType::NeonVector: 547 OS << "__attribute__((neon_vector_type(" 548 << T->getNumElements() << "))) "; 549 printBefore(T->getElementType(), OS); 550 break; 551 case VectorType::NeonPolyVector: 552 OS << "__attribute__((neon_polyvector_type(" << 553 T->getNumElements() << "))) "; 554 printBefore(T->getElementType(), OS); 555 break; 556 case VectorType::GenericVector: { 557 // FIXME: We prefer to print the size directly here, but have no way 558 // to get the size of the type. 559 OS << "__attribute__((__vector_size__(" 560 << T->getNumElements() 561 << " * sizeof("; 562 print(T->getElementType(), OS, StringRef()); 563 OS << ")))) "; 564 printBefore(T->getElementType(), OS); 565 break; 566 } 567 } 568 } 569 void TypePrinter::printVectorAfter(const VectorType *T, raw_ostream &OS) { 570 printAfter(T->getElementType(), OS); 571 } 572 573 void TypePrinter::printExtVectorBefore(const ExtVectorType *T, 574 raw_ostream &OS) { 575 printBefore(T->getElementType(), OS); 576 } 577 void TypePrinter::printExtVectorAfter(const ExtVectorType *T, raw_ostream &OS) { 578 printAfter(T->getElementType(), OS); 579 OS << " __attribute__((ext_vector_type("; 580 OS << T->getNumElements(); 581 OS << ")))"; 582 } 583 584 void 585 FunctionProtoType::printExceptionSpecification(raw_ostream &OS, 586 const PrintingPolicy &Policy) 587 const { 588 589 if (hasDynamicExceptionSpec()) { 590 OS << " throw("; 591 if (getExceptionSpecType() == EST_MSAny) 592 OS << "..."; 593 else 594 for (unsigned I = 0, N = getNumExceptions(); I != N; ++I) { 595 if (I) 596 OS << ", "; 597 598 OS << getExceptionType(I).stream(Policy); 599 } 600 OS << ')'; 601 } else if (isNoexceptExceptionSpec(getExceptionSpecType())) { 602 OS << " noexcept"; 603 if (getExceptionSpecType() == EST_ComputedNoexcept) { 604 OS << '('; 605 if (getNoexceptExpr()) 606 getNoexceptExpr()->printPretty(OS, nullptr, Policy); 607 OS << ')'; 608 } 609 } 610 } 611 612 void TypePrinter::printFunctionProtoBefore(const FunctionProtoType *T, 613 raw_ostream &OS) { 614 if (T->hasTrailingReturn()) { 615 OS << "auto "; 616 if (!HasEmptyPlaceHolder) 617 OS << '('; 618 } else { 619 // If needed for precedence reasons, wrap the inner part in grouping parens. 620 SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false); 621 printBefore(T->getReturnType(), OS); 622 if (!PrevPHIsEmpty.get()) 623 OS << '('; 624 } 625 } 626 627 void TypePrinter::printFunctionProtoAfter(const FunctionProtoType *T, 628 raw_ostream &OS) { 629 // If needed for precedence reasons, wrap the inner part in grouping parens. 630 if (!HasEmptyPlaceHolder) 631 OS << ')'; 632 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 633 634 OS << '('; 635 { 636 ParamPolicyRAII ParamPolicy(Policy); 637 for (unsigned i = 0, e = T->getNumParams(); i != e; ++i) { 638 if (i) OS << ", "; 639 print(T->getParamType(i), OS, StringRef()); 640 } 641 } 642 643 if (T->isVariadic()) { 644 if (T->getNumParams()) 645 OS << ", "; 646 OS << "..."; 647 } else if (T->getNumParams() == 0 && !Policy.LangOpts.CPlusPlus) { 648 // Do not emit int() if we have a proto, emit 'int(void)'. 649 OS << "void"; 650 } 651 652 OS << ')'; 653 654 FunctionType::ExtInfo Info = T->getExtInfo(); 655 656 if (!InsideCCAttribute) { 657 switch (Info.getCC()) { 658 case CC_C: 659 // The C calling convention is the default on the vast majority of platforms 660 // we support. If the user wrote it explicitly, it will usually be printed 661 // while traversing the AttributedType. If the type has been desugared, let 662 // the canonical spelling be the implicit calling convention. 663 // FIXME: It would be better to be explicit in certain contexts, such as a 664 // cdecl function typedef used to declare a member function with the 665 // Microsoft C++ ABI. 666 break; 667 case CC_X86StdCall: 668 OS << " __attribute__((stdcall))"; 669 break; 670 case CC_X86FastCall: 671 OS << " __attribute__((fastcall))"; 672 break; 673 case CC_X86ThisCall: 674 OS << " __attribute__((thiscall))"; 675 break; 676 case CC_X86VectorCall: 677 OS << " __attribute__((vectorcall))"; 678 break; 679 case CC_X86Pascal: 680 OS << " __attribute__((pascal))"; 681 break; 682 case CC_AAPCS: 683 OS << " __attribute__((pcs(\"aapcs\")))"; 684 break; 685 case CC_AAPCS_VFP: 686 OS << " __attribute__((pcs(\"aapcs-vfp\")))"; 687 break; 688 case CC_PnaclCall: 689 OS << " __attribute__((pnaclcall))"; 690 break; 691 case CC_IntelOclBicc: 692 OS << " __attribute__((intel_ocl_bicc))"; 693 break; 694 case CC_X86_64Win64: 695 OS << " __attribute__((ms_abi))"; 696 break; 697 case CC_X86_64SysV: 698 OS << " __attribute__((sysv_abi))"; 699 break; 700 case CC_SpirFunction: 701 case CC_SpirKernel: 702 // Do nothing. These CCs are not available as attributes. 703 break; 704 } 705 } 706 707 if (Info.getNoReturn()) 708 OS << " __attribute__((noreturn))"; 709 if (Info.getRegParm()) 710 OS << " __attribute__((regparm (" 711 << Info.getRegParm() << ")))"; 712 713 if (unsigned quals = T->getTypeQuals()) { 714 OS << ' '; 715 AppendTypeQualList(OS, quals); 716 } 717 718 switch (T->getRefQualifier()) { 719 case RQ_None: 720 break; 721 722 case RQ_LValue: 723 OS << " &"; 724 break; 725 726 case RQ_RValue: 727 OS << " &&"; 728 break; 729 } 730 T->printExceptionSpecification(OS, Policy); 731 732 if (T->hasTrailingReturn()) { 733 OS << " -> "; 734 print(T->getReturnType(), OS, StringRef()); 735 } else 736 printAfter(T->getReturnType(), OS); 737 } 738 739 void TypePrinter::printFunctionNoProtoBefore(const FunctionNoProtoType *T, 740 raw_ostream &OS) { 741 // If needed for precedence reasons, wrap the inner part in grouping parens. 742 SaveAndRestore<bool> PrevPHIsEmpty(HasEmptyPlaceHolder, false); 743 printBefore(T->getReturnType(), OS); 744 if (!PrevPHIsEmpty.get()) 745 OS << '('; 746 } 747 void TypePrinter::printFunctionNoProtoAfter(const FunctionNoProtoType *T, 748 raw_ostream &OS) { 749 // If needed for precedence reasons, wrap the inner part in grouping parens. 750 if (!HasEmptyPlaceHolder) 751 OS << ')'; 752 SaveAndRestore<bool> NonEmptyPH(HasEmptyPlaceHolder, false); 753 754 OS << "()"; 755 if (T->getNoReturnAttr()) 756 OS << " __attribute__((noreturn))"; 757 printAfter(T->getReturnType(), OS); 758 } 759 760 void TypePrinter::printTypeSpec(const NamedDecl *D, raw_ostream &OS) { 761 IdentifierInfo *II = D->getIdentifier(); 762 OS << II->getName(); 763 spaceBeforePlaceHolder(OS); 764 } 765 766 void TypePrinter::printUnresolvedUsingBefore(const UnresolvedUsingType *T, 767 raw_ostream &OS) { 768 printTypeSpec(T->getDecl(), OS); 769 } 770 void TypePrinter::printUnresolvedUsingAfter(const UnresolvedUsingType *T, 771 raw_ostream &OS) { } 772 773 void TypePrinter::printTypedefBefore(const TypedefType *T, raw_ostream &OS) { 774 printTypeSpec(T->getDecl(), OS); 775 } 776 void TypePrinter::printTypedefAfter(const TypedefType *T, raw_ostream &OS) { } 777 778 void TypePrinter::printTypeOfExprBefore(const TypeOfExprType *T, 779 raw_ostream &OS) { 780 OS << "typeof "; 781 if (T->getUnderlyingExpr()) 782 T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy); 783 spaceBeforePlaceHolder(OS); 784 } 785 void TypePrinter::printTypeOfExprAfter(const TypeOfExprType *T, 786 raw_ostream &OS) { } 787 788 void TypePrinter::printTypeOfBefore(const TypeOfType *T, raw_ostream &OS) { 789 OS << "typeof("; 790 print(T->getUnderlyingType(), OS, StringRef()); 791 OS << ')'; 792 spaceBeforePlaceHolder(OS); 793 } 794 void TypePrinter::printTypeOfAfter(const TypeOfType *T, raw_ostream &OS) { } 795 796 void TypePrinter::printDecltypeBefore(const DecltypeType *T, raw_ostream &OS) { 797 OS << "decltype("; 798 if (T->getUnderlyingExpr()) 799 T->getUnderlyingExpr()->printPretty(OS, nullptr, Policy); 800 OS << ')'; 801 spaceBeforePlaceHolder(OS); 802 } 803 void TypePrinter::printDecltypeAfter(const DecltypeType *T, raw_ostream &OS) { } 804 805 void TypePrinter::printUnaryTransformBefore(const UnaryTransformType *T, 806 raw_ostream &OS) { 807 IncludeStrongLifetimeRAII Strong(Policy); 808 809 switch (T->getUTTKind()) { 810 case UnaryTransformType::EnumUnderlyingType: 811 OS << "__underlying_type("; 812 print(T->getBaseType(), OS, StringRef()); 813 OS << ')'; 814 spaceBeforePlaceHolder(OS); 815 return; 816 } 817 818 printBefore(T->getBaseType(), OS); 819 } 820 void TypePrinter::printUnaryTransformAfter(const UnaryTransformType *T, 821 raw_ostream &OS) { 822 IncludeStrongLifetimeRAII Strong(Policy); 823 824 switch (T->getUTTKind()) { 825 case UnaryTransformType::EnumUnderlyingType: 826 return; 827 } 828 829 printAfter(T->getBaseType(), OS); 830 } 831 832 void TypePrinter::printAutoBefore(const AutoType *T, raw_ostream &OS) { 833 // If the type has been deduced, do not print 'auto'. 834 if (!T->getDeducedType().isNull()) { 835 printBefore(T->getDeducedType(), OS); 836 } else { 837 OS << (T->isDecltypeAuto() ? "decltype(auto)" : "auto"); 838 spaceBeforePlaceHolder(OS); 839 } 840 } 841 void TypePrinter::printAutoAfter(const AutoType *T, raw_ostream &OS) { 842 // If the type has been deduced, do not print 'auto'. 843 if (!T->getDeducedType().isNull()) 844 printAfter(T->getDeducedType(), OS); 845 } 846 847 void TypePrinter::printAtomicBefore(const AtomicType *T, raw_ostream &OS) { 848 IncludeStrongLifetimeRAII Strong(Policy); 849 850 OS << "_Atomic("; 851 print(T->getValueType(), OS, StringRef()); 852 OS << ')'; 853 spaceBeforePlaceHolder(OS); 854 } 855 void TypePrinter::printAtomicAfter(const AtomicType *T, raw_ostream &OS) { } 856 857 /// Appends the given scope to the end of a string. 858 void TypePrinter::AppendScope(DeclContext *DC, raw_ostream &OS) { 859 if (DC->isTranslationUnit()) return; 860 if (DC->isFunctionOrMethod()) return; 861 AppendScope(DC->getParent(), OS); 862 863 if (NamespaceDecl *NS = dyn_cast<NamespaceDecl>(DC)) { 864 if (Policy.SuppressUnwrittenScope && 865 (NS->isAnonymousNamespace() || NS->isInline())) 866 return; 867 if (NS->getIdentifier()) 868 OS << NS->getName() << "::"; 869 else 870 OS << "(anonymous namespace)::"; 871 } else if (ClassTemplateSpecializationDecl *Spec 872 = dyn_cast<ClassTemplateSpecializationDecl>(DC)) { 873 IncludeStrongLifetimeRAII Strong(Policy); 874 OS << Spec->getIdentifier()->getName(); 875 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 876 TemplateSpecializationType::PrintTemplateArgumentList(OS, 877 TemplateArgs.data(), 878 TemplateArgs.size(), 879 Policy); 880 OS << "::"; 881 } else if (TagDecl *Tag = dyn_cast<TagDecl>(DC)) { 882 if (TypedefNameDecl *Typedef = Tag->getTypedefNameForAnonDecl()) 883 OS << Typedef->getIdentifier()->getName() << "::"; 884 else if (Tag->getIdentifier()) 885 OS << Tag->getIdentifier()->getName() << "::"; 886 else 887 return; 888 } 889 } 890 891 void TypePrinter::printTag(TagDecl *D, raw_ostream &OS) { 892 if (Policy.SuppressTag) 893 return; 894 895 bool HasKindDecoration = false; 896 897 // bool SuppressTagKeyword 898 // = Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword; 899 900 // We don't print tags unless this is an elaborated type. 901 // In C, we just assume every RecordType is an elaborated type. 902 if (!(Policy.LangOpts.CPlusPlus || Policy.SuppressTagKeyword || 903 D->getTypedefNameForAnonDecl())) { 904 HasKindDecoration = true; 905 OS << D->getKindName(); 906 OS << ' '; 907 } 908 909 // Compute the full nested-name-specifier for this type. 910 // In C, this will always be empty except when the type 911 // being printed is anonymous within other Record. 912 if (!Policy.SuppressScope) 913 AppendScope(D->getDeclContext(), OS); 914 915 if (const IdentifierInfo *II = D->getIdentifier()) 916 OS << II->getName(); 917 else if (TypedefNameDecl *Typedef = D->getTypedefNameForAnonDecl()) { 918 assert(Typedef->getIdentifier() && "Typedef without identifier?"); 919 OS << Typedef->getIdentifier()->getName(); 920 } else { 921 // Make an unambiguous representation for anonymous types, e.g. 922 // (anonymous enum at /usr/include/string.h:120:9) 923 924 if (isa<CXXRecordDecl>(D) && cast<CXXRecordDecl>(D)->isLambda()) { 925 OS << "(lambda"; 926 HasKindDecoration = true; 927 } else { 928 OS << "(anonymous"; 929 } 930 931 if (Policy.AnonymousTagLocations) { 932 // Suppress the redundant tag keyword if we just printed one. 933 // We don't have to worry about ElaboratedTypes here because you can't 934 // refer to an anonymous type with one. 935 if (!HasKindDecoration) 936 OS << " " << D->getKindName(); 937 938 PresumedLoc PLoc = D->getASTContext().getSourceManager().getPresumedLoc( 939 D->getLocation()); 940 if (PLoc.isValid()) { 941 OS << " at " << PLoc.getFilename() 942 << ':' << PLoc.getLine() 943 << ':' << PLoc.getColumn(); 944 } 945 } 946 947 OS << ')'; 948 } 949 950 // If this is a class template specialization, print the template 951 // arguments. 952 if (ClassTemplateSpecializationDecl *Spec 953 = dyn_cast<ClassTemplateSpecializationDecl>(D)) { 954 const TemplateArgument *Args; 955 unsigned NumArgs; 956 if (TypeSourceInfo *TAW = Spec->getTypeAsWritten()) { 957 const TemplateSpecializationType *TST = 958 cast<TemplateSpecializationType>(TAW->getType()); 959 Args = TST->getArgs(); 960 NumArgs = TST->getNumArgs(); 961 } else { 962 const TemplateArgumentList &TemplateArgs = Spec->getTemplateArgs(); 963 Args = TemplateArgs.data(); 964 NumArgs = TemplateArgs.size(); 965 } 966 IncludeStrongLifetimeRAII Strong(Policy); 967 TemplateSpecializationType::PrintTemplateArgumentList(OS, 968 Args, NumArgs, 969 Policy); 970 } 971 972 spaceBeforePlaceHolder(OS); 973 } 974 975 void TypePrinter::printRecordBefore(const RecordType *T, raw_ostream &OS) { 976 printTag(T->getDecl(), OS); 977 } 978 void TypePrinter::printRecordAfter(const RecordType *T, raw_ostream &OS) { } 979 980 void TypePrinter::printEnumBefore(const EnumType *T, raw_ostream &OS) { 981 printTag(T->getDecl(), OS); 982 } 983 void TypePrinter::printEnumAfter(const EnumType *T, raw_ostream &OS) { } 984 985 void TypePrinter::printTemplateTypeParmBefore(const TemplateTypeParmType *T, 986 raw_ostream &OS) { 987 if (IdentifierInfo *Id = T->getIdentifier()) 988 OS << Id->getName(); 989 else 990 OS << "type-parameter-" << T->getDepth() << '-' << T->getIndex(); 991 spaceBeforePlaceHolder(OS); 992 } 993 void TypePrinter::printTemplateTypeParmAfter(const TemplateTypeParmType *T, 994 raw_ostream &OS) { } 995 996 void TypePrinter::printSubstTemplateTypeParmBefore( 997 const SubstTemplateTypeParmType *T, 998 raw_ostream &OS) { 999 IncludeStrongLifetimeRAII Strong(Policy); 1000 printBefore(T->getReplacementType(), OS); 1001 } 1002 void TypePrinter::printSubstTemplateTypeParmAfter( 1003 const SubstTemplateTypeParmType *T, 1004 raw_ostream &OS) { 1005 IncludeStrongLifetimeRAII Strong(Policy); 1006 printAfter(T->getReplacementType(), OS); 1007 } 1008 1009 void TypePrinter::printSubstTemplateTypeParmPackBefore( 1010 const SubstTemplateTypeParmPackType *T, 1011 raw_ostream &OS) { 1012 IncludeStrongLifetimeRAII Strong(Policy); 1013 printTemplateTypeParmBefore(T->getReplacedParameter(), OS); 1014 } 1015 void TypePrinter::printSubstTemplateTypeParmPackAfter( 1016 const SubstTemplateTypeParmPackType *T, 1017 raw_ostream &OS) { 1018 IncludeStrongLifetimeRAII Strong(Policy); 1019 printTemplateTypeParmAfter(T->getReplacedParameter(), OS); 1020 } 1021 1022 void TypePrinter::printTemplateSpecializationBefore( 1023 const TemplateSpecializationType *T, 1024 raw_ostream &OS) { 1025 IncludeStrongLifetimeRAII Strong(Policy); 1026 T->getTemplateName().print(OS, Policy); 1027 1028 TemplateSpecializationType::PrintTemplateArgumentList(OS, 1029 T->getArgs(), 1030 T->getNumArgs(), 1031 Policy); 1032 spaceBeforePlaceHolder(OS); 1033 } 1034 void TypePrinter::printTemplateSpecializationAfter( 1035 const TemplateSpecializationType *T, 1036 raw_ostream &OS) { } 1037 1038 void TypePrinter::printInjectedClassNameBefore(const InjectedClassNameType *T, 1039 raw_ostream &OS) { 1040 printTemplateSpecializationBefore(T->getInjectedTST(), OS); 1041 } 1042 void TypePrinter::printInjectedClassNameAfter(const InjectedClassNameType *T, 1043 raw_ostream &OS) { } 1044 1045 void TypePrinter::printElaboratedBefore(const ElaboratedType *T, 1046 raw_ostream &OS) { 1047 if (Policy.SuppressTag && isa<TagType>(T->getNamedType())) 1048 return; 1049 OS << TypeWithKeyword::getKeywordName(T->getKeyword()); 1050 if (T->getKeyword() != ETK_None) 1051 OS << " "; 1052 NestedNameSpecifier* Qualifier = T->getQualifier(); 1053 if (Qualifier) 1054 Qualifier->print(OS, Policy); 1055 1056 ElaboratedTypePolicyRAII PolicyRAII(Policy); 1057 printBefore(T->getNamedType(), OS); 1058 } 1059 void TypePrinter::printElaboratedAfter(const ElaboratedType *T, 1060 raw_ostream &OS) { 1061 ElaboratedTypePolicyRAII PolicyRAII(Policy); 1062 printAfter(T->getNamedType(), OS); 1063 } 1064 1065 void TypePrinter::printParenBefore(const ParenType *T, raw_ostream &OS) { 1066 if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) { 1067 printBefore(T->getInnerType(), OS); 1068 OS << '('; 1069 } else 1070 printBefore(T->getInnerType(), OS); 1071 } 1072 void TypePrinter::printParenAfter(const ParenType *T, raw_ostream &OS) { 1073 if (!HasEmptyPlaceHolder && !isa<FunctionType>(T->getInnerType())) { 1074 OS << ')'; 1075 printAfter(T->getInnerType(), OS); 1076 } else 1077 printAfter(T->getInnerType(), OS); 1078 } 1079 1080 void TypePrinter::printDependentNameBefore(const DependentNameType *T, 1081 raw_ostream &OS) { 1082 OS << TypeWithKeyword::getKeywordName(T->getKeyword()); 1083 if (T->getKeyword() != ETK_None) 1084 OS << " "; 1085 1086 T->getQualifier()->print(OS, Policy); 1087 1088 OS << T->getIdentifier()->getName(); 1089 spaceBeforePlaceHolder(OS); 1090 } 1091 void TypePrinter::printDependentNameAfter(const DependentNameType *T, 1092 raw_ostream &OS) { } 1093 1094 void TypePrinter::printDependentTemplateSpecializationBefore( 1095 const DependentTemplateSpecializationType *T, raw_ostream &OS) { 1096 IncludeStrongLifetimeRAII Strong(Policy); 1097 1098 OS << TypeWithKeyword::getKeywordName(T->getKeyword()); 1099 if (T->getKeyword() != ETK_None) 1100 OS << " "; 1101 1102 if (T->getQualifier()) 1103 T->getQualifier()->print(OS, Policy); 1104 OS << T->getIdentifier()->getName(); 1105 TemplateSpecializationType::PrintTemplateArgumentList(OS, 1106 T->getArgs(), 1107 T->getNumArgs(), 1108 Policy); 1109 spaceBeforePlaceHolder(OS); 1110 } 1111 void TypePrinter::printDependentTemplateSpecializationAfter( 1112 const DependentTemplateSpecializationType *T, raw_ostream &OS) { } 1113 1114 void TypePrinter::printPackExpansionBefore(const PackExpansionType *T, 1115 raw_ostream &OS) { 1116 printBefore(T->getPattern(), OS); 1117 } 1118 void TypePrinter::printPackExpansionAfter(const PackExpansionType *T, 1119 raw_ostream &OS) { 1120 printAfter(T->getPattern(), OS); 1121 OS << "..."; 1122 } 1123 1124 void TypePrinter::printAttributedBefore(const AttributedType *T, 1125 raw_ostream &OS) { 1126 // Prefer the macro forms of the GC and ownership qualifiers. 1127 if (T->getAttrKind() == AttributedType::attr_objc_gc || 1128 T->getAttrKind() == AttributedType::attr_objc_ownership) 1129 return printBefore(T->getEquivalentType(), OS); 1130 1131 printBefore(T->getModifiedType(), OS); 1132 1133 if (T->isMSTypeSpec()) { 1134 switch (T->getAttrKind()) { 1135 default: return; 1136 case AttributedType::attr_ptr32: OS << " __ptr32"; break; 1137 case AttributedType::attr_ptr64: OS << " __ptr64"; break; 1138 case AttributedType::attr_sptr: OS << " __sptr"; break; 1139 case AttributedType::attr_uptr: OS << " __uptr"; break; 1140 } 1141 spaceBeforePlaceHolder(OS); 1142 } 1143 } 1144 1145 void TypePrinter::printAttributedAfter(const AttributedType *T, 1146 raw_ostream &OS) { 1147 // Prefer the macro forms of the GC and ownership qualifiers. 1148 if (T->getAttrKind() == AttributedType::attr_objc_gc || 1149 T->getAttrKind() == AttributedType::attr_objc_ownership) 1150 return printAfter(T->getEquivalentType(), OS); 1151 1152 // TODO: not all attributes are GCC-style attributes. 1153 if (T->isMSTypeSpec()) 1154 return; 1155 1156 // If this is a calling convention attribute, don't print the implicit CC from 1157 // the modified type. 1158 SaveAndRestore<bool> MaybeSuppressCC(InsideCCAttribute, T->isCallingConv()); 1159 1160 printAfter(T->getModifiedType(), OS); 1161 1162 OS << " __attribute__(("; 1163 switch (T->getAttrKind()) { 1164 default: llvm_unreachable("This attribute should have been handled already"); 1165 case AttributedType::attr_address_space: 1166 OS << "address_space("; 1167 OS << T->getEquivalentType().getAddressSpace(); 1168 OS << ')'; 1169 break; 1170 1171 case AttributedType::attr_vector_size: { 1172 OS << "__vector_size__("; 1173 if (const VectorType *vector =T->getEquivalentType()->getAs<VectorType>()) { 1174 OS << vector->getNumElements(); 1175 OS << " * sizeof("; 1176 print(vector->getElementType(), OS, StringRef()); 1177 OS << ')'; 1178 } 1179 OS << ')'; 1180 break; 1181 } 1182 1183 case AttributedType::attr_neon_vector_type: 1184 case AttributedType::attr_neon_polyvector_type: { 1185 if (T->getAttrKind() == AttributedType::attr_neon_vector_type) 1186 OS << "neon_vector_type("; 1187 else 1188 OS << "neon_polyvector_type("; 1189 const VectorType *vector = T->getEquivalentType()->getAs<VectorType>(); 1190 OS << vector->getNumElements(); 1191 OS << ')'; 1192 break; 1193 } 1194 1195 case AttributedType::attr_regparm: { 1196 // FIXME: When Sema learns to form this AttributedType, avoid printing the 1197 // attribute again in printFunctionProtoAfter. 1198 OS << "regparm("; 1199 QualType t = T->getEquivalentType(); 1200 while (!t->isFunctionType()) 1201 t = t->getPointeeType(); 1202 OS << t->getAs<FunctionType>()->getRegParmType(); 1203 OS << ')'; 1204 break; 1205 } 1206 1207 case AttributedType::attr_objc_gc: { 1208 OS << "objc_gc("; 1209 1210 QualType tmp = T->getEquivalentType(); 1211 while (tmp.getObjCGCAttr() == Qualifiers::GCNone) { 1212 QualType next = tmp->getPointeeType(); 1213 if (next == tmp) break; 1214 tmp = next; 1215 } 1216 1217 if (tmp.isObjCGCWeak()) 1218 OS << "weak"; 1219 else 1220 OS << "strong"; 1221 OS << ')'; 1222 break; 1223 } 1224 1225 case AttributedType::attr_objc_ownership: 1226 OS << "objc_ownership("; 1227 switch (T->getEquivalentType().getObjCLifetime()) { 1228 case Qualifiers::OCL_None: llvm_unreachable("no ownership!"); 1229 case Qualifiers::OCL_ExplicitNone: OS << "none"; break; 1230 case Qualifiers::OCL_Strong: OS << "strong"; break; 1231 case Qualifiers::OCL_Weak: OS << "weak"; break; 1232 case Qualifiers::OCL_Autoreleasing: OS << "autoreleasing"; break; 1233 } 1234 OS << ')'; 1235 break; 1236 1237 // FIXME: When Sema learns to form this AttributedType, avoid printing the 1238 // attribute again in printFunctionProtoAfter. 1239 case AttributedType::attr_noreturn: OS << "noreturn"; break; 1240 1241 case AttributedType::attr_cdecl: OS << "cdecl"; break; 1242 case AttributedType::attr_fastcall: OS << "fastcall"; break; 1243 case AttributedType::attr_stdcall: OS << "stdcall"; break; 1244 case AttributedType::attr_thiscall: OS << "thiscall"; break; 1245 case AttributedType::attr_vectorcall: OS << "vectorcall"; break; 1246 case AttributedType::attr_pascal: OS << "pascal"; break; 1247 case AttributedType::attr_ms_abi: OS << "ms_abi"; break; 1248 case AttributedType::attr_sysv_abi: OS << "sysv_abi"; break; 1249 case AttributedType::attr_pcs: 1250 case AttributedType::attr_pcs_vfp: { 1251 OS << "pcs("; 1252 QualType t = T->getEquivalentType(); 1253 while (!t->isFunctionType()) 1254 t = t->getPointeeType(); 1255 OS << (t->getAs<FunctionType>()->getCallConv() == CC_AAPCS ? 1256 "\"aapcs\"" : "\"aapcs-vfp\""); 1257 OS << ')'; 1258 break; 1259 } 1260 case AttributedType::attr_pnaclcall: OS << "pnaclcall"; break; 1261 case AttributedType::attr_inteloclbicc: OS << "inteloclbicc"; break; 1262 } 1263 OS << "))"; 1264 } 1265 1266 void TypePrinter::printObjCInterfaceBefore(const ObjCInterfaceType *T, 1267 raw_ostream &OS) { 1268 OS << T->getDecl()->getName(); 1269 spaceBeforePlaceHolder(OS); 1270 } 1271 void TypePrinter::printObjCInterfaceAfter(const ObjCInterfaceType *T, 1272 raw_ostream &OS) { } 1273 1274 void TypePrinter::printObjCObjectBefore(const ObjCObjectType *T, 1275 raw_ostream &OS) { 1276 if (T->qual_empty()) 1277 return printBefore(T->getBaseType(), OS); 1278 1279 print(T->getBaseType(), OS, StringRef()); 1280 OS << '<'; 1281 bool isFirst = true; 1282 for (const auto *I : T->quals()) { 1283 if (isFirst) 1284 isFirst = false; 1285 else 1286 OS << ','; 1287 OS << I->getName(); 1288 } 1289 OS << '>'; 1290 spaceBeforePlaceHolder(OS); 1291 } 1292 void TypePrinter::printObjCObjectAfter(const ObjCObjectType *T, 1293 raw_ostream &OS) { 1294 if (T->qual_empty()) 1295 return printAfter(T->getBaseType(), OS); 1296 } 1297 1298 void TypePrinter::printObjCObjectPointerBefore(const ObjCObjectPointerType *T, 1299 raw_ostream &OS) { 1300 T->getPointeeType().getLocalQualifiers().print(OS, Policy, 1301 /*appendSpaceIfNonEmpty=*/true); 1302 1303 assert(!T->isObjCSelType()); 1304 1305 if (T->isObjCIdType() || T->isObjCQualifiedIdType()) 1306 OS << "id"; 1307 else if (T->isObjCClassType() || T->isObjCQualifiedClassType()) 1308 OS << "Class"; 1309 else 1310 OS << T->getInterfaceDecl()->getName(); 1311 1312 if (!T->qual_empty()) { 1313 OS << '<'; 1314 for (ObjCObjectPointerType::qual_iterator I = T->qual_begin(), 1315 E = T->qual_end(); 1316 I != E; ++I) { 1317 OS << (*I)->getName(); 1318 if (I+1 != E) 1319 OS << ','; 1320 } 1321 OS << '>'; 1322 } 1323 1324 if (!T->isObjCIdType() && !T->isObjCQualifiedIdType() && 1325 !T->isObjCClassType() && !T->isObjCQualifiedClassType()) { 1326 OS << " *"; // Don't forget the implicit pointer. 1327 } else { 1328 spaceBeforePlaceHolder(OS); 1329 } 1330 } 1331 void TypePrinter::printObjCObjectPointerAfter(const ObjCObjectPointerType *T, 1332 raw_ostream &OS) { } 1333 1334 void TemplateSpecializationType:: 1335 PrintTemplateArgumentList(raw_ostream &OS, 1336 const TemplateArgumentListInfo &Args, 1337 const PrintingPolicy &Policy) { 1338 return PrintTemplateArgumentList(OS, 1339 Args.getArgumentArray(), 1340 Args.size(), 1341 Policy); 1342 } 1343 1344 void 1345 TemplateSpecializationType::PrintTemplateArgumentList( 1346 raw_ostream &OS, 1347 const TemplateArgument *Args, 1348 unsigned NumArgs, 1349 const PrintingPolicy &Policy, 1350 bool SkipBrackets) { 1351 if (!SkipBrackets) 1352 OS << '<'; 1353 1354 bool needSpace = false; 1355 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) { 1356 // Print the argument into a string. 1357 SmallString<128> Buf; 1358 llvm::raw_svector_ostream ArgOS(Buf); 1359 if (Args[Arg].getKind() == TemplateArgument::Pack) { 1360 if (Args[Arg].pack_size() && Arg > 0) 1361 OS << ", "; 1362 PrintTemplateArgumentList(ArgOS, 1363 Args[Arg].pack_begin(), 1364 Args[Arg].pack_size(), 1365 Policy, true); 1366 } else { 1367 if (Arg > 0) 1368 OS << ", "; 1369 Args[Arg].print(Policy, ArgOS); 1370 } 1371 StringRef ArgString = ArgOS.str(); 1372 1373 // If this is the first argument and its string representation 1374 // begins with the global scope specifier ('::foo'), add a space 1375 // to avoid printing the diagraph '<:'. 1376 if (!Arg && !ArgString.empty() && ArgString[0] == ':') 1377 OS << ' '; 1378 1379 OS << ArgString; 1380 1381 needSpace = (!ArgString.empty() && ArgString.back() == '>'); 1382 } 1383 1384 // If the last character of our string is '>', add another space to 1385 // keep the two '>''s separate tokens. We don't *have* to do this in 1386 // C++0x, but it's still good hygiene. 1387 if (needSpace) 1388 OS << ' '; 1389 1390 if (!SkipBrackets) 1391 OS << '>'; 1392 } 1393 1394 // Sadly, repeat all that with TemplateArgLoc. 1395 void TemplateSpecializationType:: 1396 PrintTemplateArgumentList(raw_ostream &OS, 1397 const TemplateArgumentLoc *Args, unsigned NumArgs, 1398 const PrintingPolicy &Policy) { 1399 OS << '<'; 1400 1401 bool needSpace = false; 1402 for (unsigned Arg = 0; Arg < NumArgs; ++Arg) { 1403 if (Arg > 0) 1404 OS << ", "; 1405 1406 // Print the argument into a string. 1407 SmallString<128> Buf; 1408 llvm::raw_svector_ostream ArgOS(Buf); 1409 if (Args[Arg].getArgument().getKind() == TemplateArgument::Pack) { 1410 PrintTemplateArgumentList(ArgOS, 1411 Args[Arg].getArgument().pack_begin(), 1412 Args[Arg].getArgument().pack_size(), 1413 Policy, true); 1414 } else { 1415 Args[Arg].getArgument().print(Policy, ArgOS); 1416 } 1417 StringRef ArgString = ArgOS.str(); 1418 1419 // If this is the first argument and its string representation 1420 // begins with the global scope specifier ('::foo'), add a space 1421 // to avoid printing the diagraph '<:'. 1422 if (!Arg && !ArgString.empty() && ArgString[0] == ':') 1423 OS << ' '; 1424 1425 OS << ArgString; 1426 1427 needSpace = (!ArgString.empty() && ArgString.back() == '>'); 1428 } 1429 1430 // If the last character of our string is '>', add another space to 1431 // keep the two '>''s separate tokens. We don't *have* to do this in 1432 // C++0x, but it's still good hygiene. 1433 if (needSpace) 1434 OS << ' '; 1435 1436 OS << '>'; 1437 } 1438 1439 std::string Qualifiers::getAsString() const { 1440 LangOptions LO; 1441 return getAsString(PrintingPolicy(LO)); 1442 } 1443 1444 // Appends qualifiers to the given string, separated by spaces. Will 1445 // prefix a space if the string is non-empty. Will not append a final 1446 // space. 1447 std::string Qualifiers::getAsString(const PrintingPolicy &Policy) const { 1448 SmallString<64> Buf; 1449 llvm::raw_svector_ostream StrOS(Buf); 1450 print(StrOS, Policy); 1451 return StrOS.str(); 1452 } 1453 1454 bool Qualifiers::isEmptyWhenPrinted(const PrintingPolicy &Policy) const { 1455 if (getCVRQualifiers()) 1456 return false; 1457 1458 if (getAddressSpace()) 1459 return false; 1460 1461 if (getObjCGCAttr()) 1462 return false; 1463 1464 if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) 1465 if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)) 1466 return false; 1467 1468 return true; 1469 } 1470 1471 // Appends qualifiers to the given string, separated by spaces. Will 1472 // prefix a space if the string is non-empty. Will not append a final 1473 // space. 1474 void Qualifiers::print(raw_ostream &OS, const PrintingPolicy& Policy, 1475 bool appendSpaceIfNonEmpty) const { 1476 bool addSpace = false; 1477 1478 unsigned quals = getCVRQualifiers(); 1479 if (quals) { 1480 AppendTypeQualList(OS, quals); 1481 addSpace = true; 1482 } 1483 if (unsigned addrspace = getAddressSpace()) { 1484 if (addSpace) 1485 OS << ' '; 1486 addSpace = true; 1487 switch (addrspace) { 1488 case LangAS::opencl_global: 1489 OS << "__global"; 1490 break; 1491 case LangAS::opencl_local: 1492 OS << "__local"; 1493 break; 1494 case LangAS::opencl_constant: 1495 OS << "__constant"; 1496 break; 1497 case LangAS::opencl_generic: 1498 OS << "__generic"; 1499 break; 1500 default: 1501 OS << "__attribute__((address_space("; 1502 OS << addrspace; 1503 OS << ")))"; 1504 } 1505 } 1506 if (Qualifiers::GC gc = getObjCGCAttr()) { 1507 if (addSpace) 1508 OS << ' '; 1509 addSpace = true; 1510 if (gc == Qualifiers::Weak) 1511 OS << "__weak"; 1512 else 1513 OS << "__strong"; 1514 } 1515 if (Qualifiers::ObjCLifetime lifetime = getObjCLifetime()) { 1516 if (!(lifetime == Qualifiers::OCL_Strong && Policy.SuppressStrongLifetime)){ 1517 if (addSpace) 1518 OS << ' '; 1519 addSpace = true; 1520 } 1521 1522 switch (lifetime) { 1523 case Qualifiers::OCL_None: llvm_unreachable("none but true"); 1524 case Qualifiers::OCL_ExplicitNone: OS << "__unsafe_unretained"; break; 1525 case Qualifiers::OCL_Strong: 1526 if (!Policy.SuppressStrongLifetime) 1527 OS << "__strong"; 1528 break; 1529 1530 case Qualifiers::OCL_Weak: OS << "__weak"; break; 1531 case Qualifiers::OCL_Autoreleasing: OS << "__autoreleasing"; break; 1532 } 1533 } 1534 1535 if (appendSpaceIfNonEmpty && addSpace) 1536 OS << ' '; 1537 } 1538 1539 std::string QualType::getAsString(const PrintingPolicy &Policy) const { 1540 std::string S; 1541 getAsStringInternal(S, Policy); 1542 return S; 1543 } 1544 1545 std::string QualType::getAsString(const Type *ty, Qualifiers qs) { 1546 std::string buffer; 1547 LangOptions options; 1548 getAsStringInternal(ty, qs, buffer, PrintingPolicy(options)); 1549 return buffer; 1550 } 1551 1552 void QualType::print(const Type *ty, Qualifiers qs, 1553 raw_ostream &OS, const PrintingPolicy &policy, 1554 const Twine &PlaceHolder) { 1555 SmallString<128> PHBuf; 1556 StringRef PH = PlaceHolder.toStringRef(PHBuf); 1557 1558 TypePrinter(policy).print(ty, qs, OS, PH); 1559 } 1560 1561 void QualType::getAsStringInternal(const Type *ty, Qualifiers qs, 1562 std::string &buffer, 1563 const PrintingPolicy &policy) { 1564 SmallString<256> Buf; 1565 llvm::raw_svector_ostream StrOS(Buf); 1566 TypePrinter(policy).print(ty, qs, StrOS, buffer); 1567 std::string str = StrOS.str(); 1568 buffer.swap(str); 1569 } 1570