StmtPrinter.cpp revision d249e1d1f1498b81314459ceda19d6ff25c278ad
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" 1842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#include "clang/AST/PrettyPrinter.h" 195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "llvm/Support/Compiler.h" 2051221ec87faa0365c9fc8c8ad7b7f2d3ee36c8efTed Kremenek#include "llvm/Support/Streams.h" 21a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek#include "llvm/Support/Format.h" 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor 265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace { 29c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner class VISIBILITY_HIDDEN StmtPrinter : public StmtVisitor<StmtPrinter> { 30a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek llvm::raw_ostream &OS; 315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned IndentLevel; 3242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek clang::PrinterHelper* Helper; 33d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintingPolicy Policy; 34d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer public: 36d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor StmtPrinter(llvm::raw_ostream &os, PrinterHelper* helper, 37d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor const PrintingPolicy &Policy = PrintingPolicy(), 38d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation = 0) 39d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy) {} 405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 41d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S) { 42d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor PrintStmt(S, Policy.Indentation); 43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor } 44d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor 45d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor void PrintStmt(Stmt *S, int SubIndent) { 465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel += SubIndent; 475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (S && isa<Expr>(S)) { 485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // If this is an expr used in a stmt context, indent and newline it. 495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 50c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (S) { 53c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(S); 545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "<<<NULL STATEMENT>>>\n"; 565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer IndentLevel -= SubIndent; 585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawCompoundStmt(CompoundStmt *S); 615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawDecl(Decl *D); 62ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek void PrintRawDeclStmt(DeclStmt *S); 63071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump void PrintFieldDecl(FieldDecl *FD); 645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintRawIfStmt(IfStmt *If); 658351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl void PrintRawCXXCatchStmt(CXXCatchStmt *Catch); 665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer void PrintExpr(Expr *E) { 685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (E) 69c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner Visit(E); 705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<null expr>"; 725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 74071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump llvm::raw_ostream &Indent(int Delta = 0) { 75d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor for (int i = 0, e = IndentLevel+Delta; i < e; ++i) 76d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor OS << " "; 775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return OS; 785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 80704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner bool PrintOffsetOfDesignator(Expr *E); 81704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner void VisitUnaryOffsetOf(UnaryOperator *Node); 82704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 8342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek void Visit(Stmt* S) { 8442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek if (Helper && Helper->handledStmt(S,OS)) 8542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek return; 8642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek else StmtVisitor<StmtPrinter>::Visit(S); 8742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek } 8842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 89c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void VisitStmt(Stmt *Node); 90f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \ 91c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner void Visit##CLASS(CLASS *Node); 925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtNodes.def" 935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer }; 945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt printing methods. 985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStmt(Stmt *Node) { 1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "<<unknown stmt type>>\n"; 1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and 1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }. 1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) { 1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "{\n"; 1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end(); 1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer I != E; ++I) 1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(*I); 1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "}"; 1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) { 1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: Need to complete/beautify this... this code simply shows the 1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // nodes are where they need to be. 1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) { 1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "typedef " << localType->getUnderlyingType().getAsString(); 12039f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << " " << localType->getNameAsString(); 1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) { 1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit storage class for vardecls. 1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 1245466c7b0ca8ce662e2c0bc295cecba2b78d6957dDaniel Dunbar if (V->getStorageClass() != VarDecl::None) 1255466c7b0ca8ce662e2c0bc295cecba2b78d6957dDaniel Dunbar OS << VarDecl::getStorageClassSpecifierString(V->getStorageClass()) 1265466c7b0ca8ce662e2c0bc295cecba2b78d6957dDaniel Dunbar << ' '; 1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12939f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner std::string Name = VD->getNameAsString(); 130d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor VD->getType().getAsStringInternal(Name, Policy); 1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << Name; 1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 13324c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner // If this is a vardecl with an initializer, emit it. 13424c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner if (VarDecl *V = dyn_cast<VarDecl>(VD)) { 13524c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner if (V->getInit()) { 13624c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner OS << " = "; 13724c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner PrintExpr(V->getInit()); 13824c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner } 13924c3990cd2469f9692c4b0c3edea4fba67baaf6eChris Lattner } 14091578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 14191578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff // print a free standing tag decl (e.g. "struct x;"). 14291578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff OS << TD->getKindName(); 14391578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff OS << " "; 14491578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff if (const IdentifierInfo *II = TD->getIdentifier()) 14591578f3cdbabdb31ba6c5ea46441c4339d911b62Steve Naroff OS << II->getName(); 146071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump if (RecordDecl *RD = dyn_cast<RecordDecl>(TD)) { 147071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump OS << "{\n"; 148071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump IndentLevel += 1; 1496ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor // FIXME: The context passed to field_begin/field_end should 1506ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor // never be NULL! 1516ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor ASTContext *Context = 0; 1526ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor for (RecordDecl::field_iterator i = RD->field_begin(*Context); 1536ab3524f72a6e64aa04973fa9433b5559abb3525Douglas Gregor i != RD->field_end(*Context); ++i) { 154071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump PrintFieldDecl(*i); 155071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump IndentLevel -= 1; 156071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump } 157071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump } 1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer assert(0 && "Unexpected decl"); 1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 163071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stumpvoid StmtPrinter::PrintFieldDecl(FieldDecl *FD) { 164071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump Indent() << FD->getNameAsString() << "\n"; 165071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump} 166071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump 167ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenekvoid StmtPrinter::PrintRawDeclStmt(DeclStmt *S) { 168071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump bool isFirst = true; 169ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek 170ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek for (DeclStmt::decl_iterator I = S->decl_begin(), E = S->decl_end(); 171ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek I != E; ++I) { 172ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek 173ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek if (!isFirst) OS << ", "; 174ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek else isFirst = false; 175ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek 176ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDecl(*I); 177ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek } 178ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek} 1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) { 1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << ";\n"; 1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) { 185ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek for (DeclStmt::decl_iterator I = Node->decl_begin(), E = Node->decl_end(); 186ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek I!=E; ++I) { 1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 188ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDecl(*I); 1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) { 1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(Node); 1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) { 2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "case "; 2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRHS()) { 2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " ... "; 2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ":\n"; 2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) { 2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << "default:\n"; 2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) { 2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(-1) << Node->getName() << ":\n"; 2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getSubStmt(), 0); 2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) { 222bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << "if ("; 2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(If->getCond()); 224bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl OS << ')'; 2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) { 2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (If->getElse() ? ' ' : '\n'); 2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getThen()); 2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (If->getElse()) Indent(); 2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Stmt *Else = If->getElse()) { 2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "else"; 2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) { 2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) { 2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ' '; 2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(ElseIf); 2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '\n'; 2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(If->getElse()); 2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) { 2545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent(); 2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawIfStmt(If); 2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) { 2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "switch ("; 2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Pretty print compoundstmt bodies (very common). 2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintRawCompoundStmt(CS); 2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else { 2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "\n"; 2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 274c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonvoid StmtPrinter::VisitSwitchCase(SwitchCase*) { 275c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson assert(0 && "SwitchCase is an abstract class"); 276c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson} 277c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson 2785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) { 2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "while ("; 2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")\n"; 2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintStmt(Node->getBody()); 2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) { 2868bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent() << "do "; 2878bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 2888bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 2898bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 2908bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 2918bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 2928bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 2938bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner Indent(); 2948bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 2958bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner 296b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << "while ("; 2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 298b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman OS << ");\n"; 2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) { 3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "for ("; 3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getInit()) { 3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit())) 305ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else 3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(cast<Expr>(Node->getInit())); 3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3098bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 3108bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getCond()) { 3118bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 3138bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 3148bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ";"; 3158bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (Node->getInc()) { 3168bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << " "; 3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getInc()); 3188bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 3198bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << ") "; 3208bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner 3218bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 3228bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintRawCompoundStmt(CS); 3238bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 3248bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } else { 3258bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner OS << "\n"; 3268bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner PrintStmt(Node->getBody()); 3278bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner } 3285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 330a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) { 3310196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian Indent() << "for ("; 3320196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement())) 333ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek PrintRawDeclStmt(DS); 3340196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian else 3350196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(cast<Expr>(Node->getElement())); 3360196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << " in "; 3370196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintExpr(Node->getCollection()); 3380196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << ") "; 3390196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian 3400196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) { 3410196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintRawCompoundStmt(CS); 3420196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 3430196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } else { 3440196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian OS << "\n"; 3450196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian PrintStmt(Node->getBody()); 3460196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian } 3470196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian} 3480196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian 3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) { 3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto " << Node->getLabel()->getName() << ";\n"; 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) { 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "goto *"; 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getTarget()); 3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) { 3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "continue;\n"; 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) { 3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "break;\n"; 3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) { 3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Indent() << "return"; 3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->getRetValue()) { 3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " "; 3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRetValue()); 3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ";\n"; 3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 377fe795956194141c91ae555985c9b930595bff43fChris Lattner 378fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) { 37939c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson Indent() << "asm "; 38039c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson 38139c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson if (Node->isVolatile()) 38239c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "volatile "; 38339c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson 38439c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson OS << "("; 3856a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson VisitStringLiteral(Node->getAsmString()); 386b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 387b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Outputs 388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 || 389b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Node->getNumClobbers() != 0) 390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 391b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 392b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) { 393b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 395b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 396b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getOutputName(i).empty()) { 397b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 398b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getOutputName(i); 399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 400b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 401b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 402b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getOutputConstraintLiteral(i)); 403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 404b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getOutputExpr(i)); 405b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 406b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 407b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Inputs 408b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0) 409b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 410b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 411b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) { 412b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 413b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 414b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 415b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (!Node->getInputName(i).empty()) { 416b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << '['; 417b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << Node->getInputName(i); 418b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << "] "; 419b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 420b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 421b327793860737d1c103a73aeda8057dd628a101dChris Lattner VisitStringLiteral(Node->getInputConstraintLiteral(i)); 422b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " "; 423b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson Visit(Node->getInputExpr(i)); 424b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 425b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 426b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson // Clobbers 427b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (Node->getNumClobbers() != 0) 428b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << " : "; 429b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 430b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) { 431b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson if (i != 0) 432b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson OS << ", "; 433b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 434b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson VisitStringLiteral(Node->getClobber(i)); 435b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson } 436b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson 4376a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson OS << ");\n"; 438fe795956194141c91ae555985c9b930595bff43fChris Lattner} 439fe795956194141c91ae555985c9b930595bff43fChris Lattner 440a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) { 4417794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@try"; 4427794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) { 4437794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian PrintRawCompoundStmt(TS); 4447794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4457794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4467794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian 447a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek for (ObjCAtCatchStmt *catchStmt = 448a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static_cast<ObjCAtCatchStmt *>(Node->getCatchStmts()); 4497794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian catchStmt; 4507794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian catchStmt = 451a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek static_cast<ObjCAtCatchStmt *>(catchStmt->getNextCatchStmt())) { 4527794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian Indent() << "@catch("; 4537ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (catchStmt->getCatchParamDecl()) { 4547ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff if (Decl *DS = catchStmt->getCatchParamDecl()) 4557ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff PrintRawDecl(DS); 4567794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4577794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << ")"; 4587794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) 4597794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian { 4607794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian PrintRawCompoundStmt(CS); 4617794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4627794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4637794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 4647794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian 465a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek if (ObjCAtFinallyStmt *FS =static_cast<ObjCAtFinallyStmt *>( 4661e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian Node->getFinallyStmt())) { 4671e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian Indent() << "@finally"; 4681e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody())); 4697794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian OS << "\n"; 4707794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian } 471b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 472b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 473a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) { 474b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 475b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 476a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) { 477b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian Indent() << "@catch (...) { /* todo */ } \n"; 478b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian} 479b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian 48078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) { 48139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian Indent() << "@throw"; 48239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian if (Node->getThrowExpr()) { 48339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << " "; 48439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian PrintExpr(Node->getThrowExpr()); 48539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian } 48639f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian OS << ";\n"; 48739f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian} 48839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian 48978a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) { 490c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian Indent() << "@synchronized ("; 491c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian PrintExpr(Node->getSynchExpr()); 492c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian OS << ")"; 49378a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian PrintRawCompoundStmt(Node->getSynchBody()); 49478a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian OS << "\n"; 495c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian} 496c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian 4978351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) { 4988351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "catch ("; 4994b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl if (Decl *ExDecl = Node->getExceptionDecl()) 5004b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawDecl(ExDecl); 5014b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl else 5024b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "..."; 5034b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << ") "; 5044b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock())); 5058351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 5068351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 5078351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) { 5088351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent(); 5098351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node); 5108351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << "\n"; 5118351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl} 5128351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl 5138351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) { 5148351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl Indent() << "try "; 5158351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCompoundStmt(Node->getTryBlock()); 5168351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl for(unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) { 5178351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl OS << " "; 5188351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl PrintRawCXXCatchStmt(Node->getHandler(i)); 5198351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl } 5204b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl OS << "\n"; 5214b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl} 5224b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl 5235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Expr printing methods. 5255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 5265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitExpr(Expr *Node) { 5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<<unknown expr type>>"; 5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) { 53239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << Node->getDecl()->getNameAsString(); 5335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 535bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregorvoid StmtPrinter::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *Node) { 5361a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor NamedDecl *D = Node->getDecl(); 5371a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor 538d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Node->getQualifier()->print(OS, Policy); 5391a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor OS << D->getNameAsString(); 5401a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor} 5411a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor 5425953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregorvoid StmtPrinter::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *Node) { 543d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Node->getQualifier()->print(OS, Policy); 5445953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor OS << Node->getDeclName().getAsString(); 5455953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor} 5465953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor 5477779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) { 548232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian if (Node->getBase()) { 549232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian PrintExpr(Node->getBase()); 550232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian OS << (Node->isArrow() ? "->" : "."); 551232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian } 55239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << Node->getDecl()->getNameAsString(); 5537779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff} 5547779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff 555ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) { 556ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff if (Node->getBase()) { 557ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff PrintExpr(Node->getBase()); 558ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff OS << "."; 559ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff } 560c77a636688e188af7e7a9a05829e542adb48e880Steve Naroff OS << Node->getProperty()->getNameAsCString(); 561ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff} 562ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff 5635daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanianvoid StmtPrinter::VisitObjCKVCRefExpr(ObjCKVCRefExpr *Node) { 5645daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian if (Node->getBase()) { 5655daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian PrintExpr(Node->getBase()); 5665daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian OS << "."; 5675daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian } 5685daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian // FIXME: Setter/Getter names 5695daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian} 5705daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian 571d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) { 572227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson switch (Node->getIdentType()) { 573227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson default: 574227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson assert(0 && "unknown case"); 575d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Func: 576227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__func__"; 577227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 578d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::Function: 579227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__FUNCTION__"; 580227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 581d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner case PredefinedExpr::PrettyFunction: 582227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson OS << "__PRETTY_FUNCTION__"; 583227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson break; 584227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson } 585227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson} 586227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson 5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) { 588b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner unsigned value = Node->getValue(); 589c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner if (Node->isWide()) 590c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner OS << "L"; 5918bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner switch (value) { 5928bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\\': 5938bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\\\'"; 5948bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5958bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\'': 5968bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\''"; 5978bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 5988bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\a': 5998bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // TODO: K&R: the meaning of '\\a' is different in traditional C 6008bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\a'"; 6018bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6028bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\b': 6038bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\b'"; 6048bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6058bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // Nonstandard escape sequence. 6068bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner /*case '\e': 6078bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\e'"; 6088bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break;*/ 6098bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\f': 6108bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\f'"; 6118bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6128bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\n': 6138bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\n'"; 6148bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6158bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\r': 6168bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\r'"; 6178bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6188bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\t': 6198bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\t'"; 6208bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6218bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner case '\v': 6228bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'\\v'"; 6238bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner break; 6248bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner default: 625471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek if (value < 256 && isprint(value)) { 6268bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << "'" << (char)value << "'"; 6278bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } else if (value < 256) { 628a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek OS << "'\\x" << llvm::format("%x", value) << "'"; 6298bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } else { 6308bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner // FIXME what to really do here? 6318bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner OS << value; 6328bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner } 633b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner } 6345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { 6375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer bool isSigned = Node->getType()->isSignedIntegerType(); 6385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << Node->getValue().toString(10, isSigned); 6395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 6405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Emit suffixes. Integer literals are always a builtin integer type. 641b77792eabf5882cf9af8cc810599b20432fda6c2Chris Lattner switch (Node->getType()->getAsBuiltinType()->getKind()) { 6425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer default: assert(0 && "Unexpected type for integer literal!"); 6435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Int: break; // no suffix. 6445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::UInt: OS << 'U'; break; 6455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::Long: OS << 'L'; break; 6465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULong: OS << "UL"; break; 6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::LongLong: OS << "LL"; break; 6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case BuiltinType::ULongLong: OS << "ULL"; break; 6495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { 65286e499d9525ab4f2258724c4ca2826acd6b13a8eChris Lattner // FIXME: print value more precisely. 653da8249e57f3badecf925571881fe57243935c6c1Chris Lattner OS << Node->getValueAsApproximateDouble(); 6545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6555d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 6565d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) { 6575d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner PrintExpr(Node->getSubExpr()); 6585d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner OS << "i"; 6595d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner} 6605d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner 6615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) { 6625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Str->isWide()) OS << 'L'; 6635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '"'; 664ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson 6655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // FIXME: this doesn't print wstrings right. 6665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) { 6679a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner unsigned char Char = Str->getStrData()[i]; 6689a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner 6699a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner switch (Char) { 6709a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner default: 6719a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner if (isprint(Char)) 6729a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner OS << (char)Char; 6739a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner else // Output anything hard as an octal escape. 6749a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner OS << '\\' 6759a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 6) & 7)) 6769a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 3) & 7)) 6779a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner << (char)('0'+ ((Char >> 0) & 7)); 6789a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner break; 6799a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner // Handle some common non-printable cases to make dumps prettier. 6805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\\': OS << "\\\\"; break; 6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '"': OS << "\\\""; break; 6825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\n': OS << "\\n"; break; 6835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\t': OS << "\\t"; break; 6845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\a': OS << "\\a"; break; 6855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case '\b': OS << "\\b"; break; 6865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << '"'; 6895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) { 6915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "("; 6925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 6935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 6945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 6955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) { 696296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner if (!Node->isPostfix()) { 6975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 698296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner 6990518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl // Print a space if this is an "identifier operator" like __real. 700296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner switch (Node->getOpcode()) { 701296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner default: break; 702296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner case UnaryOperator::Real: 703296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner case UnaryOperator::Imag: 704296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner case UnaryOperator::Extension: 705296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner OS << ' '; 706296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner break; 707296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 708296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner } 7095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 7105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 7115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (Node->isPostfix()) 7125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << UnaryOperator::getOpcodeStr(Node->getOpcode()); 713704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner} 714704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 715704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnerbool StmtPrinter::PrintOffsetOfDesignator(Expr *E) { 71635183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman if (isa<UnaryOperator>(E)) { 717704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner // Base case, print the type and comma. 718704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << E->getType().getAsString() << ", "; 719704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner return true; 720704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner } else if (ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) { 721704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner PrintOffsetOfDesignator(ASE->getLHS()); 722704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << "["; 723704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner PrintExpr(ASE->getRHS()); 724704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << "]"; 725704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner return false; 726704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner } else { 727704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner MemberExpr *ME = cast<MemberExpr>(E); 728704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner bool IsFirst = PrintOffsetOfDesignator(ME->getBase()); 72939f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << (IsFirst ? "" : ".") << ME->getMemberDecl()->getNameAsString(); 730704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner return false; 731704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner } 732704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner} 7335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 734704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnervoid StmtPrinter::VisitUnaryOffsetOf(UnaryOperator *Node) { 735704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << "__builtin_offsetof("; 736704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner PrintOffsetOfDesignator(Node->getSubExpr()); 737704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner OS << ")"; 7385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 739704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner 7400518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtPrinter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) { 7410518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << (Node->isSizeOf() ? "sizeof" : "__alignof"); 7420518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl if (Node->isArgumentType()) 7430518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << "(" << Node->getArgumentType().getAsString() << ")"; 7440518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl else { 7450518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl OS << " "; 7460518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl PrintExpr(Node->getArgumentExpr()); 7470518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl } 7485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) { 7502324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getLHS()); 7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "["; 7522324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek PrintExpr(Node->getRHS()); 7535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "]"; 7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCallExpr(CallExpr *Call) { 7575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Call->getCallee()); 7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "("; 7595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) { 76004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner if (isa<CXXDefaultArgExpr>(Call->getArg(i))) { 76104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Don't print any defaulted arguments 76204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner break; 76304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner } 76404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 7655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (i) OS << ", "; 7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Call->getArg(i)); 7675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 7685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 7695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) { 771b3eef68111ffc220e449be96da1747998c057790Douglas Gregor // FIXME: Suppress printing implicit bases (like "this") 772b3eef68111ffc220e449be96da1747998c057790Douglas Gregor PrintExpr(Node->getBase()); 773b3eef68111ffc220e449be96da1747998c057790Douglas Gregor OS << (Node->isArrow() ? "->" : "."); 774b3eef68111ffc220e449be96da1747998c057790Douglas Gregor // FIXME: Suppress printing references to unnamed objects 775b3eef68111ffc220e449be96da1747998c057790Douglas Gregor // representing anonymous unions/structs 77686f194083504938df72135b5b66bf0c5cafd9498Douglas Gregor OS << Node->getMemberDecl()->getNameAsString(); 7775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 778213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) { 77931a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff PrintExpr(Node->getBase()); 78031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << "."; 78131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff OS << Node->getAccessor().getName(); 78231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff} 7830835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisvoid StmtPrinter::VisitCastExpr(CastExpr *) { 7840835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis assert(0 && "CastExpr is an abstract class"); 7850835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis} 78649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitExplicitCastExpr(ExplicitCastExpr *) { 78749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor assert(0 && "ExplicitCastExpr is an abstract class"); 78849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 7896eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) { 79026dc7b39267b7d29b35a7887a5b8e54697192192Chris Lattner OS << "(" << Node->getType().getAsString() << ")"; 7915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 7925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 793aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) { 794aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff OS << "(" << Node->getType().getAsString() << ")"; 795aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff PrintExpr(Node->getInitializer()); 796aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff} 79749b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) { 79890045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff // No need to print anything, simply forward to the sub expression. 79990045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff PrintExpr(Node->getSubExpr()); 80049b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff} 8015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) { 8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getLHS()); 8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 804eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getRHS()); 805eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner} 806eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) { 807eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner PrintExpr(Node->getLHS()); 808eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " "; 8095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 8105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) { 8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getCond()); 8138e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek 8148e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek if (Node->getLHS()) { 8158e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek OS << " ? "; 8168e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek PrintExpr(Node->getLHS()); 8178e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek OS << " : "; 8188e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek } 8198e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek else { // Handle GCC extention where LHS can be NULL. 8208e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek OS << " ?: "; 8218e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek } 8228e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek 8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getRHS()); 8245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions. 8275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8286481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) { 8295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "&&" << Node->getLabel()->getName(); 8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 832ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) { 833ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << "("; 834ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner PrintRawCompoundStmt(E->getSubStmt()); 835ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner OS << ")"; 836ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner} 837ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 838d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroffvoid StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) { 839d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff OS << "__builtin_types_compatible_p("; 840d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff OS << Node->getArgType1().getAsString() << ","; 841d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff OS << Node->getArgType2().getAsString() << ")"; 842d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff} 843d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff 844d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) { 845d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << "__builtin_choose_expr("; 846d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getCond()); 84794f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 848d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getLHS()); 84994f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner OS << ", "; 850d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff PrintExpr(Node->getRHS()); 851d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff OS << ")"; 852d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff} 853ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner 8542d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) { 8552d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor OS << "__null"; 8562d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor} 8572d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor 858d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) { 859d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << "__builtin_shufflevector("; 860d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) { 861d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman if (i) OS << ", "; 862d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman PrintExpr(Node->getExpr(i)); 863d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman } 864d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman OS << ")"; 865e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman} 866e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman 86766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) { 86866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << "{ "; 86966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) { 87066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson if (i) OS << ", "; 8714c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (Node->getInit(i)) 8724c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit(i)); 8734c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 8744c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "0"; 87566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson } 87666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson OS << " }"; 87766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson} 87866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson 87905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) { 8804c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(), 8814c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor DEnd = Node->designators_end(); 8824c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor D != DEnd; ++D) { 8834c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isFieldDesignator()) { 8844c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->getDotLoc().isInvalid()) 8854c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << D->getFieldName()->getName() << ":"; 8864c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor else 8874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "." << D->getFieldName()->getName(); 8884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 8894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "["; 8904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor if (D->isArrayDesignator()) { 8914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayIndex(*D)); 8924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } else { 8934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayRangeStart(*D)); 8944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " ... "; 8954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getArrayRangeEnd(*D)); 8964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 8974c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << "]"; 8984c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 8994c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor } 9004c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor 9014c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor OS << " = "; 9024c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor PrintExpr(Node->getInit()); 90305c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor} 90405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor 9053498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) { 9063498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor OS << "/*implicit*/" << Node->getType().getAsString() << "()"; 9073498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor} 9083498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor 9097c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) { 9107c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << "va_arg("; 9117c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson PrintExpr(Node->getSubExpr()); 9127c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ", "; 9137c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << Node->getType().getAsString(); 9147c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson OS << ")"; 9157c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson} 9167c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson 9175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++ 918b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) { 919b4609806e9232593ece09ce08b630836e825865cDouglas Gregor const char *OpStrings[NUM_OVERLOADED_OPERATORS] = { 920b4609806e9232593ece09ce08b630836e825865cDouglas Gregor "", 921b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 922b4609806e9232593ece09ce08b630836e825865cDouglas Gregor Spelling, 923b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def" 924b4609806e9232593ece09ce08b630836e825865cDouglas Gregor }; 925b4609806e9232593ece09ce08b630836e825865cDouglas Gregor 926b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OverloadedOperatorKind Kind = Node->getOperator(); 927b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) { 928b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (Node->getNumArgs() == 1) { 929b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 930b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 931b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 932b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 933b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind]; 934b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 935b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Call) { 936b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 937b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '('; 938b4609806e9232593ece09ce08b630836e825865cDouglas Gregor for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) { 939b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (ArgIdx > 1) 940b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ", "; 941b4609806e9232593ece09ce08b630836e825865cDouglas Gregor if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx))) 942b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(ArgIdx)); 943b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 944b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ')'; 945b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Kind == OO_Subscript) { 946b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 947b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << '['; 948b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 949b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ']'; 950b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 1) { 951b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << OpStrings[Kind] << ' '; 952b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 953b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else if (Node->getNumArgs() == 2) { 954b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(0)); 955b4609806e9232593ece09ce08b630836e825865cDouglas Gregor OS << ' ' << OpStrings[Kind] << ' '; 956b4609806e9232593ece09ce08b630836e825865cDouglas Gregor PrintExpr(Node->getArg(1)); 957b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } else { 958b4609806e9232593ece09ce08b630836e825865cDouglas Gregor assert(false && "unknown overloaded operator"); 959b4609806e9232593ece09ce08b630836e825865cDouglas Gregor } 960b4609806e9232593ece09ce08b630836e825865cDouglas Gregor} 9615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 96288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) { 96388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor VisitCallExpr(cast<CallExpr>(Node)); 96488a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor} 96588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor 96649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) { 96749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor OS << Node->getCastName() << '<'; 96849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor OS << Node->getTypeAsWritten().getAsString() << ">("; 9695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer PrintExpr(Node->getSubExpr()); 9705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << ")"; 9715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 9725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 97349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) { 97449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 97549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 97649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 97749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) { 97849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 97949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 98049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 98149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) { 98249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 98349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 98449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 98549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) { 98649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor VisitCXXNamedCastExpr(Node); 98749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor} 98849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor 989c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) { 990c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << "typeid("; 991c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl if (Node->isTypeOperand()) { 992c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << Node->getTypeOperand().getAsString(); 993c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } else { 994c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl PrintExpr(Node->getExprOperand()); 995c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl } 996c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl OS << ")"; 997c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl} 998c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl 9995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) { 10005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << (Node->getValue() ? "true" : "false"); 10015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 10025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 10036e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) { 10046e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl OS << "nullptr"; 10056e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl} 10066e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl 1007796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) { 1008796da18402f286b897782a298ae3b20c459c102eDouglas Gregor OS << "this"; 1009796da18402f286b897782a298ae3b20c459c102eDouglas Gregor} 1010796da18402f286b897782a298ae3b20c459c102eDouglas Gregor 101150dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) { 101250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner if (Node->getSubExpr() == 0) 101350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw"; 101450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner else { 101550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner OS << "throw "; 101650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner PrintExpr(Node->getSubExpr()); 101750dd289f45738ed22b7583d52ed2525b927042ffChris Lattner } 101850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner} 101950dd289f45738ed22b7583d52ed2525b927042ffChris Lattner 102004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) { 102104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner // Nothing to print: we picked up the default argument 102204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner} 102304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner 1024987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) { 1025987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << Node->getType().getAsString(); 1026987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << "("; 1027987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis PrintExpr(Node->getSubExpr()); 1028987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << ")"; 1029987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1030987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 1031506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) { 1032506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << Node->getType().getAsString(); 1033506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << "("; 1034506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(), 1035506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor ArgEnd = Node->arg_end(); 1036506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor Arg != ArgEnd; ++Arg) { 1037506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor if (Arg != Node->arg_begin()) 1038506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ", "; 1039506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor PrintExpr(*Arg); 1040506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor } 1041506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor OS << ")"; 1042506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor} 1043506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor 1044987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *Node) { 1045987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis OS << Node->getType().getAsString() << "()"; 1046987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis} 1047987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis 10489e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidisvoid 10499e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios KyrtzidisStmtPrinter::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 10509e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis PrintRawDecl(E->getVarDecl()); 10519e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis} 10529e922b1663ecb95dc7eee03002fd66ed18fb3192Argyrios Kyrtzidis 10534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) { 10544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalNew()) 10554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 10564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "new "; 10574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumPlace = E->getNumPlacementArgs(); 10584c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (NumPlace > 0) { 10594c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 10604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(0)); 10614c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumPlace; ++i) { 10624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 10634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getPlacementArg(i)); 10644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 10654c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ") "; 10664c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 10674c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 10684c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 10696fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl std::string TypeS; 10706fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl if (Expr *Size = E->getArraySize()) { 10716fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl llvm::raw_string_ostream s(TypeS); 1072d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor Size->printPretty(s, Helper, Policy); 10736fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl s.flush(); 10746fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl TypeS = "[" + TypeS + "]"; 10756fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl } 1076d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor E->getAllocatedType().getAsStringInternal(TypeS, Policy); 10776fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl OS << TypeS; 10784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isParenTypeId()) 10794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 10804c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 10814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->hasInitializer()) { 10824c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "("; 10834c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl unsigned NumCons = E->getNumConstructorArgs(); 10844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (NumCons > 0) { 10854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getConstructorArg(0)); 10864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl for (unsigned i = 1; i < NumCons; ++i) { 10874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ", "; 10884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getConstructorArg(i)); 10894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 10904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 10914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << ")"; 10924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl } 10934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 10944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 10954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) { 10964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isGlobalDelete()) 10974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "::"; 10984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "delete "; 10994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl if (E->isArrayForm()) 11004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl OS << "[] "; 11014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl PrintExpr(E->getArgument()); 11024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl} 11034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl 110417330019f05966762bc952840ef1926b9becb145Douglas Gregorvoid StmtPrinter::VisitUnresolvedFunctionNameExpr(UnresolvedFunctionNameExpr *E) { 110517330019f05966762bc952840ef1926b9becb145Douglas Gregor OS << E->getName().getAsString(); 11065c37de788529cd9180f22069970737a7208bd625Douglas Gregor} 11075c37de788529cd9180f22069970737a7208bd625Douglas Gregor 1108e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) { 1109e349bea668622ef31bd51a229960a73d69940709Anders Carlsson // Nothing to print. 1110e349bea668622ef31bd51a229960a73d69940709Anders Carlsson} 1111e349bea668622ef31bd51a229960a73d69940709Anders Carlsson 11122d44e8a41de8a33c0f04ac198714f71dc841bab0Anders Carlssonvoid StmtPrinter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) { 111302bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson // Just forward to the sub expression. 111402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson PrintExpr(E->getSubExpr()); 111502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson} 111602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson 1117d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregorvoid 1118d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr( 1119d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor CXXUnresolvedConstructExpr *Node) { 1120d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << Node->getTypeAsWritten().getAsString(); 1121d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << "("; 1122d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(), 1123d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor ArgEnd = Node->arg_end(); 1124d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor Arg != ArgEnd; ++Arg) { 1125d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor if (Arg != Node->arg_begin()) 1126d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ", "; 1127d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor PrintExpr(*Arg); 1128d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor } 1129d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor OS << ")"; 1130d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor} 1131d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor 11321c0ca59416999129d0439c2661d137ef38e86209Douglas Gregorvoid StmtPrinter::VisitCXXUnresolvedMemberExpr(CXXUnresolvedMemberExpr *Node) { 11331c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor PrintExpr(Node->getBase()); 11341c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor OS << (Node->isArrow() ? "->" : "."); 11351c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor OS << Node->getMember().getAsString(); 11361c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor} 11371c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor 113864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlstatic const char *getTypeTraitName(UnaryTypeTrait UTT) { 113964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl switch (UTT) { 114064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl default: assert(false && "Unknown type trait"); 114164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowAssign: return "__has_nothrow_assign"; 114264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowCopy: return "__has_nothrow_copy"; 114364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasNothrowConstructor: return "__has_nothrow_constructor"; 114464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialAssign: return "__has_trivial_assign"; 114564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialCopy: return "__has_trivial_copy"; 114664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialConstructor: return "__has_trivial_constructor"; 114764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasTrivialDestructor: return "__has_trivial_destructor"; 114864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_HasVirtualDestructor: return "__has_virtual_destructor"; 114964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsAbstract: return "__is_abstract"; 115064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsClass: return "__is_class"; 115164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsEmpty: return "__is_empty"; 115264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsEnum: return "__is_enum"; 115364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsPOD: return "__is_pod"; 115464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsPolymorphic: return "__is_polymorphic"; 115564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl case UTT_IsUnion: return "__is_union"; 115664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl } 115764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 115864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 115964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlvoid StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 116064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl OS << getTypeTraitName(E->getTrait()) << "(" 116164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl << E->getQueriedType().getAsString() << ")"; 116264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl} 116364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl 11645508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C 11655508518a2702b00be3b15a26d772bde968972f54Anders Carlsson 11665508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) { 11675508518a2702b00be3b15a26d772bde968972f54Anders Carlsson OS << "@"; 11685508518a2702b00be3b15a26d772bde968972f54Anders Carlsson VisitStringLiteral(Node->getString()); 11695508518a2702b00be3b15a26d772bde968972f54Anders Carlsson} 11705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1171f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) { 117239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << "@encode(" << Node->getEncodedType().getAsString() << ')'; 1173f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson} 1174f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson 1175b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) { 117639f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << "@selector(" << Node->getSelector().getAsString() << ')'; 1177b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian} 1178b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian 1179390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) { 118039f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << "@protocol(" << Node->getProtocol()->getNameAsString() << ')'; 1181390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian} 1182390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian 1183563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) { 1184563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "["; 11856a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff Expr *receiver = Mess->getReceiver(); 11866a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff if (receiver) PrintExpr(receiver); 11876a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff else OS << Mess->getClassName()->getName(); 1188c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ' '; 118997b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek Selector selector = Mess->getSelector(); 11906a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff if (selector.isUnarySelector()) { 1191c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << selector.getIdentifierInfoForSlot(0)->getName(); 11926a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } else { 11936a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) { 1194c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i < selector.getNumArgs()) { 1195c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (i > 0) OS << ' '; 1196c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek if (selector.getIdentifierInfoForSlot(i)) 119739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << selector.getIdentifierInfoForSlot(i)->getName() << ':'; 1198c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else 1199c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek OS << ":"; 1200c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek } 1201c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek else OS << ", "; // Handle variadic methods. 1202c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek 12036a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff PrintExpr(Mess->getArg(i)); 12046a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff } 1205563477da25f824e37c535131695dc4dc9b68c465Steve Naroff } 1206563477da25f824e37c535131695dc4dc9b68c465Steve Naroff OS << "]"; 1207563477da25f824e37c535131695dc4dc9b68c465Steve Naroff} 1208563477da25f824e37c535131695dc4dc9b68c465Steve Naroff 1209cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) { 1210cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor OS << "super"; 1211cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor} 1212cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor 12134eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) { 121456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff BlockDecl *BD = Node->getBlockDecl(); 12154eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "^"; 12164eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 12174eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff const FunctionType *AFT = Node->getFunctionType(); 12184eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 121972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor if (isa<FunctionNoProtoType>(AFT)) { 12204eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "()"; 122172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) { 12224eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << '('; 12234eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff std::string ParamStr; 122456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff for (BlockDecl::param_iterator AI = BD->param_begin(), 122556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff E = BD->param_end(); AI != E; ++AI) { 122656ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (AI != BD->param_begin()) OS << ", "; 122739f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner ParamStr = (*AI)->getNameAsString(); 1228d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor (*AI)->getType().getAsStringInternal(ParamStr, Policy); 12294eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ParamStr; 12304eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 12314eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 123272564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor const FunctionProtoType *FT = cast<FunctionProtoType>(AFT); 12334eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff if (FT->isVariadic()) { 123456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff if (!BD->param_empty()) OS << ", "; 12354eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << "..."; 12364eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 12374eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff OS << ')'; 12384eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff } 12394eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 12404eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff 12414eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) { 124239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner OS << Node->getDecl()->getNameAsString(); 12434eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff} 12445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 12455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations 12465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 12475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 12486000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dumpPretty() const { 1249d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor printPretty(llvm::errs(), 0, PrintingPolicy()); 12505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 12515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1252071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stumpvoid Stmt::printPretty(llvm::raw_ostream &OS, PrinterHelper* Helper, 1253d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor const PrintingPolicy &Policy, 1254d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor unsigned Indentation) const { 12555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (this == 0) { 12565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer OS << "<NULL>"; 12575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return; 12585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 12595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1260d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor StmtPrinter P(OS, Helper, Policy, Indentation); 1261c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner P.Visit(const_cast<Stmt*>(this)); 12625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 126342a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 126442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 126542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper 126642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===// 126742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek 126842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor. 12698467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {} 1270