StmtPrinter.cpp revision d1420c6fa788669e49f21e184927c7833881e399
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
15471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include "clang/AST/ASTContext.h"
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/AST/StmtVisitor.h"
171a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor#include "clang/AST/DeclCXX.h"
1891d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h"
19c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor#include "clang/AST/DeclTemplate.h"
2042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek#include "clang/AST/PrettyPrinter.h"
218ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h"
22ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor#include "clang/AST/ExprCXX.h"
238fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h"
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace  {
31770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class StmtPrinter : public StmtVisitor<StmtPrinter> {
325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &OS;
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned IndentLevel;
3442a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    clang::PrinterHelper* Helper;
35d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    PrintingPolicy Policy;
36d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  public:
38d1420c6fa788669e49f21e184927c7833881e399Richard Smith    StmtPrinter(raw_ostream &os, PrinterHelper* helper,
39e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner                const PrintingPolicy &Policy,
40d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                unsigned Indentation = 0)
41d1420c6fa788669e49f21e184927c7833881e399Richard Smith      : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy) {}
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    void PrintStmt(Stmt *S) {
44d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      PrintStmt(S, Policy.Indentation);
45d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    }
46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
47d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    void PrintStmt(Stmt *S, int SubIndent) {
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel += SubIndent;
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (S && isa<Expr>(S)) {
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // If this is an expr used in a stmt context, indent and newline it.
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent();
52c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << ";\n";
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else if (S) {
55c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent() << "<<<NULL STATEMENT>>>\n";
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel -= SubIndent;
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
61db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawCompoundStmt(CompoundStmt *S);
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawDecl(Decl *D);
64ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    void PrintRawDeclStmt(DeclStmt *S);
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawIfStmt(IfStmt *If);
668351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
67d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne    void PrintCallArgs(CallExpr *E);
6828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    void PrintRawSEHExceptHandler(SEHExceptStmt *S);
6928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintExpr(Expr *E) {
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (E)
73c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(E);
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "<null expr>";
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
785f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &Indent(int Delta = 0) {
79d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      for (int i = 0, e = IndentLevel+Delta; i < e; ++i)
80d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor        OS << "  ";
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return OS;
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void Visit(Stmt* S) {
8542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      if (Helper && Helper->handledStmt(S,OS))
8642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek          return;
8742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      else StmtVisitor<StmtPrinter>::Visit(S);
8842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    }
8978e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis
9061e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth    void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED {
9178e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis      Indent() << "<<unknown stmt type>>\n";
9278e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis    }
9361e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth    void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED {
9478e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis      OS << "<<unknown expr type>>";
9578e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis    }
9678e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis    void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9878e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis#define ABSTRACT_STMT(CLASS)
99f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \
100c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void Visit##CLASS(CLASS *Node);
1014bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Stmt printing methods.
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }.
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) {
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "{\n";
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (CompoundStmt::body_iterator I = Node->body_begin(), E = Node->body_end();
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer       I != E; ++I)
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(*I);
1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "}";
1185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) {
121f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis  D->print(OS, Policy, IndentLevel);
122071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump}
123071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump
124ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenekvoid StmtPrinter::PrintRawDeclStmt(DeclStmt *S) {
125db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  DeclStmt::decl_iterator Begin = S->decl_begin(), End = S->decl_end();
1265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<Decl*, 2> Decls;
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for ( ; Begin != End; ++Begin)
12842f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman    Decls.push_back(*Begin);
129db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman
130f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis  Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel);
131ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek}
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) {
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << ";\n";
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
138db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  Indent();
139db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  PrintRawDeclStmt(Node);
140db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  OS << ";\n";
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawCompoundStmt(Node);
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "\n";
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "case ";
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRHS()) {
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ... ";
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRHS());
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ":\n";
1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "default:\n";
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << Node->getName() << ":\n";
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
171534986f2b21e6050bf00163cd6423fd92155a6edRichard Smithvoid StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
172534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  OS << "[[";
173534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  bool first = true;
1744990890fc9428f98bef90ba349203a648c592778Alexander Kornienko  for (ArrayRef<const Attr*>::iterator it = Node->getAttrs().begin(),
1754990890fc9428f98bef90ba349203a648c592778Alexander Kornienko                                       end = Node->getAttrs().end();
1764990890fc9428f98bef90ba349203a648c592778Alexander Kornienko                                       it != end; ++it) {
177534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith    if (!first) {
178534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith      OS << ", ";
179534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith      first = false;
180534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith    }
181534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith    // TODO: check this
1820dae729a69c4fccc38c97d5dd44f7b20bb20de1cRichard Smith    (*it)->printPretty(OS, Policy);
183534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  }
184534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  OS << "]] ";
185534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  PrintStmt(Node->getSubStmt(), 0);
186534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith}
187534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) {
189bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl  OS << "if (";
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(If->getCond());
191bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl  OS << ')';
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ' ';
1955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << (If->getElse() ? ' ' : '\n');
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
1985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << '\n';
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(If->getThen());
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (If->getElse()) Indent();
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Stmt *Else = If->getElse()) {
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "else";
2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawCompoundStmt(CS);
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawIfStmt(ElseIf);
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintStmt(If->getElse());
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) {
2215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
2225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawIfStmt(If);
2235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "switch (";
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Pretty print compoundstmt bodies (very common).
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(Node->getBody());
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "while (";
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")\n";
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getBody());
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) {
2498bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  Indent() << "do ";
2508bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2518bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2528bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2538bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2548bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2558bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    Indent();
2578bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman  OS << "while (";
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
261b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman  OS << ");\n";
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) {
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "for (";
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getInit()) {
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
268ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek      PrintRawDeclStmt(DS);
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintExpr(cast<Expr>(Node->getInit()));
2715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2738bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getCond()) {
2748bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getCond());
2768bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2778bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2788bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getInc()) {
2798bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getInc());
2818bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2828bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ") ";
2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2848bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2858bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2868bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2878bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2888bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2898bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2908bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
293a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
2940196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  Indent() << "for (";
2950196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
296ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    PrintRawDeclStmt(DS);
2970196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  else
2980196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintExpr(cast<Expr>(Node->getElement()));
2990196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << " in ";
3000196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  PrintExpr(Node->getCollection());
3010196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << ") ";
3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3030196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
3040196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintRawCompoundStmt(CS);
3050196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3060196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  } else {
3070196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3080196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintStmt(Node->getBody());
3090196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  }
3100196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian}
3110196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
312ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) {
313ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  Indent() << "for (";
314ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  PrintingPolicy SubPolicy(Policy);
315ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  SubPolicy.SuppressInitializers = true;
316ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel);
317ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  OS << " : ";
318ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  PrintExpr(Node->getRangeInit());
319ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  OS << ") {\n";
320ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  PrintStmt(Node->getBody());
321ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  Indent() << "}\n";
322ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith}
323ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith
324ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregorvoid StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) {
325ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  Indent();
326ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  if (Node->isIfExists())
327ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor    OS << "__if_exists (";
328ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  else
329ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor    OS << "__if_not_exists (";
330ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor
331ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  if (NestedNameSpecifier *Qualifier
332ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor        = Node->getQualifierLoc().getNestedNameSpecifier())
333ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor    Qualifier->print(OS, Policy);
334ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor
335ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  OS << Node->getNameInfo() << ") ";
336ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor
337ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor  PrintRawCompoundStmt(Node->getSubStmt());
338ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor}
339ba0513de93d2fab6db5ab30b6927209fcc883078Douglas Gregor
3405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto " << Node->getLabel()->getName() << ";\n";
3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto *";
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getTarget());
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "continue;\n";
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "break;\n";
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "return";
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRetValue()) {
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRetValue());
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ";\n";
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
368fe795956194141c91ae555985c9b930595bff43fChris Lattner
369fe795956194141c91ae555985c9b930595bff43fChris Lattnervoid StmtPrinter::VisitAsmStmt(AsmStmt *Node) {
37039c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  Indent() << "asm ";
3711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37239c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  if (Node->isVolatile())
37339c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson    OS << "volatile ";
3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37539c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  OS << "(";
3766a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  VisitStringLiteral(Node->getAsmString());
3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
378b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Outputs
379b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
380b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      Node->getNumClobbers() != 0)
381b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
384b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
385b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
3861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
387b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getOutputName(i).empty()) {
388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
389b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getOutputName(i);
390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
391b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
3921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
393b327793860737d1c103a73aeda8057dd628a101dChris Lattner    VisitStringLiteral(Node->getOutputConstraintLiteral(i));
394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
395b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getOutputExpr(i));
396b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
398b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Inputs
399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
400b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
402b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
404b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
4051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
406b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getInputName(i).empty()) {
407b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
408b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getInputName(i);
409b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
410b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
4111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
412b327793860737d1c103a73aeda8057dd628a101dChris Lattner    VisitStringLiteral(Node->getInputConstraintLiteral(i));
413b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
414b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getInputExpr(i));
415b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
417b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Clobbers
418b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumClobbers() != 0)
419b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
4201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
421b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
422b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
423b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
4241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
425b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    VisitStringLiteral(Node->getClobber(i));
426b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4286a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  OS << ");\n";
429fe795956194141c91ae555985c9b930595bff43fChris Lattner}
430fe795956194141c91ae555985c9b930595bff43fChris Lattner
4318cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosiervoid StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) {
4328cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier  // FIXME: Implement MS style inline asm statement printer.
4337bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  Indent() << "__asm ";
4347bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  if (Node->hasBraces())
4357bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier    OS << "{\n";
4367bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  OS << *(Node->getAsmString()) << "\n";
4377bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  if (Node->hasBraces())
4387bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier    Indent() << "}\n";
4398cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier}
4408cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier
441a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
4427794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  Indent() << "@try";
4437794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
4447794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    PrintRawCompoundStmt(TS);
4457794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4467794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4488f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) {
4498f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I);
4507794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    Indent() << "@catch(";
4517ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff    if (catchStmt->getCatchParamDecl()) {
4527ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff      if (Decl *DS = catchStmt->getCatchParamDecl())
4537ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff        PrintRawDecl(DS);
4547794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    }
4557794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << ")";
4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      PrintRawCompoundStmt(CS);
4581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OS << "\n";
4591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
4607794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>(
4631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        Node->getFinallyStmt())) {
4641e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    Indent() << "@finally";
4651e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
4667794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
468b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
469b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
470a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
471b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
472b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
473a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
474b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian  Indent() << "@catch (...) { /* todo */ } \n";
475b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
476b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
47778a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
47839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  Indent() << "@throw";
47939f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  if (Node->getThrowExpr()) {
48039f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    OS << " ";
48139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    PrintExpr(Node->getThrowExpr());
48239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  }
48339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  OS << ";\n";
48439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian}
48539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian
48678a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
487c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  Indent() << "@synchronized (";
488c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  PrintExpr(Node->getSynchExpr());
489c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  OS << ")";
49078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  PrintRawCompoundStmt(Node->getSynchBody());
49178a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  OS << "\n";
492c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian}
493c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian
494f85e193739c953358c865005855253af4f68a497John McCallvoid StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
495f85e193739c953358c865005855253af4f68a497John McCall  Indent() << "@autoreleasepool";
496f85e193739c953358c865005855253af4f68a497John McCall  PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt()));
497f85e193739c953358c865005855253af4f68a497John McCall  OS << "\n";
498f85e193739c953358c865005855253af4f68a497John McCall}
499f85e193739c953358c865005855253af4f68a497John McCall
5008351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
5018351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  OS << "catch (";
5024b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  if (Decl *ExDecl = Node->getExceptionDecl())
5034b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl    PrintRawDecl(ExDecl);
5044b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  else
5054b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl    OS << "...";
5064b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  OS << ") ";
5074b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock()));
5088351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl}
5098351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl
5108351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
5118351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  Indent();
5128351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  PrintRawCXXCatchStmt(Node);
5138351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  OS << "\n";
5148351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl}
5158351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl
5168351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
5178351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  Indent() << "try ";
5188351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  PrintRawCompoundStmt(Node->getTryBlock());
5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) {
5208351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    OS << " ";
5218351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    PrintRawCXXCatchStmt(Node->getHandler(i));
5228351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  }
5234b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  OS << "\n";
5244b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl}
5254b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl
52628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) {
52728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Indent() << (Node->getIsCXXTry() ? "try " : "__try ");
52828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawCompoundStmt(Node->getTryBlock());
52928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SEHExceptStmt *E = Node->getExceptHandler();
53028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SEHFinallyStmt *F = Node->getFinallyHandler();
53128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  if(E)
53228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    PrintRawSEHExceptHandler(E);
53328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  else {
53428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    assert(F && "Must have a finally block...");
53528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    PrintRawSEHFinallyStmt(F);
53628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  }
53728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
53828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
53928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
54028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) {
54128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "__finally ";
54228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawCompoundStmt(Node->getBlock());
54328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
54428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
54528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
54628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) {
54728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "__except (";
54828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  VisitExpr(Node->getFilterExpr());
54928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << ")\n";
55028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawCompoundStmt(Node->getBlock());
55128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
55228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
55328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
55428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) {
55528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Indent();
55628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawSEHExceptHandler(Node);
55728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
55828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
55928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
56028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
56128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Indent();
56228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawSEHFinallyStmt(Node);
56328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
56428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
56528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
5665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Expr printing methods.
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
571a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
572a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier->print(OS, Policy);
573e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
574e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
5752577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getNameInfo();
576096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (Node->hasExplicitTemplateArgs())
577a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    OS << TemplateSpecializationType::PrintTemplateArgumentList(
578a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                    Node->getTemplateArgs(),
579a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor                                                    Node->getNumTemplateArgs(),
580c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt                                                    Policy);
5811a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor}
5821a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
583865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitDependentScopeDeclRefExpr(
584865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                           DependentScopeDeclRefExpr *Node) {
585274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
586274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann    Qualifier->print(OS, Policy);
587e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
588e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
5892577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getNameInfo();
590f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Node->hasExplicitTemplateArgs())
591f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    OS << TemplateSpecializationType::PrintTemplateArgumentList(
592f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Node->getTemplateArgs(),
593f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Node->getNumTemplateArgs(),
594f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Policy);
5955953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
5965953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
597ba13543329afac4a0d01304ec2ec4924d99306a6John McCallvoid StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
598edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor  if (Node->getQualifier())
599edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor    Node->getQualifier()->print(OS, Policy);
600e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
601e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
6022577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getNameInfo();
603f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Node->hasExplicitTemplateArgs())
604f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall    OS << TemplateSpecializationType::PrintTemplateArgumentList(
605f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Node->getTemplateArgs(),
606edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor                                                   Node->getNumTemplateArgs(),
607f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall                                                   Policy);
608edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor}
609edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor
6107779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
611232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  if (Node->getBase()) {
612232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    PrintExpr(Node->getBase());
613232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    OS << (Node->isArrow() ? "->" : ".");
614232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  }
615b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  OS << *Node->getDecl();
6167779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff}
6177779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff
618ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
6198ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  if (Node->isSuperReceiver())
6208ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    OS << "super.";
6218ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  else if (Node->getBase()) {
622ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    PrintExpr(Node->getBase());
623ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    OS << ".";
624ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  }
6258ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian
62612f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Node->isImplicitProperty())
62712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    OS << Node->getImplicitPropertyGetter()->getSelector().getAsString();
62812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  else
62912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    OS << Node->getExplicitProperty()->getName();
6305daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian}
6315daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian
632ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
633ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
634ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  PrintExpr(Node->getBaseExpr());
635ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "[";
636ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  PrintExpr(Node->getKeyExpr());
637ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "]";
638ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
639ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
640d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
641227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  switch (Node->getIdentType()) {
642227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    default:
643b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("unknown case");
644d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Func:
645227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__func__";
646227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
647d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Function:
648227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__FUNCTION__";
649227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
65028ad063b279378b19cb0704f977429df366a151eNico Weber    case PredefinedExpr::LFunction:
65128ad063b279378b19cb0704f977429df366a151eNico Weber      OS << "L__FUNCTION__";
65228ad063b279378b19cb0704f977429df366a151eNico Weber      break;
653d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::PrettyFunction:
654227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__PRETTY_FUNCTION__";
655227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
656227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  }
657227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}
658227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
6595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
660b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  unsigned value = Node->getValue();
6615cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor
6625cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  switch (Node->getKind()) {
6635cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::Ascii: break; // no prefix.
6645cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::Wide:  OS << 'L'; break;
6655cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::UTF16: OS << 'u'; break;
6665cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::UTF32: OS << 'U'; break;
6675cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  }
6685cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor
6698bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  switch (value) {
6708bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\\':
6718bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\\\'";
6728bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6738bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\'':
6748bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\''";
6758bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6768bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\a':
6778bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    // TODO: K&R: the meaning of '\\a' is different in traditional C
6788bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\a'";
6798bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6808bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\b':
6818bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\b'";
6828bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6838bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  // Nonstandard escape sequence.
6848bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  /*case '\e':
6858bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\e'";
6868bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;*/
6878bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\f':
6888bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\f'";
6898bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6908bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\n':
6918bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\n'";
6928bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6938bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\r':
6948bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\r'";
6958bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6968bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\t':
6978bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\t'";
6988bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
6998bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\v':
7008bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\v'";
7018bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
7028bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  default:
703471733d84639fcea35d7876940d7d32fa575e158Ted Kremenek    if (value < 256 && isprint(value)) {
7048bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << "'" << (char)value << "'";
7058bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else if (value < 256) {
7068fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer      OS << "'\\x";
7078fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer      OS.write_hex(value) << "'";
7088bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    } else {
7098bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      // FIXME what to really do here?
7108bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << value;
7118bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    }
712b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  }
7135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isSigned = Node->getType()->isSignedIntegerType();
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getValue().toString(10, isSigned);
7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Emit suffixes.  Integer literals are always a builtin integer type.
720183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
721b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unexpected type for integer literal!");
72211cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  // FIXME: The Short and UShort cases are to handle cases where a short
72311cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  // integeral literal is formed during template instantiation.  They should
72411cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  // be removed when template instantiation no longer needs integer literals.
72511cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  case BuiltinType::Short:
72611cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  case BuiltinType::UShort:
7275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Int:       break; // no suffix.
7285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UInt:      OS << 'U'; break;
7295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Long:      OS << 'L'; break;
7305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULong:     OS << "UL"; break;
7315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongLong:  OS << "LL"; break;
7325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULongLong: OS << "ULL"; break;
73311cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  case BuiltinType::Int128:    OS << "i128"; break;
73411cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  case BuiltinType::UInt128:   OS << "Ui128"; break;
7355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
738f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<16> Str;
739b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman  Node->getValue().toString(Str);
740b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman  OS << Str;
7415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7425d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
7435d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
7445d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  PrintExpr(Node->getSubExpr());
7455d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  OS << "i";
7465d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}
7475d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
7485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
7498ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu  Str->outputString(OS);
7505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) {
7525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
7535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
7555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
757296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  if (!Node->isPostfix()) {
7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7607df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    // Print a space if this is an "identifier operator" like __real, or if
7617df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    // it might be concatenated incorrectly like '+'.
762296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    switch (Node->getOpcode()) {
763296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    default: break;
7642de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Real:
7652de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Imag:
7662de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
767296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      OS << ' ';
768296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      break;
7692de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Plus:
7702de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Minus:
7717df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman      if (isa<UnaryOperator>(Node->getSubExpr()))
7727df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman        OS << ' ';
7737df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman      break;
774296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    }
775296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  }
7765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
7771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->isPostfix())
7795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
780704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
781704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
7828ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorvoid StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
7838ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << "__builtin_offsetof(";
7846cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << Node->getTypeSourceInfo()->getType().getAsString(Policy) << ", ";
7858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool PrintedSomething = false;
7868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) {
7878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i);
7888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) {
7898ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      // Array node
7908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << "[";
7918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex()));
7928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << "]";
7938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintedSomething = true;
7948ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      continue;
7958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
796cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
797cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    // Skip implicit base indirections.
798cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Base)
799cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
800cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
8018ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    // Field or identifier node.
8028ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    IdentifierInfo *Id = ON.getFieldName();
8038ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (!Id)
8048ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      continue;
805c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
8068ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (PrintedSomething)
8078ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << ".";
8088ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    else
8098ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintedSomething = true;
810c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    OS << Id->getName();
8118ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
8128ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << ")";
8138ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
8148ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
815f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){
816f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(Node->getKind()) {
817f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf:
818f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    OS << "sizeof";
819f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
820f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf:
821f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    if (Policy.LangOpts.CPlusPlus)
822f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose      OS << "alignof";
823f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    else if (Policy.LangOpts.C11)
824f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose      OS << "_Alignof";
825f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    else
826f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose      OS << "__alignof";
827f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
828f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep:
829f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    OS << "vec_step";
830f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
831f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
8320518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
8336cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar    OS << "(" << Node->getArgumentType().getAsString(Policy) << ")";
8340518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  else {
8350518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    OS << " ";
8360518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    PrintExpr(Node->getArgumentExpr());
8370518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
8385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
839f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
840f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournevoid StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
841f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  OS << "_Generic(";
842f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  PrintExpr(Node->getControllingExpr());
843f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  for (unsigned i = 0; i != Node->getNumAssocs(); ++i) {
844f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    OS << ", ";
845f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    QualType T = Node->getAssocType(i);
846f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (T.isNull())
847f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      OS << "default";
848f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    else
849f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      OS << T.getAsString(Policy);
850f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    OS << ": ";
851f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    PrintExpr(Node->getAssocExpr(i));
852f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
853f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  OS << ")";
854f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
855f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
8565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
8572324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getLHS());
8585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "[";
8592324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getRHS());
8605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "]";
8615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
863d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::PrintCallArgs(CallExpr *Call) {
8645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
86504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
86604421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      // Don't print any defaulted arguments
86704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      break;
86804421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    }
86904421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
8705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) OS << ", ";
8715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Call->getArg(i));
8725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
873d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne}
874d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne
875d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::VisitCallExpr(CallExpr *Call) {
876d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne  PrintExpr(Call->getCallee());
877d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne  OS << "(";
878d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne  PrintCallArgs(Call);
8795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
8805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
8815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
882b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  // FIXME: Suppress printing implicit bases (like "this")
883b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  PrintExpr(Node->getBase());
88497fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian  if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl()))
88597fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian    if (FD->isAnonymousStructOrUnion())
88697fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian      return;
887b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  OS << (Node->isArrow() ? "->" : ".");
88883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
88983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    Qualifier->print(OS, Policy);
890e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
891e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
8922577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getMemberNameInfo();
893096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (Node->hasExplicitTemplateArgs())
894c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor    OS << TemplateSpecializationType::PrintTemplateArgumentList(
895c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor                                                    Node->getTemplateArgs(),
896c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor                                                    Node->getNumTemplateArgs(),
897c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor                                                                Policy);
8985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
899f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroffvoid StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
900f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  PrintExpr(Node->getBase());
901f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  OS << (Node->isArrow() ? "->isa" : ".isa");
902f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
903f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
904213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
90531a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  PrintExpr(Node->getBase());
90631a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << ".";
90731a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << Node->getAccessor().getName();
90831a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
9096eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
91003e80e446edac1479bab1daa14e8bd9a46bd6c52Fariborz Jahanian  OS << "(" << Node->getType().getAsString(Policy) << ")";
9115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
9125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
913aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
9146cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << "(" << Node->getType().getAsString(Policy) << ")";
915aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  PrintExpr(Node->getInitializer());
916aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}
91749b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
91890045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  // No need to print anything, simply forward to the sub expression.
91990045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  PrintExpr(Node->getSubExpr());
92049b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}
9215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
9225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
9235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
924eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getRHS());
925eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
926eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
927eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getLHS());
928eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
9295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
9305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
9325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
93356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OS << " ? ";
93456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PrintExpr(Node->getLHS());
93556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OS << " : ";
9365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
9375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions.
9405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
94156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid
94256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallStmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
94356ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PrintExpr(Node->getCommon());
94456ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OS << " ?: ";
94556ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PrintExpr(Node->getFalseExpr());
94656ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
9476481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
9485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "&&" << Node->getLabel()->getName();
9495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
951ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) {
952ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << "(";
953ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  PrintRawCompoundStmt(E->getSubStmt());
954ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << ")";
955ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}
956ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
957d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
958d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << "__builtin_choose_expr(";
959d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getCond());
96094f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
961d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getLHS());
96294f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
963d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getRHS());
964d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << ")";
965d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}
966ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
9672d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
9682d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  OS << "__null";
9692d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor}
9702d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
971d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
972d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << "__builtin_shufflevector(";
973d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
974d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    if (i) OS << ", ";
975d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    PrintExpr(Node->getExpr(i));
976d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
977d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << ")";
978e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman}
979e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
98066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
98164f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor  if (Node->getSyntacticForm()) {
98264f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor    Visit(Node->getSyntacticForm());
98364f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor    return;
98464f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor  }
98564f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor
98666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << "{ ";
98766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
98866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    if (i) OS << ", ";
9894c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    if (Node->getInit(i))
9904c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      PrintExpr(Node->getInit(i));
9914c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    else
9924c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "0";
99366b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
99466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << " }";
99566b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
99666b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
9972ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
9982ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  OS << "( ";
9992ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {
10002ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    if (i) OS << ", ";
10012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    PrintExpr(Node->getExpr(i));
10022ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  }
10032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  OS << " )";
10042ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
10052ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
100605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
10074c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(),
10084c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor                      DEnd = Node->designators_end();
10094c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor       D != DEnd; ++D) {
10104c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    if (D->isFieldDesignator()) {
10114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      if (D->getDotLoc().isInvalid())
10124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << D->getFieldName()->getName() << ":";
10134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      else
10144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << "." << D->getFieldName()->getName();
10154c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    } else {
10164c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "[";
10174c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      if (D->isArrayDesignator()) {
10184c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        PrintExpr(Node->getArrayIndex(*D));
10194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      } else {
10204c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        PrintExpr(Node->getArrayRangeStart(*D));
10214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << " ... ";
10221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        PrintExpr(Node->getArrayRangeEnd(*D));
10234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      }
10244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "]";
10254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    }
10264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  }
10274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
10284c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  OS << " = ";
10294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  PrintExpr(Node->getInit());
103005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
103105c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
10323498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
1033e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  if (Policy.LangOpts.CPlusPlus)
10344fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    OS << "/*implicit*/" << Node->getType().getAsString(Policy) << "()";
10354fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  else {
10364fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    OS << "/*implicit*/(" << Node->getType().getAsString(Policy) << ")";
10374fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    if (Node->getType()->isRecordType())
10384fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      OS << "{}";
10394fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    else
10404fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      OS << 0;
10414fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
10423498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}
10433498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
10447c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
104542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  OS << "__builtin_va_arg(";
10467c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  PrintExpr(Node->getSubExpr());
10477c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ", ";
10486cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << Node->getType().getAsString(Policy);
10497c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ")";
10507c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
10517c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
10524b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
10534b9c2d235fb9449e249d74f48ecfec601650de93John McCall  PrintExpr(Node->getSyntacticForm());
10544b9c2d235fb9449e249d74f48ecfec601650de93John McCall}
10554b9c2d235fb9449e249d74f48ecfec601650de93John McCall
1056276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
10579e3c20b2b600af7b2b8c65fb12362ba2046caf10Eli Friedman  const char *Name = 0;
1058276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  switch (Node->getOp()) {
1059ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#define BUILTIN(ID, TYPE, ATTRS)
1060ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1061ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  case AtomicExpr::AO ## ID: \
1062ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    Name = #ID "("; \
1063ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    break;
1064ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#include "clang/Basic/Builtins.def"
1065276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1066276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  OS << Name;
1067ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1068ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // AtomicExpr stores its subexpressions in a permuted order.
1069276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  PrintExpr(Node->getPtr());
1070276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  OS << ", ";
1071ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1072ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      Node->getOp() != AtomicExpr::AO__atomic_load_n) {
1073276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    PrintExpr(Node->getVal1());
1074276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    OS << ", ";
1075276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1076ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1077ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      Node->isCmpXChg()) {
1078276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    PrintExpr(Node->getVal2());
1079276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    OS << ", ";
1080276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1081ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1082ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1083ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    PrintExpr(Node->getWeak());
1084ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    OS << ", ";
1085ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
1086ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() != AtomicExpr::AO__c11_atomic_init)
10877a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall    PrintExpr(Node->getOrder());
1088276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (Node->isCmpXChg()) {
1089276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    OS << ", ";
1090276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    PrintExpr(Node->getOrderFail());
1091276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1092276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  OS << ")";
1093276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
1094276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
10955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++
1096b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
1097b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  const char *OpStrings[NUM_OVERLOADED_OPERATORS] = {
1098b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    "",
1099b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
1100b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    Spelling,
1101b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def"
1102b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  };
1103b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
1104b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  OverloadedOperatorKind Kind = Node->getOperator();
1105b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
1106b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    if (Node->getNumArgs() == 1) {
1107b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << OpStrings[Kind] << ' ';
1108b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
1109b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    } else {
1110b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
1111b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << ' ' << OpStrings[Kind];
1112b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
1113b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Call) {
1114b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1115b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '(';
1116b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) {
1117b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (ArgIdx > 1)
1118b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        OS << ", ";
1119b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx)))
1120b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        PrintExpr(Node->getArg(ArgIdx));
1121b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
1122b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ')';
1123b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Subscript) {
1124b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1125b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '[';
1126b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
1127b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ']';
1128b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 1) {
1129b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << OpStrings[Kind] << ' ';
1130b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1131b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 2) {
1132b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1133b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ' ' << OpStrings[Kind] << ' ';
1134b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
1135b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else {
1136b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("unknown overloaded operator");
1137b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  }
1138b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
11395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
114088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
114188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  VisitCallExpr(cast<CallExpr>(Node));
114288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor}
114388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
1144e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournevoid StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
1145e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  PrintExpr(Node->getCallee());
1146e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  OS << "<<<";
1147e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  PrintCallArgs(Node->getConfig());
1148e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  OS << ">>>(";
1149e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  PrintCallArgs(Node);
1150e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  OS << ")";
1151e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
1152e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
115349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
115449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  OS << Node->getCastName() << '<';
11556cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << Node->getTypeAsWritten().getAsString(Policy) << ">(";
11565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
11575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
11585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
116049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
116149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
116249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
116349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
116449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
116549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
116649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
116749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
116849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
116949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
117049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
117149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
117249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
117349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
117449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
117549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
1176c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
1177c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << "typeid(";
1178c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  if (Node->isTypeOperand()) {
11796cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar    OS << Node->getTypeOperand().getAsString(Policy);
1180c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  } else {
1181c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    PrintExpr(Node->getExprOperand());
1182c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
1183c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << ")";
1184c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}
1185c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
118601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetvoid StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
118701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  OS << "__uuidof(";
118801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (Node->isTypeOperand()) {
118901b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    OS << Node->getTypeOperand().getAsString(Policy);
119001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  } else {
119101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    PrintExpr(Node->getExprOperand());
119201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
119301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  OS << ")";
119401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
119501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
11969fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithvoid StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
11979fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  switch (Node->getLiteralOperatorKind()) {
11989fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Raw:
1199ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    OS << cast<StringLiteral>(Node->getArg(0)->IgnoreImpCasts())->getString();
12009fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    break;
12019fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Template: {
1202ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    DeclRefExpr *DRE = cast<DeclRefExpr>(Node->getCallee()->IgnoreImpCasts());
1203ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    const TemplateArgumentList *Args =
1204ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith      cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
1205ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    assert(Args);
1206ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    const TemplateArgument &Pack = Args->get(0);
1207ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    for (TemplateArgument::pack_iterator I = Pack.pack_begin(),
1208ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith                                         E = Pack.pack_end(); I != E; ++I) {
1209855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      char C = (char)I->getAsIntegral().getZExtValue();
12109fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith      OS << C;
12119fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    }
12129fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    break;
12139fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  }
1214916883004c36291b70355d5e73abb05e138804fbRichard Smith  case UserDefinedLiteral::LOK_Integer: {
1215916883004c36291b70355d5e73abb05e138804fbRichard Smith    // Print integer literal without suffix.
1216916883004c36291b70355d5e73abb05e138804fbRichard Smith    IntegerLiteral *Int = cast<IntegerLiteral>(Node->getCookedLiteral());
1217916883004c36291b70355d5e73abb05e138804fbRichard Smith    OS << Int->getValue().toString(10, /*isSigned*/false);
1218916883004c36291b70355d5e73abb05e138804fbRichard Smith    break;
1219916883004c36291b70355d5e73abb05e138804fbRichard Smith  }
12209fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Floating:
12219fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_String:
12229fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Character:
12239fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    PrintExpr(Node->getCookedLiteral());
12249fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    break;
12259fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  }
12269fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  OS << Node->getUDSuffix()->getName();
12279fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}
12289fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
12295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
12305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->getValue() ? "true" : "false");
12315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
12325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12336e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
12346e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  OS << "nullptr";
12356e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}
12366e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
1237796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
1238796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  OS << "this";
1239796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}
1240796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
124150dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
124250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  if (Node->getSubExpr() == 0)
124350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw";
124450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  else {
124550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw ";
124650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    PrintExpr(Node->getSubExpr());
124750dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  }
124850dd289f45738ed22b7583d52ed2525b927042ffChris Lattner}
124950dd289f45738ed22b7583d52ed2525b927042ffChris Lattner
125004421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
125104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner  // Nothing to print: we picked up the default argument
125204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner}
125304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
1254987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
12556cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << Node->getType().getAsString(Policy);
1256987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << "(";
1257987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  PrintExpr(Node->getSubExpr());
1258987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << ")";
1259987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
1260987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
1261fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonvoid StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
1262eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  PrintExpr(Node->getSubExpr());
1263eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
1264eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
1265506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
12666cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << Node->getType().getAsString(Policy);
1267506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << "(";
1268506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(),
12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                         ArgEnd = Node->arg_end();
1270506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor       Arg != ArgEnd; ++Arg) {
1271506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    if (Arg != Node->arg_begin())
1272506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor      OS << ", ";
1273506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    PrintExpr(*Arg);
1274506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  }
1275506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << ")";
1276506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor}
1277506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
127801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorvoid StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) {
127901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  OS << '[';
128001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  bool NeedComma = false;
128101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  switch (Node->getCaptureDefault()) {
128201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCD_None:
128301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
128401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
128501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCD_ByCopy:
128601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << '=';
128701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = true;
128801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
128901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
129001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCD_ByRef:
129101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << '&';
129201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = true;
129301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
129401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
129501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  for (LambdaExpr::capture_iterator C = Node->explicit_capture_begin(),
129601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                                 CEnd = Node->explicit_capture_end();
129701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor       C != CEnd;
129801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor       ++C) {
129901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    if (NeedComma)
130001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << ", ";
130101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = true;
130201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
130301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    switch (C->getCaptureKind()) {
130401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    case LCK_This:
130501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << "this";
130601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      break;
130701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
130801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    case LCK_ByRef:
130901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      if (Node->getCaptureDefault() != LCD_ByRef)
131001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << '&';
131101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << C->getCapturedVar()->getName();
131201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      break;
131301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
131401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    case LCK_ByCopy:
131501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      if (Node->getCaptureDefault() != LCD_ByCopy)
131601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << '=';
131701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << C->getCapturedVar()->getName();
131801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      break;
131901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
132001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
132101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  OS << ']';
132201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
132301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  if (Node->hasExplicitParameters()) {
132401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << " (";
132501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    CXXMethodDecl *Method = Node->getCallOperator();
132601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = false;
132701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    for (CXXMethodDecl::param_iterator P = Method->param_begin(),
132801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                                    PEnd = Method->param_end();
132901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor         P != PEnd; ++P) {
133001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      if (NeedComma) {
133101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << ", ";
133201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      } else {
133301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        NeedComma = true;
133401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      }
133501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      std::string ParamStr = (*P)->getNameAsString();
133601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      (*P)->getOriginalType().getAsStringInternal(ParamStr, Policy);
133701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << ParamStr;
133801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
133901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    if (Method->isVariadic()) {
134001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      if (NeedComma)
134101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << ", ";
134201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << "...";
134301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
134401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << ')';
134501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
134601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    if (Node->isMutable())
134701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << " mutable";
134801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
134901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    const FunctionProtoType *Proto
135001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      = Method->getType()->getAs<FunctionProtoType>();
135101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    {
135201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      std::string ExceptionSpec;
135301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      Proto->printExceptionSpecification(ExceptionSpec, Policy);
135401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << ExceptionSpec;
135501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
135601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
135701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    // FIXME: Attributes
135801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
1359dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor    // Print the trailing return type if it was specified in the source.
1360dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor    if (Node->hasExplicitResultType())
1361dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor      OS << " -> " << Proto->getResultType().getAsString(Policy);
136201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
136301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
136401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // Print the body.
136501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  CompoundStmt *Body = Node->getBody();
136601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  OS << ' ';
136701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  PrintStmt(Body);
136801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
136901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
1370ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregorvoid StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
1371ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo())
1372ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    OS << TSInfo->getType().getAsString(Policy) << "()";
1373ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  else
1374ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor    OS << Node->getType().getAsString(Policy) << "()";
1375987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
1376987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
13774c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
13784c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalNew())
13794c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
13804c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "new ";
13814c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned NumPlace = E->getNumPlacementArgs();
13824c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (NumPlace > 0) {
13834c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
13844c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    PrintExpr(E->getPlacementArg(0));
13854c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    for (unsigned i = 1; i < NumPlace; ++i) {
13864c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      OS << ", ";
13874c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      PrintExpr(E->getPlacementArg(i));
13884c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    }
13894c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ") ";
13904c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
13914c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
13924c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
13936fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  std::string TypeS;
13946fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  if (Expr *Size = E->getArraySize()) {
13956fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    llvm::raw_string_ostream s(TypeS);
1396d1420c6fa788669e49f21e184927c7833881e399Richard Smith    Size->printPretty(s, Helper, Policy);
13976fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    s.flush();
13986fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    TypeS = "[" + TypeS + "]";
13996fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  }
1400d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor  E->getAllocatedType().getAsStringInternal(TypeS, Policy);
14016fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  OS << TypeS;
14024c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
14034c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ")";
14044c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
14052aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle();
14062aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  if (InitStyle) {
14072aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (InitStyle == CXXNewExpr::CallInit)
14082aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl      OS << "(";
14092aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    PrintExpr(E->getInitializer());
14102aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (InitStyle == CXXNewExpr::CallInit)
14112aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl      OS << ")";
14124c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
14134c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
14144c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
14154c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
14164c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalDelete())
14174c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
14184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "delete ";
14194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isArrayForm())
14204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "[] ";
14214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  PrintExpr(E->getArgument());
14224c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
14234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
1424a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1425a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  PrintExpr(E->getBase());
1426a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->isArrow())
1427a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    OS << "->";
1428a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  else
1429a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    OS << '.';
1430a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier())
1431a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    E->getQualifier()->print(OS, Policy);
14321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1433a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  std::string TypeS;
1434a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (IdentifierInfo *II = E->getDestroyedTypeIdentifier())
1435a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    OS << II->getName();
1436a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  else
1437a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    E->getDestroyedType().getAsStringInternal(TypeS, Policy);
1438a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  OS << TypeS;
1439a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
1440a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
1441e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1442d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor  for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
1443d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    if (isa<CXXDefaultArgExpr>(E->getArg(i))) {
1444d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor      // Don't print any defaulted arguments
1445d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor      break;
1446d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    }
1447d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor
1448d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    if (i) OS << ", ";
1449d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    PrintExpr(E->getArg(i));
1450c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian  }
1451e349bea668622ef31bd51a229960a73d69940709Anders Carlsson}
1452e349bea668622ef31bd51a229960a73d69940709Anders Carlsson
14534765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
145402bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  // Just forward to the sub expression.
145502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  PrintExpr(E->getSubExpr());
145602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson}
145702bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
14581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
1459d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr(
1460d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                           CXXUnresolvedConstructExpr *Node) {
14616cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << Node->getTypeAsWritten().getAsString(Policy);
1462d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << "(";
1463d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(),
14641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             ArgEnd = Node->arg_end();
1465d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor       Arg != ArgEnd; ++Arg) {
1466d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    if (Arg != Node->arg_begin())
1467d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor      OS << ", ";
1468d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    PrintExpr(*Arg);
1469d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  }
1470d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << ")";
1471d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}
1472d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor
1473865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitCXXDependentScopeMemberExpr(
1474865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                         CXXDependentScopeMemberExpr *Node) {
1475aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Node->isImplicitAccess()) {
1476aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    PrintExpr(Node->getBase());
1477aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OS << (Node->isArrow() ? "->" : ".");
1478aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1479a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1480a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier->print(OS, Policy);
1481e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
14823b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OS << "template ";
14832577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getMemberNameInfo();
1484aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (Node->hasExplicitTemplateArgs()) {
14853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OS << TemplateSpecializationType::PrintTemplateArgumentList(
14863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                    Node->getTemplateArgs(),
14873b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                    Node->getNumTemplateArgs(),
14883b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor                                                    Policy);
14893b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  }
14901c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}
14911c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor
1492129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallvoid StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
1493aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Node->isImplicitAccess()) {
1494aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    PrintExpr(Node->getBase());
1495aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OS << (Node->isArrow() ? "->" : ".");
1496aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1497129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1498129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier->print(OS, Policy);
1499e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
1500e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
15012577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getMemberNameInfo();
1502129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (Node->hasExplicitTemplateArgs()) {
1503129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    OS << TemplateSpecializationType::PrintTemplateArgumentList(
1504129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                    Node->getTemplateArgs(),
1505129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                    Node->getNumTemplateArgs(),
1506129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall                                                    Policy);
1507129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  }
1508129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
1509129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
151064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlstatic const char *getTypeTraitName(UnaryTypeTrait UTT) {
151164b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  switch (UTT) {
151264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasNothrowAssign:      return "__has_nothrow_assign";
151364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasNothrowConstructor: return "__has_nothrow_constructor";
151420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_HasNothrowCopy:          return "__has_nothrow_copy";
151564b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasTrivialAssign:      return "__has_trivial_assign";
1516023df37c27ee8035664fb62f206ca58f4e2a169dSean Hunt  case UTT_HasTrivialDefaultConstructor: return "__has_trivial_constructor";
151720c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_HasTrivialCopy:          return "__has_trivial_copy";
151864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasTrivialDestructor:  return "__has_trivial_destructor";
151964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_HasVirtualDestructor:  return "__has_virtual_destructor";
152064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsAbstract:            return "__is_abstract";
152120c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsArithmetic:            return "__is_arithmetic";
152220c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsArray:                 return "__is_array";
152364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsClass:               return "__is_class";
152420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsCompleteType:          return "__is_complete_type";
152520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsCompound:              return "__is_compound";
152620c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsConst:                 return "__is_const";
152764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsEmpty:               return "__is_empty";
152864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsEnum:                return "__is_enum";
15295e9392ba18f5925e26cc5714d1412eda0d219826Douglas Gregor  case UTT_IsFinal:                 return "__is_final";
153020c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsFloatingPoint:         return "__is_floating_point";
153120c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsFunction:              return "__is_function";
153220c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsFundamental:           return "__is_fundamental";
153320c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsIntegral:              return "__is_integral";
1534e194710fcd012df67a2694477ef8ce5a19bf376cChandler Carruth  case UTT_IsLiteral:               return "__is_literal";
153520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsLvalueReference:       return "__is_lvalue_reference";
153620c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsMemberFunctionPointer: return "__is_member_function_pointer";
153720c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsMemberObjectPointer:   return "__is_member_object_pointer";
153820c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsMemberPointer:         return "__is_member_pointer";
153920c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsObject:                return "__is_object";
154064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsPOD:                 return "__is_pod";
154120c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsPointer:               return "__is_pointer";
154264b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsPolymorphic:         return "__is_polymorphic";
154320c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsReference:             return "__is_reference";
154420c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsRvalueReference:       return "__is_rvalue_reference";
154520c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsScalar:                return "__is_scalar";
154620c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsSigned:                return "__is_signed";
154720c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsStandardLayout:        return "__is_standard_layout";
154820c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsTrivial:               return "__is_trivial";
1549feb375d31b7e9108b04a9f55b721d5e0c793a558Sean Hunt  case UTT_IsTriviallyCopyable:     return "__is_trivially_copyable";
155064b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  case UTT_IsUnion:               return "__is_union";
155120c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsUnsigned:              return "__is_unsigned";
155220c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsVoid:                  return "__is_void";
155320c0da7787c9a7d2529e42a4a91d777778595d74John Wiegley  case UTT_IsVolatile:              return "__is_volatile";
155464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  }
1555e194710fcd012df67a2694477ef8ce5a19bf376cChandler Carruth  llvm_unreachable("Type trait not covered by switch statement");
15566ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet}
15576ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
15586ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichetstatic const char *getTypeTraitName(BinaryTypeTrait BTT) {
15596ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  switch (BTT) {
156025d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor  case BTT_IsBaseOf:              return "__is_base_of";
156125d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor  case BTT_IsConvertible:         return "__is_convertible";
156225d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor  case BTT_IsSame:                return "__is_same";
156325d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor  case BTT_TypeCompatible:        return "__builtin_types_compatible_p";
156425d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor  case BTT_IsConvertibleTo:       return "__is_convertible_to";
156525d0a0f67d9e949ffbfc57bf487012f5cbfd886eDouglas Gregor  case BTT_IsTriviallyAssignable: return "__is_trivially_assignable";
15666ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  }
1567a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth  llvm_unreachable("Binary type trait not covered by switch");
156864b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl}
156964b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
15704ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorstatic const char *getTypeTraitName(TypeTrait TT) {
15714ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  switch (TT) {
15724ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  case clang::TT_IsTriviallyConstructible:return "__is_trivially_constructible";
15734ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  }
15744ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  llvm_unreachable("Type trait not covered by switch");
15754ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
15764ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
157721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleystatic const char *getTypeTraitName(ArrayTypeTrait ATT) {
157821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  switch (ATT) {
157921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  case ATT_ArrayRank:        return "__array_rank";
158021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  case ATT_ArrayExtent:      return "__array_extent";
158121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  }
1582a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth  llvm_unreachable("Array type trait not covered by switch");
158321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
158421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1585552622067dc45013d240f73952fece703f5e63bdJohn Wiegleystatic const char *getExpressionTraitName(ExpressionTrait ET) {
1586552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  switch (ET) {
1587552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  case ET_IsLValueExpr:      return "__is_lvalue_expr";
1588552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  case ET_IsRValueExpr:      return "__is_rvalue_expr";
1589552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  }
1590a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth  llvm_unreachable("Expression type trait not covered by switch");
1591552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1592552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
159364b45f7e0d3167f040841ac2920aead7f080730dSebastian Redlvoid StmtPrinter::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
159464b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl  OS << getTypeTraitName(E->getTrait()) << "("
15956cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar     << E->getQueriedType().getAsString(Policy) << ")";
159664b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl}
159764b45f7e0d3167f040841ac2920aead7f080730dSebastian Redl
15986ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichetvoid StmtPrinter::VisitBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) {
15996ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet  OS << getTypeTraitName(E->getTrait()) << "("
16006ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet     << E->getLhsType().getAsString(Policy) << ","
16016ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet     << E->getRhsType().getAsString(Policy) << ")";
16026ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet}
16036ad6f2848d7652ab2991286eb48be440d3493b28Francois Pichet
16044ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorvoid StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
16054ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  OS << getTypeTraitName(E->getTrait()) << "(";
16064ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
16074ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    if (I > 0)
16084ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor      OS << ", ";
16094ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    OS << E->getArg(I)->getType().getAsString(Policy);
16104ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  }
16114ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  OS << ")";
16124ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
16134ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
161421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyvoid StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
161521ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  OS << getTypeTraitName(E->getTrait()) << "("
161621ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley     << E->getQueriedType().getAsString(Policy) << ")";
161721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
161821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1619552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyvoid StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
1620552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    OS << getExpressionTraitName(E->getTrait()) << "(";
1621552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    PrintExpr(E->getQueriedExpression());
1622552622067dc45013d240f73952fece703f5e63bdJohn Wiegley    OS << ")";
1623552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1624552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
16252e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlvoid StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
16262e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  OS << "noexcept(";
16272e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  PrintExpr(E->getOperand());
16282e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  OS << ")";
16292e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}
16302e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
1631ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
1632be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  PrintExpr(E->getPattern());
1633be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  OS << "...";
1634be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
1635be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1636ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1637a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer  OS << "sizeof...(" << *E->getPack() << ")";
1638ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
1639ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
1640c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
1641c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                       SubstNonTypeTemplateParmPackExpr *Node) {
1642a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer  OS << *Node->getParameterPack();
1643c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
1644c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
164591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallvoid StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
164691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall                                       SubstNonTypeTemplateParmExpr *Node) {
164791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  Visit(Node->getReplacement());
164891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall}
164991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall
165003e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
165103e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  PrintExpr(Node->GetTemporaryExpr());
165203e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}
165303e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
16541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// Obj-C
16555508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
16565508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
16575508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  OS << "@";
16585508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  VisitStringLiteral(Node->getString());
16595508518a2702b00be3b15a26d772bde968972f54Anders Carlsson}
16605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1661eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beardvoid StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
1662ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "@";
1663eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard  Visit(E->getSubExpr());
1664ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1665ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1666ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
1667ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "@[ ";
1668ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  StmtRange ch = E->children();
1669ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (ch.first != ch.second) {
1670ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    while (1) {
1671ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      Visit(*ch.first);
1672ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      ++ch.first;
1673ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      if (ch.first == ch.second) break;
1674ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      OS << ", ";
1675ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    }
1676ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  }
1677ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " ]";
1678ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1679ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1680ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
1681ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "@{ ";
1682ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
1683ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    if (I > 0)
1684ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      OS << ", ";
1685ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1686ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    ObjCDictionaryElement Element = E->getKeyValueElement(I);
1687ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    Visit(Element.Key);
1688ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " : ";
1689ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    Visit(Element.Value);
1690ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    if (Element.isPackExpansion())
1691ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      OS << "...";
1692ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  }
1693ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " }";
1694ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1695ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1696f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
16976cb5b5fde5188af722d25d5bb80d05edf67578b2Daniel Dunbar  OS << "@encode(" << Node->getEncodedType().getAsString(Policy) << ')';
1698f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
1699f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
1700b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
170139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner  OS << "@selector(" << Node->getSelector().getAsString() << ')';
1702b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
1703b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
1704390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
1705b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  OS << "@protocol(" << *Node->getProtocol() << ')';
1706390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
1707390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
1708563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
1709563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "[";
171004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Mess->getReceiverKind()) {
171104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
171204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    PrintExpr(Mess->getInstanceReceiver());
171304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
171404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
171504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
171604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << Mess->getClassReceiver().getAsString(Policy);
171704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
171804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
171904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance:
172004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
172104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << "Super";
172204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
172304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
172404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
1725c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek  OS << ' ';
172697b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek  Selector selector = Mess->getSelector();
17276a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (selector.isUnarySelector()) {
1728813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor    OS << selector.getNameForSlot(0);
17296a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  } else {
17306a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
1731c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      if (i < selector.getNumArgs()) {
1732c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (i > 0) OS << ' ';
1733c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (selector.getIdentifierInfoForSlot(i))
173439f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner          OS << selector.getIdentifierInfoForSlot(i)->getName() << ':';
1735c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        else
1736c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek           OS << ":";
1737c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      }
1738c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      else OS << ", "; // Handle variadic methods.
17391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17406a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff      PrintExpr(Mess->getArg(i));
17416a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    }
1742563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  }
1743563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "]";
1744563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
1745563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
1746ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
1747ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << (Node->getValue() ? "__objc_yes" : "__objc_no");
1748ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1749ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1750f85e193739c953358c865005855253af4f68a497John McCallvoid
1751f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
1752f85e193739c953358c865005855253af4f68a497John McCall  PrintExpr(E->getSubExpr());
1753f85e193739c953358c865005855253af4f68a497John McCall}
1754f85e193739c953358c865005855253af4f68a497John McCall
1755f85e193739c953358c865005855253af4f68a497John McCallvoid
1756f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
1757f85e193739c953358c865005855253af4f68a497John McCall  OS << "(" << E->getBridgeKindName() << E->getType().getAsString(Policy)
1758f85e193739c953358c865005855253af4f68a497John McCall     << ")";
1759f85e193739c953358c865005855253af4f68a497John McCall  PrintExpr(E->getSubExpr());
1760f85e193739c953358c865005855253af4f68a497John McCall}
1761cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
17624eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
176356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  BlockDecl *BD = Node->getBlockDecl();
17644eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  OS << "^";
17651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
17664eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  const FunctionType *AFT = Node->getFunctionType();
17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
176872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (isa<FunctionNoProtoType>(AFT)) {
17694eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << "()";
177072564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
17714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << '(';
17724eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    std::string ParamStr;
177356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    for (BlockDecl::param_iterator AI = BD->param_begin(),
177456ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff         E = BD->param_end(); AI != E; ++AI) {
177556ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (AI != BD->param_begin()) OS << ", ";
177639f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner      ParamStr = (*AI)->getNameAsString();
1777d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      (*AI)->getType().getAsStringInternal(ParamStr, Policy);
17784eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << ParamStr;
17794eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
17801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
178172564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    const FunctionProtoType *FT = cast<FunctionProtoType>(AFT);
17824eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    if (FT->isVariadic()) {
178356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (!BD->param_empty()) OS << ", ";
17844eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << "...";
17854eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
17864eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << ')';
17874eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  }
17884eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
17894eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
1790381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenekvoid StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
1791381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek  PrintExpr(Node->getSourceExpr());
1792381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek}
17937cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
179461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnervoid StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
179561eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  OS << "__builtin_astype(";
179661eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  PrintExpr(Node->getSrcExpr());
179761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  OS << ", " << Node->getType().getAsString();
179861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  OS << ")";
179961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner}
180061eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner
18015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
18025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations
18035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
18045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1805d1420c6fa788669e49f21e184927c7833881e399Richard Smithvoid Stmt::dumpPretty(ASTContext &Context) const {
1806d1420c6fa788669e49f21e184927c7833881e399Richard Smith  printPretty(llvm::errs(), 0, PrintingPolicy(Context.getLangOpts()));
18075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
18085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1809d1420c6fa788669e49f21e184927c7833881e399Richard Smithvoid Stmt::printPretty(raw_ostream &OS,
1810d1420c6fa788669e49f21e184927c7833881e399Richard Smith                       PrinterHelper *Helper,
1811d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                       const PrintingPolicy &Policy,
1812d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                       unsigned Indentation) const {
18135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (this == 0) {
18145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "<NULL>";
18155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return;
18165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
18175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1818d1420c6fa788669e49f21e184927c7833881e399Richard Smith  if (Policy.DumpSourceManager) {
1819d1420c6fa788669e49f21e184927c7833881e399Richard Smith    dump(OS, *Policy.DumpSourceManager);
18204fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    return;
18214fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
18221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1823d1420c6fa788669e49f21e184927c7833881e399Richard Smith  StmtPrinter P(OS, Helper, Policy, Indentation);
1824c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
18255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
182642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
182742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
182842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper
182942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
183042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
183142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor.
18328467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {}
1833