StmtPrinter.cpp revision 8ecdb65716cd7914ffb2eeee993fa9039fcd31e8
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"
19a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek#include "llvm/Support/Format.h"
208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h"
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace  {
28770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class StmtPrinter : public StmtVisitor<StmtPrinter> {
29a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek    llvm::raw_ostream &OS;
3048d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman    ASTContext &Context;
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned IndentLevel;
3242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    clang::PrinterHelper* Helper;
33d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    PrintingPolicy Policy;
34d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  public:
361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    StmtPrinter(llvm::raw_ostream &os, ASTContext &C, PrinterHelper* helper,
37e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner                const PrintingPolicy &Policy,
38d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                unsigned Indentation = 0)
3948d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman      : OS(os), Context(C), IndentLevel(Indentation), Helper(helper),
4048d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman        Policy(Policy) {}
411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
42d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    void PrintStmt(Stmt *S) {
43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      PrintStmt(S, Policy.Indentation);
44d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    }
45d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    void PrintStmt(Stmt *S, int SubIndent) {
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel += SubIndent;
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (S && isa<Expr>(S)) {
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // If this is an expr used in a stmt context, indent and newline it.
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent();
51c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << ";\n";
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else if (S) {
54c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent() << "<<<NULL STATEMENT>>>\n";
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel -= SubIndent;
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
60db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawCompoundStmt(CompoundStmt *S);
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawDecl(Decl *D);
63ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    void PrintRawDeclStmt(DeclStmt *S);
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawIfStmt(IfStmt *If);
658351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintExpr(Expr *E) {
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (E)
69c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(E);
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "<null expr>";
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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    }
791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
80704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    bool PrintOffsetOfDesignator(Expr *E);
81704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    void VisitUnaryOffsetOf(UnaryOperator *Node);
821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void Visit(Stmt* S) {
8442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      if (Helper && Helper->handledStmt(S,OS))
8542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek          return;
8642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      else StmtVisitor<StmtPrinter>::Visit(S);
8742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    }
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
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);
1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "}";
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) {
116f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis  D->print(OS, Policy, IndentLevel);
117071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump}
118071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump
119ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenekvoid StmtPrinter::PrintRawDeclStmt(DeclStmt *S) {
120db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end();
12142f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  llvm::SmallVector<Decl*, 2> Decls;
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for ( ; Begin != End; ++Begin)
12342f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman    Decls.push_back(*Begin);
124db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman
125f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis  Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel);
126ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek}
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) {
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << ";\n";
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
133db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  Indent();
134db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  PrintRawDeclStmt(Node);
135db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  OS << ";\n";
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawCompoundStmt(Node);
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "\n";
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "case ";
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRHS()) {
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ... ";
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRHS());
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ":\n";
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "default:\n";
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << Node->getName() << ":\n";
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) {
167bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl  OS << "if (";
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(If->getCond());
169bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl  OS << ')';
1701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ' ';
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
1745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << (If->getElse() ? ' ' : '\n');
1755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << '\n';
1775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(If->getThen());
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (If->getElse()) Indent();
1795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Stmt *Else = If->getElse()) {
1825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "else";
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawCompoundStmt(CS);
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawIfStmt(ElseIf);
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintStmt(If->getElse());
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) {
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawIfStmt(If);
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "switch (";
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
2071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Pretty print compoundstmt bodies (very common).
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(Node->getBody());
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
219c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlssonvoid StmtPrinter::VisitSwitchCase(SwitchCase*) {
220c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson  assert(0 && "SwitchCase is an abstract class");
221c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson}
222c1fcb7762673be706b0a40477d5e93411e918f93Anders Carlsson
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "while (";
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")\n";
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getBody());
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) {
2318bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  Indent() << "do ";
2328bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2338bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2348bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2358bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2368bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2378bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2388bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    Indent();
2398bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
241b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman  OS << "while (";
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
243b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman  OS << ");\n";
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) {
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "for (";
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getInit()) {
2495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
250ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek      PrintRawDeclStmt(DS);
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
2525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintExpr(cast<Expr>(Node->getInit()));
2535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2548bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2558bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getCond()) {
2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getCond());
2588bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2598bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2608bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getInc()) {
2618bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getInc());
2638bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2648bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ") ";
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2668bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2678bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2688bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2698bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2708bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2718bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
275a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
2760196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  Indent() << "for (";
2770196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
278ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    PrintRawDeclStmt(DS);
2790196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  else
2800196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintExpr(cast<Expr>(Node->getElement()));
2810196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << " in ";
2820196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  PrintExpr(Node->getCollection());
2830196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << ") ";
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2850196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2860196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintRawCompoundStmt(CS);
2870196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
2880196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  } else {
2890196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
2900196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintStmt(Node->getBody());
2910196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  }
2920196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian}
2930196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
2945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
2955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto " << Node->getLabel()->getName() << ";\n";
2965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
2995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto *";
3005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getTarget());
3015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "continue;\n";
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "break;\n";
3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
3145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "return";
3155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRetValue()) {
3165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
3175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRetValue());
3185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
322fe795956194141c91ae555985c9b930595bff43fChris Lattner
323fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) {
32439c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  Indent() << "asm ";
3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32639c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  if (Node->isVolatile())
32739c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson    OS << "volatile ";
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
32939c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  OS << "(";
3306a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  VisitStringLiteral(Node->getAsmString());
3311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
332b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Outputs
333b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
334b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      Node->getNumClobbers() != 0)
335b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
3361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
337b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
338b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
339b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
341b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getOutputName(i).empty()) {
342b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
343b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getOutputName(i);
344b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
345b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
3461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
347b327793860737d1c103a73aeda8057dd628a101dChris Lattner    VisitStringLiteral(Node->getOutputConstraintLiteral(i));
348b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
349b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getOutputExpr(i));
350b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
352b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Inputs
353b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
354b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
3551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
356b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
357b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
358b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
3591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
360b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getInputName(i).empty()) {
361b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
362b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getInputName(i);
363b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
364b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
366b327793860737d1c103a73aeda8057dd628a101dChris Lattner    VisitStringLiteral(Node->getInputConstraintLiteral(i));
367b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
368b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getInputExpr(i));
369b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
371b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Clobbers
372b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumClobbers() != 0)
373b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
375b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
376b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
377b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
3781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
379b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getClobber(i));
380b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
3811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3826a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  OS << ");\n";
383fe795956194141c91ae555985c9b930595bff43fChris Lattner}
384fe795956194141c91ae555985c9b930595bff43fChris Lattner
385a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
3867794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  Indent() << "@try";
3877794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
3887794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    PrintRawCompoundStmt(TS);
3897794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
3907794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3928f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) {
3938f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I);
3947794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    Indent() << "@catch(";
3957ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff    if (catchStmt->getCatchParamDecl()) {
3967ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff      if (Decl *DS = catchStmt->getCatchParamDecl())
3977ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff        PrintRawDecl(DS);
3987794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    }
3997794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << ")";
4001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      PrintRawCompoundStmt(CS);
4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OS << "\n";
4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
4047794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>(
4071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        Node->getFinallyStmt())) {
4081e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    Indent() << "@finally";
4091e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
4107794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
412b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
413b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
414a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
415b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
416b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
417a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
418b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian  Indent() << "@catch (...) { /* todo */ } \n";
419b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
420b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
42178a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
42239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  Indent() << "@throw";
42339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  if (Node->getThrowExpr()) {
42439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    OS << " ";
42539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    PrintExpr(Node->getThrowExpr());
42639f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  }
42739f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  OS << ";\n";
42839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian}
42939f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian
43078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
431c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  Indent() << "@synchronized (";
432c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  PrintExpr(Node->getSynchExpr());
433c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  OS << ")";
43478a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  PrintRawCompoundStmt(Node->getSynchBody());
43578a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  OS << "\n";
436c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian}
437c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian
4388351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
4398351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  OS << "catch (";
4404b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  if (Decl *ExDecl = Node->getExceptionDecl())
4414b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl    PrintRawDecl(ExDecl);
4424b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  else
4434b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl    OS << "...";
4444b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  OS << ") ";
4454b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock()));
4468351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl}
4478351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl
4488351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
4498351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  Indent();
4508351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  PrintRawCXXCatchStmt(Node);
4518351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  OS << "\n";
4528351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl}
4538351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl
4548351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
4558351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  Indent() << "try ";
4568351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  PrintRawCompoundStmt(Node->getTryBlock());
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) {
4588351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    OS << " ";
4598351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    PrintRawCXXCatchStmt(Node->getHandler(i));
4608351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  }
4614b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  OS << "\n";
4624b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl}
4634b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl
4645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Expr printing methods.
4665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitExpr(Expr *Node) {
4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "<<unknown expr type>>";
4705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
473a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
474a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier->print(OS, Policy);
475900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << Node->getDecl();
476a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (Node->hasExplicitTemplateArgumentList())
477a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    OS << TemplateSpecializationType::PrintTemplateArgumentList(
478a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                    Node->getTemplateArgs(),
479a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                    Node->getNumTemplateArgs(),
480a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                    Policy);
4811a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor}
4821a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
483865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitDependentScopeDeclRefExpr(
484865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                           DependentScopeDeclRefExpr *Node) {
485d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  Node->getQualifier()->print(OS, Policy);
4865953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor  OS << Node->getDeclName().getAsString();
487f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Node->hasExplicitTemplateArgs())
488f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    OS << TemplateSpecializationType::PrintTemplateArgumentList(
489f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Node->getTemplateArgs(),
490f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Node->getNumTemplateArgs(),
491f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Policy);
4925953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
4935953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
494ba13543329afac4a0d01304ec2ec4924d99306a6John McCallvoid StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
495edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor  if (Node->getQualifier())
496edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor    Node->getQualifier()->print(OS, Policy);
497f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  OS << Node->getName().getAsString();
498f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Node->hasExplicitTemplateArgs())
499f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    OS << TemplateSpecializationType::PrintTemplateArgumentList(
500f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Node->getTemplateArgs(),
501edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor                                                   Node->getNumTemplateArgs(),
502f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Policy);
503edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor}
504edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor
5057779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
506232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  if (Node->getBase()) {
507232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    PrintExpr(Node->getBase());
508232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    OS << (Node->isArrow() ? "->" : ".");
509232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  }
510900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << Node->getDecl();
5117779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff}
5127779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff
513ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
514ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  if (Node->getBase()) {
515ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    PrintExpr(Node->getBase());
516ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    OS << ".";
517ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  }
518c77a636688e188af7e7a9a05829e542adb48e880Steve Naroff  OS << Node->getProperty()->getNameAsCString();
519ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff}
520ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff
52109105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanianvoid StmtPrinter::VisitObjCImplicitSetterGetterRefExpr(
52209105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz Jahanian                                        ObjCImplicitSetterGetterRefExpr *Node) {
5235daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian  if (Node->getBase()) {
5245daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian    PrintExpr(Node->getBase());
5255daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian    OS << ".";
5265daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian  }
527154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian  if (Node->getGetterMethod())
528900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer    OS << Node->getGetterMethod();
5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5305daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian}
5315daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian
532d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
533227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  switch (Node->getIdentType()) {
534227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    default:
535227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      assert(0 && "unknown case");
536d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Func:
537227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__func__";
538227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
539d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Function:
540227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__FUNCTION__";
541227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
542d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::PrettyFunction:
543227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__PRETTY_FUNCTION__";
544227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
545227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  }
546227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}
547227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
5485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
549b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  unsigned value = Node->getValue();
550c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner  if (Node->isWide())
551c250aae4f645833aed3a6321bc8598f7330dce8dChris Lattner    OS << "L";
5528bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  switch (value) {
5538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\\':
5548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\\\'";
5558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\'':
5578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\''";
5588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\a':
5608bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    // TODO: K&R: the meaning of '\\a' is different in traditional C
5618bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\a'";
5628bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5638bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\b':
5648bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\b'";
5658bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5668bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  // Nonstandard escape sequence.
5678bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  /*case '\e':
5688bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\e'";
5698bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;*/
5708bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\f':
5718bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\f'";
5728bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5738bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\n':
5748bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\n'";
5758bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5768bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\r':
5778bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\r'";
5788bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5798bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\t':
5808bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\t'";
5818bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5828bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\v':
5838bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\v'";
5848bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
5858bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  default:
586471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek    if (value < 256 && isprint(value)) {
5878bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << "'" << (char)value << "'";
5888bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else if (value < 256) {
589a95d3750441ac8ad03e36af8e6e74039c9a3109dTed Kremenek      OS << "'\\x" << llvm::format("%x", value) << "'";
5908bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else {
5918bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      // FIXME what to really do here?
5928bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << value;
5938bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    }
594b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  }
5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
5985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isSigned = Node->getType()->isSignedIntegerType();
5995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getValue().toString(10, isSigned);
6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Emit suffixes.  Integer literals are always a builtin integer type.
602183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
6035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  default: assert(0 && "Unexpected type for integer literal!");
6045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Int:       break; // no suffix.
6055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UInt:      OS << 'U'; break;
6065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Long:      OS << 'L'; break;
6075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULong:     OS << "UL"; break;
6085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongLong:  OS << "LL"; break;
6095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULongLong: OS << "ULL"; break;
6105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
61386e499d9525ab4f2258724c4ca2826acd6b13a8eChris Lattner  // FIXME: print value more precisely.
614da8249e57f3badecf925571881fe57243935c6c1Chris Lattner  OS << Node->getValueAsApproximateDouble();
6155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6165d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
6175d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
6185d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  PrintExpr(Node->getSubExpr());
6195d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  OS << "i";
6205d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}
6215d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
6225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
6235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Str->isWide()) OS << 'L';
6245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << '"';
625ee98ac5a1330db432b188dd2d38b6631aac47bf1Anders Carlsson
6265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // FIXME: this doesn't print wstrings right.
6275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
6289a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner    unsigned char Char = Str->getStrData()[i];
6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6309a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner    switch (Char) {
6319a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner    default:
6329a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner      if (isprint(Char))
6339a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner        OS << (char)Char;
6349a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner      else  // Output anything hard as an octal escape.
6359a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner        OS << '\\'
6369a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner        << (char)('0'+ ((Char >> 6) & 7))
6379a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner        << (char)('0'+ ((Char >> 3) & 7))
6389a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner        << (char)('0'+ ((Char >> 0) & 7));
6399a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner      break;
6409a81c87503c7a36a4468a081cadb461833a360a8Chris Lattner    // Handle some common non-printable cases to make dumps prettier.
6415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\\': OS << "\\\\"; break;
6425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '"': OS << "\\\""; break;
6435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\n': OS << "\\n"; break;
6445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\t': OS << "\\t"; break;
6455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\a': OS << "\\a"; break;
6465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    case '\b': OS << "\\b"; break;
6475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
6485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
6495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << '"';
6505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) {
6525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
6535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
6545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
6555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
6565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
657296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  if (!Node->isPostfix()) {
6585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
6591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6607df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    // Print a space if this is an "identifier operator" like __real, or if
6617df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    // it might be concatenated incorrectly like '+'.
662296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    switch (Node->getOpcode()) {
663296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    default: break;
664296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Real:
665296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Imag:
666296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    case UnaryOperator::Extension:
667296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      OS << ' ';
668296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      break;
6697df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    case UnaryOperator::Plus:
6707df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    case UnaryOperator::Minus:
6717df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman      if (isa<UnaryOperator>(Node->getSubExpr()))
6727df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman        OS << ' ';
6737df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman      break;
674296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    }
675296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  }
6765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
6771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->isPostfix())
6795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
680704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
681704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
682704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnerbool StmtPrinter::PrintOffsetOfDesignator(Expr *E) {
68335183aca180a2b9b2c637cd625a40a7e147d6a32Eli Friedman  if (isa<UnaryOperator>(E)) {
684704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    // Base case, print the type and comma.
685704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << E->getType().getAsString() << ", ";
686704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return true;
687704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  } else if (ArraySubscriptExpr *ASE = dyn_cast<ArraySubscriptExpr>(E)) {
688704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    PrintOffsetOfDesignator(ASE->getLHS());
689704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << "[";
690704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    PrintExpr(ASE->getRHS());
691704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    OS << "]";
692704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return false;
693704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  } else {
694704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    MemberExpr *ME = cast<MemberExpr>(E);
695704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    bool IsFirst = PrintOffsetOfDesignator(ME->getBase());
696900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer    OS << (IsFirst ? "" : ".") << ME->getMemberDecl();
697704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner    return false;
698704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  }
699704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
7005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
701704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattnervoid StmtPrinter::VisitUnaryOffsetOf(UnaryOperator *Node) {
702704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  OS << "__builtin_offsetof(";
703704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  PrintOffsetOfDesignator(Node->getSubExpr());
704704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner  OS << ")";
7055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
706704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
7078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorvoid StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
7088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << "__builtin_offsetof(";
7098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << Node->getTypeSourceInfo()->getType().getAsString() << ", ";
7108ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool PrintedSomething = false;
7118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) {
7128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i);
7138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) {
7148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      // Array node
7158ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << "[";
7168ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex()));
7178ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << "]";
7188ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintedSomething = true;
7198ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      continue;
7208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
7218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
7228ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    // Field or identifier node.
7238ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    IdentifierInfo *Id = ON.getFieldName();
7248ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (!Id)
7258ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      continue;
7268ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
7278ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (PrintedSomething)
7288ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << ".";
7298ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    else
7308ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintedSomething = true;
7318ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OS << Id->getName();
7328ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
7338ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << ")";
7348ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
7358ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
7360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redlvoid StmtPrinter::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *Node) {
7370518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  OS << (Node->isSizeOf() ? "sizeof" : "__alignof");
7380518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
7390518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    OS << "(" << Node->getArgumentType().getAsString() << ")";
7400518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  else {
7410518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    OS << " ";
7420518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    PrintExpr(Node->getArgumentExpr());
7430518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
7445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
7462324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getLHS());
7475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "[";
7482324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getRHS());
7495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "]";
7505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCallExpr(CallExpr *Call) {
7535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Call->getCallee());
7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
75604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
75704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      // Don't print any defaulted arguments
75804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      break;
75904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    }
76004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
7615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) OS << ", ";
7625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Call->getArg(i));
7635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
7655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
767b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  // FIXME: Suppress printing implicit bases (like "this")
768b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  PrintExpr(Node->getBase());
76997fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian  if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl()))
77097fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian    if (FD->isAnonymousStructOrUnion())
77197fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian      return;
772b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  OS << (Node->isArrow() ? "->" : ".");
77383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
77483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    Qualifier->print(OS, Policy);
77583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor
776900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << Node->getMemberDecl();
7771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
778c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor  if (Node->hasExplicitTemplateArgumentList())
779c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    OS << TemplateSpecializationType::PrintTemplateArgumentList(
780c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor                                                    Node->getTemplateArgs(),
781c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor                                                    Node->getNumTemplateArgs(),
782c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor                                                                Policy);
7835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
784f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroffvoid StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
785f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  PrintExpr(Node->getBase());
786f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  OS << (Node->isArrow() ? "->isa" : ".isa");
787f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
788f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
789213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
79031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  PrintExpr(Node->getBase());
79131a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << ".";
79231a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << Node->getAccessor().getName();
79331a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
7940835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidisvoid StmtPrinter::VisitCastExpr(CastExpr *) {
7950835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis  assert(0 && "CastExpr is an abstract class");
7960835a3cdeefe714b4959d31127ea155e56393125Argyrios Kyrtzidis}
79749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitExplicitCastExpr(ExplicitCastExpr *) {
79849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  assert(0 && "ExplicitCastExpr is an abstract class");
79949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
8006eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
80126dc7b39267b7d29b35a7887a5b8e54697192192Chris Lattner  OS << "(" << Node->getType().getAsString() << ")";
8025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
8035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
804aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
805aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  OS << "(" << Node->getType().getAsString() << ")";
806aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  PrintExpr(Node->getInitializer());
807aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}
80849b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
80990045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  // No need to print anything, simply forward to the sub expression.
81090045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  PrintExpr(Node->getSubExpr());
81149b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}
8125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
8135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
8145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
815eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getRHS());
816eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
817eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
818eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getLHS());
819eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
8205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
8215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
8235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
8241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8258e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  if (Node->getLHS()) {
8268e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " ? ";
8278e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    PrintExpr(Node->getLHS());
8288e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " : ";
8298e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  }
8304fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  else { // Handle GCC extension where LHS can be NULL.
8318e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek    OS << " ?: ";
8328e911c42ad6a5ae0fe0dd46058bd13236a0e9026Ted Kremenek  }
8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
8345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
8355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions.
8385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8396481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
8405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "&&" << Node->getLabel()->getName();
8415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
843ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) {
844ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << "(";
845ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  PrintRawCompoundStmt(E->getSubStmt());
846ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << ")";
847ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}
848ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
849d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroffvoid StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
850d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << "__builtin_types_compatible_p(";
851d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << Node->getArgType1().getAsString() << ",";
852d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff  OS << Node->getArgType2().getAsString() << ")";
853d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff}
854d34e915f33224c508ad55fbf975bd10b7876e197Steve Naroff
855d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
856d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << "__builtin_choose_expr(";
857d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getCond());
85894f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
859d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getLHS());
86094f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
861d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getRHS());
862d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << ")";
863d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}
864ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
8652d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
8662d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  OS << "__null";
8672d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor}
8682d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
869d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
870d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << "__builtin_shufflevector(";
871d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
872d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    if (i) OS << ", ";
873d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    PrintExpr(Node->getExpr(i));
874d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
875d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << ")";
876e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman}
877e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
87866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
87964f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor  if (Node->getSyntacticForm()) {
88064f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor    Visit(Node->getSyntacticForm());
88164f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor    return;
88264f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor  }
88364f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor
88466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << "{ ";
88566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
88666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    if (i) OS << ", ";
8874c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    if (Node->getInit(i))
8884c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      PrintExpr(Node->getInit(i));
8894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    else
8904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "0";
89166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
89266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << " }";
89366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
89466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
8952ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
8962ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  OS << "( ";
8972ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {
8982ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    if (i) OS << ", ";
8992ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    PrintExpr(Node->getExpr(i));
9002ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  }
9012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  OS << " )";
9022ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
9032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
90405c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
9054c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(),
9064c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor                      DEnd = Node->designators_end();
9074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor       D != DEnd; ++D) {
9084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    if (D->isFieldDesignator()) {
9094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      if (D->getDotLoc().isInvalid())
9104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << D->getFieldName()->getName() << ":";
9114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      else
9124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << "." << D->getFieldName()->getName();
9134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    } else {
9144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "[";
9154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      if (D->isArrayDesignator()) {
9164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        PrintExpr(Node->getArrayIndex(*D));
9174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      } else {
9184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        PrintExpr(Node->getArrayRangeStart(*D));
9194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << " ... ";
9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        PrintExpr(Node->getArrayRangeEnd(*D));
9214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      }
9224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "]";
9234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    }
9244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  }
9254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
9264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  OS << " = ";
9274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  PrintExpr(Node->getInit());
92805c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
92905c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
9303498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
931e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  if (Policy.LangOpts.CPlusPlus)
9324fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    OS << "/*implicit*/" << Node->getType().getAsString(Policy) << "()";
9334fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  else {
9344fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    OS << "/*implicit*/(" << Node->getType().getAsString(Policy) << ")";
9354fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    if (Node->getType()->isRecordType())
9364fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      OS << "{}";
9374fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    else
9384fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      OS << 0;
9394fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
9403498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}
9413498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
9427c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
94342f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  OS << "__builtin_va_arg(";
9447c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  PrintExpr(Node->getSubExpr());
9457c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ", ";
9467c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << Node->getType().getAsString();
9477c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ")";
9487c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
9497c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
9505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++
951b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
952b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  const char *OpStrings[NUM_OVERLOADED_OPERATORS] = {
953b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    "",
954b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
955b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    Spelling,
956b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def"
957b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  };
958b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
959b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  OverloadedOperatorKind Kind = Node->getOperator();
960b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
961b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    if (Node->getNumArgs() == 1) {
962b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << OpStrings[Kind] << ' ';
963b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
964b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    } else {
965b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
966b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << ' ' << OpStrings[Kind];
967b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
968b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Call) {
969b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
970b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '(';
971b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) {
972b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (ArgIdx > 1)
973b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        OS << ", ";
974b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx)))
975b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        PrintExpr(Node->getArg(ArgIdx));
976b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
977b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ')';
978b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Subscript) {
979b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
980b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '[';
981b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
982b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ']';
983b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 1) {
984b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << OpStrings[Kind] << ' ';
985b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
986b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 2) {
987b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
988b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ' ' << OpStrings[Kind] << ' ';
989b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
990b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else {
991b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    assert(false && "unknown overloaded operator");
992b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  }
993b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
9945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
99588a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
99688a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  VisitCallExpr(cast<CallExpr>(Node));
99788a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor}
99888a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
99949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
100049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  OS << Node->getCastName() << '<';
100149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  OS << Node->getTypeAsWritten().getAsString() << ">(";
10025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
10035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
100649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
100749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
100849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
100949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
101049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
101149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
101249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
101349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
101449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
101549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
101649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
101749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
101849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
101949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
102049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
102149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
1022c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
1023c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << "typeid(";
1024c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  if (Node->isTypeOperand()) {
1025c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    OS << Node->getTypeOperand().getAsString();
1026c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  } else {
1027c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    PrintExpr(Node->getExprOperand());
1028c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
1029c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << ")";
1030c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}
1031c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
10325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->getValue() ? "true" : "false");
10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10366e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
10376e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  OS << "nullptr";
10386e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}
10396e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
1040796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
1041796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  OS << "this";
1042796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}
1043796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
104450dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
104550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  if (Node->getSubExpr() == 0)
104650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw";
104750dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  else {
104850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw ";
104950dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    PrintExpr(Node->getSubExpr());
105050dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  }
105150dd289f45738ed22b7583d52ed2525b927042ffChris Lattner}
105250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner
105304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
105404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  // Nothing to print: we picked up the default argument
105504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner}
105604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
1057987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
1058987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << Node->getType().getAsString();
1059987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << "(";
1060987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  PrintExpr(Node->getSubExpr());
1061987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << ")";
1062987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
1063987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
1064fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonvoid StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
1065eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  PrintExpr(Node->getSubExpr());
1066eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
1067eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
1068eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlssonvoid StmtPrinter::VisitCXXBindReferenceExpr(CXXBindReferenceExpr *Node) {
1069fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson  PrintExpr(Node->getSubExpr());
1070fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson}
1071fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlsson
1072506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
1073506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << Node->getType().getAsString();
1074506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << "(";
1075506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(),
10761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                         ArgEnd = Node->arg_end();
1077506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor       Arg != ArgEnd; ++Arg) {
1078506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    if (Arg != Node->arg_begin())
1079506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor      OS << ", ";
1080506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    PrintExpr(*Arg);
1081506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  }
1082506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << ")";
1083506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor}
1084506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
1085987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *Node) {
1086987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << Node->getType().getAsString() << "()";
1087987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
1088987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
10894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
10904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalNew())
10914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
10924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "new ";
10934c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned NumPlace = E->getNumPlacementArgs();
10944c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (NumPlace > 0) {
10954c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
10964c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    PrintExpr(E->getPlacementArg(0));
10974c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    for (unsigned i = 1; i < NumPlace; ++i) {
10984c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      OS << ", ";
10994c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      PrintExpr(E->getPlacementArg(i));
11004c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    }
11014c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ") ";
11024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
11034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
11044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
11056fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  std::string TypeS;
11066fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  if (Expr *Size = E->getArraySize()) {
11076fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    llvm::raw_string_ostream s(TypeS);
11086e1a345838c8feb500ba8887b3ba5a1c1d0b33dcEli Friedman    Size->printPretty(s, Context, Helper, Policy);
11096fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    s.flush();
11106fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    TypeS = "[" + TypeS + "]";
11116fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  }
1112d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  E->getAllocatedType().getAsStringInternal(TypeS, Policy);
11136fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  OS << TypeS;
11144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
11154c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ")";
11164c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
11174c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->hasInitializer()) {
11184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
11194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    unsigned NumCons = E->getNumConstructorArgs();
11204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    if (NumCons > 0) {
11214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      PrintExpr(E->getConstructorArg(0));
11224c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      for (unsigned i = 1; i < NumCons; ++i) {
11234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl        OS << ", ";
11244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl        PrintExpr(E->getConstructorArg(i));
11254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      }
11264c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    }
11274c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ")";
11284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
11294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
11304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
11314c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
11324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalDelete())
11334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
11344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "delete ";
11354c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isArrayForm())
11364c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "[] ";
11374c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  PrintExpr(E->getArgument());
11384c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
11394c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
1140a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1141a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  PrintExpr(E->getBase());
1142a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->isArrow())
1143a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    OS << "->";
1144a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  else
1145a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    OS << '.';
1146a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier())
1147a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    E->getQualifier()->print(OS, Policy);
11481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1149a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  std::string TypeS;
1150a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (IdentifierInfo *II = E->getDestroyedTypeIdentifier())
1151a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    OS << II->getName();
1152a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  else
1153a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    E->getDestroyedType().getAsStringInternal(TypeS, Policy);
1154a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OS << TypeS;
1155a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
1156a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
1157e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1158c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian  // FIXME. For now we just print a trivial constructor call expression,
1159c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian  // constructing its first argument object.
1160c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian  if (E->getNumArgs() == 1) {
1161c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian    CXXConstructorDecl *CD = E->getConstructor();
1162c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian    if (CD->isTrivial())
1163c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian      PrintExpr(E->getArg(0));
1164c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian  }
1165e349bea668622ef31bd51a229960a73d69940709Anders Carlsson  // Nothing to print.
1166e349bea668622ef31bd51a229960a73d69940709Anders Carlsson}
1167e349bea668622ef31bd51a229960a73d69940709Anders Carlsson
11682d44e8a41de8a33c0f04ac198714f71dc841bab0Anders Carlssonvoid StmtPrinter::VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E) {
116902bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  // Just forward to the sub expression.
117002bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  PrintExpr(E->getSubExpr());
117102bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson}
117202bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
11731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
1174d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr(
1175d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                           CXXUnresolvedConstructExpr *Node) {
1176d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << Node->getTypeAsWritten().getAsString();
1177d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << "(";
1178d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(),
11791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             ArgEnd = Node->arg_end();
1180d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor       Arg != ArgEnd; ++Arg) {
1181d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    if (Arg != Node->arg_begin())
1182d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor      OS << ", ";
1183d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    PrintExpr(*Arg);
1184d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  }
1185d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << ")";
1186d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}
1187d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor
1188865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitCXXDependentScopeMemberExpr(
1189865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                         CXXDependentScopeMemberExpr *Node) {
1190aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Node->isImplicitAccess()) {
1191aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    PrintExpr(Node->getBase());
1192aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OS << (Node->isArrow() ? "->" : ".");
1193aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1194a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1195a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier->print(OS, Policy);
1196aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  else if (Node->hasExplicitTemplateArgs())
11973b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    // FIXME: Track use of "template" keyword explicitly?
11983b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OS << "template ";
11991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
12001c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor  OS << Node->getMember().getAsString();
12011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1202aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (Node->hasExplicitTemplateArgs()) {
12033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OS << TemplateSpecializationType::PrintTemplateArgumentList(
12043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                    Node->getTemplateArgs(),
12053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                    Node->getNumTemplateArgs(),
12063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                    Policy);
12073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
12081c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}
12091c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor
1210129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallvoid StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
1211aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Node->isImplicitAccess()) {
1212aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    PrintExpr(Node->getBase());
1213aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OS << (Node->isArrow() ? "->" : ".");
1214aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1215129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1216129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier->print(OS, Policy);
1217129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
1218129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  // FIXME: this might originally have been written with 'template'
1219129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
1220129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  OS << Node->getMemberName().getAsString();
1221129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
1222129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Node->hasExplicitTemplateArgs()) {
1223129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    OS << TemplateSpecializationType::PrintTemplateArgumentList(
1224129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                    Node->getTemplateArgs(),
1225129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                    Node->getNumTemplateArgs(),
1226129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                    Policy);
1227129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
1228129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
1229129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
123064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlstatic const char *getTypeTraitName(UnaryTypeTrait UTT) {
123164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  switch (UTT) {
123264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  default: assert(false && "Unknown type trait");
123364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasNothrowAssign:      return "__has_nothrow_assign";
123464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasNothrowCopy:        return "__has_nothrow_copy";
123564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasNothrowConstructor: return "__has_nothrow_constructor";
123664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasTrivialAssign:      return "__has_trivial_assign";
123764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasTrivialCopy:        return "__has_trivial_copy";
123864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasTrivialConstructor: return "__has_trivial_constructor";
123964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasTrivialDestructor:  return "__has_trivial_destructor";
124064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasVirtualDestructor:  return "__has_virtual_destructor";
124164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsAbstract:            return "__is_abstract";
124264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsClass:               return "__is_class";
124364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsEmpty:               return "__is_empty";
124464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsEnum:                return "__is_enum";
124564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsPOD:                 return "__is_pod";
124664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsPolymorphic:         return "__is_polymorphic";
124764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsUnion:               return "__is_union";
124864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
124964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl}
125064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
125164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlvoid StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
125264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  OS << getTypeTraitName(E->getTrait()) << "("
125364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl     << E->getQueriedType().getAsString() << ")";
125464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl}
125564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
12561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// Obj-C
12575508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
12585508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
12595508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  OS << "@";
12605508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  VisitStringLiteral(Node->getString());
12615508518a2702b00be3b15a26d772bde968972f54Anders Carlsson}
12625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1263f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
126439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << "@encode(" << Node->getEncodedType().getAsString() << ')';
1265f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
1266f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
1267b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
126839f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << "@selector(" << Node->getSelector().getAsString() << ')';
1269b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
1270b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
1271390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
1272900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << "@protocol(" << Node->getProtocol() << ')';
1273390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
1274390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
1275563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
1276563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "[";
127704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Mess->getReceiverKind()) {
127804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
127904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    PrintExpr(Mess->getInstanceReceiver());
128004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
128104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
128204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
128304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << Mess->getClassReceiver().getAsString(Policy);
128404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
128504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
128604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance:
128704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
128804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << "Super";
128904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
129004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
129104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
1292c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek  OS << ' ';
129397b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek  Selector selector = Mess->getSelector();
12946a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (selector.isUnarySelector()) {
1295c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek    OS << selector.getIdentifierInfoForSlot(0)->getName();
12966a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  } else {
12976a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
1298c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      if (i < selector.getNumArgs()) {
1299c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (i > 0) OS << ' ';
1300c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (selector.getIdentifierInfoForSlot(i))
130139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner          OS << selector.getIdentifierInfoForSlot(i)->getName() << ':';
1302c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        else
1303c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek           OS << ":";
1304c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      }
1305c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      else OS << ", "; // Handle variadic methods.
13061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13076a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff      PrintExpr(Mess->getArg(i));
13086a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    }
1309563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  }
1310563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "]";
1311563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
1312563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
1313cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtPrinter::VisitObjCSuperExpr(ObjCSuperExpr *) {
1314cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor  OS << "super";
1315cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
1316cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
13174eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
131856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  BlockDecl *BD = Node->getBlockDecl();
13194eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  OS << "^";
13201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
13214eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  const FunctionType *AFT = Node->getFunctionType();
13221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
132372564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (isa<FunctionNoProtoType>(AFT)) {
13244eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << "()";
132572564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
13264eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << '(';
13274eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    std::string ParamStr;
132856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    for (BlockDecl::param_iterator AI = BD->param_begin(),
132956ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff         E = BD->param_end(); AI != E; ++AI) {
133056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (AI != BD->param_begin()) OS << ", ";
133139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      ParamStr = (*AI)->getNameAsString();
1332d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      (*AI)->getType().getAsStringInternal(ParamStr, Policy);
13334eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << ParamStr;
13344eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
13351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
133672564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    const FunctionProtoType *FT = cast<FunctionProtoType>(AFT);
13374eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    if (FT->isVariadic()) {
133856ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (!BD->param_empty()) OS << ", ";
13394eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << "...";
13404eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
13414eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << ')';
13424eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  }
13434eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
13444eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
13454eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockDeclRefExpr(BlockDeclRefExpr *Node) {
1346900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << Node->getDecl();
13474eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
13485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
13495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations
13505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
13515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
135248d14a222276fad5279e994d1a062f36ae6fcbceEli Friedmanvoid Stmt::dumpPretty(ASTContext& Context) const {
1353e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  printPretty(llvm::errs(), Context, 0,
1354e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner              PrintingPolicy(Context.getLangOptions()));
13555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
13565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
135748d14a222276fad5279e994d1a062f36ae6fcbceEli Friedmanvoid Stmt::printPretty(llvm::raw_ostream &OS, ASTContext& Context,
135848d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman                       PrinterHelper* Helper,
1359d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                       const PrintingPolicy &Policy,
1360d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                       unsigned Indentation) const {
13615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (this == 0) {
13625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "<NULL>";
13635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
13645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
13655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1366bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor  if (Policy.Dump && &Context) {
1367ad42f06f998c45faed641180d852e46177e695cfArgyrios Kyrtzidis    dump(Context.getSourceManager());
13684fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    return;
13694fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
13701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
137148d14a222276fad5279e994d1a062f36ae6fcbceEli Friedman  StmtPrinter P(OS, Context, Helper, Policy, Indentation);
1372c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
13735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
137442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
137542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
137642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper
137742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
137842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
137942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor.
13808467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {}
1381