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/ASTContext.h" 16 #include "clang/AST/Attr.h" 17 #include "clang/AST/DeclCXX.h" 18 #include "clang/AST/DeclObjC.h" 19 #include "clang/AST/DeclOpenMP.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprCXX.h" 23 #include "clang/AST/ExprOpenMP.h" 24 #include "clang/AST/PrettyPrinter.h" 25 #include "clang/AST/StmtVisitor.h" 26 #include "clang/Basic/CharInfo.h" 27 #include "clang/Lex/Lexer.h" 28 #include "llvm/ADT/SmallString.h" 29 #include "llvm/Support/Format.h" 30 using namespace clang; 31 32 //===----------------------------------------------------------------------===// 33 // StmtPrinter Visitor 34 //===----------------------------------------------------------------------===// 35 36 namespace { 37 class StmtPrinter : public StmtVisitor<StmtPrinter> { 38 raw_ostream &OS; 39 unsigned IndentLevel; 40 clang::PrinterHelper* Helper; 41 PrintingPolicy Policy; 42 const ASTContext *Context; 43 44 public: 45 StmtPrinter(raw_ostream &os, PrinterHelper *helper, 46 const PrintingPolicy &Policy, unsigned Indentation = 0, 47 const ASTContext *Context = nullptr) 48 : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy), 49 Context(Context) {} 50 51 void PrintStmt(Stmt *S) { 52 PrintStmt(S, Policy.Indentation); 53 } 54 55 void PrintStmt(Stmt *S, int SubIndent) { 56 IndentLevel += SubIndent; 57 if (S && isa<Expr>(S)) { 58 // If this is an expr used in a stmt context, indent and newline it. 59 Indent(); 60 Visit(S); 61 OS << ";\n"; 62 } else if (S) { 63 Visit(S); 64 } else { 65 Indent() << "<<<NULL STATEMENT>>>\n"; 66 } 67 IndentLevel -= SubIndent; 68 } 69 70 void PrintRawCompoundStmt(CompoundStmt *S); 71 void PrintRawDecl(Decl *D); 72 void PrintRawDeclStmt(const DeclStmt *S); 73 void PrintRawIfStmt(IfStmt *If); 74 void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); 75 void PrintCallArgs(CallExpr *E); 76 void PrintRawSEHExceptHandler(SEHExceptStmt *S); 77 void PrintRawSEHFinallyStmt(SEHFinallyStmt *S); 78 void PrintOMPExecutableDirective(OMPExecutableDirective *S, 79 bool ForceNoStmt = false); 80 81 void PrintExpr(Expr *E) { 82 if (E) 83 Visit(E); 84 else 85 OS << "<null expr>"; 86 } 87 88 raw_ostream &Indent(int Delta = 0) { 89 for (int i = 0, e = IndentLevel+Delta; i < e; ++i) 90 OS << " "; 91 return OS; 92 } 93 94 void Visit(Stmt* S) { 95 if (Helper && Helper->handledStmt(S,OS)) 96 return; 97 else StmtVisitor<StmtPrinter>::Visit(S); 98 } 99 100 void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED { 101 Indent() << "<<unknown stmt type>>\n"; 102 } 103 void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED { 104 OS << "<<unknown expr type>>"; 105 } 106 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 107 108 #define ABSTRACT_STMT(CLASS) 109 #define STMT(CLASS, PARENT) \ 110 void Visit##CLASS(CLASS *Node); 111 #include "clang/AST/StmtNodes.inc" 112 }; 113 } 114 115 //===----------------------------------------------------------------------===// 116 // Stmt printing methods. 117 //===----------------------------------------------------------------------===// 118 119 /// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and 120 /// with no newline after the }. 121 void StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { 122 OS << "{\n"; 123 for (auto *I : Node->body()) 124 PrintStmt(I); 125 126 Indent() << "}"; 127 } 128 129 void StmtPrinter::PrintRawDecl(Decl *D) { 130 D->print(OS, Policy, IndentLevel); 131 } 132 133 void StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) { 134 SmallVector<Decl*, 2> Decls(S->decls()); 135 Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel); 136 } 137 138 void StmtPrinter::VisitNullStmt(NullStmt *Node) { 139 Indent() << ";\n"; 140 } 141 142 void StmtPrinter::VisitDeclStmt(DeclStmt *Node) { 143 Indent(); 144 PrintRawDeclStmt(Node); 145 OS << ";\n"; 146 } 147 148 void StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { 149 Indent(); 150 PrintRawCompoundStmt(Node); 151 OS << "\n"; 152 } 153 154 void StmtPrinter::VisitCaseStmt(CaseStmt *Node) { 155 Indent(-1) << "case "; 156 PrintExpr(Node->getLHS()); 157 if (Node->getRHS()) { 158 OS << " ... "; 159 PrintExpr(Node->getRHS()); 160 } 161 OS << ":\n"; 162 163 PrintStmt(Node->getSubStmt(), 0); 164 } 165 166 void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { 167 Indent(-1) << "default:\n"; 168 PrintStmt(Node->getSubStmt(), 0); 169 } 170 171 void StmtPrinter::VisitLabelStmt(LabelStmt *Node) { 172 Indent(-1) << Node->getName() << ":\n"; 173 PrintStmt(Node->getSubStmt(), 0); 174 } 175 176 void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) { 177 for (const auto *Attr : Node->getAttrs()) { 178 Attr->printPretty(OS, Policy); 179 } 180 181 PrintStmt(Node->getSubStmt(), 0); 182 } 183 184 void StmtPrinter::PrintRawIfStmt(IfStmt *If) { 185 OS << "if ("; 186 if (const DeclStmt *DS = If->getConditionVariableDeclStmt()) 187 PrintRawDeclStmt(DS); 188 else 189 PrintExpr(If->getCond()); 190 OS << ')'; 191 192 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { 193 OS << ' '; 194 PrintRawCompoundStmt(CS); 195 OS << (If->getElse() ? ' ' : '\n'); 196 } else { 197 OS << '\n'; 198 PrintStmt(If->getThen()); 199 if (If->getElse()) Indent(); 200 } 201 202 if (Stmt *Else = If->getElse()) { 203 OS << "else"; 204 205 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) { 206 OS << ' '; 207 PrintRawCompoundStmt(CS); 208 OS << '\n'; 209 } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) { 210 OS << ' '; 211 PrintRawIfStmt(ElseIf); 212 } else { 213 OS << '\n'; 214 PrintStmt(If->getElse()); 215 } 216 } 217 } 218 219 void StmtPrinter::VisitIfStmt(IfStmt *If) { 220 Indent(); 221 PrintRawIfStmt(If); 222 } 223 224 void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { 225 Indent() << "switch ("; 226 if (const DeclStmt *DS = Node->getConditionVariableDeclStmt()) 227 PrintRawDeclStmt(DS); 228 else 229 PrintExpr(Node->getCond()); 230 OS << ")"; 231 232 // Pretty print compoundstmt bodies (very common). 233 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 234 OS << " "; 235 PrintRawCompoundStmt(CS); 236 OS << "\n"; 237 } else { 238 OS << "\n"; 239 PrintStmt(Node->getBody()); 240 } 241 } 242 243 void StmtPrinter::VisitWhileStmt(WhileStmt *Node) { 244 Indent() << "while ("; 245 if (const DeclStmt *DS = Node->getConditionVariableDeclStmt()) 246 PrintRawDeclStmt(DS); 247 else 248 PrintExpr(Node->getCond()); 249 OS << ")\n"; 250 PrintStmt(Node->getBody()); 251 } 252 253 void StmtPrinter::VisitDoStmt(DoStmt *Node) { 254 Indent() << "do "; 255 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 256 PrintRawCompoundStmt(CS); 257 OS << " "; 258 } else { 259 OS << "\n"; 260 PrintStmt(Node->getBody()); 261 Indent(); 262 } 263 264 OS << "while ("; 265 PrintExpr(Node->getCond()); 266 OS << ");\n"; 267 } 268 269 void StmtPrinter::VisitForStmt(ForStmt *Node) { 270 Indent() << "for ("; 271 if (Node->getInit()) { 272 if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit())) 273 PrintRawDeclStmt(DS); 274 else 275 PrintExpr(cast<Expr>(Node->getInit())); 276 } 277 OS << ";"; 278 if (Node->getCond()) { 279 OS << " "; 280 PrintExpr(Node->getCond()); 281 } 282 OS << ";"; 283 if (Node->getInc()) { 284 OS << " "; 285 PrintExpr(Node->getInc()); 286 } 287 OS << ") "; 288 289 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 290 PrintRawCompoundStmt(CS); 291 OS << "\n"; 292 } else { 293 OS << "\n"; 294 PrintStmt(Node->getBody()); 295 } 296 } 297 298 void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { 299 Indent() << "for ("; 300 if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement())) 301 PrintRawDeclStmt(DS); 302 else 303 PrintExpr(cast<Expr>(Node->getElement())); 304 OS << " in "; 305 PrintExpr(Node->getCollection()); 306 OS << ") "; 307 308 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 309 PrintRawCompoundStmt(CS); 310 OS << "\n"; 311 } else { 312 OS << "\n"; 313 PrintStmt(Node->getBody()); 314 } 315 } 316 317 void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) { 318 Indent() << "for ("; 319 PrintingPolicy SubPolicy(Policy); 320 SubPolicy.SuppressInitializers = true; 321 Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel); 322 OS << " : "; 323 PrintExpr(Node->getRangeInit()); 324 OS << ") {\n"; 325 PrintStmt(Node->getBody()); 326 Indent() << "}"; 327 if (Policy.IncludeNewlines) OS << "\n"; 328 } 329 330 void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) { 331 Indent(); 332 if (Node->isIfExists()) 333 OS << "__if_exists ("; 334 else 335 OS << "__if_not_exists ("; 336 337 if (NestedNameSpecifier *Qualifier 338 = Node->getQualifierLoc().getNestedNameSpecifier()) 339 Qualifier->print(OS, Policy); 340 341 OS << Node->getNameInfo() << ") "; 342 343 PrintRawCompoundStmt(Node->getSubStmt()); 344 } 345 346 void StmtPrinter::VisitGotoStmt(GotoStmt *Node) { 347 Indent() << "goto " << Node->getLabel()->getName() << ";"; 348 if (Policy.IncludeNewlines) OS << "\n"; 349 } 350 351 void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { 352 Indent() << "goto *"; 353 PrintExpr(Node->getTarget()); 354 OS << ";"; 355 if (Policy.IncludeNewlines) OS << "\n"; 356 } 357 358 void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { 359 Indent() << "continue;"; 360 if (Policy.IncludeNewlines) OS << "\n"; 361 } 362 363 void StmtPrinter::VisitBreakStmt(BreakStmt *Node) { 364 Indent() << "break;"; 365 if (Policy.IncludeNewlines) OS << "\n"; 366 } 367 368 369 void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { 370 Indent() << "return"; 371 if (Node->getRetValue()) { 372 OS << " "; 373 PrintExpr(Node->getRetValue()); 374 } 375 OS << ";"; 376 if (Policy.IncludeNewlines) OS << "\n"; 377 } 378 379 380 void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) { 381 Indent() << "asm "; 382 383 if (Node->isVolatile()) 384 OS << "volatile "; 385 386 OS << "("; 387 VisitStringLiteral(Node->getAsmString()); 388 389 // Outputs 390 if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 || 391 Node->getNumClobbers() != 0) 392 OS << " : "; 393 394 for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) { 395 if (i != 0) 396 OS << ", "; 397 398 if (!Node->getOutputName(i).empty()) { 399 OS << '['; 400 OS << Node->getOutputName(i); 401 OS << "] "; 402 } 403 404 VisitStringLiteral(Node->getOutputConstraintLiteral(i)); 405 OS << " ("; 406 Visit(Node->getOutputExpr(i)); 407 OS << ")"; 408 } 409 410 // Inputs 411 if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0) 412 OS << " : "; 413 414 for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) { 415 if (i != 0) 416 OS << ", "; 417 418 if (!Node->getInputName(i).empty()) { 419 OS << '['; 420 OS << Node->getInputName(i); 421 OS << "] "; 422 } 423 424 VisitStringLiteral(Node->getInputConstraintLiteral(i)); 425 OS << " ("; 426 Visit(Node->getInputExpr(i)); 427 OS << ")"; 428 } 429 430 // Clobbers 431 if (Node->getNumClobbers() != 0) 432 OS << " : "; 433 434 for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) { 435 if (i != 0) 436 OS << ", "; 437 438 VisitStringLiteral(Node->getClobberStringLiteral(i)); 439 } 440 441 OS << ");"; 442 if (Policy.IncludeNewlines) OS << "\n"; 443 } 444 445 void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) { 446 // FIXME: Implement MS style inline asm statement printer. 447 Indent() << "__asm "; 448 if (Node->hasBraces()) 449 OS << "{\n"; 450 OS << Node->getAsmString() << "\n"; 451 if (Node->hasBraces()) 452 Indent() << "}\n"; 453 } 454 455 void StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) { 456 PrintStmt(Node->getCapturedDecl()->getBody()); 457 } 458 459 void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { 460 Indent() << "@try"; 461 if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) { 462 PrintRawCompoundStmt(TS); 463 OS << "\n"; 464 } 465 466 for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { 467 ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I); 468 Indent() << "@catch("; 469 if (catchStmt->getCatchParamDecl()) { 470 if (Decl *DS = catchStmt->getCatchParamDecl()) 471 PrintRawDecl(DS); 472 } 473 OS << ")"; 474 if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) { 475 PrintRawCompoundStmt(CS); 476 OS << "\n"; 477 } 478 } 479 480 if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>( 481 Node->getFinallyStmt())) { 482 Indent() << "@finally"; 483 PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody())); 484 OS << "\n"; 485 } 486 } 487 488 void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { 489 } 490 491 void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { 492 Indent() << "@catch (...) { /* todo */ } \n"; 493 } 494 495 void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { 496 Indent() << "@throw"; 497 if (Node->getThrowExpr()) { 498 OS << " "; 499 PrintExpr(Node->getThrowExpr()); 500 } 501 OS << ";\n"; 502 } 503 504 void StmtPrinter::VisitObjCAvailabilityCheckExpr( 505 ObjCAvailabilityCheckExpr *Node) { 506 OS << "@available(...)"; 507 } 508 509 void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { 510 Indent() << "@synchronized ("; 511 PrintExpr(Node->getSynchExpr()); 512 OS << ")"; 513 PrintRawCompoundStmt(Node->getSynchBody()); 514 OS << "\n"; 515 } 516 517 void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) { 518 Indent() << "@autoreleasepool"; 519 PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt())); 520 OS << "\n"; 521 } 522 523 void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { 524 OS << "catch ("; 525 if (Decl *ExDecl = Node->getExceptionDecl()) 526 PrintRawDecl(ExDecl); 527 else 528 OS << "..."; 529 OS << ") "; 530 PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock())); 531 } 532 533 void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { 534 Indent(); 535 PrintRawCXXCatchStmt(Node); 536 OS << "\n"; 537 } 538 539 void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { 540 Indent() << "try "; 541 PrintRawCompoundStmt(Node->getTryBlock()); 542 for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) { 543 OS << " "; 544 PrintRawCXXCatchStmt(Node->getHandler(i)); 545 } 546 OS << "\n"; 547 } 548 549 void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) { 550 Indent() << (Node->getIsCXXTry() ? "try " : "__try "); 551 PrintRawCompoundStmt(Node->getTryBlock()); 552 SEHExceptStmt *E = Node->getExceptHandler(); 553 SEHFinallyStmt *F = Node->getFinallyHandler(); 554 if(E) 555 PrintRawSEHExceptHandler(E); 556 else { 557 assert(F && "Must have a finally block..."); 558 PrintRawSEHFinallyStmt(F); 559 } 560 OS << "\n"; 561 } 562 563 void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) { 564 OS << "__finally "; 565 PrintRawCompoundStmt(Node->getBlock()); 566 OS << "\n"; 567 } 568 569 void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) { 570 OS << "__except ("; 571 VisitExpr(Node->getFilterExpr()); 572 OS << ")\n"; 573 PrintRawCompoundStmt(Node->getBlock()); 574 OS << "\n"; 575 } 576 577 void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) { 578 Indent(); 579 PrintRawSEHExceptHandler(Node); 580 OS << "\n"; 581 } 582 583 void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) { 584 Indent(); 585 PrintRawSEHFinallyStmt(Node); 586 OS << "\n"; 587 } 588 589 void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) { 590 Indent() << "__leave;"; 591 if (Policy.IncludeNewlines) OS << "\n"; 592 } 593 594 //===----------------------------------------------------------------------===// 595 // OpenMP clauses printing methods 596 //===----------------------------------------------------------------------===// 597 598 namespace { 599 class OMPClausePrinter : public OMPClauseVisitor<OMPClausePrinter> { 600 raw_ostream &OS; 601 const PrintingPolicy &Policy; 602 /// \brief Process clauses with list of variables. 603 template <typename T> 604 void VisitOMPClauseList(T *Node, char StartSym); 605 public: 606 OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy) 607 : OS(OS), Policy(Policy) { } 608 #define OPENMP_CLAUSE(Name, Class) \ 609 void Visit##Class(Class *S); 610 #include "clang/Basic/OpenMPKinds.def" 611 }; 612 613 void OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) { 614 OS << "if("; 615 if (Node->getNameModifier() != OMPD_unknown) 616 OS << getOpenMPDirectiveName(Node->getNameModifier()) << ": "; 617 Node->getCondition()->printPretty(OS, nullptr, Policy, 0); 618 OS << ")"; 619 } 620 621 void OMPClausePrinter::VisitOMPFinalClause(OMPFinalClause *Node) { 622 OS << "final("; 623 Node->getCondition()->printPretty(OS, nullptr, Policy, 0); 624 OS << ")"; 625 } 626 627 void OMPClausePrinter::VisitOMPNumThreadsClause(OMPNumThreadsClause *Node) { 628 OS << "num_threads("; 629 Node->getNumThreads()->printPretty(OS, nullptr, Policy, 0); 630 OS << ")"; 631 } 632 633 void OMPClausePrinter::VisitOMPSafelenClause(OMPSafelenClause *Node) { 634 OS << "safelen("; 635 Node->getSafelen()->printPretty(OS, nullptr, Policy, 0); 636 OS << ")"; 637 } 638 639 void OMPClausePrinter::VisitOMPSimdlenClause(OMPSimdlenClause *Node) { 640 OS << "simdlen("; 641 Node->getSimdlen()->printPretty(OS, nullptr, Policy, 0); 642 OS << ")"; 643 } 644 645 void OMPClausePrinter::VisitOMPCollapseClause(OMPCollapseClause *Node) { 646 OS << "collapse("; 647 Node->getNumForLoops()->printPretty(OS, nullptr, Policy, 0); 648 OS << ")"; 649 } 650 651 void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) { 652 OS << "default(" 653 << getOpenMPSimpleClauseTypeName(OMPC_default, Node->getDefaultKind()) 654 << ")"; 655 } 656 657 void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) { 658 OS << "proc_bind(" 659 << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, Node->getProcBindKind()) 660 << ")"; 661 } 662 663 void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) { 664 OS << "schedule("; 665 if (Node->getFirstScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) { 666 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, 667 Node->getFirstScheduleModifier()); 668 if (Node->getSecondScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) { 669 OS << ", "; 670 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, 671 Node->getSecondScheduleModifier()); 672 } 673 OS << ": "; 674 } 675 OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, Node->getScheduleKind()); 676 if (auto *E = Node->getChunkSize()) { 677 OS << ", "; 678 E->printPretty(OS, nullptr, Policy); 679 } 680 OS << ")"; 681 } 682 683 void OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *Node) { 684 OS << "ordered"; 685 if (auto *Num = Node->getNumForLoops()) { 686 OS << "("; 687 Num->printPretty(OS, nullptr, Policy, 0); 688 OS << ")"; 689 } 690 } 691 692 void OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) { 693 OS << "nowait"; 694 } 695 696 void OMPClausePrinter::VisitOMPUntiedClause(OMPUntiedClause *) { 697 OS << "untied"; 698 } 699 700 void OMPClausePrinter::VisitOMPNogroupClause(OMPNogroupClause *) { 701 OS << "nogroup"; 702 } 703 704 void OMPClausePrinter::VisitOMPMergeableClause(OMPMergeableClause *) { 705 OS << "mergeable"; 706 } 707 708 void OMPClausePrinter::VisitOMPReadClause(OMPReadClause *) { OS << "read"; } 709 710 void OMPClausePrinter::VisitOMPWriteClause(OMPWriteClause *) { OS << "write"; } 711 712 void OMPClausePrinter::VisitOMPUpdateClause(OMPUpdateClause *) { 713 OS << "update"; 714 } 715 716 void OMPClausePrinter::VisitOMPCaptureClause(OMPCaptureClause *) { 717 OS << "capture"; 718 } 719 720 void OMPClausePrinter::VisitOMPSeqCstClause(OMPSeqCstClause *) { 721 OS << "seq_cst"; 722 } 723 724 void OMPClausePrinter::VisitOMPThreadsClause(OMPThreadsClause *) { 725 OS << "threads"; 726 } 727 728 void OMPClausePrinter::VisitOMPSIMDClause(OMPSIMDClause *) { OS << "simd"; } 729 730 void OMPClausePrinter::VisitOMPDeviceClause(OMPDeviceClause *Node) { 731 OS << "device("; 732 Node->getDevice()->printPretty(OS, nullptr, Policy, 0); 733 OS << ")"; 734 } 735 736 void OMPClausePrinter::VisitOMPNumTeamsClause(OMPNumTeamsClause *Node) { 737 OS << "num_teams("; 738 Node->getNumTeams()->printPretty(OS, nullptr, Policy, 0); 739 OS << ")"; 740 } 741 742 void OMPClausePrinter::VisitOMPThreadLimitClause(OMPThreadLimitClause *Node) { 743 OS << "thread_limit("; 744 Node->getThreadLimit()->printPretty(OS, nullptr, Policy, 0); 745 OS << ")"; 746 } 747 748 void OMPClausePrinter::VisitOMPPriorityClause(OMPPriorityClause *Node) { 749 OS << "priority("; 750 Node->getPriority()->printPretty(OS, nullptr, Policy, 0); 751 OS << ")"; 752 } 753 754 void OMPClausePrinter::VisitOMPGrainsizeClause(OMPGrainsizeClause *Node) { 755 OS << "grainsize("; 756 Node->getGrainsize()->printPretty(OS, nullptr, Policy, 0); 757 OS << ")"; 758 } 759 760 void OMPClausePrinter::VisitOMPNumTasksClause(OMPNumTasksClause *Node) { 761 OS << "num_tasks("; 762 Node->getNumTasks()->printPretty(OS, nullptr, Policy, 0); 763 OS << ")"; 764 } 765 766 void OMPClausePrinter::VisitOMPHintClause(OMPHintClause *Node) { 767 OS << "hint("; 768 Node->getHint()->printPretty(OS, nullptr, Policy, 0); 769 OS << ")"; 770 } 771 772 template<typename T> 773 void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { 774 for (typename T::varlist_iterator I = Node->varlist_begin(), 775 E = Node->varlist_end(); 776 I != E; ++I) { 777 assert(*I && "Expected non-null Stmt"); 778 OS << (I == Node->varlist_begin() ? StartSym : ','); 779 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(*I)) { 780 if (isa<OMPCapturedExprDecl>(DRE->getDecl())) 781 DRE->printPretty(OS, nullptr, Policy, 0); 782 else 783 DRE->getDecl()->printQualifiedName(OS); 784 } else 785 (*I)->printPretty(OS, nullptr, Policy, 0); 786 } 787 } 788 789 void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) { 790 if (!Node->varlist_empty()) { 791 OS << "private"; 792 VisitOMPClauseList(Node, '('); 793 OS << ")"; 794 } 795 } 796 797 void OMPClausePrinter::VisitOMPFirstprivateClause(OMPFirstprivateClause *Node) { 798 if (!Node->varlist_empty()) { 799 OS << "firstprivate"; 800 VisitOMPClauseList(Node, '('); 801 OS << ")"; 802 } 803 } 804 805 void OMPClausePrinter::VisitOMPLastprivateClause(OMPLastprivateClause *Node) { 806 if (!Node->varlist_empty()) { 807 OS << "lastprivate"; 808 VisitOMPClauseList(Node, '('); 809 OS << ")"; 810 } 811 } 812 813 void OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) { 814 if (!Node->varlist_empty()) { 815 OS << "shared"; 816 VisitOMPClauseList(Node, '('); 817 OS << ")"; 818 } 819 } 820 821 void OMPClausePrinter::VisitOMPReductionClause(OMPReductionClause *Node) { 822 if (!Node->varlist_empty()) { 823 OS << "reduction("; 824 NestedNameSpecifier *QualifierLoc = 825 Node->getQualifierLoc().getNestedNameSpecifier(); 826 OverloadedOperatorKind OOK = 827 Node->getNameInfo().getName().getCXXOverloadedOperator(); 828 if (QualifierLoc == nullptr && OOK != OO_None) { 829 // Print reduction identifier in C format 830 OS << getOperatorSpelling(OOK); 831 } else { 832 // Use C++ format 833 if (QualifierLoc != nullptr) 834 QualifierLoc->print(OS, Policy); 835 OS << Node->getNameInfo(); 836 } 837 OS << ":"; 838 VisitOMPClauseList(Node, ' '); 839 OS << ")"; 840 } 841 } 842 843 void OMPClausePrinter::VisitOMPTaskReductionClause( 844 OMPTaskReductionClause *Node) { 845 if (!Node->varlist_empty()) { 846 OS << "task_reduction("; 847 NestedNameSpecifier *QualifierLoc = 848 Node->getQualifierLoc().getNestedNameSpecifier(); 849 OverloadedOperatorKind OOK = 850 Node->getNameInfo().getName().getCXXOverloadedOperator(); 851 if (QualifierLoc == nullptr && OOK != OO_None) { 852 // Print reduction identifier in C format 853 OS << getOperatorSpelling(OOK); 854 } else { 855 // Use C++ format 856 if (QualifierLoc != nullptr) 857 QualifierLoc->print(OS, Policy); 858 OS << Node->getNameInfo(); 859 } 860 OS << ":"; 861 VisitOMPClauseList(Node, ' '); 862 OS << ")"; 863 } 864 } 865 866 void OMPClausePrinter::VisitOMPInReductionClause(OMPInReductionClause *Node) { 867 if (!Node->varlist_empty()) { 868 OS << "in_reduction("; 869 NestedNameSpecifier *QualifierLoc = 870 Node->getQualifierLoc().getNestedNameSpecifier(); 871 OverloadedOperatorKind OOK = 872 Node->getNameInfo().getName().getCXXOverloadedOperator(); 873 if (QualifierLoc == nullptr && OOK != OO_None) { 874 // Print reduction identifier in C format 875 OS << getOperatorSpelling(OOK); 876 } else { 877 // Use C++ format 878 if (QualifierLoc != nullptr) 879 QualifierLoc->print(OS, Policy); 880 OS << Node->getNameInfo(); 881 } 882 OS << ":"; 883 VisitOMPClauseList(Node, ' '); 884 OS << ")"; 885 } 886 } 887 888 void OMPClausePrinter::VisitOMPLinearClause(OMPLinearClause *Node) { 889 if (!Node->varlist_empty()) { 890 OS << "linear"; 891 if (Node->getModifierLoc().isValid()) { 892 OS << '(' 893 << getOpenMPSimpleClauseTypeName(OMPC_linear, Node->getModifier()); 894 } 895 VisitOMPClauseList(Node, '('); 896 if (Node->getModifierLoc().isValid()) 897 OS << ')'; 898 if (Node->getStep() != nullptr) { 899 OS << ": "; 900 Node->getStep()->printPretty(OS, nullptr, Policy, 0); 901 } 902 OS << ")"; 903 } 904 } 905 906 void OMPClausePrinter::VisitOMPAlignedClause(OMPAlignedClause *Node) { 907 if (!Node->varlist_empty()) { 908 OS << "aligned"; 909 VisitOMPClauseList(Node, '('); 910 if (Node->getAlignment() != nullptr) { 911 OS << ": "; 912 Node->getAlignment()->printPretty(OS, nullptr, Policy, 0); 913 } 914 OS << ")"; 915 } 916 } 917 918 void OMPClausePrinter::VisitOMPCopyinClause(OMPCopyinClause *Node) { 919 if (!Node->varlist_empty()) { 920 OS << "copyin"; 921 VisitOMPClauseList(Node, '('); 922 OS << ")"; 923 } 924 } 925 926 void OMPClausePrinter::VisitOMPCopyprivateClause(OMPCopyprivateClause *Node) { 927 if (!Node->varlist_empty()) { 928 OS << "copyprivate"; 929 VisitOMPClauseList(Node, '('); 930 OS << ")"; 931 } 932 } 933 934 void OMPClausePrinter::VisitOMPFlushClause(OMPFlushClause *Node) { 935 if (!Node->varlist_empty()) { 936 VisitOMPClauseList(Node, '('); 937 OS << ")"; 938 } 939 } 940 941 void OMPClausePrinter::VisitOMPDependClause(OMPDependClause *Node) { 942 OS << "depend("; 943 OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(), 944 Node->getDependencyKind()); 945 if (!Node->varlist_empty()) { 946 OS << " :"; 947 VisitOMPClauseList(Node, ' '); 948 } 949 OS << ")"; 950 } 951 952 void OMPClausePrinter::VisitOMPMapClause(OMPMapClause *Node) { 953 if (!Node->varlist_empty()) { 954 OS << "map("; 955 if (Node->getMapType() != OMPC_MAP_unknown) { 956 if (Node->getMapTypeModifier() != OMPC_MAP_unknown) { 957 OS << getOpenMPSimpleClauseTypeName(OMPC_map, 958 Node->getMapTypeModifier()); 959 OS << ','; 960 } 961 OS << getOpenMPSimpleClauseTypeName(OMPC_map, Node->getMapType()); 962 OS << ':'; 963 } 964 VisitOMPClauseList(Node, ' '); 965 OS << ")"; 966 } 967 } 968 969 void OMPClausePrinter::VisitOMPToClause(OMPToClause *Node) { 970 if (!Node->varlist_empty()) { 971 OS << "to"; 972 VisitOMPClauseList(Node, '('); 973 OS << ")"; 974 } 975 } 976 977 void OMPClausePrinter::VisitOMPFromClause(OMPFromClause *Node) { 978 if (!Node->varlist_empty()) { 979 OS << "from"; 980 VisitOMPClauseList(Node, '('); 981 OS << ")"; 982 } 983 } 984 985 void OMPClausePrinter::VisitOMPDistScheduleClause(OMPDistScheduleClause *Node) { 986 OS << "dist_schedule(" << getOpenMPSimpleClauseTypeName( 987 OMPC_dist_schedule, Node->getDistScheduleKind()); 988 if (auto *E = Node->getChunkSize()) { 989 OS << ", "; 990 E->printPretty(OS, nullptr, Policy); 991 } 992 OS << ")"; 993 } 994 995 void OMPClausePrinter::VisitOMPDefaultmapClause(OMPDefaultmapClause *Node) { 996 OS << "defaultmap("; 997 OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap, 998 Node->getDefaultmapModifier()); 999 OS << ": "; 1000 OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap, 1001 Node->getDefaultmapKind()); 1002 OS << ")"; 1003 } 1004 1005 void OMPClausePrinter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *Node) { 1006 if (!Node->varlist_empty()) { 1007 OS << "use_device_ptr"; 1008 VisitOMPClauseList(Node, '('); 1009 OS << ")"; 1010 } 1011 } 1012 1013 void OMPClausePrinter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *Node) { 1014 if (!Node->varlist_empty()) { 1015 OS << "is_device_ptr"; 1016 VisitOMPClauseList(Node, '('); 1017 OS << ")"; 1018 } 1019 } 1020 } 1021 1022 //===----------------------------------------------------------------------===// 1023 // OpenMP directives printing methods 1024 //===----------------------------------------------------------------------===// 1025 1026 void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S, 1027 bool ForceNoStmt) { 1028 OMPClausePrinter Printer(OS, Policy); 1029 ArrayRef<OMPClause *> Clauses = S->clauses(); 1030 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 1031 I != E; ++I) 1032 if (*I && !(*I)->isImplicit()) { 1033 Printer.Visit(*I); 1034 OS << ' '; 1035 } 1036 OS << "\n"; 1037 if (!ForceNoStmt && S->hasAssociatedStmt()) 1038 PrintStmt(S->getInnermostCapturedStmt()->getCapturedStmt()); 1039 } 1040 1041 void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) { 1042 Indent() << "#pragma omp parallel "; 1043 PrintOMPExecutableDirective(Node); 1044 } 1045 1046 void StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) { 1047 Indent() << "#pragma omp simd "; 1048 PrintOMPExecutableDirective(Node); 1049 } 1050 1051 void StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) { 1052 Indent() << "#pragma omp for "; 1053 PrintOMPExecutableDirective(Node); 1054 } 1055 1056 void StmtPrinter::VisitOMPForSimdDirective(OMPForSimdDirective *Node) { 1057 Indent() << "#pragma omp for simd "; 1058 PrintOMPExecutableDirective(Node); 1059 } 1060 1061 void StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) { 1062 Indent() << "#pragma omp sections "; 1063 PrintOMPExecutableDirective(Node); 1064 } 1065 1066 void StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) { 1067 Indent() << "#pragma omp section"; 1068 PrintOMPExecutableDirective(Node); 1069 } 1070 1071 void StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) { 1072 Indent() << "#pragma omp single "; 1073 PrintOMPExecutableDirective(Node); 1074 } 1075 1076 void StmtPrinter::VisitOMPMasterDirective(OMPMasterDirective *Node) { 1077 Indent() << "#pragma omp master"; 1078 PrintOMPExecutableDirective(Node); 1079 } 1080 1081 void StmtPrinter::VisitOMPCriticalDirective(OMPCriticalDirective *Node) { 1082 Indent() << "#pragma omp critical"; 1083 if (Node->getDirectiveName().getName()) { 1084 OS << " ("; 1085 Node->getDirectiveName().printName(OS); 1086 OS << ")"; 1087 } 1088 OS << " "; 1089 PrintOMPExecutableDirective(Node); 1090 } 1091 1092 void StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) { 1093 Indent() << "#pragma omp parallel for "; 1094 PrintOMPExecutableDirective(Node); 1095 } 1096 1097 void StmtPrinter::VisitOMPParallelForSimdDirective( 1098 OMPParallelForSimdDirective *Node) { 1099 Indent() << "#pragma omp parallel for simd "; 1100 PrintOMPExecutableDirective(Node); 1101 } 1102 1103 void StmtPrinter::VisitOMPParallelSectionsDirective( 1104 OMPParallelSectionsDirective *Node) { 1105 Indent() << "#pragma omp parallel sections "; 1106 PrintOMPExecutableDirective(Node); 1107 } 1108 1109 void StmtPrinter::VisitOMPTaskDirective(OMPTaskDirective *Node) { 1110 Indent() << "#pragma omp task "; 1111 PrintOMPExecutableDirective(Node); 1112 } 1113 1114 void StmtPrinter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *Node) { 1115 Indent() << "#pragma omp taskyield"; 1116 PrintOMPExecutableDirective(Node); 1117 } 1118 1119 void StmtPrinter::VisitOMPBarrierDirective(OMPBarrierDirective *Node) { 1120 Indent() << "#pragma omp barrier"; 1121 PrintOMPExecutableDirective(Node); 1122 } 1123 1124 void StmtPrinter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *Node) { 1125 Indent() << "#pragma omp taskwait"; 1126 PrintOMPExecutableDirective(Node); 1127 } 1128 1129 void StmtPrinter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *Node) { 1130 Indent() << "#pragma omp taskgroup "; 1131 PrintOMPExecutableDirective(Node); 1132 } 1133 1134 void StmtPrinter::VisitOMPFlushDirective(OMPFlushDirective *Node) { 1135 Indent() << "#pragma omp flush "; 1136 PrintOMPExecutableDirective(Node); 1137 } 1138 1139 void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) { 1140 Indent() << "#pragma omp ordered "; 1141 PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>()); 1142 } 1143 1144 void StmtPrinter::VisitOMPAtomicDirective(OMPAtomicDirective *Node) { 1145 Indent() << "#pragma omp atomic "; 1146 PrintOMPExecutableDirective(Node); 1147 } 1148 1149 void StmtPrinter::VisitOMPTargetDirective(OMPTargetDirective *Node) { 1150 Indent() << "#pragma omp target "; 1151 PrintOMPExecutableDirective(Node); 1152 } 1153 1154 void StmtPrinter::VisitOMPTargetDataDirective(OMPTargetDataDirective *Node) { 1155 Indent() << "#pragma omp target data "; 1156 PrintOMPExecutableDirective(Node); 1157 } 1158 1159 void StmtPrinter::VisitOMPTargetEnterDataDirective( 1160 OMPTargetEnterDataDirective *Node) { 1161 Indent() << "#pragma omp target enter data "; 1162 PrintOMPExecutableDirective(Node, /*ForceNoStmt=*/true); 1163 } 1164 1165 void StmtPrinter::VisitOMPTargetExitDataDirective( 1166 OMPTargetExitDataDirective *Node) { 1167 Indent() << "#pragma omp target exit data "; 1168 PrintOMPExecutableDirective(Node, /*ForceNoStmt=*/true); 1169 } 1170 1171 void StmtPrinter::VisitOMPTargetParallelDirective( 1172 OMPTargetParallelDirective *Node) { 1173 Indent() << "#pragma omp target parallel "; 1174 PrintOMPExecutableDirective(Node); 1175 } 1176 1177 void StmtPrinter::VisitOMPTargetParallelForDirective( 1178 OMPTargetParallelForDirective *Node) { 1179 Indent() << "#pragma omp target parallel for "; 1180 PrintOMPExecutableDirective(Node); 1181 } 1182 1183 void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) { 1184 Indent() << "#pragma omp teams "; 1185 PrintOMPExecutableDirective(Node); 1186 } 1187 1188 void StmtPrinter::VisitOMPCancellationPointDirective( 1189 OMPCancellationPointDirective *Node) { 1190 Indent() << "#pragma omp cancellation point " 1191 << getOpenMPDirectiveName(Node->getCancelRegion()); 1192 PrintOMPExecutableDirective(Node); 1193 } 1194 1195 void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) { 1196 Indent() << "#pragma omp cancel " 1197 << getOpenMPDirectiveName(Node->getCancelRegion()) << " "; 1198 PrintOMPExecutableDirective(Node); 1199 } 1200 1201 void StmtPrinter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *Node) { 1202 Indent() << "#pragma omp taskloop "; 1203 PrintOMPExecutableDirective(Node); 1204 } 1205 1206 void StmtPrinter::VisitOMPTaskLoopSimdDirective( 1207 OMPTaskLoopSimdDirective *Node) { 1208 Indent() << "#pragma omp taskloop simd "; 1209 PrintOMPExecutableDirective(Node); 1210 } 1211 1212 void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective *Node) { 1213 Indent() << "#pragma omp distribute "; 1214 PrintOMPExecutableDirective(Node); 1215 } 1216 1217 void StmtPrinter::VisitOMPTargetUpdateDirective( 1218 OMPTargetUpdateDirective *Node) { 1219 Indent() << "#pragma omp target update "; 1220 PrintOMPExecutableDirective(Node, /*ForceNoStmt=*/true); 1221 } 1222 1223 void StmtPrinter::VisitOMPDistributeParallelForDirective( 1224 OMPDistributeParallelForDirective *Node) { 1225 Indent() << "#pragma omp distribute parallel for "; 1226 PrintOMPExecutableDirective(Node); 1227 } 1228 1229 void StmtPrinter::VisitOMPDistributeParallelForSimdDirective( 1230 OMPDistributeParallelForSimdDirective *Node) { 1231 Indent() << "#pragma omp distribute parallel for simd "; 1232 PrintOMPExecutableDirective(Node); 1233 } 1234 1235 void StmtPrinter::VisitOMPDistributeSimdDirective( 1236 OMPDistributeSimdDirective *Node) { 1237 Indent() << "#pragma omp distribute simd "; 1238 PrintOMPExecutableDirective(Node); 1239 } 1240 1241 void StmtPrinter::VisitOMPTargetParallelForSimdDirective( 1242 OMPTargetParallelForSimdDirective *Node) { 1243 Indent() << "#pragma omp target parallel for simd "; 1244 PrintOMPExecutableDirective(Node); 1245 } 1246 1247 void StmtPrinter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *Node) { 1248 Indent() << "#pragma omp target simd "; 1249 PrintOMPExecutableDirective(Node); 1250 } 1251 1252 void StmtPrinter::VisitOMPTeamsDistributeDirective( 1253 OMPTeamsDistributeDirective *Node) { 1254 Indent() << "#pragma omp teams distribute "; 1255 PrintOMPExecutableDirective(Node); 1256 } 1257 1258 void StmtPrinter::VisitOMPTeamsDistributeSimdDirective( 1259 OMPTeamsDistributeSimdDirective *Node) { 1260 Indent() << "#pragma omp teams distribute simd "; 1261 PrintOMPExecutableDirective(Node); 1262 } 1263 1264 void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective( 1265 OMPTeamsDistributeParallelForSimdDirective *Node) { 1266 Indent() << "#pragma omp teams distribute parallel for simd "; 1267 PrintOMPExecutableDirective(Node); 1268 } 1269 1270 void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective( 1271 OMPTeamsDistributeParallelForDirective *Node) { 1272 Indent() << "#pragma omp teams distribute parallel for "; 1273 PrintOMPExecutableDirective(Node); 1274 } 1275 1276 void StmtPrinter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *Node) { 1277 Indent() << "#pragma omp target teams "; 1278 PrintOMPExecutableDirective(Node); 1279 } 1280 1281 void StmtPrinter::VisitOMPTargetTeamsDistributeDirective( 1282 OMPTargetTeamsDistributeDirective *Node) { 1283 Indent() << "#pragma omp target teams distribute "; 1284 PrintOMPExecutableDirective(Node); 1285 } 1286 1287 void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective( 1288 OMPTargetTeamsDistributeParallelForDirective *Node) { 1289 Indent() << "#pragma omp target teams distribute parallel for "; 1290 PrintOMPExecutableDirective(Node); 1291 } 1292 1293 void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective( 1294 OMPTargetTeamsDistributeParallelForSimdDirective *Node) { 1295 Indent() << "#pragma omp target teams distribute parallel for simd "; 1296 PrintOMPExecutableDirective(Node); 1297 } 1298 1299 void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective( 1300 OMPTargetTeamsDistributeSimdDirective *Node) { 1301 Indent() << "#pragma omp target teams distribute simd "; 1302 PrintOMPExecutableDirective(Node); 1303 } 1304 1305 //===----------------------------------------------------------------------===// 1306 // Expr printing methods. 1307 //===----------------------------------------------------------------------===// 1308 1309 void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { 1310 if (auto *OCED = dyn_cast<OMPCapturedExprDecl>(Node->getDecl())) { 1311 OCED->getInit()->IgnoreImpCasts()->printPretty(OS, nullptr, Policy); 1312 return; 1313 } 1314 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1315 Qualifier->print(OS, Policy); 1316 if (Node->hasTemplateKeyword()) 1317 OS << "template "; 1318 OS << Node->getNameInfo(); 1319 if (Node->hasExplicitTemplateArgs()) 1320 printTemplateArgumentList(OS, Node->template_arguments(), Policy); 1321 } 1322 1323 void StmtPrinter::VisitDependentScopeDeclRefExpr( 1324 DependentScopeDeclRefExpr *Node) { 1325 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1326 Qualifier->print(OS, Policy); 1327 if (Node->hasTemplateKeyword()) 1328 OS << "template "; 1329 OS << Node->getNameInfo(); 1330 if (Node->hasExplicitTemplateArgs()) 1331 printTemplateArgumentList(OS, Node->template_arguments(), Policy); 1332 } 1333 1334 void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 1335 if (Node->getQualifier()) 1336 Node->getQualifier()->print(OS, Policy); 1337 if (Node->hasTemplateKeyword()) 1338 OS << "template "; 1339 OS << Node->getNameInfo(); 1340 if (Node->hasExplicitTemplateArgs()) 1341 printTemplateArgumentList(OS, Node->template_arguments(), Policy); 1342 } 1343 1344 static bool isImplicitSelf(const Expr *E) { 1345 if (const auto *DRE = dyn_cast<DeclRefExpr>(E)) { 1346 if (const ImplicitParamDecl *PD = 1347 dyn_cast<ImplicitParamDecl>(DRE->getDecl())) { 1348 if (PD->getParameterKind() == ImplicitParamDecl::ObjCSelf && 1349 DRE->getLocStart().isInvalid()) 1350 return true; 1351 } 1352 } 1353 return false; 1354 } 1355 1356 void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 1357 if (Node->getBase()) { 1358 if (!Policy.SuppressImplicitBase || 1359 !isImplicitSelf(Node->getBase()->IgnoreImpCasts())) { 1360 PrintExpr(Node->getBase()); 1361 OS << (Node->isArrow() ? "->" : "."); 1362 } 1363 } 1364 OS << *Node->getDecl(); 1365 } 1366 1367 void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 1368 if (Node->isSuperReceiver()) 1369 OS << "super."; 1370 else if (Node->isObjectReceiver() && Node->getBase()) { 1371 PrintExpr(Node->getBase()); 1372 OS << "."; 1373 } else if (Node->isClassReceiver() && Node->getClassReceiver()) { 1374 OS << Node->getClassReceiver()->getName() << "."; 1375 } 1376 1377 if (Node->isImplicitProperty()) 1378 Node->getImplicitPropertyGetter()->getSelector().print(OS); 1379 else 1380 OS << Node->getExplicitProperty()->getName(); 1381 } 1382 1383 void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) { 1384 1385 PrintExpr(Node->getBaseExpr()); 1386 OS << "["; 1387 PrintExpr(Node->getKeyExpr()); 1388 OS << "]"; 1389 } 1390 1391 void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) { 1392 OS << PredefinedExpr::getIdentTypeName(Node->getIdentType()); 1393 } 1394 1395 void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { 1396 unsigned value = Node->getValue(); 1397 1398 switch (Node->getKind()) { 1399 case CharacterLiteral::Ascii: break; // no prefix. 1400 case CharacterLiteral::Wide: OS << 'L'; break; 1401 case CharacterLiteral::UTF8: OS << "u8"; break; 1402 case CharacterLiteral::UTF16: OS << 'u'; break; 1403 case CharacterLiteral::UTF32: OS << 'U'; break; 1404 } 1405 1406 switch (value) { 1407 case '\\': 1408 OS << "'\\\\'"; 1409 break; 1410 case '\'': 1411 OS << "'\\''"; 1412 break; 1413 case '\a': 1414 // TODO: K&R: the meaning of '\\a' is different in traditional C 1415 OS << "'\\a'"; 1416 break; 1417 case '\b': 1418 OS << "'\\b'"; 1419 break; 1420 // Nonstandard escape sequence. 1421 /*case '\e': 1422 OS << "'\\e'"; 1423 break;*/ 1424 case '\f': 1425 OS << "'\\f'"; 1426 break; 1427 case '\n': 1428 OS << "'\\n'"; 1429 break; 1430 case '\r': 1431 OS << "'\\r'"; 1432 break; 1433 case '\t': 1434 OS << "'\\t'"; 1435 break; 1436 case '\v': 1437 OS << "'\\v'"; 1438 break; 1439 default: 1440 // A character literal might be sign-extended, which 1441 // would result in an invalid \U escape sequence. 1442 // FIXME: multicharacter literals such as '\xFF\xFF\xFF\xFF' 1443 // are not correctly handled. 1444 if ((value & ~0xFFu) == ~0xFFu && Node->getKind() == CharacterLiteral::Ascii) 1445 value &= 0xFFu; 1446 if (value < 256 && isPrintable((unsigned char)value)) 1447 OS << "'" << (char)value << "'"; 1448 else if (value < 256) 1449 OS << "'\\x" << llvm::format("%02x", value) << "'"; 1450 else if (value <= 0xFFFF) 1451 OS << "'\\u" << llvm::format("%04x", value) << "'"; 1452 else 1453 OS << "'\\U" << llvm::format("%08x", value) << "'"; 1454 } 1455 } 1456 1457 /// Prints the given expression using the original source text. Returns true on 1458 /// success, false otherwise. 1459 static bool printExprAsWritten(raw_ostream &OS, Expr *E, 1460 const ASTContext *Context) { 1461 if (!Context) 1462 return false; 1463 bool Invalid = false; 1464 StringRef Source = Lexer::getSourceText( 1465 CharSourceRange::getTokenRange(E->getSourceRange()), 1466 Context->getSourceManager(), Context->getLangOpts(), &Invalid); 1467 if (!Invalid) { 1468 OS << Source; 1469 return true; 1470 } 1471 return false; 1472 } 1473 1474 void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { 1475 if (Policy.ConstantsAsWritten && printExprAsWritten(OS, Node, Context)) 1476 return; 1477 bool isSigned = Node->getType()->isSignedIntegerType(); 1478 OS << Node->getValue().toString(10, isSigned); 1479 1480 // Emit suffixes. Integer literals are always a builtin integer type. 1481 switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 1482 default: llvm_unreachable("Unexpected type for integer literal!"); 1483 case BuiltinType::Char_S: 1484 case BuiltinType::Char_U: OS << "i8"; break; 1485 case BuiltinType::UChar: OS << "Ui8"; break; 1486 case BuiltinType::Short: OS << "i16"; break; 1487 case BuiltinType::UShort: OS << "Ui16"; break; 1488 case BuiltinType::Int: break; // no suffix. 1489 case BuiltinType::UInt: OS << 'U'; break; 1490 case BuiltinType::Long: OS << 'L'; break; 1491 case BuiltinType::ULong: OS << "UL"; break; 1492 case BuiltinType::LongLong: OS << "LL"; break; 1493 case BuiltinType::ULongLong: OS << "ULL"; break; 1494 } 1495 } 1496 1497 static void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node, 1498 bool PrintSuffix) { 1499 SmallString<16> Str; 1500 Node->getValue().toString(Str); 1501 OS << Str; 1502 if (Str.find_first_not_of("-0123456789") == StringRef::npos) 1503 OS << '.'; // Trailing dot in order to separate from ints. 1504 1505 if (!PrintSuffix) 1506 return; 1507 1508 // Emit suffixes. Float literals are always a builtin float type. 1509 switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 1510 default: llvm_unreachable("Unexpected type for float literal!"); 1511 case BuiltinType::Half: break; // FIXME: suffix? 1512 case BuiltinType::Double: break; // no suffix. 1513 case BuiltinType::Float16: OS << "F16"; break; 1514 case BuiltinType::Float: OS << 'F'; break; 1515 case BuiltinType::LongDouble: OS << 'L'; break; 1516 case BuiltinType::Float128: OS << 'Q'; break; 1517 } 1518 } 1519 1520 void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { 1521 if (Policy.ConstantsAsWritten && printExprAsWritten(OS, Node, Context)) 1522 return; 1523 PrintFloatingLiteral(OS, Node, /*PrintSuffix=*/true); 1524 } 1525 1526 void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { 1527 PrintExpr(Node->getSubExpr()); 1528 OS << "i"; 1529 } 1530 1531 void StmtPrinter::VisitStringLiteral(StringLiteral *Str) { 1532 Str->outputString(OS); 1533 } 1534 void StmtPrinter::VisitParenExpr(ParenExpr *Node) { 1535 OS << "("; 1536 PrintExpr(Node->getSubExpr()); 1537 OS << ")"; 1538 } 1539 void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) { 1540 if (!Node->isPostfix()) { 1541 OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 1542 1543 // Print a space if this is an "identifier operator" like __real, or if 1544 // it might be concatenated incorrectly like '+'. 1545 switch (Node->getOpcode()) { 1546 default: break; 1547 case UO_Real: 1548 case UO_Imag: 1549 case UO_Extension: 1550 OS << ' '; 1551 break; 1552 case UO_Plus: 1553 case UO_Minus: 1554 if (isa<UnaryOperator>(Node->getSubExpr())) 1555 OS << ' '; 1556 break; 1557 } 1558 } 1559 PrintExpr(Node->getSubExpr()); 1560 1561 if (Node->isPostfix()) 1562 OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 1563 } 1564 1565 void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) { 1566 OS << "__builtin_offsetof("; 1567 Node->getTypeSourceInfo()->getType().print(OS, Policy); 1568 OS << ", "; 1569 bool PrintedSomething = false; 1570 for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) { 1571 OffsetOfNode ON = Node->getComponent(i); 1572 if (ON.getKind() == OffsetOfNode::Array) { 1573 // Array node 1574 OS << "["; 1575 PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex())); 1576 OS << "]"; 1577 PrintedSomething = true; 1578 continue; 1579 } 1580 1581 // Skip implicit base indirections. 1582 if (ON.getKind() == OffsetOfNode::Base) 1583 continue; 1584 1585 // Field or identifier node. 1586 IdentifierInfo *Id = ON.getFieldName(); 1587 if (!Id) 1588 continue; 1589 1590 if (PrintedSomething) 1591 OS << "."; 1592 else 1593 PrintedSomething = true; 1594 OS << Id->getName(); 1595 } 1596 OS << ")"; 1597 } 1598 1599 void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){ 1600 switch(Node->getKind()) { 1601 case UETT_SizeOf: 1602 OS << "sizeof"; 1603 break; 1604 case UETT_AlignOf: 1605 if (Policy.Alignof) 1606 OS << "alignof"; 1607 else if (Policy.UnderscoreAlignof) 1608 OS << "_Alignof"; 1609 else 1610 OS << "__alignof"; 1611 break; 1612 case UETT_VecStep: 1613 OS << "vec_step"; 1614 break; 1615 case UETT_OpenMPRequiredSimdAlign: 1616 OS << "__builtin_omp_required_simd_align"; 1617 break; 1618 } 1619 if (Node->isArgumentType()) { 1620 OS << '('; 1621 Node->getArgumentType().print(OS, Policy); 1622 OS << ')'; 1623 } else { 1624 OS << " "; 1625 PrintExpr(Node->getArgumentExpr()); 1626 } 1627 } 1628 1629 void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) { 1630 OS << "_Generic("; 1631 PrintExpr(Node->getControllingExpr()); 1632 for (unsigned i = 0; i != Node->getNumAssocs(); ++i) { 1633 OS << ", "; 1634 QualType T = Node->getAssocType(i); 1635 if (T.isNull()) 1636 OS << "default"; 1637 else 1638 T.print(OS, Policy); 1639 OS << ": "; 1640 PrintExpr(Node->getAssocExpr(i)); 1641 } 1642 OS << ")"; 1643 } 1644 1645 void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { 1646 PrintExpr(Node->getLHS()); 1647 OS << "["; 1648 PrintExpr(Node->getRHS()); 1649 OS << "]"; 1650 } 1651 1652 void StmtPrinter::VisitOMPArraySectionExpr(OMPArraySectionExpr *Node) { 1653 PrintExpr(Node->getBase()); 1654 OS << "["; 1655 if (Node->getLowerBound()) 1656 PrintExpr(Node->getLowerBound()); 1657 if (Node->getColonLoc().isValid()) { 1658 OS << ":"; 1659 if (Node->getLength()) 1660 PrintExpr(Node->getLength()); 1661 } 1662 OS << "]"; 1663 } 1664 1665 void StmtPrinter::PrintCallArgs(CallExpr *Call) { 1666 for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { 1667 if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { 1668 // Don't print any defaulted arguments 1669 break; 1670 } 1671 1672 if (i) OS << ", "; 1673 PrintExpr(Call->getArg(i)); 1674 } 1675 } 1676 1677 void StmtPrinter::VisitCallExpr(CallExpr *Call) { 1678 PrintExpr(Call->getCallee()); 1679 OS << "("; 1680 PrintCallArgs(Call); 1681 OS << ")"; 1682 } 1683 1684 static bool isImplicitThis(const Expr *E) { 1685 if (const auto *TE = dyn_cast<CXXThisExpr>(E)) 1686 return TE->isImplicit(); 1687 return false; 1688 } 1689 1690 void StmtPrinter::VisitMemberExpr(MemberExpr *Node) { 1691 if (!Policy.SuppressImplicitBase || !isImplicitThis(Node->getBase())) { 1692 PrintExpr(Node->getBase()); 1693 1694 MemberExpr *ParentMember = dyn_cast<MemberExpr>(Node->getBase()); 1695 FieldDecl *ParentDecl = 1696 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl()) 1697 : nullptr; 1698 1699 if (!ParentDecl || !ParentDecl->isAnonymousStructOrUnion()) 1700 OS << (Node->isArrow() ? "->" : "."); 1701 } 1702 1703 if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl())) 1704 if (FD->isAnonymousStructOrUnion()) 1705 return; 1706 1707 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1708 Qualifier->print(OS, Policy); 1709 if (Node->hasTemplateKeyword()) 1710 OS << "template "; 1711 OS << Node->getMemberNameInfo(); 1712 if (Node->hasExplicitTemplateArgs()) 1713 printTemplateArgumentList(OS, Node->template_arguments(), Policy); 1714 } 1715 void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) { 1716 PrintExpr(Node->getBase()); 1717 OS << (Node->isArrow() ? "->isa" : ".isa"); 1718 } 1719 1720 void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 1721 PrintExpr(Node->getBase()); 1722 OS << "."; 1723 OS << Node->getAccessor().getName(); 1724 } 1725 void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { 1726 OS << '('; 1727 Node->getTypeAsWritten().print(OS, Policy); 1728 OS << ')'; 1729 PrintExpr(Node->getSubExpr()); 1730 } 1731 void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { 1732 OS << '('; 1733 Node->getType().print(OS, Policy); 1734 OS << ')'; 1735 PrintExpr(Node->getInitializer()); 1736 } 1737 void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 1738 // No need to print anything, simply forward to the subexpression. 1739 PrintExpr(Node->getSubExpr()); 1740 } 1741 void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) { 1742 PrintExpr(Node->getLHS()); 1743 OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 1744 PrintExpr(Node->getRHS()); 1745 } 1746 void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 1747 PrintExpr(Node->getLHS()); 1748 OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 1749 PrintExpr(Node->getRHS()); 1750 } 1751 void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) { 1752 PrintExpr(Node->getCond()); 1753 OS << " ? "; 1754 PrintExpr(Node->getLHS()); 1755 OS << " : "; 1756 PrintExpr(Node->getRHS()); 1757 } 1758 1759 // GNU extensions. 1760 1761 void 1762 StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) { 1763 PrintExpr(Node->getCommon()); 1764 OS << " ?: "; 1765 PrintExpr(Node->getFalseExpr()); 1766 } 1767 void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) { 1768 OS << "&&" << Node->getLabel()->getName(); 1769 } 1770 1771 void StmtPrinter::VisitStmtExpr(StmtExpr *E) { 1772 OS << "("; 1773 PrintRawCompoundStmt(E->getSubStmt()); 1774 OS << ")"; 1775 } 1776 1777 void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) { 1778 OS << "__builtin_choose_expr("; 1779 PrintExpr(Node->getCond()); 1780 OS << ", "; 1781 PrintExpr(Node->getLHS()); 1782 OS << ", "; 1783 PrintExpr(Node->getRHS()); 1784 OS << ")"; 1785 } 1786 1787 void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) { 1788 OS << "__null"; 1789 } 1790 1791 void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) { 1792 OS << "__builtin_shufflevector("; 1793 for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) { 1794 if (i) OS << ", "; 1795 PrintExpr(Node->getExpr(i)); 1796 } 1797 OS << ")"; 1798 } 1799 1800 void StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) { 1801 OS << "__builtin_convertvector("; 1802 PrintExpr(Node->getSrcExpr()); 1803 OS << ", "; 1804 Node->getType().print(OS, Policy); 1805 OS << ")"; 1806 } 1807 1808 void StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 1809 if (Node->getSyntacticForm()) { 1810 Visit(Node->getSyntacticForm()); 1811 return; 1812 } 1813 1814 OS << "{"; 1815 for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) { 1816 if (i) OS << ", "; 1817 if (Node->getInit(i)) 1818 PrintExpr(Node->getInit(i)); 1819 else 1820 OS << "{}"; 1821 } 1822 OS << "}"; 1823 } 1824 1825 void StmtPrinter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *Node) { 1826 // There's no way to express this expression in any of our supported 1827 // languages, so just emit something terse and (hopefully) clear. 1828 OS << "{"; 1829 PrintExpr(Node->getSubExpr()); 1830 OS << "}"; 1831 } 1832 1833 void StmtPrinter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *Node) { 1834 OS << "*"; 1835 } 1836 1837 void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) { 1838 OS << "("; 1839 for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) { 1840 if (i) OS << ", "; 1841 PrintExpr(Node->getExpr(i)); 1842 } 1843 OS << ")"; 1844 } 1845 1846 void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { 1847 bool NeedsEquals = true; 1848 for (const DesignatedInitExpr::Designator &D : Node->designators()) { 1849 if (D.isFieldDesignator()) { 1850 if (D.getDotLoc().isInvalid()) { 1851 if (IdentifierInfo *II = D.getFieldName()) { 1852 OS << II->getName() << ":"; 1853 NeedsEquals = false; 1854 } 1855 } else { 1856 OS << "." << D.getFieldName()->getName(); 1857 } 1858 } else { 1859 OS << "["; 1860 if (D.isArrayDesignator()) { 1861 PrintExpr(Node->getArrayIndex(D)); 1862 } else { 1863 PrintExpr(Node->getArrayRangeStart(D)); 1864 OS << " ... "; 1865 PrintExpr(Node->getArrayRangeEnd(D)); 1866 } 1867 OS << "]"; 1868 } 1869 } 1870 1871 if (NeedsEquals) 1872 OS << " = "; 1873 else 1874 OS << " "; 1875 PrintExpr(Node->getInit()); 1876 } 1877 1878 void StmtPrinter::VisitDesignatedInitUpdateExpr( 1879 DesignatedInitUpdateExpr *Node) { 1880 OS << "{"; 1881 OS << "/*base*/"; 1882 PrintExpr(Node->getBase()); 1883 OS << ", "; 1884 1885 OS << "/*updater*/"; 1886 PrintExpr(Node->getUpdater()); 1887 OS << "}"; 1888 } 1889 1890 void StmtPrinter::VisitNoInitExpr(NoInitExpr *Node) { 1891 OS << "/*no init*/"; 1892 } 1893 1894 void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) { 1895 if (Node->getType()->getAsCXXRecordDecl()) { 1896 OS << "/*implicit*/"; 1897 Node->getType().print(OS, Policy); 1898 OS << "()"; 1899 } else { 1900 OS << "/*implicit*/("; 1901 Node->getType().print(OS, Policy); 1902 OS << ')'; 1903 if (Node->getType()->isRecordType()) 1904 OS << "{}"; 1905 else 1906 OS << 0; 1907 } 1908 } 1909 1910 void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) { 1911 OS << "__builtin_va_arg("; 1912 PrintExpr(Node->getSubExpr()); 1913 OS << ", "; 1914 Node->getType().print(OS, Policy); 1915 OS << ")"; 1916 } 1917 1918 void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) { 1919 PrintExpr(Node->getSyntacticForm()); 1920 } 1921 1922 void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) { 1923 const char *Name = nullptr; 1924 switch (Node->getOp()) { 1925 #define BUILTIN(ID, TYPE, ATTRS) 1926 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \ 1927 case AtomicExpr::AO ## ID: \ 1928 Name = #ID "("; \ 1929 break; 1930 #include "clang/Basic/Builtins.def" 1931 } 1932 OS << Name; 1933 1934 // AtomicExpr stores its subexpressions in a permuted order. 1935 PrintExpr(Node->getPtr()); 1936 if (Node->getOp() != AtomicExpr::AO__c11_atomic_load && 1937 Node->getOp() != AtomicExpr::AO__atomic_load_n && 1938 Node->getOp() != AtomicExpr::AO__opencl_atomic_load) { 1939 OS << ", "; 1940 PrintExpr(Node->getVal1()); 1941 } 1942 if (Node->getOp() == AtomicExpr::AO__atomic_exchange || 1943 Node->isCmpXChg()) { 1944 OS << ", "; 1945 PrintExpr(Node->getVal2()); 1946 } 1947 if (Node->getOp() == AtomicExpr::AO__atomic_compare_exchange || 1948 Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) { 1949 OS << ", "; 1950 PrintExpr(Node->getWeak()); 1951 } 1952 if (Node->getOp() != AtomicExpr::AO__c11_atomic_init && 1953 Node->getOp() != AtomicExpr::AO__opencl_atomic_init) { 1954 OS << ", "; 1955 PrintExpr(Node->getOrder()); 1956 } 1957 if (Node->isCmpXChg()) { 1958 OS << ", "; 1959 PrintExpr(Node->getOrderFail()); 1960 } 1961 OS << ")"; 1962 } 1963 1964 // C++ 1965 void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { 1966 const char *OpStrings[NUM_OVERLOADED_OPERATORS] = { 1967 "", 1968 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 1969 Spelling, 1970 #include "clang/Basic/OperatorKinds.def" 1971 }; 1972 1973 OverloadedOperatorKind Kind = Node->getOperator(); 1974 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 1975 if (Node->getNumArgs() == 1) { 1976 OS << OpStrings[Kind] << ' '; 1977 PrintExpr(Node->getArg(0)); 1978 } else { 1979 PrintExpr(Node->getArg(0)); 1980 OS << ' ' << OpStrings[Kind]; 1981 } 1982 } else if (Kind == OO_Arrow) { 1983 PrintExpr(Node->getArg(0)); 1984 } else if (Kind == OO_Call) { 1985 PrintExpr(Node->getArg(0)); 1986 OS << '('; 1987 for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) { 1988 if (ArgIdx > 1) 1989 OS << ", "; 1990 if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx))) 1991 PrintExpr(Node->getArg(ArgIdx)); 1992 } 1993 OS << ')'; 1994 } else if (Kind == OO_Subscript) { 1995 PrintExpr(Node->getArg(0)); 1996 OS << '['; 1997 PrintExpr(Node->getArg(1)); 1998 OS << ']'; 1999 } else if (Node->getNumArgs() == 1) { 2000 OS << OpStrings[Kind] << ' '; 2001 PrintExpr(Node->getArg(0)); 2002 } else if (Node->getNumArgs() == 2) { 2003 PrintExpr(Node->getArg(0)); 2004 OS << ' ' << OpStrings[Kind] << ' '; 2005 PrintExpr(Node->getArg(1)); 2006 } else { 2007 llvm_unreachable("unknown overloaded operator"); 2008 } 2009 } 2010 2011 void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { 2012 // If we have a conversion operator call only print the argument. 2013 CXXMethodDecl *MD = Node->getMethodDecl(); 2014 if (MD && isa<CXXConversionDecl>(MD)) { 2015 PrintExpr(Node->getImplicitObjectArgument()); 2016 return; 2017 } 2018 VisitCallExpr(cast<CallExpr>(Node)); 2019 } 2020 2021 void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) { 2022 PrintExpr(Node->getCallee()); 2023 OS << "<<<"; 2024 PrintCallArgs(Node->getConfig()); 2025 OS << ">>>("; 2026 PrintCallArgs(Node); 2027 OS << ")"; 2028 } 2029 2030 void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 2031 OS << Node->getCastName() << '<'; 2032 Node->getTypeAsWritten().print(OS, Policy); 2033 OS << ">("; 2034 PrintExpr(Node->getSubExpr()); 2035 OS << ")"; 2036 } 2037 2038 void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) { 2039 VisitCXXNamedCastExpr(Node); 2040 } 2041 2042 void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) { 2043 VisitCXXNamedCastExpr(Node); 2044 } 2045 2046 void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) { 2047 VisitCXXNamedCastExpr(Node); 2048 } 2049 2050 void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) { 2051 VisitCXXNamedCastExpr(Node); 2052 } 2053 2054 void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { 2055 OS << "typeid("; 2056 if (Node->isTypeOperand()) { 2057 Node->getTypeOperandSourceInfo()->getType().print(OS, Policy); 2058 } else { 2059 PrintExpr(Node->getExprOperand()); 2060 } 2061 OS << ")"; 2062 } 2063 2064 void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) { 2065 OS << "__uuidof("; 2066 if (Node->isTypeOperand()) { 2067 Node->getTypeOperandSourceInfo()->getType().print(OS, Policy); 2068 } else { 2069 PrintExpr(Node->getExprOperand()); 2070 } 2071 OS << ")"; 2072 } 2073 2074 void StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) { 2075 PrintExpr(Node->getBaseExpr()); 2076 if (Node->isArrow()) 2077 OS << "->"; 2078 else 2079 OS << "."; 2080 if (NestedNameSpecifier *Qualifier = 2081 Node->getQualifierLoc().getNestedNameSpecifier()) 2082 Qualifier->print(OS, Policy); 2083 OS << Node->getPropertyDecl()->getDeclName(); 2084 } 2085 2086 void StmtPrinter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *Node) { 2087 PrintExpr(Node->getBase()); 2088 OS << "["; 2089 PrintExpr(Node->getIdx()); 2090 OS << "]"; 2091 } 2092 2093 void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) { 2094 switch (Node->getLiteralOperatorKind()) { 2095 case UserDefinedLiteral::LOK_Raw: 2096 OS << cast<StringLiteral>(Node->getArg(0)->IgnoreImpCasts())->getString(); 2097 break; 2098 case UserDefinedLiteral::LOK_Template: { 2099 DeclRefExpr *DRE = cast<DeclRefExpr>(Node->getCallee()->IgnoreImpCasts()); 2100 const TemplateArgumentList *Args = 2101 cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs(); 2102 assert(Args); 2103 2104 if (Args->size() != 1) { 2105 OS << "operator\"\"" << Node->getUDSuffix()->getName(); 2106 printTemplateArgumentList(OS, Args->asArray(), Policy); 2107 OS << "()"; 2108 return; 2109 } 2110 2111 const TemplateArgument &Pack = Args->get(0); 2112 for (const auto &P : Pack.pack_elements()) { 2113 char C = (char)P.getAsIntegral().getZExtValue(); 2114 OS << C; 2115 } 2116 break; 2117 } 2118 case UserDefinedLiteral::LOK_Integer: { 2119 // Print integer literal without suffix. 2120 IntegerLiteral *Int = cast<IntegerLiteral>(Node->getCookedLiteral()); 2121 OS << Int->getValue().toString(10, /*isSigned*/false); 2122 break; 2123 } 2124 case UserDefinedLiteral::LOK_Floating: { 2125 // Print floating literal without suffix. 2126 FloatingLiteral *Float = cast<FloatingLiteral>(Node->getCookedLiteral()); 2127 PrintFloatingLiteral(OS, Float, /*PrintSuffix=*/false); 2128 break; 2129 } 2130 case UserDefinedLiteral::LOK_String: 2131 case UserDefinedLiteral::LOK_Character: 2132 PrintExpr(Node->getCookedLiteral()); 2133 break; 2134 } 2135 OS << Node->getUDSuffix()->getName(); 2136 } 2137 2138 void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 2139 OS << (Node->getValue() ? "true" : "false"); 2140 } 2141 2142 void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { 2143 OS << "nullptr"; 2144 } 2145 2146 void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { 2147 OS << "this"; 2148 } 2149 2150 void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) { 2151 if (!Node->getSubExpr()) 2152 OS << "throw"; 2153 else { 2154 OS << "throw "; 2155 PrintExpr(Node->getSubExpr()); 2156 } 2157 } 2158 2159 void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { 2160 // Nothing to print: we picked up the default argument. 2161 } 2162 2163 void StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) { 2164 // Nothing to print: we picked up the default initializer. 2165 } 2166 2167 void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 2168 Node->getType().print(OS, Policy); 2169 // If there are no parens, this is list-initialization, and the braces are 2170 // part of the syntax of the inner construct. 2171 if (Node->getLParenLoc().isValid()) 2172 OS << "("; 2173 PrintExpr(Node->getSubExpr()); 2174 if (Node->getLParenLoc().isValid()) 2175 OS << ")"; 2176 } 2177 2178 void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 2179 PrintExpr(Node->getSubExpr()); 2180 } 2181 2182 void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { 2183 Node->getType().print(OS, Policy); 2184 if (Node->isStdInitListInitialization()) 2185 /* Nothing to do; braces are part of creating the std::initializer_list. */; 2186 else if (Node->isListInitialization()) 2187 OS << "{"; 2188 else 2189 OS << "("; 2190 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(), 2191 ArgEnd = Node->arg_end(); 2192 Arg != ArgEnd; ++Arg) { 2193 if ((*Arg)->isDefaultArgument()) 2194 break; 2195 if (Arg != Node->arg_begin()) 2196 OS << ", "; 2197 PrintExpr(*Arg); 2198 } 2199 if (Node->isStdInitListInitialization()) 2200 /* See above. */; 2201 else if (Node->isListInitialization()) 2202 OS << "}"; 2203 else 2204 OS << ")"; 2205 } 2206 2207 void StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) { 2208 OS << '['; 2209 bool NeedComma = false; 2210 switch (Node->getCaptureDefault()) { 2211 case LCD_None: 2212 break; 2213 2214 case LCD_ByCopy: 2215 OS << '='; 2216 NeedComma = true; 2217 break; 2218 2219 case LCD_ByRef: 2220 OS << '&'; 2221 NeedComma = true; 2222 break; 2223 } 2224 for (LambdaExpr::capture_iterator C = Node->explicit_capture_begin(), 2225 CEnd = Node->explicit_capture_end(); 2226 C != CEnd; 2227 ++C) { 2228 if (C->capturesVLAType()) 2229 continue; 2230 2231 if (NeedComma) 2232 OS << ", "; 2233 NeedComma = true; 2234 2235 switch (C->getCaptureKind()) { 2236 case LCK_This: 2237 OS << "this"; 2238 break; 2239 case LCK_StarThis: 2240 OS << "*this"; 2241 break; 2242 case LCK_ByRef: 2243 if (Node->getCaptureDefault() != LCD_ByRef || Node->isInitCapture(C)) 2244 OS << '&'; 2245 OS << C->getCapturedVar()->getName(); 2246 break; 2247 2248 case LCK_ByCopy: 2249 OS << C->getCapturedVar()->getName(); 2250 break; 2251 case LCK_VLAType: 2252 llvm_unreachable("VLA type in explicit captures."); 2253 } 2254 2255 if (Node->isInitCapture(C)) 2256 PrintExpr(C->getCapturedVar()->getInit()); 2257 } 2258 OS << ']'; 2259 2260 if (Node->hasExplicitParameters()) { 2261 OS << " ("; 2262 CXXMethodDecl *Method = Node->getCallOperator(); 2263 NeedComma = false; 2264 for (auto P : Method->parameters()) { 2265 if (NeedComma) { 2266 OS << ", "; 2267 } else { 2268 NeedComma = true; 2269 } 2270 std::string ParamStr = P->getNameAsString(); 2271 P->getOriginalType().print(OS, Policy, ParamStr); 2272 } 2273 if (Method->isVariadic()) { 2274 if (NeedComma) 2275 OS << ", "; 2276 OS << "..."; 2277 } 2278 OS << ')'; 2279 2280 if (Node->isMutable()) 2281 OS << " mutable"; 2282 2283 const FunctionProtoType *Proto 2284 = Method->getType()->getAs<FunctionProtoType>(); 2285 Proto->printExceptionSpecification(OS, Policy); 2286 2287 // FIXME: Attributes 2288 2289 // Print the trailing return type if it was specified in the source. 2290 if (Node->hasExplicitResultType()) { 2291 OS << " -> "; 2292 Proto->getReturnType().print(OS, Policy); 2293 } 2294 } 2295 2296 // Print the body. 2297 CompoundStmt *Body = Node->getBody(); 2298 OS << ' '; 2299 PrintStmt(Body); 2300 } 2301 2302 void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) { 2303 if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo()) 2304 TSInfo->getType().print(OS, Policy); 2305 else 2306 Node->getType().print(OS, Policy); 2307 OS << "()"; 2308 } 2309 2310 void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { 2311 if (E->isGlobalNew()) 2312 OS << "::"; 2313 OS << "new "; 2314 unsigned NumPlace = E->getNumPlacementArgs(); 2315 if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(E->getPlacementArg(0))) { 2316 OS << "("; 2317 PrintExpr(E->getPlacementArg(0)); 2318 for (unsigned i = 1; i < NumPlace; ++i) { 2319 if (isa<CXXDefaultArgExpr>(E->getPlacementArg(i))) 2320 break; 2321 OS << ", "; 2322 PrintExpr(E->getPlacementArg(i)); 2323 } 2324 OS << ") "; 2325 } 2326 if (E->isParenTypeId()) 2327 OS << "("; 2328 std::string TypeS; 2329 if (Expr *Size = E->getArraySize()) { 2330 llvm::raw_string_ostream s(TypeS); 2331 s << '['; 2332 Size->printPretty(s, Helper, Policy); 2333 s << ']'; 2334 } 2335 E->getAllocatedType().print(OS, Policy, TypeS); 2336 if (E->isParenTypeId()) 2337 OS << ")"; 2338 2339 CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle(); 2340 if (InitStyle) { 2341 if (InitStyle == CXXNewExpr::CallInit) 2342 OS << "("; 2343 PrintExpr(E->getInitializer()); 2344 if (InitStyle == CXXNewExpr::CallInit) 2345 OS << ")"; 2346 } 2347 } 2348 2349 void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 2350 if (E->isGlobalDelete()) 2351 OS << "::"; 2352 OS << "delete "; 2353 if (E->isArrayForm()) 2354 OS << "[] "; 2355 PrintExpr(E->getArgument()); 2356 } 2357 2358 void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 2359 PrintExpr(E->getBase()); 2360 if (E->isArrow()) 2361 OS << "->"; 2362 else 2363 OS << '.'; 2364 if (E->getQualifier()) 2365 E->getQualifier()->print(OS, Policy); 2366 OS << "~"; 2367 2368 if (IdentifierInfo *II = E->getDestroyedTypeIdentifier()) 2369 OS << II->getName(); 2370 else 2371 E->getDestroyedType().print(OS, Policy); 2372 } 2373 2374 void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) { 2375 if (E->isListInitialization() && !E->isStdInitListInitialization()) 2376 OS << "{"; 2377 2378 for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 2379 if (isa<CXXDefaultArgExpr>(E->getArg(i))) { 2380 // Don't print any defaulted arguments 2381 break; 2382 } 2383 2384 if (i) OS << ", "; 2385 PrintExpr(E->getArg(i)); 2386 } 2387 2388 if (E->isListInitialization() && !E->isStdInitListInitialization()) 2389 OS << "}"; 2390 } 2391 2392 void StmtPrinter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) { 2393 // Parens are printed by the surrounding context. 2394 OS << "<forwarded>"; 2395 } 2396 2397 void StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) { 2398 PrintExpr(E->getSubExpr()); 2399 } 2400 2401 void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) { 2402 // Just forward to the subexpression. 2403 PrintExpr(E->getSubExpr()); 2404 } 2405 2406 void 2407 StmtPrinter::VisitCXXUnresolvedConstructExpr( 2408 CXXUnresolvedConstructExpr *Node) { 2409 Node->getTypeAsWritten().print(OS, Policy); 2410 OS << "("; 2411 for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(), 2412 ArgEnd = Node->arg_end(); 2413 Arg != ArgEnd; ++Arg) { 2414 if (Arg != Node->arg_begin()) 2415 OS << ", "; 2416 PrintExpr(*Arg); 2417 } 2418 OS << ")"; 2419 } 2420 2421 void StmtPrinter::VisitCXXDependentScopeMemberExpr( 2422 CXXDependentScopeMemberExpr *Node) { 2423 if (!Node->isImplicitAccess()) { 2424 PrintExpr(Node->getBase()); 2425 OS << (Node->isArrow() ? "->" : "."); 2426 } 2427 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 2428 Qualifier->print(OS, Policy); 2429 if (Node->hasTemplateKeyword()) 2430 OS << "template "; 2431 OS << Node->getMemberNameInfo(); 2432 if (Node->hasExplicitTemplateArgs()) 2433 printTemplateArgumentList(OS, Node->template_arguments(), Policy); 2434 } 2435 2436 void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) { 2437 if (!Node->isImplicitAccess()) { 2438 PrintExpr(Node->getBase()); 2439 OS << (Node->isArrow() ? "->" : "."); 2440 } 2441 if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 2442 Qualifier->print(OS, Policy); 2443 if (Node->hasTemplateKeyword()) 2444 OS << "template "; 2445 OS << Node->getMemberNameInfo(); 2446 if (Node->hasExplicitTemplateArgs()) 2447 printTemplateArgumentList(OS, Node->template_arguments(), Policy); 2448 } 2449 2450 static const char *getTypeTraitName(TypeTrait TT) { 2451 switch (TT) { 2452 #define TYPE_TRAIT_1(Spelling, Name, Key) \ 2453 case clang::UTT_##Name: return #Spelling; 2454 #define TYPE_TRAIT_2(Spelling, Name, Key) \ 2455 case clang::BTT_##Name: return #Spelling; 2456 #define TYPE_TRAIT_N(Spelling, Name, Key) \ 2457 case clang::TT_##Name: return #Spelling; 2458 #include "clang/Basic/TokenKinds.def" 2459 } 2460 llvm_unreachable("Type trait not covered by switch"); 2461 } 2462 2463 static const char *getTypeTraitName(ArrayTypeTrait ATT) { 2464 switch (ATT) { 2465 case ATT_ArrayRank: return "__array_rank"; 2466 case ATT_ArrayExtent: return "__array_extent"; 2467 } 2468 llvm_unreachable("Array type trait not covered by switch"); 2469 } 2470 2471 static const char *getExpressionTraitName(ExpressionTrait ET) { 2472 switch (ET) { 2473 case ET_IsLValueExpr: return "__is_lvalue_expr"; 2474 case ET_IsRValueExpr: return "__is_rvalue_expr"; 2475 } 2476 llvm_unreachable("Expression type trait not covered by switch"); 2477 } 2478 2479 void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) { 2480 OS << getTypeTraitName(E->getTrait()) << "("; 2481 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 2482 if (I > 0) 2483 OS << ", "; 2484 E->getArg(I)->getType().print(OS, Policy); 2485 } 2486 OS << ")"; 2487 } 2488 2489 void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 2490 OS << getTypeTraitName(E->getTrait()) << '('; 2491 E->getQueriedType().print(OS, Policy); 2492 OS << ')'; 2493 } 2494 2495 void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 2496 OS << getExpressionTraitName(E->getTrait()) << '('; 2497 PrintExpr(E->getQueriedExpression()); 2498 OS << ')'; 2499 } 2500 2501 void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 2502 OS << "noexcept("; 2503 PrintExpr(E->getOperand()); 2504 OS << ")"; 2505 } 2506 2507 void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) { 2508 PrintExpr(E->getPattern()); 2509 OS << "..."; 2510 } 2511 2512 void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 2513 OS << "sizeof...(" << *E->getPack() << ")"; 2514 } 2515 2516 void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr( 2517 SubstNonTypeTemplateParmPackExpr *Node) { 2518 OS << *Node->getParameterPack(); 2519 } 2520 2521 void StmtPrinter::VisitSubstNonTypeTemplateParmExpr( 2522 SubstNonTypeTemplateParmExpr *Node) { 2523 Visit(Node->getReplacement()); 2524 } 2525 2526 void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { 2527 OS << *E->getParameterPack(); 2528 } 2529 2530 void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){ 2531 PrintExpr(Node->GetTemporaryExpr()); 2532 } 2533 2534 void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) { 2535 OS << "("; 2536 if (E->getLHS()) { 2537 PrintExpr(E->getLHS()); 2538 OS << " " << BinaryOperator::getOpcodeStr(E->getOperator()) << " "; 2539 } 2540 OS << "..."; 2541 if (E->getRHS()) { 2542 OS << " " << BinaryOperator::getOpcodeStr(E->getOperator()) << " "; 2543 PrintExpr(E->getRHS()); 2544 } 2545 OS << ")"; 2546 } 2547 2548 // C++ Coroutines TS 2549 2550 void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) { 2551 Visit(S->getBody()); 2552 } 2553 2554 void StmtPrinter::VisitCoreturnStmt(CoreturnStmt *S) { 2555 OS << "co_return"; 2556 if (S->getOperand()) { 2557 OS << " "; 2558 Visit(S->getOperand()); 2559 } 2560 OS << ";"; 2561 } 2562 2563 void StmtPrinter::VisitCoawaitExpr(CoawaitExpr *S) { 2564 OS << "co_await "; 2565 PrintExpr(S->getOperand()); 2566 } 2567 2568 2569 void StmtPrinter::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) { 2570 OS << "co_await "; 2571 PrintExpr(S->getOperand()); 2572 } 2573 2574 2575 void StmtPrinter::VisitCoyieldExpr(CoyieldExpr *S) { 2576 OS << "co_yield "; 2577 PrintExpr(S->getOperand()); 2578 } 2579 2580 // Obj-C 2581 2582 void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { 2583 OS << "@"; 2584 VisitStringLiteral(Node->getString()); 2585 } 2586 2587 void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 2588 OS << "@"; 2589 Visit(E->getSubExpr()); 2590 } 2591 2592 void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 2593 OS << "@[ "; 2594 ObjCArrayLiteral::child_range Ch = E->children(); 2595 for (auto I = Ch.begin(), E = Ch.end(); I != E; ++I) { 2596 if (I != Ch.begin()) 2597 OS << ", "; 2598 Visit(*I); 2599 } 2600 OS << " ]"; 2601 } 2602 2603 void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 2604 OS << "@{ "; 2605 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 2606 if (I > 0) 2607 OS << ", "; 2608 2609 ObjCDictionaryElement Element = E->getKeyValueElement(I); 2610 Visit(Element.Key); 2611 OS << " : "; 2612 Visit(Element.Value); 2613 if (Element.isPackExpansion()) 2614 OS << "..."; 2615 } 2616 OS << " }"; 2617 } 2618 2619 void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 2620 OS << "@encode("; 2621 Node->getEncodedType().print(OS, Policy); 2622 OS << ')'; 2623 } 2624 2625 void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 2626 OS << "@selector("; 2627 Node->getSelector().print(OS); 2628 OS << ')'; 2629 } 2630 2631 void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 2632 OS << "@protocol(" << *Node->getProtocol() << ')'; 2633 } 2634 2635 void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { 2636 OS << "["; 2637 switch (Mess->getReceiverKind()) { 2638 case ObjCMessageExpr::Instance: 2639 PrintExpr(Mess->getInstanceReceiver()); 2640 break; 2641 2642 case ObjCMessageExpr::Class: 2643 Mess->getClassReceiver().print(OS, Policy); 2644 break; 2645 2646 case ObjCMessageExpr::SuperInstance: 2647 case ObjCMessageExpr::SuperClass: 2648 OS << "Super"; 2649 break; 2650 } 2651 2652 OS << ' '; 2653 Selector selector = Mess->getSelector(); 2654 if (selector.isUnarySelector()) { 2655 OS << selector.getNameForSlot(0); 2656 } else { 2657 for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) { 2658 if (i < selector.getNumArgs()) { 2659 if (i > 0) OS << ' '; 2660 if (selector.getIdentifierInfoForSlot(i)) 2661 OS << selector.getIdentifierInfoForSlot(i)->getName() << ':'; 2662 else 2663 OS << ":"; 2664 } 2665 else OS << ", "; // Handle variadic methods. 2666 2667 PrintExpr(Mess->getArg(i)); 2668 } 2669 } 2670 OS << "]"; 2671 } 2672 2673 void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) { 2674 OS << (Node->getValue() ? "__objc_yes" : "__objc_no"); 2675 } 2676 2677 void 2678 StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 2679 PrintExpr(E->getSubExpr()); 2680 } 2681 2682 void 2683 StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 2684 OS << '(' << E->getBridgeKindName(); 2685 E->getType().print(OS, Policy); 2686 OS << ')'; 2687 PrintExpr(E->getSubExpr()); 2688 } 2689 2690 void StmtPrinter::VisitBlockExpr(BlockExpr *Node) { 2691 BlockDecl *BD = Node->getBlockDecl(); 2692 OS << "^"; 2693 2694 const FunctionType *AFT = Node->getFunctionType(); 2695 2696 if (isa<FunctionNoProtoType>(AFT)) { 2697 OS << "()"; 2698 } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) { 2699 OS << '('; 2700 for (BlockDecl::param_iterator AI = BD->param_begin(), 2701 E = BD->param_end(); AI != E; ++AI) { 2702 if (AI != BD->param_begin()) OS << ", "; 2703 std::string ParamStr = (*AI)->getNameAsString(); 2704 (*AI)->getType().print(OS, Policy, ParamStr); 2705 } 2706 2707 const FunctionProtoType *FT = cast<FunctionProtoType>(AFT); 2708 if (FT->isVariadic()) { 2709 if (!BD->param_empty()) OS << ", "; 2710 OS << "..."; 2711 } 2712 OS << ')'; 2713 } 2714 OS << "{ }"; 2715 } 2716 2717 void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) { 2718 PrintExpr(Node->getSourceExpr()); 2719 } 2720 2721 void StmtPrinter::VisitTypoExpr(TypoExpr *Node) { 2722 // TODO: Print something reasonable for a TypoExpr, if necessary. 2723 llvm_unreachable("Cannot print TypoExpr nodes"); 2724 } 2725 2726 void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) { 2727 OS << "__builtin_astype("; 2728 PrintExpr(Node->getSrcExpr()); 2729 OS << ", "; 2730 Node->getType().print(OS, Policy); 2731 OS << ")"; 2732 } 2733 2734 //===----------------------------------------------------------------------===// 2735 // Stmt method implementations 2736 //===----------------------------------------------------------------------===// 2737 2738 void Stmt::dumpPretty(const ASTContext &Context) const { 2739 printPretty(llvm::errs(), nullptr, PrintingPolicy(Context.getLangOpts())); 2740 } 2741 2742 void Stmt::printPretty(raw_ostream &OS, PrinterHelper *Helper, 2743 const PrintingPolicy &Policy, unsigned Indentation, 2744 const ASTContext *Context) const { 2745 StmtPrinter P(OS, Helper, Policy, Indentation, Context); 2746 P.Visit(const_cast<Stmt*>(this)); 2747 } 2748 2749 //===----------------------------------------------------------------------===// 2750 // PrinterHelper 2751 //===----------------------------------------------------------------------===// 2752 2753 // Implement virtual destructor. 2754 PrinterHelper::~PrinterHelper() {} 2755