15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- StmtPrinter.cpp - Printing implementation for Stmt ASTs ----------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 106000dace22f110d8768476989313e9d981d690d0Chris Lattner// This file implements the Stmt::dumpPretty/Stmt::printPretty methods, which 116000dace22f110d8768476989313e9d981d690d0Chris Lattner// pretty print the AST back out to C code. 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 15471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include "clang/AST/ASTContext.h" 162fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Attr.h" 171a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor#include "clang/AST/DeclCXX.h" 1891d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h" 19c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor#include "clang/AST/DeclTemplate.h" 208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h" 21ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor#include "clang/AST/ExprCXX.h" 222fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/PrettyPrinter.h" 232fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/StmtVisitor.h" 246d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose#include "clang/Basic/CharInfo.h" 258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h" 266d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose#include "llvm/Support/Format.h" 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace { 34770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class StmtPrinter : public StmtVisitor<StmtPrinter> { 355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS; 365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned IndentLevel; 3742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek clang::PrinterHelper* Helper; 38d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintingPolicy Policy; 39d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 41d1420c6fa788669e49f21e184927c7833881e399Richard Smith StmtPrinter(raw_ostream &os, PrinterHelper* helper, 42e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner const PrintingPolicy &Policy, 43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation = 0) 44d1420c6fa788669e49f21e184927c7833881e399Richard Smith : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy) {} 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S) { 47d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintStmt(S, Policy.Indentation); 48d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor } 49d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 50d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S, int SubIndent) { 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel += SubIndent; 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (S && isa<Expr>(S)) { 535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is an expr used in a stmt context, indent and newline it. 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 55c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (S) { 58c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "<<<NULL STATEMENT>>>\n"; 615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel -= SubIndent; 635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 64db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman 655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawCompoundStmt(CompoundStmt *S); 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawDecl(Decl *D); 67915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman void PrintRawDeclStmt(const DeclStmt *S); 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawIfStmt(IfStmt *If); 698351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); 70d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne void PrintCallArgs(CallExpr *E); 7128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley void PrintRawSEHExceptHandler(SEHExceptStmt *S); 7228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley void PrintRawSEHFinallyStmt(SEHFinallyStmt *S); 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void PrintOMPExecutableDirective(OMPExecutableDirective *S); 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintExpr(Expr *E) { 765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (E) 77c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(E); 785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<null expr>"; 805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &Indent(int Delta = 0) { 83d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor for (int i = 0, e = IndentLevel+Delta; i < e; ++i) 84d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor OS << " "; 855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return OS; 865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void Visit(Stmt* S) { 8942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek if (Helper && Helper->handledStmt(S,OS)) 9042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek return; 9142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek else StmtVisitor<StmtPrinter>::Visit(S); 9242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek } 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 9461e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED { 9578e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis Indent() << "<<unknown stmt type>>\n"; 9678e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis } 9761e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED { 9878e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis OS << "<<unknown expr type>>"; 9978e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis } 10078e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10278e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis#define ABSTRACT_STMT(CLASS) 103f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \ 104c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void Visit##CLASS(CLASS *Node); 1054bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt printing methods. 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }. 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "{\n"; 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto *I : Node->body()) 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrintStmt(I); 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "}"; 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) { 124f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis D->print(OS, Policy, IndentLevel); 125071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump} 126071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump 127915c07db05375d563187f8b75fa4f766a5220b75Eli Friedmanvoid StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) { 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SmallVector<Decl*, 2> Decls(S->decls()); 129f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel); 130ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek} 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) { 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << ";\n"; 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) { 137db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman Indent(); 138db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman PrintRawDeclStmt(Node); 139db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman OS << ";\n"; 1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(Node); 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) { 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "case "; 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRHS()) { 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " ... "; 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ":\n"; 1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "default:\n"; 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) { 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << Node->getName() << ":\n"; 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 170534986f2b21e6050bf00163cd6423fd92155a6edRichard Smithvoid StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) { 171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines for (const auto *Attr : Node->getAttrs()) { 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Attr->printPretty(OS, Policy); 173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 175534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith PrintStmt(Node->getSubStmt(), 0); 176534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith} 177534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) { 179bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << "if ("; 180915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman if (const DeclStmt *DS = If->getConditionVariableDeclStmt()) 181915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman PrintRawDeclStmt(DS); 182915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman else 183915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman PrintExpr(If->getCond()); 184bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << ')'; 1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (If->getElse() ? ' ' : '\n'); 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getThen()); 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (If->getElse()) Indent(); 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Stmt *Else = If->getElse()) { 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "else"; 1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) { 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) { 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(ElseIf); 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getElse()); 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) { 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(If); 2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { 2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "switch ("; 220915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman if (const DeclStmt *DS = Node->getConditionVariableDeclStmt()) 221915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman PrintRawDeclStmt(DS); 222915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman else 223915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman PrintExpr(Node->getCond()); 2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Pretty print compoundstmt bodies (very common). 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) { 2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "while ("; 239915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman if (const DeclStmt *DS = Node->getConditionVariableDeclStmt()) 240915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman PrintRawDeclStmt(DS); 241915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman else 242915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman PrintExpr(Node->getCond()); 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")\n"; 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) { 2488bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent() << "do "; 2498bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2508bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2518bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2528bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2538bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2548bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2558bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent(); 2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 258b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << "while ("; 2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 260b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << ");\n"; 2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) { 2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "for ("; 2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getInit()) { 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit())) 267ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(cast<Expr>(Node->getInit())); 2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2718bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getCond()) { 2738bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2758bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2768bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 2778bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getInc()) { 2788bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getInc()); 2808bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2818bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ") "; 2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2838bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2848bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2858bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2868bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2878bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2888bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2898bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 292a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { 2930196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian Indent() << "for ("; 2940196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement())) 295ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 2960196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian else 2970196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(cast<Expr>(Node->getElement())); 2980196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << " in "; 2990196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(Node->getCollection()); 3000196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << ") "; 3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3020196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 3030196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintRawCompoundStmt(CS); 3040196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 3050196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } else { 3060196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 3070196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintStmt(Node->getBody()); 3080196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } 3090196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian} 3100196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian 311ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) { 312ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Indent() << "for ("; 313ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith PrintingPolicy SubPolicy(Policy); 314ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith SubPolicy.SuppressInitializers = true; 315ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel); 316ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith OS << " : "; 317ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith PrintExpr(Node->getRangeInit()); 318ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith OS << ") {\n"; 319ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith PrintStmt(Node->getBody()); 320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Indent() << "}"; 321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 322ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 323ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 324ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregorvoid StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) { 325ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor Indent(); 326ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor if (Node->isIfExists()) 327ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor OS << "__if_exists ("; 328ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor else 329ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor OS << "__if_not_exists ("; 330ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 331ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor if (NestedNameSpecifier *Qualifier 332ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor = Node->getQualifierLoc().getNestedNameSpecifier()) 333ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor Qualifier->print(OS, Policy); 334ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 335ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor OS << Node->getNameInfo() << ") "; 336ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 337ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor PrintRawCompoundStmt(Node->getSubStmt()); 338ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor} 339ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) { 341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Indent() << "goto " << Node->getLabel()->getName() << ";"; 342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto *"; 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getTarget()); 348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ";"; 349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { 353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Indent() << "continue;"; 354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) { 358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Indent() << "break;"; 359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { 3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "return"; 3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRetValue()) { 3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRetValue()); 3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ";"; 370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 373fe795956194141c91ae555985c9b930595bff43fChris Lattner 374df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad Rosiervoid StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) { 37539c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson Indent() << "asm "; 3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37739c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson if (Node->isVolatile()) 37839c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "volatile "; 3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 38039c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "("; 3816a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson VisitStringLiteral(Node->getAsmString()); 3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 383b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Outputs 384b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 || 385b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Node->getNumClobbers() != 0) 386b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) { 389b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 392b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getOutputName(i).empty()) { 393b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getOutputName(i); 395b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 396b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 398b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getOutputConstraintLiteral(i)); 399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 400b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getOutputExpr(i)); 401b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Inputs 404b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0) 405b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 407b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) { 408b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 409b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 411b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getInputName(i).empty()) { 412b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 413b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getInputName(i); 414b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 415b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 417b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getInputConstraintLiteral(i)); 418b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 419b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getInputExpr(i)); 420b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 422b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Clobbers 423b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumClobbers() != 0) 424b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 426b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) { 427b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 428b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4305c7f59445ae68109c7ffee731aca2ce32db587c7Chad Rosier VisitStringLiteral(Node->getClobberStringLiteral(i)); 431b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ");"; 434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Policy.IncludeNewlines) OS << "\n"; 435fe795956194141c91ae555985c9b930595bff43fChris Lattner} 436fe795956194141c91ae555985c9b930595bff43fChris Lattner 4378cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosiervoid StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) { 4388cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier // FIXME: Implement MS style inline asm statement printer. 4397bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier Indent() << "__asm "; 4407bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier if (Node->hasBraces()) 4417bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier OS << "{\n"; 442aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall OS << Node->getAsmString() << "\n"; 4437bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier if (Node->hasBraces()) 4447bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier Indent() << "}\n"; 4458cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier} 4468cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier 447051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Sirajvoid StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) { 4486afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj PrintStmt(Node->getCapturedDecl()->getBody()); 449051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj} 450051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj 451a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { 4527794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@try"; 4537794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) { 4547794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian PrintRawCompoundStmt(TS); 4557794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4567794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4588f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { 4598f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I); 4607794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@catch("; 4617ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (catchStmt->getCatchParamDecl()) { 4627ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (Decl *DS = catchStmt->getCatchParamDecl()) 4637ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff PrintRawDecl(DS); 4647794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4657794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << ")"; 4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) { 4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PrintRawCompoundStmt(CS); 4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OS << "\n"; 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4707794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>( 4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Node->getFinallyStmt())) { 4741e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian Indent() << "@finally"; 4751e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody())); 4767794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 478b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 479b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 480a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { 481b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 482b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 483a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { 484b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian Indent() << "@catch (...) { /* todo */ } \n"; 485b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 486b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 48778a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { 48839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian Indent() << "@throw"; 48939f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian if (Node->getThrowExpr()) { 49039f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << " "; 49139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian PrintExpr(Node->getThrowExpr()); 49239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian } 49339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << ";\n"; 49439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian} 49539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian 49678a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { 497c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian Indent() << "@synchronized ("; 498c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian PrintExpr(Node->getSynchExpr()); 499c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian OS << ")"; 50078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian PrintRawCompoundStmt(Node->getSynchBody()); 50178a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian OS << "\n"; 502c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian} 503c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian 504f85e193739c953358c865005855253af4f68a497John McCallvoid StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) { 505f85e193739c953358c865005855253af4f68a497John McCall Indent() << "@autoreleasepool"; 506f85e193739c953358c865005855253af4f68a497John McCall PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt())); 507f85e193739c953358c865005855253af4f68a497John McCall OS << "\n"; 508f85e193739c953358c865005855253af4f68a497John McCall} 509f85e193739c953358c865005855253af4f68a497John McCall 5108351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { 5118351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "catch ("; 5124b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl if (Decl *ExDecl = Node->getExceptionDecl()) 5134b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawDecl(ExDecl); 5144b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl else 5154b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "..."; 5164b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << ") "; 5174b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock())); 5188351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 5198351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 5208351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { 5218351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent(); 5228351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node); 5238351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "\n"; 5248351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 5258351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 5268351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { 5278351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent() << "try "; 5288351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCompoundStmt(Node->getTryBlock()); 5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) { 5308351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << " "; 5318351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node->getHandler(i)); 5328351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl } 5334b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "\n"; 5344b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl} 5354b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl 53628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) { 53728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Indent() << (Node->getIsCXXTry() ? "try " : "__try "); 53828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawCompoundStmt(Node->getTryBlock()); 53928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley SEHExceptStmt *E = Node->getExceptHandler(); 54028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley SEHFinallyStmt *F = Node->getFinallyHandler(); 54128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley if(E) 54228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHExceptHandler(E); 54328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley else { 54428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley assert(F && "Must have a finally block..."); 54528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHFinallyStmt(F); 54628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley } 54728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 54828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 54928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 55028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) { 55128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "__finally "; 55228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawCompoundStmt(Node->getBlock()); 55328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 55428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 55528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 55628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) { 55728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "__except ("; 55828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley VisitExpr(Node->getFilterExpr()); 559568ba871bbac959029671b81f8e531edb7e0d7d6Joao Matos OS << ")\n"; 56028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawCompoundStmt(Node->getBlock()); 56128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 56228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 56328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 56428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) { 56528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Indent(); 56628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHExceptHandler(Node); 56728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 56828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 56928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 57028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) { 57128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Indent(); 57228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHFinallyStmt(Node); 57328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 57428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 57528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 576ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) { 577ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "__leave;"; 578ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Policy.IncludeNewlines) OS << "\n"; 579ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 580ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5824fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev// OpenMP clauses printing methods 5834fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===// 5844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 5854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevnamespace { 5864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass OMPClausePrinter : public OMPClauseVisitor<OMPClausePrinter> { 5874fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev raw_ostream &OS; 588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const PrintingPolicy &Policy; 589543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev /// \brief Process clauses with list of variables. 590543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev template <typename T> 591543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev void VisitOMPClauseList(T *Node, char StartSym); 5924fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic: 593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy) 594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : OS(OS), Policy(Policy) { } 5954fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#define OPENMP_CLAUSE(Name, Class) \ 5964fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev void Visit##Class(Class *S); 5974fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def" 5984fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}; 5994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) { 601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "if("; 6026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Node->getCondition()->printPretty(OS, nullptr, Policy, 0); 603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ")"; 604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPNumThreadsClause(OMPNumThreadsClause *Node) { 607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "num_threads("; 6086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Node->getNumThreads()->printPretty(OS, nullptr, Policy, 0); 609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ")"; 610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPSafelenClause(OMPSafelenClause *Node) { 613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "safelen("; 6146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Node->getSafelen()->printPretty(OS, nullptr, Policy, 0); 6156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << ")"; 6166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 6176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 6186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClausePrinter::VisitOMPCollapseClause(OMPCollapseClause *Node) { 6196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << "collapse("; 6206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Node->getNumForLoops()->printPretty(OS, nullptr, Policy, 0); 621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ")"; 622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6244fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) { 6254fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev OS << "default(" 6264fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev << getOpenMPSimpleClauseTypeName(OMPC_default, Node->getDefaultKind()) 6274fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev << ")"; 6284fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev} 6294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) { 6316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << "proc_bind(" 6326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, Node->getProcBindKind()) 6336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << ")"; 6346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 6356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 636ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) { 637ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "schedule(" 638ef8225444452a1486bd721f3285301fe84643b00Stephen Hines << getOpenMPSimpleClauseTypeName(OMPC_schedule, Node->getScheduleKind()); 639ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Node->getChunkSize()) { 640ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ", "; 641ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Node->getChunkSize()->printPretty(OS, nullptr, Policy); 642ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 643ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ")"; 644ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 645ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 646ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *) { 647ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "ordered"; 648ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 649ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 650ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) { 651ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "nowait"; 652ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 653ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 654543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevtemplate<typename T> 655543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevvoid OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) { 656543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev for (typename T::varlist_iterator I = Node->varlist_begin(), 657543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev E = Node->varlist_end(); 658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines I != E; ++I) { 659ef8225444452a1486bd721f3285301fe84643b00Stephen Hines assert(*I && "Expected non-null Stmt"); 660651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(*I)) { 661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << (I == Node->varlist_begin() ? StartSym : ','); 662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cast<NamedDecl>(DRE->getDecl())->printQualifiedName(OS); 663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else { 664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << (I == Node->varlist_begin() ? StartSym : ','); 6656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines (*I)->printPretty(OS, nullptr, Policy, 0); 666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 668543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev} 6694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 6704fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) { 6714fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev if (!Node->varlist_empty()) { 6724fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev OS << "private"; 673543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev VisitOMPClauseList(Node, '('); 6744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev OS << ")"; 6750c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev } 6760c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev} 6770c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev 678d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataevvoid OMPClausePrinter::VisitOMPFirstprivateClause(OMPFirstprivateClause *Node) { 679d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev if (!Node->varlist_empty()) { 680d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev OS << "firstprivate"; 681d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev VisitOMPClauseList(Node, '('); 682d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev OS << ")"; 683d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev } 684d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev} 685d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev 686ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPLastprivateClause(OMPLastprivateClause *Node) { 687ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Node->varlist_empty()) { 688ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "lastprivate"; 689ef8225444452a1486bd721f3285301fe84643b00Stephen Hines VisitOMPClauseList(Node, '('); 690ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ")"; 691ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 692ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 693ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 6940c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevvoid OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) { 6950c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev if (!Node->varlist_empty()) { 6960c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev OS << "shared"; 697543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev VisitOMPClauseList(Node, '('); 6980c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev OS << ")"; 6994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev } 7004fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev} 7014fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 702ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPReductionClause(OMPReductionClause *Node) { 703ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Node->varlist_empty()) { 704ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "reduction("; 705ef8225444452a1486bd721f3285301fe84643b00Stephen Hines NestedNameSpecifier *QualifierLoc = 706ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Node->getQualifierLoc().getNestedNameSpecifier(); 707ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OverloadedOperatorKind OOK = 708ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Node->getNameInfo().getName().getCXXOverloadedOperator(); 709ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (QualifierLoc == nullptr && OOK != OO_None) { 710ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Print reduction identifier in C format 711ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << getOperatorSpelling(OOK); 712ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else { 713ef8225444452a1486bd721f3285301fe84643b00Stephen Hines // Use C++ format 714ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (QualifierLoc != nullptr) 715ef8225444452a1486bd721f3285301fe84643b00Stephen Hines QualifierLoc->print(OS, Policy); 716ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << Node->getNameInfo(); 717ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 718ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ":"; 719ef8225444452a1486bd721f3285301fe84643b00Stephen Hines VisitOMPClauseList(Node, ' '); 720ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ")"; 721ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 722ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 723ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 7246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClausePrinter::VisitOMPLinearClause(OMPLinearClause *Node) { 7256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Node->varlist_empty()) { 7266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << "linear"; 7276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines VisitOMPClauseList(Node, '('); 7286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (Node->getStep() != nullptr) { 7296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << ": "; 7306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Node->getStep()->printPretty(OS, nullptr, Policy, 0); 7316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 7326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << ")"; 7336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 7346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 7356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 736ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPAlignedClause(OMPAlignedClause *Node) { 737ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Node->varlist_empty()) { 738ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "aligned"; 739ef8225444452a1486bd721f3285301fe84643b00Stephen Hines VisitOMPClauseList(Node, '('); 740ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (Node->getAlignment() != nullptr) { 741ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ": "; 742ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Node->getAlignment()->printPretty(OS, nullptr, Policy, 0); 743ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 744ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ")"; 745ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 746ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 747ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPCopyinClause(OMPCopyinClause *Node) { 749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Node->varlist_empty()) { 750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "copyin"; 751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines VisitOMPClauseList(Node, '('); 752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ")"; 753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 756ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPCopyprivateClause(OMPCopyprivateClause *Node) { 757ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (!Node->varlist_empty()) { 758ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << "copyprivate"; 759ef8225444452a1486bd721f3285301fe84643b00Stephen Hines VisitOMPClauseList(Node, '('); 760ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << ")"; 761ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 762ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 763ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 7644fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev} 7654fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 7664fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===// 7674fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev// OpenMP directives printing methods 7684fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===// 7694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev 770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S) { 771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OMPClausePrinter Printer(OS, Policy); 772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<OMPClause *> Clauses = S->clauses(); 7734fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev I != E; ++I) 7754fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev if (*I && !(*I)->isImplicit()) { 7764fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev Printer.Visit(*I); 7774fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev OS << ' '; 7784fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev } 7794fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev OS << "\n"; 780651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (S->getAssociatedStmt()) { 781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines assert(isa<CapturedStmt>(S->getAssociatedStmt()) && 7824fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev "Expected captured statement!"); 783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Stmt *CS = cast<CapturedStmt>(S->getAssociatedStmt())->getCapturedStmt(); 7844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev PrintStmt(CS); 7854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev } 7864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev} 787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) { 789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Indent() << "#pragma omp parallel "; 790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrintOMPExecutableDirective(Node); 791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) { 794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Indent() << "#pragma omp simd "; 795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrintOMPExecutableDirective(Node); 796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 798ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) { 799ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "#pragma omp for "; 800ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrintOMPExecutableDirective(Node); 801ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 802ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 803ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) { 804ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "#pragma omp sections "; 805ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrintOMPExecutableDirective(Node); 806ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 807ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 808ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) { 809ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "#pragma omp section"; 810ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrintOMPExecutableDirective(Node); 811ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 812ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 813ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) { 814ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "#pragma omp single "; 815ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrintOMPExecutableDirective(Node); 816ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 817ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 818ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) { 819ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "#pragma omp parallel for "; 820ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrintOMPExecutableDirective(Node); 821ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 822ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 823ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPParallelSectionsDirective( 824ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OMPParallelSectionsDirective *Node) { 825ef8225444452a1486bd721f3285301fe84643b00Stephen Hines Indent() << "#pragma omp parallel sections "; 826ef8225444452a1486bd721f3285301fe84643b00Stephen Hines PrintOMPExecutableDirective(Node); 827ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 828ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 8294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===// 8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Expr printing methods. 8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 8325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { 834a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 835a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier->print(OS, Policy); 836e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (Node->hasTemplateKeyword()) 837e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara OS << "template "; 8382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getNameInfo(); 839096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (Node->hasExplicitTemplateArgs()) 8405eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 8415eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy); 8421a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor} 8431a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor 844865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitDependentScopeDeclRefExpr( 845865d447ac6a4721ab58e898d014a21f2eff74b06John McCall DependentScopeDeclRefExpr *Node) { 846274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 847274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann Qualifier->print(OS, Policy); 848e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (Node->hasTemplateKeyword()) 849e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara OS << "template "; 8502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getNameInfo(); 851f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Node->hasExplicitTemplateArgs()) 8525eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 8535eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy); 8545953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 8555953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 856ba13543329afac4a0d01304ec2ec4924d99306a6John McCallvoid StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 857edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor if (Node->getQualifier()) 858edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor Node->getQualifier()->print(OS, Policy); 859e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (Node->hasTemplateKeyword()) 860e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara OS << "template "; 8612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getNameInfo(); 862f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Node->hasExplicitTemplateArgs()) 8635eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 8645eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy); 865edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor} 866edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor 8677779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 868232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian if (Node->getBase()) { 869232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian PrintExpr(Node->getBase()); 870232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian OS << (Node->isArrow() ? "->" : "."); 871232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian } 872b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *Node->getDecl(); 8737779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff} 8747779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff 875ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 8768ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian if (Node->isSuperReceiver()) 8778ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian OS << "super."; 878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (Node->isObjectReceiver() && Node->getBase()) { 879ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff PrintExpr(Node->getBase()); 880ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff OS << "."; 881651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (Node->isClassReceiver() && Node->getClassReceiver()) { 882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << Node->getClassReceiver()->getName() << "."; 883ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff } 8848ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian 88512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Node->isImplicitProperty()) 886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Node->getImplicitPropertyGetter()->getSelector().print(OS); 88712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall else 88812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Node->getExplicitProperty()->getName(); 8895daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian} 8905daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 891ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) { 892ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 893ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek PrintExpr(Node->getBaseExpr()); 894ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "["; 895ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek PrintExpr(Node->getKeyExpr()); 896ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "]"; 897ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 898ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 899d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) { 900227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson switch (Node->getIdentType()) { 901227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson default: 902b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("unknown case"); 903d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Func: 904227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__func__"; 905227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 906d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Function: 907227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__FUNCTION__"; 908227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 909bafa74f360cb3ec82fa8c688845330f491d167fdDavid Majnemer case PredefinedExpr::FuncDName: 910bafa74f360cb3ec82fa8c688845330f491d167fdDavid Majnemer OS << "__FUNCDNAME__"; 911bafa74f360cb3ec82fa8c688845330f491d167fdDavid Majnemer break; 9126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case PredefinedExpr::FuncSig: 9136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines OS << "__FUNCSIG__"; 9146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 91528ad063b279378b19cb0704f977429df366a151eNico Weber case PredefinedExpr::LFunction: 91628ad063b279378b19cb0704f977429df366a151eNico Weber OS << "L__FUNCTION__"; 91728ad063b279378b19cb0704f977429df366a151eNico Weber break; 918d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::PrettyFunction: 919227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__PRETTY_FUNCTION__"; 920227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 921227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson } 922227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson} 923227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 9245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { 925b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner unsigned value = Node->getValue(); 9265cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 9275cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (Node->getKind()) { 9285cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::Ascii: break; // no prefix. 9295cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::Wide: OS << 'L'; break; 9305cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::UTF16: OS << 'u'; break; 9315cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::UTF32: OS << 'U'; break; 9325cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 9335cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 9348bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner switch (value) { 9358bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\\': 9368bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\\\'"; 9378bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9388bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\'': 9398bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\''"; 9408bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9418bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\a': 9428bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // TODO: K&R: the meaning of '\\a' is different in traditional C 9438bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\a'"; 9448bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9458bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\b': 9468bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\b'"; 9478bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9488bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // Nonstandard escape sequence. 9498bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner /*case '\e': 9508bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\e'"; 9518bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break;*/ 9528bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\f': 9538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\f'"; 9548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\n': 9568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\n'"; 9578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\r': 9598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\r'"; 9608bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9618bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\t': 9628bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\t'"; 9638bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9648bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\v': 9658bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\v'"; 9668bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 9678bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner default: 9686d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose if (value < 256 && isPrintable((unsigned char)value)) 9698bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'" << (char)value << "'"; 9706d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose else if (value < 256) 9716d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose OS << "'\\x" << llvm::format("%02x", value) << "'"; 9726d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose else if (value <= 0xFFFF) 9736d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose OS << "'\\u" << llvm::format("%04x", value) << "'"; 9746d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose else 9756d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose OS << "'\\U" << llvm::format("%08x", value) << "'"; 976b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner } 9775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 9785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 9795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { 9805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isSigned = Node->getType()->isSignedIntegerType(); 9815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << Node->getValue().toString(10, isSigned); 9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit suffixes. Integer literals are always a builtin integer type. 984183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 985b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unexpected type for integer literal!"); 986ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case BuiltinType::SChar: OS << "i8"; break; 987ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case BuiltinType::UChar: OS << "Ui8"; break; 988ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case BuiltinType::Short: OS << "i16"; break; 989ef8225444452a1486bd721f3285301fe84643b00Stephen Hines case BuiltinType::UShort: OS << "Ui16"; break; 9905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Int: break; // no suffix. 9915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::UInt: OS << 'U'; break; 9925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Long: OS << 'L'; break; 9935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULong: OS << "UL"; break; 9945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongLong: OS << "LL"; break; 9955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULongLong: OS << "ULL"; break; 99611cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu case BuiltinType::Int128: OS << "i128"; break; 99711cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu case BuiltinType::UInt128: OS << "Ui128"; break; 9985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 9995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1000a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer 1001a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramerstatic void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node, 1002a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer bool PrintSuffix) { 1003f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<16> Str; 1004b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman Node->getValue().toString(Str); 1005b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman OS << Str; 1006a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer if (Str.find_first_not_of("-0123456789") == StringRef::npos) 1007a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer OS << '.'; // Trailing dot in order to separate from ints. 1008a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer 1009a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer if (!PrintSuffix) 1010a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer return; 1011a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer 1012a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer // Emit suffixes. Float literals are always a builtin float type. 1013a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 1014a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer default: llvm_unreachable("Unexpected type for float literal!"); 1015a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer case BuiltinType::Half: break; // FIXME: suffix? 1016a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer case BuiltinType::Double: break; // no suffix. 1017a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer case BuiltinType::Float: OS << 'F'; break; 1018a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer case BuiltinType::LongDouble: OS << 'L'; break; 1019a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer } 1020a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer} 1021a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer 1022a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { 1023a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer PrintFloatingLiteral(OS, Node, /*PrintSuffix=*/true); 10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10255d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 10265d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { 10275d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner PrintExpr(Node->getSubExpr()); 10285d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner OS << "i"; 10295d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner} 10305d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) { 10328ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu Str->outputString(OS); 10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) { 10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "("; 10365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 10375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 10385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) { 1040296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner if (!Node->isPostfix()) { 10415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10437df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman // Print a space if this is an "identifier operator" like __real, or if 10447df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman // it might be concatenated incorrectly like '+'. 1045296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner switch (Node->getOpcode()) { 1046296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner default: break; 10472de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: 10482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: 10492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 1050296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner OS << ' '; 1051296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner break; 10522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 10532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 10547df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman if (isa<UnaryOperator>(Node->getSubExpr())) 10557df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman OS << ' '; 10567df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman break; 1057296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 1058296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 10595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->isPostfix()) 10625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 1063704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner} 1064704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 10658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorvoid StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) { 10668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "__builtin_offsetof("; 10679d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getTypeSourceInfo()->getType().print(OS, Policy); 10689d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ", "; 10698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool PrintedSomething = false; 10708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) { 10718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i); 10728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) { 10738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Array node 10748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "["; 10758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex())); 10768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "]"; 10778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintedSomething = true; 10788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor continue; 10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 1080cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 1081cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Skip implicit base indirections. 1082cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Base) 1083cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor continue; 1084cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 10858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Field or identifier node. 10868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor IdentifierInfo *Id = ON.getFieldName(); 10878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!Id) 10888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor continue; 1089c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 10908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (PrintedSomething) 10918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "."; 10928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor else 10938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintedSomething = true; 1094c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OS << Id->getName(); 10958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 10968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << ")"; 10978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 10988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 1099f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){ 1100f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(Node->getKind()) { 1101f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: 1102f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << "sizeof"; 1103f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1104f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: 1105f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose if (Policy.LangOpts.CPlusPlus) 1106f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose OS << "alignof"; 1107f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose else if (Policy.LangOpts.C11) 1108f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose OS << "_Alignof"; 1109f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose else 1110f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose OS << "__alignof"; 1111f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1112f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: 1113f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << "vec_step"; 1114f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 1115f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 11169d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer if (Node->isArgumentType()) { 11179d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << '('; 11189d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getArgumentType().print(OS, Policy); 11199d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 11209d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer } else { 11210518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << " "; 11220518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl PrintExpr(Node->getArgumentExpr()); 11230518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 11245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1125f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 1126f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournevoid StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) { 1127f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << "_Generic("; 1128f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne PrintExpr(Node->getControllingExpr()); 1129f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne for (unsigned i = 0; i != Node->getNumAssocs(); ++i) { 1130f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << ", "; 1131f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne QualType T = Node->getAssocType(i); 1132f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne if (T.isNull()) 1133f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << "default"; 1134f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne else 11359d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer T.print(OS, Policy); 1136f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << ": "; 1137f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne PrintExpr(Node->getAssocExpr(i)); 1138f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 1139f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << ")"; 1140f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne} 1141f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 11425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { 11432324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getLHS()); 11445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "["; 11452324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getRHS()); 11465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "]"; 11475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 11485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1149d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::PrintCallArgs(CallExpr *Call) { 11505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { 115104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { 115204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Don't print any defaulted arguments 115304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner break; 115404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner } 115504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 11565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (i) OS << ", "; 11575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Call->getArg(i)); 11585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1159d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne} 1160d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne 1161d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::VisitCallExpr(CallExpr *Call) { 1162d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne PrintExpr(Call->getCallee()); 1163d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne OS << "("; 1164d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne PrintCallArgs(Call); 11655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 11665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 11675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) { 1168b3eef68111ffc220e449be96da1747998c057790Douglas Gregor // FIXME: Suppress printing implicit bases (like "this") 1169b3eef68111ffc220e449be96da1747998c057790Douglas Gregor PrintExpr(Node->getBase()); 1170383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie 1171383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie MemberExpr *ParentMember = dyn_cast<MemberExpr>(Node->getBase()); 1172731de313f759bdb412d38df3d2a0f149437ef401David Blaikie FieldDecl *ParentDecl = ParentMember 11736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl()) : nullptr; 1174383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie 1175731de313f759bdb412d38df3d2a0f149437ef401David Blaikie if (!ParentDecl || !ParentDecl->isAnonymousStructOrUnion()) 1176383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie OS << (Node->isArrow() ? "->" : "."); 1177383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie 117897fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl())) 117997fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian if (FD->isAnonymousStructOrUnion()) 118097fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian return; 1181383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie 118283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 118383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier->print(OS, Policy); 1184e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (Node->hasTemplateKeyword()) 1185e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara OS << "template "; 11862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getMemberNameInfo(); 1187096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (Node->hasExplicitTemplateArgs()) 11885eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 11895eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy); 11905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1191f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroffvoid StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) { 1192f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff PrintExpr(Node->getBase()); 1193f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff OS << (Node->isArrow() ? "->isa" : ".isa"); 1194f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff} 1195f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff 1196213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 119731a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff PrintExpr(Node->getBase()); 119831a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << "."; 119931a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << Node->getAccessor().getName(); 120031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff} 12016eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { 12029d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << '('; 12039d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getTypeAsWritten().print(OS, Policy); 12049d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 12055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 12065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1207aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { 12089d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << '('; 12099d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 12109d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 1211aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff PrintExpr(Node->getInitializer()); 1212aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff} 121349b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 1214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // No need to print anything, simply forward to the subexpression. 121590045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff PrintExpr(Node->getSubExpr()); 121649b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff} 12175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) { 12185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 12195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 1220eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getRHS()); 1221eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 1222eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 1223eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getLHS()); 1224eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 12255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 12265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 12275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) { 12285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 122956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OS << " ? "; 123056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall PrintExpr(Node->getLHS()); 123156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OS << " : "; 12325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 12335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 12345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions. 12365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 123756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid 123856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallStmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) { 123956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall PrintExpr(Node->getCommon()); 124056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OS << " ?: "; 124156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall PrintExpr(Node->getFalseExpr()); 124256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 12436481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) { 12445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "&&" << Node->getLabel()->getName(); 12455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 12465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1247ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) { 1248ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << "("; 1249ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner PrintRawCompoundStmt(E->getSubStmt()); 1250ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << ")"; 1251ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner} 1252ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 1253d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) { 1254d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << "__builtin_choose_expr("; 1255d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getCond()); 125694f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 1257d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getLHS()); 125894f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 1259d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getRHS()); 1260d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << ")"; 1261d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff} 1262ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 12632d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) { 12642d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor OS << "__null"; 12652d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor} 12662d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 1267d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) { 1268d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << "__builtin_shufflevector("; 1269d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) { 1270d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman if (i) OS << ", "; 1271d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman PrintExpr(Node->getExpr(i)); 1272d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 1273d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << ")"; 1274e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman} 1275e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman 1276414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvoid StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) { 1277414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel OS << "__builtin_convertvector("; 1278414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel PrintExpr(Node->getSrcExpr()); 1279414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel OS << ", "; 1280414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel Node->getType().print(OS, Policy); 1281414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel OS << ")"; 1282414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel} 1283414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel 128466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 128564f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor if (Node->getSyntacticForm()) { 128664f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor Visit(Node->getSyntacticForm()); 128764f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor return; 128864f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor } 128964f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor 129066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << "{ "; 129166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) { 129266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson if (i) OS << ", "; 12934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Node->getInit(i)) 12944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit(i)); 12954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 12964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "0"; 129766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 129866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << " }"; 129966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 130066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 13012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid StmtPrinter::VisitParenListExpr(ParenListExpr* Node) { 13022ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman OS << "( "; 13032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) { 13042ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (i) OS << ", "; 13052ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman PrintExpr(Node->getExpr(i)); 13062ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 13072ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman OS << " )"; 13082ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 13092ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 131005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { 13114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), 13124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DEnd = Node->designators_end(); 13134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D != DEnd; ++D) { 13144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isFieldDesignator()) { 1315ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (D->getDotLoc().isInvalid()) { 1316ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (IdentifierInfo *II = D->getFieldName()) 1317ef8225444452a1486bd721f3285301fe84643b00Stephen Hines OS << II->getName() << ":"; 1318ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } else { 13194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "." << D->getFieldName()->getName(); 1320ef8225444452a1486bd721f3285301fe84643b00Stephen Hines } 13214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 13224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "["; 13234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isArrayDesignator()) { 13244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayIndex(*D)); 13254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 13264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayRangeStart(*D)); 13274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " ... "; 13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PrintExpr(Node->getArrayRangeEnd(*D)); 13294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 13304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "]"; 13314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 13324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 13334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 13344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " = "; 13354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit()); 133605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 133705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 13383498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) { 13399d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer if (Policy.LangOpts.CPlusPlus) { 13409d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << "/*implicit*/"; 13419d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 13429d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << "()"; 13439d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer } else { 13449d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << "/*implicit*/("; 13459d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 13469d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 13474fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor if (Node->getType()->isRecordType()) 13484fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "{}"; 13494fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor else 13504fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << 0; 13514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 13523498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 13533498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 13547c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) { 135542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman OS << "__builtin_va_arg("; 13567c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson PrintExpr(Node->getSubExpr()); 13577c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ", "; 13589d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 13597c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ")"; 13607c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson} 13617c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson 13624b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) { 13634b9c2d235fb9449e249d74f48ecfec601650de93John McCall PrintExpr(Node->getSyntacticForm()); 13644b9c2d235fb9449e249d74f48ecfec601650de93John McCall} 13654b9c2d235fb9449e249d74f48ecfec601650de93John McCall 1366276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) { 13676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *Name = nullptr; 1368276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman switch (Node->getOp()) { 1369ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#define BUILTIN(ID, TYPE, ATTRS) 1370ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \ 1371ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith case AtomicExpr::AO ## ID: \ 1372ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith Name = #ID "("; \ 1373ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith break; 1374ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#include "clang/Basic/Builtins.def" 1375276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1376276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << Name; 1377ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith 1378ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith // AtomicExpr stores its subexpressions in a permuted order. 1379276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getPtr()); 1380ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith if (Node->getOp() != AtomicExpr::AO__c11_atomic_load && 1381ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith Node->getOp() != AtomicExpr::AO__atomic_load_n) { 1382276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 138328fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith PrintExpr(Node->getVal1()); 1384276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1385ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith if (Node->getOp() == AtomicExpr::AO__atomic_exchange || 1386ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith Node->isCmpXChg()) { 1387276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 138828fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith PrintExpr(Node->getVal2()); 1389276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1390ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith if (Node->getOp() == AtomicExpr::AO__atomic_compare_exchange || 1391ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) { 1392ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith OS << ", "; 139328fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith PrintExpr(Node->getWeak()); 1394ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith } 139528fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith if (Node->getOp() != AtomicExpr::AO__c11_atomic_init) { 139628fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith OS << ", "; 13977a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall PrintExpr(Node->getOrder()); 139828fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith } 1399276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman if (Node->isCmpXChg()) { 1400276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 1401276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getOrderFail()); 1402276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1403276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ")"; 1404276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman} 1405276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman 14065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++ 1407b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { 1408b4609806e9232593ece09ce08b630836e825865cDouglas Gregor const char *OpStrings[NUM_OVERLOADED_OPERATORS] = { 1409b4609806e9232593ece09ce08b630836e825865cDouglas Gregor "", 1410b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 1411b4609806e9232593ece09ce08b630836e825865cDouglas Gregor Spelling, 1412b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def" 1413b4609806e9232593ece09ce08b630836e825865cDouglas Gregor }; 1414b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 1415b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OverloadedOperatorKind Kind = Node->getOperator(); 1416b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 1417b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Node->getNumArgs() == 1) { 1418b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 1419b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1420b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 1421b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1422b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind]; 1423b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1424a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman } else if (Kind == OO_Arrow) { 1425a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman PrintExpr(Node->getArg(0)); 1426b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Call) { 1427b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1428b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '('; 1429b4609806e9232593ece09ce08b630836e825865cDouglas Gregor for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) { 1430b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (ArgIdx > 1) 1431b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ", "; 1432b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx))) 1433b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(ArgIdx)); 1434b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1435b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ')'; 1436b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Subscript) { 1437b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1438b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '['; 1439b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 1440b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ']'; 1441b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 1) { 1442b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 1443b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1444b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 2) { 1445b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1446b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind] << ' '; 1447b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 1448b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 1449b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("unknown overloaded operator"); 1450b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1451b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 14525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { 1454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // If we have a conversion operator call only print the argument. 1455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines CXXMethodDecl *MD = Node->getMethodDecl(); 1456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (MD && isa<CXXConversionDecl>(MD)) { 1457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PrintExpr(Node->getImplicitObjectArgument()); 1458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return; 1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 146088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor VisitCallExpr(cast<CallExpr>(Node)); 146188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor} 146288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 1463e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournevoid StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) { 1464e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne PrintExpr(Node->getCallee()); 1465e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne OS << "<<<"; 1466e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne PrintCallArgs(Node->getConfig()); 1467e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne OS << ">>>("; 1468e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne PrintCallArgs(Node); 1469e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne OS << ")"; 1470e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne} 1471e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 147249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 147349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor OS << Node->getCastName() << '<'; 14749d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getTypeAsWritten().print(OS, Policy); 14759d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ">("; 14765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 14775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 14785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 14795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 148049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) { 148149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 148249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 148349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 148449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) { 148549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 148649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 148749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 148849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) { 148949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 149049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 149149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 149249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) { 149349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 149449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 149549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 1496c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { 1497c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << "typeid("; 1498c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl if (Node->isTypeOperand()) { 1499fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer Node->getTypeOperandSourceInfo()->getType().print(OS, Policy); 1500c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } else { 1501c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl PrintExpr(Node->getExprOperand()); 1502c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 1503c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << ")"; 1504c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl} 1505c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 150601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetvoid StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) { 150701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet OS << "__uuidof("; 150801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (Node->isTypeOperand()) { 1509fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer Node->getTypeOperandSourceInfo()->getType().print(OS, Policy); 151001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } else { 151101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet PrintExpr(Node->getExprOperand()); 151201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 151301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet OS << ")"; 151401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet} 151501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 151676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) { 151776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall PrintExpr(Node->getBaseExpr()); 151876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall if (Node->isArrow()) 151976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall OS << "->"; 152076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall else 152176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall OS << "."; 152276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall if (NestedNameSpecifier *Qualifier = 152376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall Node->getQualifierLoc().getNestedNameSpecifier()) 152476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall Qualifier->print(OS, Policy); 152576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall OS << Node->getPropertyDecl()->getDeclName(); 152676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall} 152776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall 15289fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithvoid StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) { 15299fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith switch (Node->getLiteralOperatorKind()) { 15309fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith case UserDefinedLiteral::LOK_Raw: 1531ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith OS << cast<StringLiteral>(Node->getArg(0)->IgnoreImpCasts())->getString(); 15329fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith break; 15339fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith case UserDefinedLiteral::LOK_Template: { 1534ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith DeclRefExpr *DRE = cast<DeclRefExpr>(Node->getCallee()->IgnoreImpCasts()); 1535ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith const TemplateArgumentList *Args = 1536ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs(); 1537ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith assert(Args); 1538ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith const TemplateArgument &Pack = Args->get(0); 1539ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith for (TemplateArgument::pack_iterator I = Pack.pack_begin(), 1540ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith E = Pack.pack_end(); I != E; ++I) { 1541855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer char C = (char)I->getAsIntegral().getZExtValue(); 15429fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith OS << C; 15439fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 15449fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith break; 15459fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 1546916883004c36291b70355d5e73abb05e138804fbRichard Smith case UserDefinedLiteral::LOK_Integer: { 1547916883004c36291b70355d5e73abb05e138804fbRichard Smith // Print integer literal without suffix. 1548916883004c36291b70355d5e73abb05e138804fbRichard Smith IntegerLiteral *Int = cast<IntegerLiteral>(Node->getCookedLiteral()); 1549916883004c36291b70355d5e73abb05e138804fbRichard Smith OS << Int->getValue().toString(10, /*isSigned*/false); 1550916883004c36291b70355d5e73abb05e138804fbRichard Smith break; 1551916883004c36291b70355d5e73abb05e138804fbRichard Smith } 1552a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer case UserDefinedLiteral::LOK_Floating: { 1553a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer // Print floating literal without suffix. 1554a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer FloatingLiteral *Float = cast<FloatingLiteral>(Node->getCookedLiteral()); 1555a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer PrintFloatingLiteral(OS, Float, /*PrintSuffix=*/false); 1556a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer break; 1557a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer } 15589fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith case UserDefinedLiteral::LOK_String: 15599fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith case UserDefinedLiteral::LOK_Character: 15609fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith PrintExpr(Node->getCookedLiteral()); 15619fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith break; 15629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith } 15639fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith OS << Node->getUDSuffix()->getName(); 15649fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith} 15659fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith 15665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 15675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (Node->getValue() ? "true" : "false"); 15685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 15695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 15706e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { 15716e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl OS << "nullptr"; 15726e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 15736e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 1574796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { 1575796da18402f286b897782a298ae3b20c459c102eDouglas Gregor OS << "this"; 1576796da18402f286b897782a298ae3b20c459c102eDouglas Gregor} 1577796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 157850dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) { 15796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!Node->getSubExpr()) 158050dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw"; 158150dd289f45738ed22b7583d52ed2525b927042ffChris Lattner else { 158250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw "; 158350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner PrintExpr(Node->getSubExpr()); 158450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner } 158550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner} 158650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner 158704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { 1588c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // Nothing to print: we picked up the default argument. 1589c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith} 1590c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 1591c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithvoid StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) { 1592c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith // Nothing to print: we picked up the default initializer. 159304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner} 159404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 1595987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 15969d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 1597987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << "("; 1598987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis PrintExpr(Node->getSubExpr()); 1599987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << ")"; 1600987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1601987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1602fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonvoid StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 1603eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson PrintExpr(Node->getSubExpr()); 1604eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson} 1605eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson 1606506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { 16079d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 1608506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << "("; 1609506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(), 16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgEnd = Node->arg_end(); 1611506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor Arg != ArgEnd; ++Arg) { 1612d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola if (Arg->isDefaultArgument()) 1613d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola break; 1614506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor if (Arg != Node->arg_begin()) 1615506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ", "; 1616506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor PrintExpr(*Arg); 1617506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor } 1618506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ")"; 1619506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor} 1620506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 162101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorvoid StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) { 162201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << '['; 162301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor bool NeedComma = false; 162401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor switch (Node->getCaptureDefault()) { 162501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCD_None: 162601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 162701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 162801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCD_ByCopy: 162901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << '='; 163001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor NeedComma = true; 163101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 163201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 163301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCD_ByRef: 163401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << '&'; 163501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor NeedComma = true; 163601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 163701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 163801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor for (LambdaExpr::capture_iterator C = Node->explicit_capture_begin(), 163901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CEnd = Node->explicit_capture_end(); 164001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor C != CEnd; 164101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor ++C) { 164201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (NeedComma) 164301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << ", "; 164401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor NeedComma = true; 164501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 164601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor switch (C->getCaptureKind()) { 164701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCK_This: 164801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << "this"; 164901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 165001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 165101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCK_ByRef: 165204fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith if (Node->getCaptureDefault() != LCD_ByRef || C->isInitCapture()) 165301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << '&'; 165401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << C->getCapturedVar()->getName(); 165501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 165601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 165701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor case LCK_ByCopy: 165801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << C->getCapturedVar()->getName(); 165901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor break; 166001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 166104fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith 166204fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith if (C->isInitCapture()) 166304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith PrintExpr(C->getCapturedVar()->getInit()); 166401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 166501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << ']'; 166601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 166701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (Node->hasExplicitParameters()) { 166801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << " ("; 166901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CXXMethodDecl *Method = Node->getCallOperator(); 167001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor NeedComma = false; 1671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (auto P : Method->params()) { 167201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (NeedComma) { 167301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << ", "; 167401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } else { 167501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor NeedComma = true; 167601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 1677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::string ParamStr = P->getNameAsString(); 1678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines P->getOriginalType().print(OS, Policy, ParamStr); 167901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 168001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (Method->isVariadic()) { 168101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (NeedComma) 168201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << ", "; 168301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << "..."; 168401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 168501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << ')'; 168601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 168701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor if (Node->isMutable()) 168801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << " mutable"; 168901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 169001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor const FunctionProtoType *Proto 169101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor = Method->getType()->getAs<FunctionProtoType>(); 16925eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer Proto->printExceptionSpecification(OS, Policy); 169301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1694ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling // FIXME: Attributes 169501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1696dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor // Print the trailing return type if it was specified in the source. 16979d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer if (Node->hasExplicitResultType()) { 16989d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << " -> "; 1699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Proto->getReturnType().print(OS, Policy); 17009d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer } 170101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor } 170201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 170301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor // Print the body. 170401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor CompoundStmt *Body = Node->getBody(); 170501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor OS << ' '; 170601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor PrintStmt(Body); 170701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor} 170801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor 1709ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregorvoid StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) { 1710ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo()) 17119d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer TSInfo->getType().print(OS, Policy); 1712ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor else 17139d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 17149d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << "()"; 1715987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1716987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 17174c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { 17184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalNew()) 17194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 17204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "new "; 17214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumPlace = E->getNumPlacementArgs(); 1722d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(E->getPlacementArg(0))) { 17234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 17244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(0)); 17254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumPlace; ++i) { 1726d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman if (isa<CXXDefaultArgExpr>(E->getPlacementArg(i))) 1727d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman break; 17284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 17294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(i)); 17304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17314c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ") "; 17324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 17344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 17356fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl std::string TypeS; 17366fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl if (Expr *Size = E->getArraySize()) { 17376fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl llvm::raw_string_ostream s(TypeS); 17389d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer s << '['; 1739d1420c6fa788669e49f21e184927c7833881e399Richard Smith Size->printPretty(s, Helper, Policy); 17409d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer s << ']'; 17416fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl } 17429d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer E->getAllocatedType().print(OS, Policy, TypeS); 17434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 17444c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 17454c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 17462aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle(); 17472aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (InitStyle) { 17482aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (InitStyle == CXXNewExpr::CallInit) 17492aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl OS << "("; 17502aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl PrintExpr(E->getInitializer()); 17512aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl if (InitStyle == CXXNewExpr::CallInit) 17522aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl OS << ")"; 17534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 17544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 17554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 17564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 17574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalDelete()) 17584c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 17594c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "delete "; 17604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isArrayForm()) 17614c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "[] "; 17624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getArgument()); 17634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 17644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1765a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1766a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor PrintExpr(E->getBase()); 1767a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->isArrow()) 1768a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << "->"; 1769a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor else 1770a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << '.'; 1771a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier()) 1772a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifier()->print(OS, Policy); 1773a7a38cb64e0781b8489332cedcfae9c8f95ba22eEli Friedman OS << "~"; 17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1775a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (IdentifierInfo *II = E->getDestroyedTypeIdentifier()) 1776a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor OS << II->getName(); 1777a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor else 17789d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer E->getDestroyedType().print(OS, Policy); 1779a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 1780a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 1781e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) { 1782c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith if (E->isListInitialization()) 1783c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith OS << "{ "; 1784c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith 1785d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 1786d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor if (isa<CXXDefaultArgExpr>(E->getArg(i))) { 1787d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor // Don't print any defaulted arguments 1788d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor break; 1789d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor } 1790d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor 1791d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor if (i) OS << ", "; 1792d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor PrintExpr(E->getArg(i)); 1793c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian } 1794c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith 1795c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith if (E->isListInitialization()) 1796c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith OS << " }"; 1797e349bea668622ef31bd51a229960a73d69940709Anders Carlsson} 1798e349bea668622ef31bd51a229960a73d69940709Anders Carlsson 17997c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithvoid StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) { 18007c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith PrintExpr(E->getSubExpr()); 18017c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith} 18027c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 18034765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) { 1804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Just forward to the subexpression. 180502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson PrintExpr(E->getSubExpr()); 180602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson} 180702bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 18081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 1809d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr( 1810d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor CXXUnresolvedConstructExpr *Node) { 18119d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getTypeAsWritten().print(OS, Policy); 1812d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << "("; 1813d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(), 18141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgEnd = Node->arg_end(); 1815d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Arg != ArgEnd; ++Arg) { 1816d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor if (Arg != Node->arg_begin()) 1817d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ", "; 1818d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor PrintExpr(*Arg); 1819d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 1820d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ")"; 1821d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor} 1822d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 1823865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitCXXDependentScopeMemberExpr( 1824865d447ac6a4721ab58e898d014a21f2eff74b06John McCall CXXDependentScopeMemberExpr *Node) { 1825aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Node->isImplicitAccess()) { 1826aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall PrintExpr(Node->getBase()); 1827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OS << (Node->isArrow() ? "->" : "."); 1828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 1829a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1830a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier->print(OS, Policy); 1831e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (Node->hasTemplateKeyword()) 18323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OS << "template "; 18332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getMemberNameInfo(); 18345eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer if (Node->hasExplicitTemplateArgs()) 18355eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 18365eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy); 18371c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor} 18381c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 1839129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallvoid StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) { 1840aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Node->isImplicitAccess()) { 1841aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall PrintExpr(Node->getBase()); 1842aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OS << (Node->isArrow() ? "->" : "."); 1843aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 1844129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1845129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier->print(OS, Policy); 1846e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara if (Node->hasTemplateKeyword()) 1847e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara OS << "template "; 18482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getMemberNameInfo(); 18495eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer if (Node->hasExplicitTemplateArgs()) 18505eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer TemplateSpecializationType::PrintTemplateArgumentList( 18515eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy); 1852129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 1853129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 18544ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorstatic const char *getTypeTraitName(TypeTrait TT) { 18554ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor switch (TT) { 1856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define TYPE_TRAIT_1(Spelling, Name, Key) \ 1857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinescase clang::UTT_##Name: return #Spelling; 1858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define TYPE_TRAIT_2(Spelling, Name, Key) \ 1859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinescase clang::BTT_##Name: return #Spelling; 1860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define TYPE_TRAIT_N(Spelling, Name, Key) \ 1861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case clang::TT_##Name: return #Spelling; 1862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/TokenKinds.def" 18634ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 18644ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor llvm_unreachable("Type trait not covered by switch"); 18654ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor} 18664ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 186721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleystatic const char *getTypeTraitName(ArrayTypeTrait ATT) { 186821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley switch (ATT) { 186921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case ATT_ArrayRank: return "__array_rank"; 187021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case ATT_ArrayExtent: return "__array_extent"; 187121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 1872a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth llvm_unreachable("Array type trait not covered by switch"); 187321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley} 187421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 1875552622067dc45013d240f73952fece703f5e63bdJohn Wiegleystatic const char *getExpressionTraitName(ExpressionTrait ET) { 1876552622067dc45013d240f73952fece703f5e63bdJohn Wiegley switch (ET) { 1877552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case ET_IsLValueExpr: return "__is_lvalue_expr"; 1878552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case ET_IsRValueExpr: return "__is_rvalue_expr"; 1879552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 1880a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth llvm_unreachable("Expression type trait not covered by switch"); 1881552622067dc45013d240f73952fece703f5e63bdJohn Wiegley} 1882552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 18834ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorvoid StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) { 18844ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor OS << getTypeTraitName(E->getTrait()) << "("; 18854ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 18864ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor if (I > 0) 18874ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor OS << ", "; 18889d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer E->getArg(I)->getType().print(OS, Policy); 18894ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor } 18904ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor OS << ")"; 18914ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor} 18924ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor 189321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyvoid StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 18949d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << getTypeTraitName(E->getTrait()) << '('; 18959d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer E->getQueriedType().print(OS, Policy); 18969d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 189721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley} 189821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 1899552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyvoid StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 19009d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << getExpressionTraitName(E->getTrait()) << '('; 19019d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer PrintExpr(E->getQueriedExpression()); 19029d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 1903552622067dc45013d240f73952fece703f5e63bdJohn Wiegley} 1904552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 19052e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlvoid StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 19062e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl OS << "noexcept("; 19072e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl PrintExpr(E->getOperand()); 19082e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl OS << ")"; 19092e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl} 19102e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 1911ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) { 1912be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor PrintExpr(E->getPattern()); 1913be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor OS << "..."; 1914be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor} 1915be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 1916ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1917a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer OS << "sizeof...(" << *E->getPack() << ")"; 1918ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 1919ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 1920c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr( 1921c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SubstNonTypeTemplateParmPackExpr *Node) { 1922a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer OS << *Node->getParameterPack(); 1923c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor} 1924c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 192591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallvoid StmtPrinter::VisitSubstNonTypeTemplateParmExpr( 192691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SubstNonTypeTemplateParmExpr *Node) { 192791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Visit(Node->getReplacement()); 192891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall} 192991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 19309a4db032ecd991626d236a502e770126db32bd31Richard Smithvoid StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) { 19319a4db032ecd991626d236a502e770126db32bd31Richard Smith OS << *E->getParameterPack(); 19329a4db032ecd991626d236a502e770126db32bd31Richard Smith} 19339a4db032ecd991626d236a502e770126db32bd31Richard Smith 193403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){ 193503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor PrintExpr(Node->GetTemporaryExpr()); 193603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor} 193703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor 19381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// Obj-C 19395508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 19405508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { 19415508518a2702b00be3b15a26d772bde968972f54Anders Carlsson OS << "@"; 19425508518a2702b00be3b15a26d772bde968972f54Anders Carlsson VisitStringLiteral(Node->getString()); 19435508518a2702b00be3b15a26d772bde968972f54Anders Carlsson} 19445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1945eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beardvoid StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) { 1946ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "@"; 1947eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard Visit(E->getSubExpr()); 1948ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1949ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1950ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) { 1951ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "@[ "; 1952ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek StmtRange ch = E->children(); 1953ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (ch.first != ch.second) { 1954ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek while (1) { 1955ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Visit(*ch.first); 1956ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek ++ch.first; 1957ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (ch.first == ch.second) break; 1958ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << ", "; 1959ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 1960ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 1961ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " ]"; 1962ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1963ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1964ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) { 1965ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "@{ "; 1966ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 1967ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (I > 0) 1968ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << ", "; 1969ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1970ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek ObjCDictionaryElement Element = E->getKeyValueElement(I); 1971ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Visit(Element.Key); 1972ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " : "; 1973ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek Visit(Element.Value); 1974ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek if (Element.isPackExpansion()) 1975ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << "..."; 1976ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek } 1977ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << " }"; 1978ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 1979ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 1980f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 19819d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << "@encode("; 19829d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getEncodedType().print(OS, Policy); 19839d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 1984f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 1985f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 1986b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 1987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << "@selector("; 1988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Node->getSelector().print(OS); 1989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << ')'; 1990b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1991b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 1992390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 1993b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "@protocol(" << *Node->getProtocol() << ')'; 1994390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 1995390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 1996563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { 1997563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "["; 199804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Mess->getReceiverKind()) { 199904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 200004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor PrintExpr(Mess->getInstanceReceiver()); 200104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 200204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 200304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 20049d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Mess->getClassReceiver().print(OS, Policy); 200504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 200604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 200704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 200804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 200904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << "Super"; 201004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 201104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 201204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 2013c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ' '; 201497b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek Selector selector = Mess->getSelector(); 20156a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff if (selector.isUnarySelector()) { 2016813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor OS << selector.getNameForSlot(0); 20176a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } else { 20186a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) { 2019c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i < selector.getNumArgs()) { 2020c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i > 0) OS << ' '; 2021c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (selector.getIdentifierInfoForSlot(i)) 202239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << selector.getIdentifierInfoForSlot(i)->getName() << ':'; 2023c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else 2024c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ":"; 2025c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek } 2026c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else OS << ", "; // Handle variadic methods. 20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20286a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff PrintExpr(Mess->getArg(i)); 20296a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } 2030563477da25f824e37c535131695dc4dc9b68c465Steve Naroff } 2031563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "]"; 2032563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 2033563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 2034ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) { 2035ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek OS << (Node->getValue() ? "__objc_yes" : "__objc_no"); 2036ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek} 2037ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek 2038f85e193739c953358c865005855253af4f68a497John McCallvoid 2039f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 2040f85e193739c953358c865005855253af4f68a497John McCall PrintExpr(E->getSubExpr()); 2041f85e193739c953358c865005855253af4f68a497John McCall} 2042f85e193739c953358c865005855253af4f68a497John McCall 2043f85e193739c953358c865005855253af4f68a497John McCallvoid 2044f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 20459d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << '(' << E->getBridgeKindName(); 20469d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer E->getType().print(OS, Policy); 20479d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ')'; 2048f85e193739c953358c865005855253af4f68a497John McCall PrintExpr(E->getSubExpr()); 2049f85e193739c953358c865005855253af4f68a497John McCall} 2050cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 20514eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) { 205256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *BD = Node->getBlockDecl(); 20534eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "^"; 20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20554eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff const FunctionType *AFT = Node->getFunctionType(); 20561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 205772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(AFT)) { 20584eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "()"; 205972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) { 20604eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << '('; 206156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (BlockDecl::param_iterator AI = BD->param_begin(), 206256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff E = BD->param_end(); AI != E; ++AI) { 206356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (AI != BD->param_begin()) OS << ", "; 20649d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer std::string ParamStr = (*AI)->getNameAsString(); 20659d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer (*AI)->getType().print(OS, Policy, ParamStr); 20664eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 20671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 206872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *FT = cast<FunctionProtoType>(AFT); 20694eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff if (FT->isVariadic()) { 207056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (!BD->param_empty()) OS << ", "; 20714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "..."; 20724eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 20734eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ')'; 20744eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 20753e2fe86dd0dd65bff254e3bbdc0ea8df9282dc35Fariborz Jahanian OS << "{ }"; 20764eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 20774eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 2078381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenekvoid StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) { 2079381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek PrintExpr(Node->getSourceExpr()); 2080381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek} 20817cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 208261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnervoid StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) { 208361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner OS << "__builtin_astype("; 208461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner PrintExpr(Node->getSrcExpr()); 20859d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer OS << ", "; 20869d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer Node->getType().print(OS, Policy); 208761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner OS << ")"; 208861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner} 208961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 20905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 20915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations 20925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 20935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 20948b4b98b7cb18cc4a99cca0aefa515cc8756dc06dCraig Toppervoid Stmt::dumpPretty(const ASTContext &Context) const { 20956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines printPretty(llvm::errs(), nullptr, PrintingPolicy(Context.getLangOpts())); 20965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 20975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2098d1420c6fa788669e49f21e184927c7833881e399Richard Smithvoid Stmt::printPretty(raw_ostream &OS, 2099d1420c6fa788669e49f21e184927c7833881e399Richard Smith PrinterHelper *Helper, 2100d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor const PrintingPolicy &Policy, 2101d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation) const { 2102d1420c6fa788669e49f21e184927c7833881e399Richard Smith StmtPrinter P(OS, Helper, Policy, Indentation); 2103c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner P.Visit(const_cast<Stmt*>(this)); 21045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 210542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 210642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 210742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper 210842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 210942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 211042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor. 21118467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {} 2112