1 //===--- StmtPrinter.cpp - Printing implementation for Stmt ASTs ----------===// 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 file implements the Stmt::dumpPretty/Stmt::printPretty methods, which 11 // pretty print the AST back out to C code. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "clang/AST/StmtVisitor.h" 16 #include "clang/AST/DeclCXX.h" 17 #include "clang/AST/DeclObjC.h" 18 #include "clang/AST/DeclTemplate.h" 19 #include "clang/AST/PrettyPrinter.h" 20 #include "clang/AST/Expr.h" 21 #include "clang/AST/ExprCXX.h" 22 #include "llvm/ADT/SmallString.h" 23 using namespace clang; 24 25 //===----------------------------------------------------------------------===// 26 // StmtPrinter Visitor 27 //===----------------------------------------------------------------------===// 28 29 namespace { 30 class StmtPrinter : public StmtVisitor<StmtPrinter> { 31 raw_ostream &OS; 32 ASTContext &Context; 33 unsigned IndentLevel; 34 clang::PrinterHelper* Helper; 35 PrintingPolicy Policy; 36 37 public: 38 StmtPrinter(raw_ostream &os, ASTContext &C, PrinterHelper* helper, 39 const PrintingPolicy &Policy, 40 unsigned Indentation = 0) 41 : OS(os), Context(C), IndentLevel(Indentation), Helper(helper), 42 Policy(Policy) {} 43 44 void PrintStmt(Stmt *S) { 45 PrintStmt(S, Policy.Indentation); 46 } 47 48 void PrintStmt(Stmt *S, int SubIndent) { 49 IndentLevel += SubIndent; 50 if (S && isa<Expr>(S)) { 51 // If this is an expr used in a stmt context, indent and newline it. 52 Indent(); 53 Visit(S); 54 OS << ";\n"; 55 } else if (S) { 56 Visit(S); 57 } else { 58 Indent() << "<<<NULL STATEMENT>>>\n"; 59 } 60 IndentLevel -= SubIndent; 61 } 62 63 void PrintRawCompoundStmt(CompoundStmt *S); 64 void PrintRawDecl(Decl *D); 65 void PrintRawDeclStmt(DeclStmt *S); 66 void PrintRawIfStmt(IfStmt *If); 67 void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); 68 void PrintCallArgs(CallExpr *E); 69 void PrintRawSEHExceptHandler(SEHExceptStmt *S); 70 void PrintRawSEHFinallyStmt(SEHFinallyStmt *S); 71 72 void PrintExpr(Expr *E) { 73 if (E) 74 Visit(E); 75 else 76 OS << "<null expr>"; 77 } 78 79 raw_ostream &Indent(int Delta = 0) { 80 for (int i = 0, e = IndentLevel+Delta; i < e; ++i) 81 OS << " "; 82 return OS; 83 } 84 85 void Visit(Stmt* S) { 86 if (Helper && Helper->handledStmt(S,OS)) 87 return; 88 else StmtVisitor<StmtPrinter>::Visit(S); 89 } 90 91 void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED { 92 Indent() << "<<unknown stmt type>>\n"; 93 } 94 void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED { 95 OS << "<<unknown expr type>>"; 96 } 97 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 98 99 #define ABSTRACT_STMT(CLASS) 100 #define STMT(CLASS, PARENT) \ 101 void Visit##CLASS(CLASS *Node); 102 #include "clang/AST/StmtNodes.inc" 103 }; 104 } 105 106 //===----------------------------------------------------------------------===// 107 // Stmt printing methods. 108 //===----------------------------------------------------------------------===// 109 110 /// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and 111 /// with no newline after the }. 112 void StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { 113 OS << "{\n"; 114 for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end(); 115 I != E; ++I) 116 PrintStmt(*I); 117 118 Indent() << "}"; 119 } 120 121 void StmtPrinter::PrintRawDecl(Decl *D) { 122 D->print(OS, Policy, IndentLevel); 123 } 124 125 void StmtPrinter::PrintRawDeclStmt(DeclStmt *S) { 126 DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end(); 127 SmallVector<Decl*, 2> Decls; 128 for ( ; Begin != End; ++Begin) 129 Decls.push_back(*Begin); 130 131 Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel); 132 } 133 134 void StmtPrinter::VisitNullStmt(NullStmt *Node) { 135 Indent() << ";\n"; 136 } 137 138 void StmtPrinter::VisitDeclStmt(DeclStmt *Node) { 139 Indent(); 140 PrintRawDeclStmt(Node); 141 OS << ";\n"; 142 } 143 144 void StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { 145 Indent(); 146 PrintRawCompoundStmt(Node); 147 OS << "\n"; 148 } 149 150 void StmtPrinter::VisitCaseStmt(CaseStmt *Node) { 151 Indent(-1) << "case "; 152 PrintExpr(Node->getLHS()); 153 if (Node->getRHS()) { 154 OS << " ... "; 155 PrintExpr(Node->getRHS()); 156 } 157 OS << ":\n"; 158 159 PrintStmt(Node->getSubStmt(), 0); 160 } 161 162 void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { 163 Indent(-1) << "default:\n"; 164 PrintStmt(Node->getSubStmt(), 0); 165 } 166 167 void StmtPrinter::VisitLabelStmt(LabelStmt *Node) { 168 Indent(-1) << Node->getName() << ":\n"; 169 PrintStmt(Node->getSubStmt(), 0); 170 } 171 172 void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) { 173 OS << "[["; 174 bool first = true; 175 for (AttrVec::const_iterator it = Node->getAttrs().begin(), 176 end = Node->getAttrs().end(); 177 it != end; ++it) { 178 if (!first) { 179 OS << ", "; 180 first = false; 181 } 182 // TODO: check this 183 (*it)->printPretty(OS, Context); 184 } 185 OS << "]] "; 186 PrintStmt(Node->getSubStmt(), 0); 187 } 188 189 void StmtPrinter::PrintRawIfStmt(IfStmt *If) { 190 OS << "if ("; 191 PrintExpr(If->getCond()); 192 OS << ')'; 193 194 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { 195 OS << ' '; 196 PrintRawCompoundStmt(CS); 197 OS << (If->getElse() ? ' ' : '\n'); 198 } else { 199 OS << '\n'; 200 PrintStmt(If->getThen()); 201 if (If->getElse()) Indent(); 202 } 203 204 if (Stmt *Else = If->getElse()) { 205 OS << "else"; 206 207 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) { 208 OS << ' '; 209 PrintRawCompoundStmt(CS); 210 OS << '\n'; 211 } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) { 212 OS << ' '; 213 PrintRawIfStmt(ElseIf); 214 } else { 215 OS << '\n'; 216 PrintStmt(If->getElse()); 217 } 218 } 219 } 220 221 void StmtPrinter::VisitIfStmt(IfStmt *If) { 222 Indent(); 223 PrintRawIfStmt(If); 224 } 225 226 void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { 227 Indent() << "switch ("; 228 PrintExpr(Node->getCond()); 229 OS << ")"; 230 231 // Pretty print compoundstmt bodies (very common). 232 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 233 OS << " "; 234 PrintRawCompoundStmt(CS); 235 OS << "\n"; 236 } else { 237 OS << "\n"; 238 PrintStmt(Node->getBody()); 239 } 240 } 241 242 void StmtPrinter::VisitWhileStmt(WhileStmt *Node) { 243 Indent() << "while ("; 244 PrintExpr(Node->getCond()); 245 OS << ")\n"; 246 PrintStmt(Node->getBody()); 247 } 248 249 void StmtPrinter::VisitDoStmt(DoStmt *Node) { 250 Indent() << "do "; 251 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 252 PrintRawCompoundStmt(CS); 253 OS << " "; 254 } else { 255 OS << "\n"; 256 PrintStmt(Node->getBody()); 257 Indent(); 258 } 259 260 OS << "while ("; 261 PrintExpr(Node->getCond()); 262 OS << ");\n"; 263 } 264 265 void StmtPrinter::VisitForStmt(ForStmt *Node) { 266 Indent() << "for ("; 267 if (Node->getInit()) { 268 if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit())) 269 PrintRawDeclStmt(DS); 270 else 271 PrintExpr(cast<Expr>(Node->getInit())); 272 } 273 OS << ";"; 274 if (Node->getCond()) { 275 OS << " "; 276 PrintExpr(Node->getCond()); 277 } 278 OS << ";"; 279 if (Node->getInc()) { 280 OS << " "; 281 PrintExpr(Node->getInc()); 282 } 283 OS << ") "; 284 285 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 286 PrintRawCompoundStmt(CS); 287 OS << "\n"; 288 } else { 289 OS << "\n"; 290 PrintStmt(Node->getBody()); 291 } 292 } 293 294 void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { 295 Indent() << "for ("; 296 if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement())) 297 PrintRawDeclStmt(DS); 298 else 299 PrintExpr(cast<Expr>(Node->getElement())); 300 OS << " in "; 301 PrintExpr(Node->getCollection()); 302 OS << ") "; 303 304 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 305 PrintRawCompoundStmt(CS); 306 OS << "\n"; 307 } else { 308 OS << "\n"; 309 PrintStmt(Node->getBody()); 310 } 311 } 312 313 void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) { 314 Indent() << "for ("; 315 PrintingPolicy SubPolicy(Policy); 316 SubPolicy.SuppressInitializers = true; 317 Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel); 318 OS << " : "; 319 PrintExpr(Node->getRangeInit()); 320 OS << ") {\n"; 321 PrintStmt(Node->getBody()); 322 Indent() << "}\n"; 323 } 324 325 void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) { 326 Indent(); 327 if (Node->isIfExists()) 328 OS << "__if_exists ("; 329 else 330 OS << "__if_not_exists ("; 331 332 if (NestedNameSpecifier *Qualifier 333 = Node->getQualifierLoc().getNestedNameSpecifier()) 334 Qualifier->print(OS, Policy); 335 336 OS << Node->getNameInfo() << ") "; 337 338 PrintRawCompoundStmt(Node->getSubStmt()); 339 } 340 341 void StmtPrinter::VisitGotoStmt(GotoStmt *Node) { 342 Indent() << "goto " << Node->getLabel()->getName() << ";\n"; 343 } 344 345 void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { 346 Indent() << "goto *"; 347 PrintExpr(Node->getTarget()); 348 OS << ";\n"; 349 } 350 351 void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { 352 Indent() << "continue;\n"; 353 } 354 355 void StmtPrinter::VisitBreakStmt(BreakStmt *Node) { 356 Indent() << "break;\n"; 357 } 358 359 360 void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { 361 Indent() << "return"; 362 if (Node->getRetValue()) { 363 OS << " "; 364 PrintExpr(Node->getRetValue()); 365 } 366 OS << ";\n"; 367 } 368 369 370 void StmtPrinter::VisitAsmStmt(AsmStmt *Node) { 371 Indent() << "asm "; 372 373 if (Node->isVolatile()) 374 OS << "volatile "; 375 376 OS << "("; 377 VisitStringLiteral(Node->getAsmString()); 378 379 // Outputs 380 if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 || 381 Node->getNumClobbers() != 0) 382 OS << " : "; 383 384 for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) { 385 if (i != 0) 386 OS << ", "; 387 388 if (!Node->getOutputName(i).empty()) { 389 OS << '['; 390 OS << Node->getOutputName(i); 391 OS << "] "; 392 } 393 394 VisitStringLiteral(Node->getOutputConstraintLiteral(i)); 395 OS << " "; 396 Visit(Node->getOutputExpr(i)); 397 } 398 399 // Inputs 400 if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0) 401 OS << " : "; 402 403 for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) { 404 if (i != 0) 405 OS << ", "; 406 407 if (!Node->getInputName(i).empty()) { 408 OS << '['; 409 OS << Node->getInputName(i); 410 OS << "] "; 411 } 412 413 VisitStringLiteral(Node->getInputConstraintLiteral(i)); 414 OS << " "; 415 Visit(Node->getInputExpr(i)); 416 } 417 418 // Clobbers 419 if (Node->getNumClobbers() != 0) 420 OS << " : "; 421 422 for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) { 423 if (i != 0) 424 OS << ", "; 425 426 VisitStringLiteral(Node->getClobber(i)); 427 } 428 429 OS << ");\n"; 430 } 431 432 void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) { 433 // FIXME: Implement MS style inline asm statement printer. 434 Indent() << "asm ()"; 435 } 436 437 void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { 438 Indent() << "@try"; 439 if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) { 440 PrintRawCompoundStmt(TS); 441 OS << "\n"; 442 } 443 444 for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { 445 ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I); 446 Indent() << "@catch("; 447 if (catchStmt->getCatchParamDecl()) { 448 if (Decl *DS = catchStmt->getCatchParamDecl()) 449 PrintRawDecl(DS); 450 } 451 OS << ")"; 452 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) { 453 PrintRawCompoundStmt(CS); 454 OS << "\n"; 455 } 456 } 457 458 if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>( 459 Node->getFinallyStmt())) { 460 Indent() << "@finally"; 461 PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody())); 462 OS << "\n"; 463 } 464 } 465 466 void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { 467 } 468 469 void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { 470 Indent() << "@catch (...) { /* todo */ } \n"; 471 } 472 473 void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { 474 Indent() << "@throw"; 475 if (Node->getThrowExpr()) { 476 OS << " "; 477 PrintExpr(Node->getThrowExpr()); 478 } 479 OS << ";\n"; 480 } 481 482 void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { 483 Indent() << "@synchronized ("; 484 PrintExpr(Node->getSynchExpr()); 485 OS << ")"; 486 PrintRawCompoundStmt(Node->getSynchBody()); 487 OS << "\n"; 488 } 489 490 void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) { 491 Indent() << "@autoreleasepool"; 492 PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt())); 493 OS << "\n"; 494 } 495 496 void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { 497 OS << "catch ("; 498 if (Decl *ExDecl = Node->getExceptionDecl()) 499 PrintRawDecl(ExDecl); 500 else 501 OS << "..."; 502 OS << ") "; 503 PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock())); 504 } 505 506 void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { 507 Indent(); 508 PrintRawCXXCatchStmt(Node); 509 OS << "\n"; 510 } 511 512 void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { 513 Indent() << "try "; 514 PrintRawCompoundStmt(Node->getTryBlock()); 515 for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) { 516 OS << " "; 517 PrintRawCXXCatchStmt(Node->getHandler(i)); 518 } 519 OS << "\n"; 520 } 521 522 void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) { 523 Indent() << (Node->getIsCXXTry() ? "try " : "__try "); 524 PrintRawCompoundStmt(Node->getTryBlock()); 525 SEHExceptStmt *E = Node->getExceptHandler(); 526 SEHFinallyStmt *F = Node->getFinallyHandler(); 527 if(E) 528 PrintRawSEHExceptHandler(E); 529 else { 530 assert(F && "Must have a finally block..."); 531 PrintRawSEHFinallyStmt(F); 532 } 533 OS << "\n"; 534 } 535 536 void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) { 537 OS << "__finally "; 538 PrintRawCompoundStmt(Node->getBlock()); 539 OS << "\n"; 540 } 541 542 void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) { 543 OS << "__except ("; 544 VisitExpr(Node->getFilterExpr()); 545 OS << ")\n"; 546 PrintRawCompoundStmt(Node->getBlock()); 547 OS << "\n"; 548 } 549 550 void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) { 551 Indent(); 552 PrintRawSEHExceptHandler(Node); 553 OS << "\n"; 554 } 555 556 void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) { 557 Indent(); 558 PrintRawSEHFinallyStmt(Node); 559 OS << "\n"; 560 } 561 562 //===----------------------------------------------------------------------===// 563 // Expr printing methods. 564 //===----------------------------------------------------------------------===// 565 566 void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { 567 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 568 Qualifier->print(OS, Policy); 569 if (Node->hasTemplateKeyword()) 570 OS << "template "; 571 OS << Node->getNameInfo(); 572 if (Node->hasExplicitTemplateArgs()) 573 OS << TemplateSpecializationType::PrintTemplateArgumentList( 574 Node->getTemplateArgs(), 575 Node->getNumTemplateArgs(), 576 Policy); 577 } 578 579 void StmtPrinter::VisitDependentScopeDeclRefExpr( 580 DependentScopeDeclRefExpr *Node) { 581 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 582 Qualifier->print(OS, Policy); 583 if (Node->hasTemplateKeyword()) 584 OS << "template "; 585 OS << Node->getNameInfo(); 586 if (Node->hasExplicitTemplateArgs()) 587 OS << TemplateSpecializationType::PrintTemplateArgumentList( 588 Node->getTemplateArgs(), 589 Node->getNumTemplateArgs(), 590 Policy); 591 } 592 593 void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 594 if (Node->getQualifier()) 595 Node->getQualifier()->print(OS, Policy); 596 if (Node->hasTemplateKeyword()) 597 OS << "template "; 598 OS << Node->getNameInfo(); 599 if (Node->hasExplicitTemplateArgs()) 600 OS << TemplateSpecializationType::PrintTemplateArgumentList( 601 Node->getTemplateArgs(), 602 Node->getNumTemplateArgs(), 603 Policy); 604 } 605 606 void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 607 if (Node->getBase()) { 608 PrintExpr(Node->getBase()); 609 OS << (Node->isArrow() ? "->" : "."); 610 } 611 OS << *Node->getDecl(); 612 } 613 614 void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 615 if (Node->isSuperReceiver()) 616 OS << "super."; 617 else if (Node->getBase()) { 618 PrintExpr(Node->getBase()); 619 OS << "."; 620 } 621 622 if (Node->isImplicitProperty()) 623 OS << Node->getImplicitPropertyGetter()->getSelector().getAsString(); 624 else 625 OS << Node->getExplicitProperty()->getName(); 626 } 627 628 void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) { 629 630 PrintExpr(Node->getBaseExpr()); 631 OS << "["; 632 PrintExpr(Node->getKeyExpr()); 633 OS << "]"; 634 } 635 636 void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) { 637 switch (Node->getIdentType()) { 638 default: 639 llvm_unreachable("unknown case"); 640 case PredefinedExpr::Func: 641 OS << "__func__"; 642 break; 643 case PredefinedExpr::Function: 644 OS << "__FUNCTION__"; 645 break; 646 case PredefinedExpr::LFunction: 647 OS << "L__FUNCTION__"; 648 break; 649 case PredefinedExpr::PrettyFunction: 650 OS << "__PRETTY_FUNCTION__"; 651 break; 652 } 653 } 654 655 void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { 656 unsigned value = Node->getValue(); 657 658 switch (Node->getKind()) { 659 case CharacterLiteral::Ascii: break; // no prefix. 660 case CharacterLiteral::Wide: OS << 'L'; break; 661 case CharacterLiteral::UTF16: OS << 'u'; break; 662 case CharacterLiteral::UTF32: OS << 'U'; break; 663 } 664 665 switch (value) { 666 case '\\': 667 OS << "'\\\\'"; 668 break; 669 case '\'': 670 OS << "'\\''"; 671 break; 672 case '\a': 673 // TODO: K&R: the meaning of '\\a' is different in traditional C 674 OS << "'\\a'"; 675 break; 676 case '\b': 677 OS << "'\\b'"; 678 break; 679 // Nonstandard escape sequence. 680 /*case '\e': 681 OS << "'\\e'"; 682 break;*/ 683 case '\f': 684 OS << "'\\f'"; 685 break; 686 case '\n': 687 OS << "'\\n'"; 688 break; 689 case '\r': 690 OS << "'\\r'"; 691 break; 692 case '\t': 693 OS << "'\\t'"; 694 break; 695 case '\v': 696 OS << "'\\v'"; 697 break; 698 default: 699 if (value < 256 && isprint(value)) { 700 OS << "'" << (char)value << "'"; 701 } else if (value < 256) { 702 OS << "'\\x"; 703 OS.write_hex(value) << "'"; 704 } else { 705 // FIXME what to really do here? 706 OS << value; 707 } 708 } 709 } 710 711 void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { 712 bool isSigned = Node->getType()->isSignedIntegerType(); 713 OS << Node->getValue().toString(10, isSigned); 714 715 // Emit suffixes. Integer literals are always a builtin integer type. 716 switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 717 default: llvm_unreachable("Unexpected type for integer literal!"); 718 // FIXME: The Short and UShort cases are to handle cases where a short 719 // integeral literal is formed during template instantiation. They should 720 // be removed when template instantiation no longer needs integer literals. 721 case BuiltinType::Short: 722 case BuiltinType::UShort: 723 case BuiltinType::Int: break; // no suffix. 724 case BuiltinType::UInt: OS << 'U'; break; 725 case BuiltinType::Long: OS << 'L'; break; 726 case BuiltinType::ULong: OS << "UL"; break; 727 case BuiltinType::LongLong: OS << "LL"; break; 728 case BuiltinType::ULongLong: OS << "ULL"; break; 729 case BuiltinType::Int128: OS << "i128"; break; 730 case BuiltinType::UInt128: OS << "Ui128"; break; 731 } 732 } 733 void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { 734 SmallString<16> Str; 735 Node->getValue().toString(Str); 736 OS << Str; 737 } 738 739 void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { 740 PrintExpr(Node->getSubExpr()); 741 OS << "i"; 742 } 743 744 void StmtPrinter::VisitStringLiteral(StringLiteral *Str) { 745 Str->outputString(OS); 746 } 747 void StmtPrinter::VisitParenExpr(ParenExpr *Node) { 748 OS << "("; 749 PrintExpr(Node->getSubExpr()); 750 OS << ")"; 751 } 752 void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) { 753 if (!Node->isPostfix()) { 754 OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 755 756 // Print a space if this is an "identifier operator" like __real, or if 757 // it might be concatenated incorrectly like '+'. 758 switch (Node->getOpcode()) { 759 default: break; 760 case UO_Real: 761 case UO_Imag: 762 case UO_Extension: 763 OS << ' '; 764 break; 765 case UO_Plus: 766 case UO_Minus: 767 if (isa<UnaryOperator>(Node->getSubExpr())) 768 OS << ' '; 769 break; 770 } 771 } 772 PrintExpr(Node->getSubExpr()); 773 774 if (Node->isPostfix()) 775 OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 776 } 777 778 void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) { 779 OS << "__builtin_offsetof("; 780 OS << Node->getTypeSourceInfo()->getType().getAsString(Policy) << ", "; 781 bool PrintedSomething = false; 782 for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) { 783 OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i); 784 if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) { 785 // Array node 786 OS << "["; 787 PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex())); 788 OS << "]"; 789 PrintedSomething = true; 790 continue; 791 } 792 793 // Skip implicit base indirections. 794 if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Base) 795 continue; 796 797 // Field or identifier node. 798 IdentifierInfo *Id = ON.getFieldName(); 799 if (!Id) 800 continue; 801 802 if (PrintedSomething) 803 OS << "."; 804 else 805 PrintedSomething = true; 806 OS << Id->getName(); 807 } 808 OS << ")"; 809 } 810 811 void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){ 812 switch(Node->getKind()) { 813 case UETT_SizeOf: 814 OS << "sizeof"; 815 break; 816 case UETT_AlignOf: 817 OS << "__alignof"; 818 break; 819 case UETT_VecStep: 820 OS << "vec_step"; 821 break; 822 } 823 if (Node->isArgumentType()) 824 OS << "(" << Node->getArgumentType().getAsString(Policy) << ")"; 825 else { 826 OS << " "; 827 PrintExpr(Node->getArgumentExpr()); 828 } 829 } 830 831 void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) { 832 OS << "_Generic("; 833 PrintExpr(Node->getControllingExpr()); 834 for (unsigned i = 0; i != Node->getNumAssocs(); ++i) { 835 OS << ", "; 836 QualType T = Node->getAssocType(i); 837 if (T.isNull()) 838 OS << "default"; 839 else 840 OS << T.getAsString(Policy); 841 OS << ": "; 842 PrintExpr(Node->getAssocExpr(i)); 843 } 844 OS << ")"; 845 } 846 847 void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { 848 PrintExpr(Node->getLHS()); 849 OS << "["; 850 PrintExpr(Node->getRHS()); 851 OS << "]"; 852 } 853 854 void StmtPrinter::PrintCallArgs(CallExpr *Call) { 855 for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { 856 if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { 857 // Don't print any defaulted arguments 858 break; 859 } 860 861 if (i) OS << ", "; 862 PrintExpr(Call->getArg(i)); 863 } 864 } 865 866 void StmtPrinter::VisitCallExpr(CallExpr *Call) { 867 PrintExpr(Call->getCallee()); 868 OS << "("; 869 PrintCallArgs(Call); 870 OS << ")"; 871 } 872 void StmtPrinter::VisitMemberExpr(MemberExpr *Node) { 873 // FIXME: Suppress printing implicit bases (like "this") 874 PrintExpr(Node->getBase()); 875 if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl())) 876 if (FD->isAnonymousStructOrUnion()) 877 return; 878 OS << (Node->isArrow() ? "->" : "."); 879 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 880 Qualifier->print(OS, Policy); 881 if (Node->hasTemplateKeyword()) 882 OS << "template "; 883 OS << Node->getMemberNameInfo(); 884 if (Node->hasExplicitTemplateArgs()) 885 OS << TemplateSpecializationType::PrintTemplateArgumentList( 886 Node->getTemplateArgs(), 887 Node->getNumTemplateArgs(), 888 Policy); 889 } 890 void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) { 891 PrintExpr(Node->getBase()); 892 OS << (Node->isArrow() ? "->isa" : ".isa"); 893 } 894 895 void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 896 PrintExpr(Node->getBase()); 897 OS << "."; 898 OS << Node->getAccessor().getName(); 899 } 900 void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { 901 OS << "(" << Node->getType().getAsString(Policy) << ")"; 902 PrintExpr(Node->getSubExpr()); 903 } 904 void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { 905 OS << "(" << Node->getType().getAsString(Policy) << ")"; 906 PrintExpr(Node->getInitializer()); 907 } 908 void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 909 // No need to print anything, simply forward to the sub expression. 910 PrintExpr(Node->getSubExpr()); 911 } 912 void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) { 913 PrintExpr(Node->getLHS()); 914 OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 915 PrintExpr(Node->getRHS()); 916 } 917 void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 918 PrintExpr(Node->getLHS()); 919 OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 920 PrintExpr(Node->getRHS()); 921 } 922 void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) { 923 PrintExpr(Node->getCond()); 924 OS << " ? "; 925 PrintExpr(Node->getLHS()); 926 OS << " : "; 927 PrintExpr(Node->getRHS()); 928 } 929 930 // GNU extensions. 931 932 void 933 StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) { 934 PrintExpr(Node->getCommon()); 935 OS << " ?: "; 936 PrintExpr(Node->getFalseExpr()); 937 } 938 void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) { 939 OS << "&&" << Node->getLabel()->getName(); 940 } 941 942 void StmtPrinter::VisitStmtExpr(StmtExpr *E) { 943 OS << "("; 944 PrintRawCompoundStmt(E->getSubStmt()); 945 OS << ")"; 946 } 947 948 void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) { 949 OS << "__builtin_choose_expr("; 950 PrintExpr(Node->getCond()); 951 OS << ", "; 952 PrintExpr(Node->getLHS()); 953 OS << ", "; 954 PrintExpr(Node->getRHS()); 955 OS << ")"; 956 } 957 958 void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) { 959 OS << "__null"; 960 } 961 962 void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) { 963 OS << "__builtin_shufflevector("; 964 for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) { 965 if (i) OS << ", "; 966 PrintExpr(Node->getExpr(i)); 967 } 968 OS << ")"; 969 } 970 971 void StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 972 if (Node->getSyntacticForm()) { 973 Visit(Node->getSyntacticForm()); 974 return; 975 } 976 977 OS << "{ "; 978 for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) { 979 if (i) OS << ", "; 980 if (Node->getInit(i)) 981 PrintExpr(Node->getInit(i)); 982 else 983 OS << "0"; 984 } 985 OS << " }"; 986 } 987 988 void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) { 989 OS << "( "; 990 for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) { 991 if (i) OS << ", "; 992 PrintExpr(Node->getExpr(i)); 993 } 994 OS << " )"; 995 } 996 997 void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { 998 for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), 999 DEnd = Node->designators_end(); 1000 D != DEnd; ++D) { 1001 if (D->isFieldDesignator()) { 1002 if (D->getDotLoc().isInvalid()) 1003 OS << D->getFieldName()->getName() << ":"; 1004 else 1005 OS << "." << D->getFieldName()->getName(); 1006 } else { 1007 OS << "["; 1008 if (D->isArrayDesignator()) { 1009 PrintExpr(Node->getArrayIndex(*D)); 1010 } else { 1011 PrintExpr(Node->getArrayRangeStart(*D)); 1012 OS << " ... "; 1013 PrintExpr(Node->getArrayRangeEnd(*D)); 1014 } 1015 OS << "]"; 1016 } 1017 } 1018 1019 OS << " = "; 1020 PrintExpr(Node->getInit()); 1021 } 1022 1023 void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) { 1024 if (Policy.LangOpts.CPlusPlus) 1025 OS << "/*implicit*/" << Node->getType().getAsString(Policy) << "()"; 1026 else { 1027 OS << "/*implicit*/(" << Node->getType().getAsString(Policy) << ")"; 1028 if (Node->getType()->isRecordType()) 1029 OS << "{}"; 1030 else 1031 OS << 0; 1032 } 1033 } 1034 1035 void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) { 1036 OS << "__builtin_va_arg("; 1037 PrintExpr(Node->getSubExpr()); 1038 OS << ", "; 1039 OS << Node->getType().getAsString(Policy); 1040 OS << ")"; 1041 } 1042 1043 void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) { 1044 PrintExpr(Node->getSyntacticForm()); 1045 } 1046 1047 void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) { 1048 const char *Name = 0; 1049 switch (Node->getOp()) { 1050 #define BUILTIN(ID, TYPE, ATTRS) 1051 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \ 1052 case AtomicExpr::AO ## ID: \ 1053 Name = #ID "("; \ 1054 break; 1055 #include "clang/Basic/Builtins.def" 1056 } 1057 OS << Name; 1058 1059 // AtomicExpr stores its subexpressions in a permuted order. 1060 PrintExpr(Node->getPtr()); 1061 OS << ", "; 1062 if (Node->getOp() != AtomicExpr::AO__c11_atomic_load && 1063 Node->getOp() != AtomicExpr::AO__atomic_load_n) { 1064 PrintExpr(Node->getVal1()); 1065 OS << ", "; 1066 } 1067 if (Node->getOp() == AtomicExpr::AO__atomic_exchange || 1068 Node->isCmpXChg()) { 1069 PrintExpr(Node->getVal2()); 1070 OS << ", "; 1071 } 1072 if (Node->getOp() == AtomicExpr::AO__atomic_compare_exchange || 1073 Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) { 1074 PrintExpr(Node->getWeak()); 1075 OS << ", "; 1076 } 1077 if (Node->getOp() != AtomicExpr::AO__c11_atomic_init) 1078 PrintExpr(Node->getOrder()); 1079 if (Node->isCmpXChg()) { 1080 OS << ", "; 1081 PrintExpr(Node->getOrderFail()); 1082 } 1083 OS << ")"; 1084 } 1085 1086 // C++ 1087 void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { 1088 const char *OpStrings[NUM_OVERLOADED_OPERATORS] = { 1089 "", 1090 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 1091 Spelling, 1092 #include "clang/Basic/OperatorKinds.def" 1093 }; 1094 1095 OverloadedOperatorKind Kind = Node->getOperator(); 1096 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 1097 if (Node->getNumArgs() == 1) { 1098 OS << OpStrings[Kind] << ' '; 1099 PrintExpr(Node->getArg(0)); 1100 } else { 1101 PrintExpr(Node->getArg(0)); 1102 OS << ' ' << OpStrings[Kind]; 1103 } 1104 } else if (Kind == OO_Call) { 1105 PrintExpr(Node->getArg(0)); 1106 OS << '('; 1107 for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) { 1108 if (ArgIdx > 1) 1109 OS << ", "; 1110 if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx))) 1111 PrintExpr(Node->getArg(ArgIdx)); 1112 } 1113 OS << ')'; 1114 } else if (Kind == OO_Subscript) { 1115 PrintExpr(Node->getArg(0)); 1116 OS << '['; 1117 PrintExpr(Node->getArg(1)); 1118 OS << ']'; 1119 } else if (Node->getNumArgs() == 1) { 1120 OS << OpStrings[Kind] << ' '; 1121 PrintExpr(Node->getArg(0)); 1122 } else if (Node->getNumArgs() == 2) { 1123 PrintExpr(Node->getArg(0)); 1124 OS << ' ' << OpStrings[Kind] << ' '; 1125 PrintExpr(Node->getArg(1)); 1126 } else { 1127 llvm_unreachable("unknown overloaded operator"); 1128 } 1129 } 1130 1131 void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { 1132 VisitCallExpr(cast<CallExpr>(Node)); 1133 } 1134 1135 void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) { 1136 PrintExpr(Node->getCallee()); 1137 OS << "<<<"; 1138 PrintCallArgs(Node->getConfig()); 1139 OS << ">>>("; 1140 PrintCallArgs(Node); 1141 OS << ")"; 1142 } 1143 1144 void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 1145 OS << Node->getCastName() << '<'; 1146 OS << Node->getTypeAsWritten().getAsString(Policy) << ">("; 1147 PrintExpr(Node->getSubExpr()); 1148 OS << ")"; 1149 } 1150 1151 void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) { 1152 VisitCXXNamedCastExpr(Node); 1153 } 1154 1155 void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) { 1156 VisitCXXNamedCastExpr(Node); 1157 } 1158 1159 void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) { 1160 VisitCXXNamedCastExpr(Node); 1161 } 1162 1163 void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) { 1164 VisitCXXNamedCastExpr(Node); 1165 } 1166 1167 void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { 1168 OS << "typeid("; 1169 if (Node->isTypeOperand()) { 1170 OS << Node->getTypeOperand().getAsString(Policy); 1171 } else { 1172 PrintExpr(Node->getExprOperand()); 1173 } 1174 OS << ")"; 1175 } 1176 1177 void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) { 1178 OS << "__uuidof("; 1179 if (Node->isTypeOperand()) { 1180 OS << Node->getTypeOperand().getAsString(Policy); 1181 } else { 1182 PrintExpr(Node->getExprOperand()); 1183 } 1184 OS << ")"; 1185 } 1186 1187 void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) { 1188 switch (Node->getLiteralOperatorKind()) { 1189 case UserDefinedLiteral::LOK_Raw: 1190 OS << cast<StringLiteral>(Node->getArg(0)->IgnoreImpCasts())->getString(); 1191 break; 1192 case UserDefinedLiteral::LOK_Template: { 1193 DeclRefExpr *DRE = cast<DeclRefExpr>(Node->getCallee()->IgnoreImpCasts()); 1194 const TemplateArgumentList *Args = 1195 cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs(); 1196 assert(Args); 1197 const TemplateArgument &Pack = Args->get(0); 1198 for (TemplateArgument::pack_iterator I = Pack.pack_begin(), 1199 E = Pack.pack_end(); I != E; ++I) { 1200 char C = (char)I->getAsIntegral().getZExtValue(); 1201 OS << C; 1202 } 1203 break; 1204 } 1205 case UserDefinedLiteral::LOK_Integer: { 1206 // Print integer literal without suffix. 1207 IntegerLiteral *Int = cast<IntegerLiteral>(Node->getCookedLiteral()); 1208 OS << Int->getValue().toString(10, /*isSigned*/false); 1209 break; 1210 } 1211 case UserDefinedLiteral::LOK_Floating: 1212 case UserDefinedLiteral::LOK_String: 1213 case UserDefinedLiteral::LOK_Character: 1214 PrintExpr(Node->getCookedLiteral()); 1215 break; 1216 } 1217 OS << Node->getUDSuffix()->getName(); 1218 } 1219 1220 void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 1221 OS << (Node->getValue() ? "true" : "false"); 1222 } 1223 1224 void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { 1225 OS << "nullptr"; 1226 } 1227 1228 void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { 1229 OS << "this"; 1230 } 1231 1232 void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) { 1233 if (Node->getSubExpr() == 0) 1234 OS << "throw"; 1235 else { 1236 OS << "throw "; 1237 PrintExpr(Node->getSubExpr()); 1238 } 1239 } 1240 1241 void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { 1242 // Nothing to print: we picked up the default argument 1243 } 1244 1245 void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 1246 OS << Node->getType().getAsString(Policy); 1247 OS << "("; 1248 PrintExpr(Node->getSubExpr()); 1249 OS << ")"; 1250 } 1251 1252 void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 1253 PrintExpr(Node->getSubExpr()); 1254 } 1255 1256 void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { 1257 OS << Node->getType().getAsString(Policy); 1258 OS << "("; 1259 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(), 1260 ArgEnd = Node->arg_end(); 1261 Arg != ArgEnd; ++Arg) { 1262 if (Arg != Node->arg_begin()) 1263 OS << ", "; 1264 PrintExpr(*Arg); 1265 } 1266 OS << ")"; 1267 } 1268 1269 void StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) { 1270 OS << '['; 1271 bool NeedComma = false; 1272 switch (Node->getCaptureDefault()) { 1273 case LCD_None: 1274 break; 1275 1276 case LCD_ByCopy: 1277 OS << '='; 1278 NeedComma = true; 1279 break; 1280 1281 case LCD_ByRef: 1282 OS << '&'; 1283 NeedComma = true; 1284 break; 1285 } 1286 for (LambdaExpr::capture_iterator C = Node->explicit_capture_begin(), 1287 CEnd = Node->explicit_capture_end(); 1288 C != CEnd; 1289 ++C) { 1290 if (NeedComma) 1291 OS << ", "; 1292 NeedComma = true; 1293 1294 switch (C->getCaptureKind()) { 1295 case LCK_This: 1296 OS << "this"; 1297 break; 1298 1299 case LCK_ByRef: 1300 if (Node->getCaptureDefault() != LCD_ByRef) 1301 OS << '&'; 1302 OS << C->getCapturedVar()->getName(); 1303 break; 1304 1305 case LCK_ByCopy: 1306 if (Node->getCaptureDefault() != LCD_ByCopy) 1307 OS << '='; 1308 OS << C->getCapturedVar()->getName(); 1309 break; 1310 } 1311 } 1312 OS << ']'; 1313 1314 if (Node->hasExplicitParameters()) { 1315 OS << " ("; 1316 CXXMethodDecl *Method = Node->getCallOperator(); 1317 NeedComma = false; 1318 for (CXXMethodDecl::param_iterator P = Method->param_begin(), 1319 PEnd = Method->param_end(); 1320 P != PEnd; ++P) { 1321 if (NeedComma) { 1322 OS << ", "; 1323 } else { 1324 NeedComma = true; 1325 } 1326 std::string ParamStr = (*P)->getNameAsString(); 1327 (*P)->getOriginalType().getAsStringInternal(ParamStr, Policy); 1328 OS << ParamStr; 1329 } 1330 if (Method->isVariadic()) { 1331 if (NeedComma) 1332 OS << ", "; 1333 OS << "..."; 1334 } 1335 OS << ')'; 1336 1337 if (Node->isMutable()) 1338 OS << " mutable"; 1339 1340 const FunctionProtoType *Proto 1341 = Method->getType()->getAs<FunctionProtoType>(); 1342 { 1343 std::string ExceptionSpec; 1344 Proto->printExceptionSpecification(ExceptionSpec, Policy); 1345 OS << ExceptionSpec; 1346 } 1347 1348 // FIXME: Attributes 1349 1350 // Print the trailing return type if it was specified in the source. 1351 if (Node->hasExplicitResultType()) 1352 OS << " -> " << Proto->getResultType().getAsString(Policy); 1353 } 1354 1355 // Print the body. 1356 CompoundStmt *Body = Node->getBody(); 1357 OS << ' '; 1358 PrintStmt(Body); 1359 } 1360 1361 void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) { 1362 if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo()) 1363 OS << TSInfo->getType().getAsString(Policy) << "()"; 1364 else 1365 OS << Node->getType().getAsString(Policy) << "()"; 1366 } 1367 1368 void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { 1369 if (E->isGlobalNew()) 1370 OS << "::"; 1371 OS << "new "; 1372 unsigned NumPlace = E->getNumPlacementArgs(); 1373 if (NumPlace > 0) { 1374 OS << "("; 1375 PrintExpr(E->getPlacementArg(0)); 1376 for (unsigned i = 1; i < NumPlace; ++i) { 1377 OS << ", "; 1378 PrintExpr(E->getPlacementArg(i)); 1379 } 1380 OS << ") "; 1381 } 1382 if (E->isParenTypeId()) 1383 OS << "("; 1384 std::string TypeS; 1385 if (Expr *Size = E->getArraySize()) { 1386 llvm::raw_string_ostream s(TypeS); 1387 Size->printPretty(s, Context, Helper, Policy); 1388 s.flush(); 1389 TypeS = "[" + TypeS + "]"; 1390 } 1391 E->getAllocatedType().getAsStringInternal(TypeS, Policy); 1392 OS << TypeS; 1393 if (E->isParenTypeId()) 1394 OS << ")"; 1395 1396 CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle(); 1397 if (InitStyle) { 1398 if (InitStyle == CXXNewExpr::CallInit) 1399 OS << "("; 1400 PrintExpr(E->getInitializer()); 1401 if (InitStyle == CXXNewExpr::CallInit) 1402 OS << ")"; 1403 } 1404 } 1405 1406 void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 1407 if (E->isGlobalDelete()) 1408 OS << "::"; 1409 OS << "delete "; 1410 if (E->isArrayForm()) 1411 OS << "[] "; 1412 PrintExpr(E->getArgument()); 1413 } 1414 1415 void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1416 PrintExpr(E->getBase()); 1417 if (E->isArrow()) 1418 OS << "->"; 1419 else 1420 OS << '.'; 1421 if (E->getQualifier()) 1422 E->getQualifier()->print(OS, Policy); 1423 1424 std::string TypeS; 1425 if (IdentifierInfo *II = E->getDestroyedTypeIdentifier()) 1426 OS << II->getName(); 1427 else 1428 E->getDestroyedType().getAsStringInternal(TypeS, Policy); 1429 OS << TypeS; 1430 } 1431 1432 void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) { 1433 for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 1434 if (isa<CXXDefaultArgExpr>(E->getArg(i))) { 1435 // Don't print any defaulted arguments 1436 break; 1437 } 1438 1439 if (i) OS << ", "; 1440 PrintExpr(E->getArg(i)); 1441 } 1442 } 1443 1444 void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) { 1445 // Just forward to the sub expression. 1446 PrintExpr(E->getSubExpr()); 1447 } 1448 1449 void 1450 StmtPrinter::VisitCXXUnresolvedConstructExpr( 1451 CXXUnresolvedConstructExpr *Node) { 1452 OS << Node->getTypeAsWritten().getAsString(Policy); 1453 OS << "("; 1454 for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(), 1455 ArgEnd = Node->arg_end(); 1456 Arg != ArgEnd; ++Arg) { 1457 if (Arg != Node->arg_begin()) 1458 OS << ", "; 1459 PrintExpr(*Arg); 1460 } 1461 OS << ")"; 1462 } 1463 1464 void StmtPrinter::VisitCXXDependentScopeMemberExpr( 1465 CXXDependentScopeMemberExpr *Node) { 1466 if (!Node->isImplicitAccess()) { 1467 PrintExpr(Node->getBase()); 1468 OS << (Node->isArrow() ? "->" : "."); 1469 } 1470 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1471 Qualifier->print(OS, Policy); 1472 if (Node->hasTemplateKeyword()) 1473 OS << "template "; 1474 OS << Node->getMemberNameInfo(); 1475 if (Node->hasExplicitTemplateArgs()) { 1476 OS << TemplateSpecializationType::PrintTemplateArgumentList( 1477 Node->getTemplateArgs(), 1478 Node->getNumTemplateArgs(), 1479 Policy); 1480 } 1481 } 1482 1483 void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) { 1484 if (!Node->isImplicitAccess()) { 1485 PrintExpr(Node->getBase()); 1486 OS << (Node->isArrow() ? "->" : "."); 1487 } 1488 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1489 Qualifier->print(OS, Policy); 1490 if (Node->hasTemplateKeyword()) 1491 OS << "template "; 1492 OS << Node->getMemberNameInfo(); 1493 if (Node->hasExplicitTemplateArgs()) { 1494 OS << TemplateSpecializationType::PrintTemplateArgumentList( 1495 Node->getTemplateArgs(), 1496 Node->getNumTemplateArgs(), 1497 Policy); 1498 } 1499 } 1500 1501 static const char *getTypeTraitName(UnaryTypeTrait UTT) { 1502 switch (UTT) { 1503 case UTT_HasNothrowAssign: return "__has_nothrow_assign"; 1504 case UTT_HasNothrowConstructor: return "__has_nothrow_constructor"; 1505 case UTT_HasNothrowCopy: return "__has_nothrow_copy"; 1506 case UTT_HasTrivialAssign: return "__has_trivial_assign"; 1507 case UTT_HasTrivialDefaultConstructor: return "__has_trivial_constructor"; 1508 case UTT_HasTrivialCopy: return "__has_trivial_copy"; 1509 case UTT_HasTrivialDestructor: return "__has_trivial_destructor"; 1510 case UTT_HasVirtualDestructor: return "__has_virtual_destructor"; 1511 case UTT_IsAbstract: return "__is_abstract"; 1512 case UTT_IsArithmetic: return "__is_arithmetic"; 1513 case UTT_IsArray: return "__is_array"; 1514 case UTT_IsClass: return "__is_class"; 1515 case UTT_IsCompleteType: return "__is_complete_type"; 1516 case UTT_IsCompound: return "__is_compound"; 1517 case UTT_IsConst: return "__is_const"; 1518 case UTT_IsEmpty: return "__is_empty"; 1519 case UTT_IsEnum: return "__is_enum"; 1520 case UTT_IsFinal: return "__is_final"; 1521 case UTT_IsFloatingPoint: return "__is_floating_point"; 1522 case UTT_IsFunction: return "__is_function"; 1523 case UTT_IsFundamental: return "__is_fundamental"; 1524 case UTT_IsIntegral: return "__is_integral"; 1525 case UTT_IsLiteral: return "__is_literal"; 1526 case UTT_IsLvalueReference: return "__is_lvalue_reference"; 1527 case UTT_IsMemberFunctionPointer: return "__is_member_function_pointer"; 1528 case UTT_IsMemberObjectPointer: return "__is_member_object_pointer"; 1529 case UTT_IsMemberPointer: return "__is_member_pointer"; 1530 case UTT_IsObject: return "__is_object"; 1531 case UTT_IsPOD: return "__is_pod"; 1532 case UTT_IsPointer: return "__is_pointer"; 1533 case UTT_IsPolymorphic: return "__is_polymorphic"; 1534 case UTT_IsReference: return "__is_reference"; 1535 case UTT_IsRvalueReference: return "__is_rvalue_reference"; 1536 case UTT_IsScalar: return "__is_scalar"; 1537 case UTT_IsSigned: return "__is_signed"; 1538 case UTT_IsStandardLayout: return "__is_standard_layout"; 1539 case UTT_IsTrivial: return "__is_trivial"; 1540 case UTT_IsTriviallyCopyable: return "__is_trivially_copyable"; 1541 case UTT_IsUnion: return "__is_union"; 1542 case UTT_IsUnsigned: return "__is_unsigned"; 1543 case UTT_IsVoid: return "__is_void"; 1544 case UTT_IsVolatile: return "__is_volatile"; 1545 } 1546 llvm_unreachable("Type trait not covered by switch statement"); 1547 } 1548 1549 static const char *getTypeTraitName(BinaryTypeTrait BTT) { 1550 switch (BTT) { 1551 case BTT_IsBaseOf: return "__is_base_of"; 1552 case BTT_IsConvertible: return "__is_convertible"; 1553 case BTT_IsSame: return "__is_same"; 1554 case BTT_TypeCompatible: return "__builtin_types_compatible_p"; 1555 case BTT_IsConvertibleTo: return "__is_convertible_to"; 1556 case BTT_IsTriviallyAssignable: return "__is_trivially_assignable"; 1557 } 1558 llvm_unreachable("Binary type trait not covered by switch"); 1559 } 1560 1561 static const char *getTypeTraitName(TypeTrait TT) { 1562 switch (TT) { 1563 case clang::TT_IsTriviallyConstructible:return "__is_trivially_constructible"; 1564 } 1565 llvm_unreachable("Type trait not covered by switch"); 1566 } 1567 1568 static const char *getTypeTraitName(ArrayTypeTrait ATT) { 1569 switch (ATT) { 1570 case ATT_ArrayRank: return "__array_rank"; 1571 case ATT_ArrayExtent: return "__array_extent"; 1572 } 1573 llvm_unreachable("Array type trait not covered by switch"); 1574 } 1575 1576 static const char *getExpressionTraitName(ExpressionTrait ET) { 1577 switch (ET) { 1578 case ET_IsLValueExpr: return "__is_lvalue_expr"; 1579 case ET_IsRValueExpr: return "__is_rvalue_expr"; 1580 } 1581 llvm_unreachable("Expression type trait not covered by switch"); 1582 } 1583 1584 void StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 1585 OS << getTypeTraitName(E->getTrait()) << "(" 1586 << E->getQueriedType().getAsString(Policy) << ")"; 1587 } 1588 1589 void StmtPrinter::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 1590 OS << getTypeTraitName(E->getTrait()) << "(" 1591 << E->getLhsType().getAsString(Policy) << "," 1592 << E->getRhsType().getAsString(Policy) << ")"; 1593 } 1594 1595 void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) { 1596 OS << getTypeTraitName(E->getTrait()) << "("; 1597 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 1598 if (I > 0) 1599 OS << ", "; 1600 OS << E->getArg(I)->getType().getAsString(Policy); 1601 } 1602 OS << ")"; 1603 } 1604 1605 void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 1606 OS << getTypeTraitName(E->getTrait()) << "(" 1607 << E->getQueriedType().getAsString(Policy) << ")"; 1608 } 1609 1610 void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 1611 OS << getExpressionTraitName(E->getTrait()) << "("; 1612 PrintExpr(E->getQueriedExpression()); 1613 OS << ")"; 1614 } 1615 1616 void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 1617 OS << "noexcept("; 1618 PrintExpr(E->getOperand()); 1619 OS << ")"; 1620 } 1621 1622 void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) { 1623 PrintExpr(E->getPattern()); 1624 OS << "..."; 1625 } 1626 1627 void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1628 OS << "sizeof...(" << *E->getPack() << ")"; 1629 } 1630 1631 void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr( 1632 SubstNonTypeTemplateParmPackExpr *Node) { 1633 OS << *Node->getParameterPack(); 1634 } 1635 1636 void StmtPrinter::VisitSubstNonTypeTemplateParmExpr( 1637 SubstNonTypeTemplateParmExpr *Node) { 1638 Visit(Node->getReplacement()); 1639 } 1640 1641 void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){ 1642 PrintExpr(Node->GetTemporaryExpr()); 1643 } 1644 1645 // Obj-C 1646 1647 void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { 1648 OS << "@"; 1649 VisitStringLiteral(Node->getString()); 1650 } 1651 1652 void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 1653 OS << "@"; 1654 Visit(E->getSubExpr()); 1655 } 1656 1657 void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 1658 OS << "@[ "; 1659 StmtRange ch = E->children(); 1660 if (ch.first != ch.second) { 1661 while (1) { 1662 Visit(*ch.first); 1663 ++ch.first; 1664 if (ch.first == ch.second) break; 1665 OS << ", "; 1666 } 1667 } 1668 OS << " ]"; 1669 } 1670 1671 void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 1672 OS << "@{ "; 1673 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 1674 if (I > 0) 1675 OS << ", "; 1676 1677 ObjCDictionaryElement Element = E->getKeyValueElement(I); 1678 Visit(Element.Key); 1679 OS << " : "; 1680 Visit(Element.Value); 1681 if (Element.isPackExpansion()) 1682 OS << "..."; 1683 } 1684 OS << " }"; 1685 } 1686 1687 void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 1688 OS << "@encode(" << Node->getEncodedType().getAsString(Policy) << ')'; 1689 } 1690 1691 void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 1692 OS << "@selector(" << Node->getSelector().getAsString() << ')'; 1693 } 1694 1695 void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 1696 OS << "@protocol(" << *Node->getProtocol() << ')'; 1697 } 1698 1699 void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { 1700 OS << "["; 1701 switch (Mess->getReceiverKind()) { 1702 case ObjCMessageExpr::Instance: 1703 PrintExpr(Mess->getInstanceReceiver()); 1704 break; 1705 1706 case ObjCMessageExpr::Class: 1707 OS << Mess->getClassReceiver().getAsString(Policy); 1708 break; 1709 1710 case ObjCMessageExpr::SuperInstance: 1711 case ObjCMessageExpr::SuperClass: 1712 OS << "Super"; 1713 break; 1714 } 1715 1716 OS << ' '; 1717 Selector selector = Mess->getSelector(); 1718 if (selector.isUnarySelector()) { 1719 OS << selector.getNameForSlot(0); 1720 } else { 1721 for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) { 1722 if (i < selector.getNumArgs()) { 1723 if (i > 0) OS << ' '; 1724 if (selector.getIdentifierInfoForSlot(i)) 1725 OS << selector.getIdentifierInfoForSlot(i)->getName() << ':'; 1726 else 1727 OS << ":"; 1728 } 1729 else OS << ", "; // Handle variadic methods. 1730 1731 PrintExpr(Mess->getArg(i)); 1732 } 1733 } 1734 OS << "]"; 1735 } 1736 1737 void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) { 1738 OS << (Node->getValue() ? "__objc_yes" : "__objc_no"); 1739 } 1740 1741 void 1742 StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 1743 PrintExpr(E->getSubExpr()); 1744 } 1745 1746 void 1747 StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 1748 OS << "(" << E->getBridgeKindName() << E->getType().getAsString(Policy) 1749 << ")"; 1750 PrintExpr(E->getSubExpr()); 1751 } 1752 1753 void StmtPrinter::VisitBlockExpr(BlockExpr *Node) { 1754 BlockDecl *BD = Node->getBlockDecl(); 1755 OS << "^"; 1756 1757 const FunctionType *AFT = Node->getFunctionType(); 1758 1759 if (isa<FunctionNoProtoType>(AFT)) { 1760 OS << "()"; 1761 } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) { 1762 OS << '('; 1763 std::string ParamStr; 1764 for (BlockDecl::param_iterator AI = BD->param_begin(), 1765 E = BD->param_end(); AI != E; ++AI) { 1766 if (AI != BD->param_begin()) OS << ", "; 1767 ParamStr = (*AI)->getNameAsString(); 1768 (*AI)->getType().getAsStringInternal(ParamStr, Policy); 1769 OS << ParamStr; 1770 } 1771 1772 const FunctionProtoType *FT = cast<FunctionProtoType>(AFT); 1773 if (FT->isVariadic()) { 1774 if (!BD->param_empty()) OS << ", "; 1775 OS << "..."; 1776 } 1777 OS << ')'; 1778 } 1779 } 1780 1781 void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) { 1782 PrintExpr(Node->getSourceExpr()); 1783 } 1784 1785 void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) { 1786 OS << "__builtin_astype("; 1787 PrintExpr(Node->getSrcExpr()); 1788 OS << ", " << Node->getType().getAsString(); 1789 OS << ")"; 1790 } 1791 1792 //===----------------------------------------------------------------------===// 1793 // Stmt method implementations 1794 //===----------------------------------------------------------------------===// 1795 1796 void Stmt::dumpPretty(ASTContext& Context) const { 1797 printPretty(llvm::errs(), Context, 0, 1798 PrintingPolicy(Context.getLangOpts())); 1799 } 1800 1801 void Stmt::printPretty(raw_ostream &OS, ASTContext& Context, 1802 PrinterHelper* Helper, 1803 const PrintingPolicy &Policy, 1804 unsigned Indentation) const { 1805 if (this == 0) { 1806 OS << "<NULL>"; 1807 return; 1808 } 1809 1810 if (Policy.Dump && &Context) { 1811 dump(OS, Context.getSourceManager()); 1812 return; 1813 } 1814 1815 StmtPrinter P(OS, Context, Helper, Policy, Indentation); 1816 P.Visit(const_cast<Stmt*>(this)); 1817 } 1818 1819 //===----------------------------------------------------------------------===// 1820 // PrinterHelper 1821 //===----------------------------------------------------------------------===// 1822 1823 // Implement virtual destructor. 1824 PrinterHelper::~PrinterHelper() {} 1825