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