StmtPrinter.cpp revision 5e9392ba18f5925e26cc5714d1412eda0d219826
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 155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtVisitor.h" 161a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor#include "clang/AST/DeclCXX.h" 1791d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h" 18c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor#include "clang/AST/DeclTemplate.h" 1942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#include "clang/AST/PrettyPrinter.h" 20a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek#include "llvm/Support/Format.h" 218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h" 22ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor#include "clang/AST/ExprCXX.h" 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace { 30770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer class StmtPrinter : public StmtVisitor<StmtPrinter> { 315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &OS; 3248d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman ASTContext &Context; 335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned IndentLevel; 3442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek clang::PrinterHelper* Helper; 35d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintingPolicy Policy; 36d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StmtPrinter(raw_ostream &os, ASTContext &C, PrinterHelper* helper, 39e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner const PrintingPolicy &Policy, 40d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation = 0) 4148d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman : OS(os), Context(C), IndentLevel(Indentation), Helper(helper), 4248d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman Policy(Policy) {} 431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S) { 45d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintStmt(S, Policy.Indentation); 46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor } 47d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 48d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S, int SubIndent) { 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel += SubIndent; 505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (S && isa<Expr>(S)) { 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is an expr used in a stmt context, indent and newline it. 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 53c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (S) { 56c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "<<<NULL STATEMENT>>>\n"; 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel -= SubIndent; 615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 62db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman 635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawCompoundStmt(CompoundStmt *S); 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawDecl(Decl *D); 65ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek void PrintRawDeclStmt(DeclStmt *S); 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawIfStmt(IfStmt *If); 678351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); 68d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne void PrintCallArgs(CallExpr *E); 6928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley void PrintRawSEHExceptHandler(SEHExceptStmt *S); 7028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley void PrintRawSEHFinallyStmt(SEHFinallyStmt *S); 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintExpr(Expr *E) { 735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (E) 74c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(E); 755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<null expr>"; 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 795f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner raw_ostream &Indent(int Delta = 0) { 80d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor for (int i = 0, e = IndentLevel+Delta; i < e; ++i) 81d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor OS << " "; 825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return OS; 835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump void Visit(Stmt* S) { 8642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek if (Helper && Helper->handledStmt(S,OS)) 8742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek return; 8842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek else StmtVisitor<StmtPrinter>::Visit(S); 8942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek } 9078e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis 9161e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED { 9278e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis Indent() << "<<unknown stmt type>>\n"; 9378e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis } 9461e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED { 9578e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis OS << "<<unknown expr type>>"; 9678e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis } 9778e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node); 981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 9978e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis#define ABSTRACT_STMT(CLASS) 100f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \ 101c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void Visit##CLASS(CLASS *Node); 1024bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc" 1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt printing methods. 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }. 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "{\n"; 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end(); 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer I != E; ++I) 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(*I); 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "}"; 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) { 122f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis D->print(OS, Policy, IndentLevel); 123071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump} 124071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump 125ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenekvoid StmtPrinter::PrintRawDeclStmt(DeclStmt *S) { 126db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end(); 1275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner SmallVector<Decl*, 2> Decls; 1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for ( ; Begin != End; ++Begin) 12942f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman Decls.push_back(*Begin); 130db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman 131f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel); 132ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek} 1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) { 1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << ";\n"; 1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) { 139db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman Indent(); 140db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman PrintRawDeclStmt(Node); 141db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman OS << ";\n"; 1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { 1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(Node); 1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) { 1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "case "; 1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRHS()) { 1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " ... "; 1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ":\n"; 1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { 1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "default:\n"; 1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) { 1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << Node->getName() << ":\n"; 1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) { 173bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << "if ("; 1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(If->getCond()); 175bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << ')'; 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { 1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (If->getElse() ? ' ' : '\n'); 1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getThen()); 1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (If->getElse()) Indent(); 1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Stmt *Else = If->getElse()) { 1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "else"; 1891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) { 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) { 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(ElseIf); 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getElse()); 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) { 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(If); 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "switch ("; 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Pretty print compoundstmt bodies (very common). 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) { 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "while ("; 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")\n"; 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) { 2338bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent() << "do "; 2348bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2358bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2368bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2378bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2388bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2398bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2408bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent(); 2418bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 243b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << "while ("; 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 245b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << ");\n"; 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) { 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "for ("; 2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getInit()) { 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit())) 252ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(cast<Expr>(Node->getInit())); 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 2578bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getCond()) { 2588bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2608bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2618bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 2628bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getInc()) { 2638bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getInc()); 2658bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2668bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ") "; 2671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2688bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2698bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2708bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2718bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2738bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2748bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 277a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { 2780196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian Indent() << "for ("; 2790196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement())) 280ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 2810196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian else 2820196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(cast<Expr>(Node->getElement())); 2830196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << " in "; 2840196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(Node->getCollection()); 2850196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << ") "; 2861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2870196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2880196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintRawCompoundStmt(CS); 2890196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 2900196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } else { 2910196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 2920196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintStmt(Node->getBody()); 2930196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } 2940196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian} 2950196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian 296ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) { 297ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Indent() << "for ("; 298ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith PrintingPolicy SubPolicy(Policy); 299ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith SubPolicy.SuppressInitializers = true; 300ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel); 301ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith OS << " : "; 302ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith PrintExpr(Node->getRangeInit()); 303ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith OS << ") {\n"; 304ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith PrintStmt(Node->getBody()); 305ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith Indent() << "}\n"; 306ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith} 307ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith 308ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregorvoid StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) { 309ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor Indent(); 310ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor if (Node->isIfExists()) 311ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor OS << "__if_exists ("; 312ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor else 313ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor OS << "__if_not_exists ("; 314ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 315ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor if (NestedNameSpecifier *Qualifier 316ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor = Node->getQualifierLoc().getNestedNameSpecifier()) 317ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor Qualifier->print(OS, Policy); 318ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 319ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor OS << Node->getNameInfo() << ") "; 320ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 321ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor PrintRawCompoundStmt(Node->getSubStmt()); 322ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor} 323ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor 3245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) { 3255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto " << Node->getLabel()->getName() << ";\n"; 3265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { 3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto *"; 3305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getTarget()); 3315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 3325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { 3355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "continue;\n"; 3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) { 3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "break;\n"; 3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { 3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "return"; 3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRetValue()) { 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRetValue()); 3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 352fe795956194141c91ae555985c9b930595bff43fChris Lattner 353fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) { 35439c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson Indent() << "asm "; 3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35639c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson if (Node->isVolatile()) 35739c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "volatile "; 3581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 35939c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "("; 3606a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson VisitStringLiteral(Node->getAsmString()); 3611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 362b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Outputs 363b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 || 364b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Node->getNumClobbers() != 0) 365b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 367b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) { 368b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 369b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 371b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getOutputName(i).empty()) { 372b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 373b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getOutputName(i); 374b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 375b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 377b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getOutputConstraintLiteral(i)); 378b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 379b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getOutputExpr(i)); 380b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 382b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Inputs 383b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0) 384b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 386b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) { 387b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getInputName(i).empty()) { 391b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 392b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getInputName(i); 393b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 3951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 396b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getInputConstraintLiteral(i)); 397b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 398b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getInputExpr(i)); 399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 401b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Clobbers 402b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumClobbers() != 0) 403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 405b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) { 406b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 407b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 409b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson VisitStringLiteral(Node->getClobber(i)); 410b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4126a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson OS << ");\n"; 413fe795956194141c91ae555985c9b930595bff43fChris Lattner} 414fe795956194141c91ae555985c9b930595bff43fChris Lattner 415a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { 4167794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@try"; 4177794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) { 4187794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian PrintRawCompoundStmt(TS); 4197794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4207794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4228f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) { 4238f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I); 4247794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@catch("; 4257ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (catchStmt->getCatchParamDecl()) { 4267ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (Decl *DS = catchStmt->getCatchParamDecl()) 4277ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff PrintRawDecl(DS); 4287794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4297794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << ")"; 4301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) { 4311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PrintRawCompoundStmt(CS); 4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OS << "\n"; 4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 4347794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>( 4371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Node->getFinallyStmt())) { 4381e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian Indent() << "@finally"; 4391e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody())); 4407794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 442b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 443b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 444a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { 445b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 446b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 447a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { 448b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian Indent() << "@catch (...) { /* todo */ } \n"; 449b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 450b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 45178a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { 45239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian Indent() << "@throw"; 45339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian if (Node->getThrowExpr()) { 45439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << " "; 45539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian PrintExpr(Node->getThrowExpr()); 45639f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian } 45739f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << ";\n"; 45839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian} 45939f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian 46078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { 461c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian Indent() << "@synchronized ("; 462c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian PrintExpr(Node->getSynchExpr()); 463c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian OS << ")"; 46478a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian PrintRawCompoundStmt(Node->getSynchBody()); 46578a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian OS << "\n"; 466c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian} 467c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian 468f85e193739c953358c865005855253af4f68a497John McCallvoid StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) { 469f85e193739c953358c865005855253af4f68a497John McCall Indent() << "@autoreleasepool"; 470f85e193739c953358c865005855253af4f68a497John McCall PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt())); 471f85e193739c953358c865005855253af4f68a497John McCall OS << "\n"; 472f85e193739c953358c865005855253af4f68a497John McCall} 473f85e193739c953358c865005855253af4f68a497John McCall 4748351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { 4758351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "catch ("; 4764b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl if (Decl *ExDecl = Node->getExceptionDecl()) 4774b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawDecl(ExDecl); 4784b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl else 4794b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "..."; 4804b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << ") "; 4814b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock())); 4828351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 4838351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 4848351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { 4858351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent(); 4868351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node); 4878351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "\n"; 4888351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 4898351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 4908351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { 4918351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent() << "try "; 4928351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCompoundStmt(Node->getTryBlock()); 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) { 4948351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << " "; 4958351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node->getHandler(i)); 4968351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl } 4974b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "\n"; 4984b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl} 4994b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl 50028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) { 50128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Indent() << (Node->getIsCXXTry() ? "try " : "__try "); 50228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawCompoundStmt(Node->getTryBlock()); 50328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley SEHExceptStmt *E = Node->getExceptHandler(); 50428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley SEHFinallyStmt *F = Node->getFinallyHandler(); 50528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley if(E) 50628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHExceptHandler(E); 50728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley else { 50828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley assert(F && "Must have a finally block..."); 50928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHFinallyStmt(F); 51028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley } 51128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 51228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 51328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 51428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) { 51528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "__finally "; 51628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawCompoundStmt(Node->getBlock()); 51728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 51828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 51928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 52028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) { 52128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "__except ("; 52228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley VisitExpr(Node->getFilterExpr()); 52328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << ")\n"; 52428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawCompoundStmt(Node->getBlock()); 52528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 52628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 52728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 52828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) { 52928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Indent(); 53028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHExceptHandler(Node); 53128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 53228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 53328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 53428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) { 53528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley Indent(); 53628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley PrintRawSEHFinallyStmt(Node); 53728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley OS << "\n"; 53828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley} 53928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley 5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Expr printing methods. 5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { 545a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 546a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Qualifier->print(OS, Policy); 5472577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getNameInfo(); 548096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (Node->hasExplicitTemplateArgs()) 549a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor OS << TemplateSpecializationType::PrintTemplateArgumentList( 550a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Node->getTemplateArgs(), 551a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor Node->getNumTemplateArgs(), 552c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt Policy); 5531a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor} 5541a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor 555865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitDependentScopeDeclRefExpr( 556865d447ac6a4721ab58e898d014a21f2eff74b06John McCall DependentScopeDeclRefExpr *Node) { 557274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 558274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann Qualifier->print(OS, Policy); 5592577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getNameInfo(); 560f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Node->hasExplicitTemplateArgs()) 561f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OS << TemplateSpecializationType::PrintTemplateArgumentList( 562f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Node->getTemplateArgs(), 563f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Node->getNumTemplateArgs(), 564f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Policy); 5655953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 5665953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 567ba13543329afac4a0d01304ec2ec4924d99306a6John McCallvoid StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) { 568edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor if (Node->getQualifier()) 569edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor Node->getQualifier()->print(OS, Policy); 5702577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getNameInfo(); 571f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall if (Node->hasExplicitTemplateArgs()) 572f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall OS << TemplateSpecializationType::PrintTemplateArgumentList( 573f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Node->getTemplateArgs(), 574edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor Node->getNumTemplateArgs(), 575f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall Policy); 576edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor} 577edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor 5787779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 579232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian if (Node->getBase()) { 580232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian PrintExpr(Node->getBase()); 581232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian OS << (Node->isArrow() ? "->" : "."); 582232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian } 583b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *Node->getDecl(); 5847779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff} 5857779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff 586ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 5878ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian if (Node->isSuperReceiver()) 5888ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian OS << "super."; 5898ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian else if (Node->getBase()) { 590ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff PrintExpr(Node->getBase()); 591ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff OS << "."; 592ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff } 5938ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian 59412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall if (Node->isImplicitProperty()) 59512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Node->getImplicitPropertyGetter()->getSelector().getAsString(); 59612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall else 59712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall OS << Node->getExplicitProperty()->getName(); 5985daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian} 5995daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 600d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) { 601227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson switch (Node->getIdentType()) { 602227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson default: 603b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("unknown case"); 604d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Func: 605227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__func__"; 606227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 607d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Function: 608227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__FUNCTION__"; 609227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 610d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::PrettyFunction: 611227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__PRETTY_FUNCTION__"; 612227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 613227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson } 614227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson} 615227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 6165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { 617b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner unsigned value = Node->getValue(); 6185cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 6195cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (Node->getKind()) { 6205cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::Ascii: break; // no prefix. 6215cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::Wide: OS << 'L'; break; 6225cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::UTF16: OS << 'u'; break; 6235cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case CharacterLiteral::UTF32: OS << 'U'; break; 6245cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 6255cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor 6268bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner switch (value) { 6278bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\\': 6288bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\\\'"; 6298bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6308bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\'': 6318bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\''"; 6328bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6338bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\a': 6348bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // TODO: K&R: the meaning of '\\a' is different in traditional C 6358bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\a'"; 6368bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6378bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\b': 6388bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\b'"; 6398bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6408bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // Nonstandard escape sequence. 6418bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner /*case '\e': 6428bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\e'"; 6438bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break;*/ 6448bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\f': 6458bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\f'"; 6468bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6478bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\n': 6488bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\n'"; 6498bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6508bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\r': 6518bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\r'"; 6528bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\t': 6548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\t'"; 6558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\v': 6578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\v'"; 6588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner default: 660471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek if (value < 256 && isprint(value)) { 6618bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'" << (char)value << "'"; 6628bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } else if (value < 256) { 663a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek OS << "'\\x" << llvm::format("%x", value) << "'"; 6648bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } else { 6658bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // FIXME what to really do here? 6668bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << value; 6678bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } 668b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner } 6695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { 6725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isSigned = Node->getType()->isSignedIntegerType(); 6735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << Node->getValue().toString(10, isSigned); 6741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 6755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit suffixes. Integer literals are always a builtin integer type. 676183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall switch (Node->getType()->getAs<BuiltinType>()->getKind()) { 677b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unexpected type for integer literal!"); 67811cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu // FIXME: The Short and UShort cases are to handle cases where a short 67911cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu // integeral literal is formed during template instantiation. They should 68011cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu // be removed when template instantiation no longer needs integer literals. 68111cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu case BuiltinType::Short: 68211cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu case BuiltinType::UShort: 6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Int: break; // no suffix. 6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::UInt: OS << 'U'; break; 6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Long: OS << 'L'; break; 6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULong: OS << "UL"; break; 6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongLong: OS << "LL"; break; 6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULongLong: OS << "ULL"; break; 68911cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu case BuiltinType::Int128: OS << "i128"; break; 69011cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu case BuiltinType::UInt128: OS << "Ui128"; break; 6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { 694b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman llvm::SmallString<16> Str; 695b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman Node->getValue().toString(Str); 696b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman OS << Str; 6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6985d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 6995d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { 7005d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner PrintExpr(Node->getSubExpr()); 7015d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner OS << "i"; 7025d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner} 7035d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 7045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) { 7055cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor switch (Str->getKind()) { 7065cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Ascii: break; // no prefix. 7075cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::Wide: OS << 'L'; break; 7085cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF8: OS << "u8"; break; 7095cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF16: OS << 'u'; break; 7105cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor case StringLiteral::UTF32: OS << 'U'; break; 7115cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor } 7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '"'; 713ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson 7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: this doesn't print wstrings right. 7155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner StringRef StrData = Str->getString(); 7165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner for (StringRef::iterator I = StrData.begin(), E = StrData.end(); 7172f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer I != E; ++I) { 7182f4eaef37476ae6891ede8ba215d0f6fd093629bBenjamin Kramer unsigned char Char = *I; 7191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7209a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner switch (Char) { 7219a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner default: 7229a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner if (isprint(Char)) 7239a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner OS << (char)Char; 7249a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner else // Output anything hard as an octal escape. 7259a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner OS << '\\' 7269a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 6) & 7)) 7279a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 3) & 7)) 7289a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 0) & 7)); 7299a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner break; 7309a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner // Handle some common non-printable cases to make dumps prettier. 7315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\\': OS << "\\\\"; break; 7325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '"': OS << "\\\""; break; 7335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\n': OS << "\\n"; break; 7345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\t': OS << "\\t"; break; 7355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\a': OS << "\\a"; break; 7365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\b': OS << "\\b"; break; 7375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 7395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '"'; 7405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) { 7425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "("; 7435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 7445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 7455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) { 747296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner if (!Node->isPostfix()) { 7485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7507df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman // Print a space if this is an "identifier operator" like __real, or if 7517df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman // it might be concatenated incorrectly like '+'. 752296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner switch (Node->getOpcode()) { 753296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner default: break; 7542de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Real: 7552de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Imag: 7562de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Extension: 757296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner OS << ' '; 758296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner break; 7592de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Plus: 7602de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall case UO_Minus: 7617df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman if (isa<UnaryOperator>(Node->getSubExpr())) 7627df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman OS << ' '; 7637df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman break; 764296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 765296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 7671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->isPostfix()) 7695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 770704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner} 771704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 7728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorvoid StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) { 7738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "__builtin_offsetof("; 7746cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getTypeSourceInfo()->getType().getAsString(Policy) << ", "; 7758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor bool PrintedSomething = false; 7768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) { 7778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i); 7788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) { 7798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Array node 7808ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "["; 7818ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex())); 7828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "]"; 7838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintedSomething = true; 7848ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor continue; 7858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 786cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 787cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor // Skip implicit base indirections. 788cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Base) 789cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor continue; 790cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor 7918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor // Field or identifier node. 7928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor IdentifierInfo *Id = ON.getFieldName(); 7938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (!Id) 7948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor continue; 795c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt 7968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor if (PrintedSomething) 7978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << "."; 7988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor else 7998ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor PrintedSomething = true; 800c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt OS << Id->getName(); 8018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor } 8028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor OS << ")"; 8038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor} 8048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor 805f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){ 806f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne switch(Node->getKind()) { 807f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_SizeOf: 808f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << "sizeof"; 809f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 810f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_AlignOf: 811f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << "__alignof"; 812f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 813f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne case UETT_VecStep: 814f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne OS << "vec_step"; 815f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne break; 816f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne } 8170518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 8186cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << "(" << Node->getArgumentType().getAsString(Policy) << ")"; 8190518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl else { 8200518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << " "; 8210518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl PrintExpr(Node->getArgumentExpr()); 8220518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 824f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 825f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournevoid StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) { 826f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << "_Generic("; 827f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne PrintExpr(Node->getControllingExpr()); 828f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne for (unsigned i = 0; i != Node->getNumAssocs(); ++i) { 829f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << ", "; 830f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne QualType T = Node->getAssocType(i); 831f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne if (T.isNull()) 832f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << "default"; 833f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne else 834f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << T.getAsString(Policy); 835f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << ": "; 836f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne PrintExpr(Node->getAssocExpr(i)); 837f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne } 838f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne OS << ")"; 839f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne} 840f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne 8415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { 8422324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getLHS()); 8435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "["; 8442324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getRHS()); 8455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "]"; 8465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 848d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::PrintCallArgs(CallExpr *Call) { 8495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { 85004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { 85104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Don't print any defaulted arguments 85204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner break; 85304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner } 85404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 8555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (i) OS << ", "; 8565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Call->getArg(i)); 8575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 858d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne} 859d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne 860d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::VisitCallExpr(CallExpr *Call) { 861d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne PrintExpr(Call->getCallee()); 862d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne OS << "("; 863d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne PrintCallArgs(Call); 8645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 8655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) { 867b3eef68111ffc220e449be96da1747998c057790Douglas Gregor // FIXME: Suppress printing implicit bases (like "this") 868b3eef68111ffc220e449be96da1747998c057790Douglas Gregor PrintExpr(Node->getBase()); 86997fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl())) 87097fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian if (FD->isAnonymousStructOrUnion()) 87197fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian return; 872b3eef68111ffc220e449be96da1747998c057790Douglas Gregor OS << (Node->isArrow() ? "->" : "."); 87383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 87483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier->print(OS, Policy); 87583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 8762577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getMemberNameInfo(); 8771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 878096832c5ed5b9106fa177ebc148489760c3bc496John McCall if (Node->hasExplicitTemplateArgs()) 879c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor OS << TemplateSpecializationType::PrintTemplateArgumentList( 880c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor Node->getTemplateArgs(), 881c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor Node->getNumTemplateArgs(), 882c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor Policy); 8835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 884f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroffvoid StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) { 885f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff PrintExpr(Node->getBase()); 886f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff OS << (Node->isArrow() ? "->isa" : ".isa"); 887f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff} 888f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff 889213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 89031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff PrintExpr(Node->getBase()); 89131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << "."; 89231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << Node->getAccessor().getName(); 89331a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff} 8946eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { 89503e80e446edac1479bab1daa14e8bd9a46bd6c52Fariborz Jahanian OS << "(" << Node->getType().getAsString(Policy) << ")"; 8965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 8975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 898aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { 8996cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << "(" << Node->getType().getAsString(Policy) << ")"; 900aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff PrintExpr(Node->getInitializer()); 901aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff} 90249b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 90390045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff // No need to print anything, simply forward to the sub expression. 90490045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff PrintExpr(Node->getSubExpr()); 90549b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff} 9065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) { 9075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 9085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 909eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getRHS()); 910eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 911eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 912eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getLHS()); 913eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 9145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 9155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 9165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) { 9175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 91856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OS << " ? "; 91956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall PrintExpr(Node->getLHS()); 92056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OS << " : "; 9215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 9225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 9235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 9245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions. 9255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 92656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid 92756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallStmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) { 92856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall PrintExpr(Node->getCommon()); 92956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall OS << " ?: "; 93056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall PrintExpr(Node->getFalseExpr()); 93156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall} 9326481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) { 9335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "&&" << Node->getLabel()->getName(); 9345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 9355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 936ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) { 937ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << "("; 938ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner PrintRawCompoundStmt(E->getSubStmt()); 939ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << ")"; 940ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner} 941ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 942d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) { 943d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << "__builtin_choose_expr("; 944d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getCond()); 94594f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 946d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getLHS()); 94794f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 948d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getRHS()); 949d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << ")"; 950d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff} 951ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 9522d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) { 9532d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor OS << "__null"; 9542d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor} 9552d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 956d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) { 957d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << "__builtin_shufflevector("; 958d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) { 959d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman if (i) OS << ", "; 960d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman PrintExpr(Node->getExpr(i)); 961d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 962d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << ")"; 963e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman} 964e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman 96566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 96664f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor if (Node->getSyntacticForm()) { 96764f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor Visit(Node->getSyntacticForm()); 96864f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor return; 96964f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor } 97064f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor 97166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << "{ "; 97266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) { 97366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson if (i) OS << ", "; 9744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Node->getInit(i)) 9754c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit(i)); 9764c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 9774c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "0"; 97866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 97966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << " }"; 98066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 98166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 9822ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid StmtPrinter::VisitParenListExpr(ParenListExpr* Node) { 9832ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman OS << "( "; 9842ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) { 9852ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman if (i) OS << ", "; 9862ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman PrintExpr(Node->getExpr(i)); 9872ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman } 9882ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman OS << " )"; 9892ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman} 9902ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman 99105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { 9924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), 9934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DEnd = Node->designators_end(); 9944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D != DEnd; ++D) { 9954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isFieldDesignator()) { 9964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->getDotLoc().isInvalid()) 9974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << D->getFieldName()->getName() << ":"; 9984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 9994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "." << D->getFieldName()->getName(); 10004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 10014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "["; 10024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isArrayDesignator()) { 10034c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayIndex(*D)); 10044c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 10054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayRangeStart(*D)); 10064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " ... "; 10071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PrintExpr(Node->getArrayRangeEnd(*D)); 10084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 10094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "]"; 10104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 10114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 10124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 10134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " = "; 10144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit()); 101505c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 101605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 10173498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) { 1018e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner if (Policy.LangOpts.CPlusPlus) 10194fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "/*implicit*/" << Node->getType().getAsString(Policy) << "()"; 10204fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor else { 10214fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "/*implicit*/(" << Node->getType().getAsString(Policy) << ")"; 10224fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor if (Node->getType()->isRecordType()) 10234fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << "{}"; 10244fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor else 10254fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor OS << 0; 10264fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 10273498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 10283498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 10297c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) { 103042f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman OS << "__builtin_va_arg("; 10317c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson PrintExpr(Node->getSubExpr()); 10327c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ", "; 10336cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getType().getAsString(Policy); 10347c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ")"; 10357c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson} 10367c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson 10374b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) { 10384b9c2d235fb9449e249d74f48ecfec601650de93John McCall PrintExpr(Node->getSyntacticForm()); 10394b9c2d235fb9449e249d74f48ecfec601650de93John McCall} 10404b9c2d235fb9449e249d74f48ecfec601650de93John McCall 1041276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) { 10429e3c20b2b600af7b2b8c65fb12362ba2046caf10Eli Friedman const char *Name = 0; 1043276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman switch (Node->getOp()) { 1044276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Load: 1045276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_load("; 1046276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1047276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Store: 1048276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_store("; 1049276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1050276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::CmpXchgStrong: 1051276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_compare_exchange_strong("; 1052276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1053276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::CmpXchgWeak: 1054276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_compare_exchange_weak("; 1055276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1056276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Xchg: 1057276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_exchange("; 1058276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1059276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Add: 1060276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_fetch_add("; 1061276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1062276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Sub: 1063276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_fetch_sub("; 1064276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1065276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::And: 1066276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_fetch_and("; 1067276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1068276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Or: 1069276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_fetch_or("; 1070276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1071276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman case AtomicExpr::Xor: 1072276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman Name = "__atomic_fetch_xor("; 1073276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman break; 1074276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1075276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << Name; 1076276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getPtr()); 1077276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 1078276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman if (Node->getOp() != AtomicExpr::Load) { 1079276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getVal1()); 1080276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 1081276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1082276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman if (Node->isCmpXChg()) { 1083276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getVal2()); 1084276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 1085276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1086276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getOrder()); 1087276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman if (Node->isCmpXChg()) { 1088276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ", "; 1089276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman PrintExpr(Node->getOrderFail()); 1090276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman } 1091276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman OS << ")"; 1092276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman} 1093276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman 10945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++ 1095b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { 1096b4609806e9232593ece09ce08b630836e825865cDouglas Gregor const char *OpStrings[NUM_OVERLOADED_OPERATORS] = { 1097b4609806e9232593ece09ce08b630836e825865cDouglas Gregor "", 1098b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 1099b4609806e9232593ece09ce08b630836e825865cDouglas Gregor Spelling, 1100b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def" 1101b4609806e9232593ece09ce08b630836e825865cDouglas Gregor }; 1102b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 1103b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OverloadedOperatorKind Kind = Node->getOperator(); 1104b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 1105b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Node->getNumArgs() == 1) { 1106b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 1107b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1108b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 1109b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1110b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind]; 1111b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1112b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Call) { 1113b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1114b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '('; 1115b4609806e9232593ece09ce08b630836e825865cDouglas Gregor for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) { 1116b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (ArgIdx > 1) 1117b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ", "; 1118b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx))) 1119b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(ArgIdx)); 1120b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1121b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ')'; 1122b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Subscript) { 1123b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1124b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '['; 1125b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 1126b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ']'; 1127b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 1) { 1128b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 1129b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1130b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 2) { 1131b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 1132b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind] << ' '; 1133b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 1134b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 1135b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie llvm_unreachable("unknown overloaded operator"); 1136b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 1137b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 11385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 113988a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { 114088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor VisitCallExpr(cast<CallExpr>(Node)); 114188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor} 114288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 1143e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournevoid StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) { 1144e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne PrintExpr(Node->getCallee()); 1145e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne OS << "<<<"; 1146e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne PrintCallArgs(Node->getConfig()); 1147e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne OS << ">>>("; 1148e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne PrintCallArgs(Node); 1149e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne OS << ")"; 1150e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne} 1151e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne 115249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 115349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor OS << Node->getCastName() << '<'; 11546cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getTypeAsWritten().getAsString(Policy) << ">("; 11555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 11565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 11575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 11585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 115949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) { 116049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 116149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 116249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 116349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) { 116449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 116549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 116649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 116749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) { 116849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 116949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 117049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 117149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) { 117249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 117349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 117449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 1175c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { 1176c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << "typeid("; 1177c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl if (Node->isTypeOperand()) { 11786cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getTypeOperand().getAsString(Policy); 1179c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } else { 1180c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl PrintExpr(Node->getExprOperand()); 1181c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 1182c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << ")"; 1183c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl} 1184c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 118501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetvoid StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) { 118601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet OS << "__uuidof("; 118701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet if (Node->isTypeOperand()) { 118801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet OS << Node->getTypeOperand().getAsString(Policy); 118901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } else { 119001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet PrintExpr(Node->getExprOperand()); 119101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet } 119201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet OS << ")"; 119301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet} 119401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet 11955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 11965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (Node->getValue() ? "true" : "false"); 11975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 11985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 11996e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { 12006e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl OS << "nullptr"; 12016e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 12026e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 1203796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { 1204796da18402f286b897782a298ae3b20c459c102eDouglas Gregor OS << "this"; 1205796da18402f286b897782a298ae3b20c459c102eDouglas Gregor} 1206796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 120750dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) { 120850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner if (Node->getSubExpr() == 0) 120950dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw"; 121050dd289f45738ed22b7583d52ed2525b927042ffChris Lattner else { 121150dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw "; 121250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner PrintExpr(Node->getSubExpr()); 121350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner } 121450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner} 121550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner 121604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { 121704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Nothing to print: we picked up the default argument 121804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner} 121904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 1220987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 12216cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getType().getAsString(Policy); 1222987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << "("; 1223987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis PrintExpr(Node->getSubExpr()); 1224987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << ")"; 1225987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1226987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1227fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonvoid StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) { 1228eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson PrintExpr(Node->getSubExpr()); 1229eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson} 1230eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson 1231506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { 12326cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getType().getAsString(Policy); 1233506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << "("; 1234506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(), 12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgEnd = Node->arg_end(); 1236506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor Arg != ArgEnd; ++Arg) { 1237506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor if (Arg != Node->arg_begin()) 1238506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ", "; 1239506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor PrintExpr(*Arg); 1240506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor } 1241506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ")"; 1242506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor} 1243506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1244ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregorvoid StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) { 1245ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo()) 1246ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor OS << TSInfo->getType().getAsString(Policy) << "()"; 1247ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor else 1248ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor OS << Node->getType().getAsString(Policy) << "()"; 1249987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1250987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 12514c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { 12524c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalNew()) 12534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 12544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "new "; 12554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumPlace = E->getNumPlacementArgs(); 12564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (NumPlace > 0) { 12574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 12584c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(0)); 12594c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumPlace; ++i) { 12604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 12614c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(i)); 12624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 12634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ") "; 12644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 12654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 12664c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 12676fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl std::string TypeS; 12686fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl if (Expr *Size = E->getArraySize()) { 12696fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl llvm::raw_string_ostream s(TypeS); 12706e1a345838c8feb500ba8887b3ba5a1c1d0b33dcEli Friedman Size->printPretty(s, Context, Helper, Policy); 12716fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl s.flush(); 12726fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl TypeS = "[" + TypeS + "]"; 12736fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl } 1274d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor E->getAllocatedType().getAsStringInternal(TypeS, Policy); 12756fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl OS << TypeS; 12764c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 12774c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 12784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 12794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->hasInitializer()) { 12804c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 12814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumCons = E->getNumConstructorArgs(); 12824c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (NumCons > 0) { 12834c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getConstructorArg(0)); 12844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumCons; ++i) { 12854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 12864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getConstructorArg(i)); 12874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 12884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 12894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 12904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 12914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 12924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 12934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 12944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalDelete()) 12954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 12964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "delete "; 12974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isArrayForm()) 12984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "[] "; 12994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getArgument()); 13004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 13014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 1302a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) { 1303a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor PrintExpr(E->getBase()); 1304a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->isArrow()) 1305a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << "->"; 1306a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor else 1307a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << '.'; 1308a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier()) 1309a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifier()->print(OS, Policy); 13101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1311a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor std::string TypeS; 1312a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor if (IdentifierInfo *II = E->getDestroyedTypeIdentifier()) 1313a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor OS << II->getName(); 1314a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor else 1315a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor E->getDestroyedType().getAsStringInternal(TypeS, Policy); 1316a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OS << TypeS; 1317a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 1318a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 1319e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) { 1320d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) { 1321d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor if (isa<CXXDefaultArgExpr>(E->getArg(i))) { 1322d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor // Don't print any defaulted arguments 1323d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor break; 1324d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor } 1325d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor 1326d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor if (i) OS << ", "; 1327d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor PrintExpr(E->getArg(i)); 1328c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian } 1329e349bea668622ef31bd51a229960a73d69940709Anders Carlsson} 1330e349bea668622ef31bd51a229960a73d69940709Anders Carlsson 13314765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) { 133202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Just forward to the sub expression. 133302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson PrintExpr(E->getSubExpr()); 133402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson} 133502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 13361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid 1337d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr( 1338d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor CXXUnresolvedConstructExpr *Node) { 13396cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << Node->getTypeAsWritten().getAsString(Policy); 1340d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << "("; 1341d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(), 13421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgEnd = Node->arg_end(); 1343d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Arg != ArgEnd; ++Arg) { 1344d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor if (Arg != Node->arg_begin()) 1345d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ", "; 1346d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor PrintExpr(*Arg); 1347d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 1348d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ")"; 1349d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor} 1350d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 1351865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitCXXDependentScopeMemberExpr( 1352865d447ac6a4721ab58e898d014a21f2eff74b06John McCall CXXDependentScopeMemberExpr *Node) { 1353aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Node->isImplicitAccess()) { 1354aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall PrintExpr(Node->getBase()); 1355aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OS << (Node->isArrow() ? "->" : "."); 1356aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 1357a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1358a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier->print(OS, Policy); 1359aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall else if (Node->hasExplicitTemplateArgs()) 13603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: Track use of "template" keyword explicitly? 13613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OS << "template "; 13621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 13632577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getMemberNameInfo(); 13641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1365aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (Node->hasExplicitTemplateArgs()) { 13663b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OS << TemplateSpecializationType::PrintTemplateArgumentList( 13673b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Node->getTemplateArgs(), 13683b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Node->getNumTemplateArgs(), 13693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Policy); 13703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 13711c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor} 13721c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 1373129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallvoid StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) { 1374aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall if (!Node->isImplicitAccess()) { 1375aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall PrintExpr(Node->getBase()); 1376aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall OS << (Node->isArrow() ? "->" : "."); 1377aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall } 1378129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (NestedNameSpecifier *Qualifier = Node->getQualifier()) 1379129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Qualifier->print(OS, Policy); 1380129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 1381129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall // FIXME: this might originally have been written with 'template' 1382129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 13832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara OS << Node->getMemberNameInfo(); 1384129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 1385129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall if (Node->hasExplicitTemplateArgs()) { 1386129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall OS << TemplateSpecializationType::PrintTemplateArgumentList( 1387129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Node->getTemplateArgs(), 1388129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Node->getNumTemplateArgs(), 1389129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall Policy); 1390129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall } 1391129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall} 1392129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall 139364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlstatic const char *getTypeTraitName(UnaryTypeTrait UTT) { 139464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl switch (UTT) { 139564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowAssign: return "__has_nothrow_assign"; 139664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowConstructor: return "__has_nothrow_constructor"; 139720c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_HasNothrowCopy: return "__has_nothrow_copy"; 139864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialAssign: return "__has_trivial_assign"; 1399023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt case UTT_HasTrivialDefaultConstructor: return "__has_trivial_constructor"; 140020c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_HasTrivialCopy: return "__has_trivial_copy"; 140164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialDestructor: return "__has_trivial_destructor"; 140264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasVirtualDestructor: return "__has_virtual_destructor"; 140364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsAbstract: return "__is_abstract"; 140420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsArithmetic: return "__is_arithmetic"; 140520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsArray: return "__is_array"; 140664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsClass: return "__is_class"; 140720c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsCompleteType: return "__is_complete_type"; 140820c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsCompound: return "__is_compound"; 140920c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsConst: return "__is_const"; 141064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsEmpty: return "__is_empty"; 141164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsEnum: return "__is_enum"; 14125e9392ba18f5925e26cc5714d1412eda0d219826Douglas Gregor case UTT_IsFinal: return "__is_final"; 141320c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsFloatingPoint: return "__is_floating_point"; 141420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsFunction: return "__is_function"; 141520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsFundamental: return "__is_fundamental"; 141620c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsIntegral: return "__is_integral"; 1417e194710fcd012df67a2694477ef8ce5a19bf376cChandler Carruth case UTT_IsLiteral: return "__is_literal"; 141820c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsLvalueReference: return "__is_lvalue_reference"; 141920c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsMemberFunctionPointer: return "__is_member_function_pointer"; 142020c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsMemberObjectPointer: return "__is_member_object_pointer"; 142120c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsMemberPointer: return "__is_member_pointer"; 142220c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsObject: return "__is_object"; 142364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsPOD: return "__is_pod"; 142420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsPointer: return "__is_pointer"; 142564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsPolymorphic: return "__is_polymorphic"; 142620c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsReference: return "__is_reference"; 142720c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsRvalueReference: return "__is_rvalue_reference"; 142820c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsScalar: return "__is_scalar"; 142920c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsSigned: return "__is_signed"; 143020c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsStandardLayout: return "__is_standard_layout"; 143120c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsTrivial: return "__is_trivial"; 1432feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt case UTT_IsTriviallyCopyable: return "__is_trivially_copyable"; 143364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsUnion: return "__is_union"; 143420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsUnsigned: return "__is_unsigned"; 143520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsVoid: return "__is_void"; 143620c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case UTT_IsVolatile: return "__is_volatile"; 143764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 1438e194710fcd012df67a2694477ef8ce5a19bf376cChandler Carruth llvm_unreachable("Type trait not covered by switch statement"); 14396ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet} 14406ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 14416ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichetstatic const char *getTypeTraitName(BinaryTypeTrait BTT) { 14426ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet switch (BTT) { 1443f187237d916afa97c491ac32fe98be7d335c5b63Francois Pichet case BTT_IsBaseOf: return "__is_base_of"; 144420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case BTT_IsConvertible: return "__is_convertible"; 144520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley case BTT_IsSame: return "__is_same"; 1446f187237d916afa97c491ac32fe98be7d335c5b63Francois Pichet case BTT_TypeCompatible: return "__builtin_types_compatible_p"; 14479f3611365d0f2297a910cf246e056708726ed10aDouglas Gregor case BTT_IsConvertibleTo: return "__is_convertible_to"; 14486ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet } 1449a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth llvm_unreachable("Binary type trait not covered by switch"); 145064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 145164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 145221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleystatic const char *getTypeTraitName(ArrayTypeTrait ATT) { 145321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley switch (ATT) { 145421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case ATT_ArrayRank: return "__array_rank"; 145521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley case ATT_ArrayExtent: return "__array_extent"; 145621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley } 1457a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth llvm_unreachable("Array type trait not covered by switch"); 145821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley} 145921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 1460552622067dc45013d240f73952fece703f5e63bdJohn Wiegleystatic const char *getExpressionTraitName(ExpressionTrait ET) { 1461552622067dc45013d240f73952fece703f5e63bdJohn Wiegley switch (ET) { 1462552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case ET_IsLValueExpr: return "__is_lvalue_expr"; 1463552622067dc45013d240f73952fece703f5e63bdJohn Wiegley case ET_IsRValueExpr: return "__is_rvalue_expr"; 1464552622067dc45013d240f73952fece703f5e63bdJohn Wiegley } 1465a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth llvm_unreachable("Expression type trait not covered by switch"); 1466552622067dc45013d240f73952fece703f5e63bdJohn Wiegley} 1467552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 146864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlvoid StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 146964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl OS << getTypeTraitName(E->getTrait()) << "(" 14706cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar << E->getQueriedType().getAsString(Policy) << ")"; 147164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 147264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 14736ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichetvoid StmtPrinter::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 14746ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet OS << getTypeTraitName(E->getTrait()) << "(" 14756ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet << E->getLhsType().getAsString(Policy) << "," 14766ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet << E->getRhsType().getAsString(Policy) << ")"; 14776ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet} 14786ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet 147921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyvoid StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 148021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley OS << getTypeTraitName(E->getTrait()) << "(" 148121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley << E->getQueriedType().getAsString(Policy) << ")"; 148221ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley} 148321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley 1484552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyvoid StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) { 1485552622067dc45013d240f73952fece703f5e63bdJohn Wiegley OS << getExpressionTraitName(E->getTrait()) << "("; 1486552622067dc45013d240f73952fece703f5e63bdJohn Wiegley PrintExpr(E->getQueriedExpression()); 1487552622067dc45013d240f73952fece703f5e63bdJohn Wiegley OS << ")"; 1488552622067dc45013d240f73952fece703f5e63bdJohn Wiegley} 1489552622067dc45013d240f73952fece703f5e63bdJohn Wiegley 14902e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlvoid StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) { 14912e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl OS << "noexcept("; 14922e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl PrintExpr(E->getOperand()); 14932e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl OS << ")"; 14942e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl} 14952e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl 1496ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) { 1497be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor PrintExpr(E->getPattern()); 1498be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor OS << "..."; 1499be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor} 1500be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor 1501ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) { 1502ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor OS << "sizeof...(" << E->getPack()->getNameAsString() << ")"; 1503ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor} 1504ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor 1505c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr( 1506c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor SubstNonTypeTemplateParmPackExpr *Node) { 1507c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor OS << Node->getParameterPack()->getNameAsString(); 1508c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor} 1509c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor 151091a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallvoid StmtPrinter::VisitSubstNonTypeTemplateParmExpr( 151191a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall SubstNonTypeTemplateParmExpr *Node) { 151291a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall Visit(Node->getReplacement()); 151391a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall} 151491a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall 151503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){ 151603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor PrintExpr(Node->GetTemporaryExpr()); 151703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor} 151803e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor 15191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// Obj-C 15205508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 15215508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { 15225508518a2702b00be3b15a26d772bde968972f54Anders Carlsson OS << "@"; 15235508518a2702b00be3b15a26d772bde968972f54Anders Carlsson VisitStringLiteral(Node->getString()); 15245508518a2702b00be3b15a26d772bde968972f54Anders Carlsson} 15255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1526f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 15276cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar OS << "@encode(" << Node->getEncodedType().getAsString(Policy) << ')'; 1528f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 1529f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 1530b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 153139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << "@selector(" << Node->getSelector().getAsString() << ')'; 1532b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1533b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 1534390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 1535b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << "@protocol(" << *Node->getProtocol() << ')'; 1536390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 1537390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 1538563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { 1539563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "["; 154004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor switch (Mess->getReceiverKind()) { 154104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Instance: 154204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor PrintExpr(Mess->getInstanceReceiver()); 154304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 154404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 154504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::Class: 154604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << Mess->getClassReceiver().getAsString(Policy); 154704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 154804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 154904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperInstance: 155004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor case ObjCMessageExpr::SuperClass: 155104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor OS << "Super"; 155204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor break; 155304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor } 155404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor 1555c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ' '; 155697b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek Selector selector = Mess->getSelector(); 15576a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff if (selector.isUnarySelector()) { 1558813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor OS << selector.getNameForSlot(0); 15596a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } else { 15606a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) { 1561c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i < selector.getNumArgs()) { 1562c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i > 0) OS << ' '; 1563c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (selector.getIdentifierInfoForSlot(i)) 156439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << selector.getIdentifierInfoForSlot(i)->getName() << ':'; 1565c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else 1566c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ":"; 1567c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek } 1568c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else OS << ", "; // Handle variadic methods. 15691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15706a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff PrintExpr(Mess->getArg(i)); 15716a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } 1572563477da25f824e37c535131695dc4dc9b68c465Steve Naroff } 1573563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "]"; 1574563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 1575563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 1576f85e193739c953358c865005855253af4f68a497John McCallvoid 1577f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 1578f85e193739c953358c865005855253af4f68a497John McCall PrintExpr(E->getSubExpr()); 1579f85e193739c953358c865005855253af4f68a497John McCall} 1580f85e193739c953358c865005855253af4f68a497John McCall 1581f85e193739c953358c865005855253af4f68a497John McCallvoid 1582f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 1583f85e193739c953358c865005855253af4f68a497John McCall OS << "(" << E->getBridgeKindName() << E->getType().getAsString(Policy) 1584f85e193739c953358c865005855253af4f68a497John McCall << ")"; 1585f85e193739c953358c865005855253af4f68a497John McCall PrintExpr(E->getSubExpr()); 1586f85e193739c953358c865005855253af4f68a497John McCall} 1587cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 15884eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) { 158956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *BD = Node->getBlockDecl(); 15904eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "^"; 15911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15924eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff const FunctionType *AFT = Node->getFunctionType(); 15931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 159472564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(AFT)) { 15954eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "()"; 159672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) { 15974eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << '('; 15984eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff std::string ParamStr; 159956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (BlockDecl::param_iterator AI = BD->param_begin(), 160056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff E = BD->param_end(); AI != E; ++AI) { 160156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (AI != BD->param_begin()) OS << ", "; 160239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner ParamStr = (*AI)->getNameAsString(); 1603d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor (*AI)->getType().getAsStringInternal(ParamStr, Policy); 16044eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ParamStr; 16054eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 16061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 160772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *FT = cast<FunctionProtoType>(AFT); 16084eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff if (FT->isVariadic()) { 160956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (!BD->param_empty()) OS << ", "; 16104eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "..."; 16114eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 16124eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ')'; 16134eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 16144eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 16154eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 16164eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) { 1617b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer OS << *Node->getDecl(); 16184eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 16197cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 1620381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenekvoid StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) { 1621381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek PrintExpr(Node->getSourceExpr()); 1622381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek} 16237cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall 162461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnervoid StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) { 162561eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner OS << "__builtin_astype("; 162661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner PrintExpr(Node->getSrcExpr()); 162761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner OS << ", " << Node->getType().getAsString(); 162861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner OS << ")"; 162961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner} 163061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner 16315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 16325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations 16335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 16345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 163548d14a222276fad5279e994d1a062f36ae6fcbceEli Friedmanvoid Stmt::dumpPretty(ASTContext& Context) const { 16369668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis printPretty(llvm::errs(), Context, 0, 1637e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner PrintingPolicy(Context.getLangOptions())); 16385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 16395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 16405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Stmt::printPretty(raw_ostream &OS, ASTContext& Context, 164148d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman PrinterHelper* Helper, 1642d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor const PrintingPolicy &Policy, 1643d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation) const { 16445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (this == 0) { 16455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<NULL>"; 16465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return; 16475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 16485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1649bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor if (Policy.Dump && &Context) { 16509668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis dump(OS, Context.getSourceManager()); 16514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor return; 16524fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor } 16531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 165448d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman StmtPrinter P(OS, Context, Helper, Policy, Indentation); 1655c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner P.Visit(const_cast<Stmt*>(this)); 16565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 165742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 165842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 165942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper 166042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 166142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 166242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor. 16638467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {} 1664