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