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"
162fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/Attr.h"
171a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor#include "clang/AST/DeclCXX.h"
1891d1d7a448bbde955e15ec39aa368958673450bfTed Kremenek#include "clang/AST/DeclObjC.h"
19c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor#include "clang/AST/DeclTemplate.h"
208ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor#include "clang/AST/Expr.h"
21ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor#include "clang/AST/ExprCXX.h"
222fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/PrettyPrinter.h"
232fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer#include "clang/AST/StmtVisitor.h"
246d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose#include "clang/Basic/CharInfo.h"
258fe83e1df954d72c0f4ffc15d20a5222ec151c21Benjamin Kramer#include "llvm/ADT/SmallString.h"
266d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose#include "llvm/Support/Format.h"
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// StmtPrinter Visitor
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace  {
34770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class StmtPrinter : public StmtVisitor<StmtPrinter> {
355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &OS;
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    unsigned IndentLevel;
3742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    clang::PrinterHelper* Helper;
38d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    PrintingPolicy Policy;
39d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  public:
41d1420c6fa788669e49f21e184927c7833881e399Richard Smith    StmtPrinter(raw_ostream &os, PrinterHelper* helper,
42e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner                const PrintingPolicy &Policy,
43d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                unsigned Indentation = 0)
44d1420c6fa788669e49f21e184927c7833881e399Richard Smith      : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy) {}
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
46d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    void PrintStmt(Stmt *S) {
47d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      PrintStmt(S, Policy.Indentation);
48d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    }
49d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
50d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    void PrintStmt(Stmt *S, int SubIndent) {
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel += SubIndent;
525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (S && isa<Expr>(S)) {
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        // If this is an expr used in a stmt context, indent and newline it.
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent();
55c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << ";\n";
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else if (S) {
58c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(S);
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      } else {
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        Indent() << "<<<NULL STATEMENT>>>\n";
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      }
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      IndentLevel -= SubIndent;
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
64db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawCompoundStmt(CompoundStmt *S);
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawDecl(Decl *D);
67915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    void PrintRawDeclStmt(const DeclStmt *S);
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintRawIfStmt(IfStmt *If);
698351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
70d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne    void PrintCallArgs(CallExpr *E);
7128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    void PrintRawSEHExceptHandler(SEHExceptStmt *S);
7228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    void PrintOMPExecutableDirective(OMPExecutableDirective *S);
741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    void PrintExpr(Expr *E) {
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      if (E)
77c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner        Visit(E);
785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      else
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer        OS << "<null expr>";
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &Indent(int Delta = 0) {
83d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor      for (int i = 0, e = IndentLevel+Delta; i < e; ++i)
84d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor        OS << "  ";
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      return OS;
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    void Visit(Stmt* S) {
8942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      if (Helper && Helper->handledStmt(S,OS))
9042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek          return;
9142a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek      else StmtVisitor<StmtPrinter>::Visit(S);
9242a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek    }
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
9461e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth    void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED {
9578e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis      Indent() << "<<unknown stmt type>>\n";
9678e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis    }
9761e38285c54d5f3cad610cb421fad1504373e082Chandler Carruth    void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED {
9878e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis      OS << "<<unknown expr type>>";
9978e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis    }
10078e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis    void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10278e4cc70cf4ffc8c537e0a72fbe653b127eed358Argyrios Kyrtzidis#define ABSTRACT_STMT(CLASS)
103f2cad8633e46cce12fc3d77c0bd451ffd7264bafDouglas Gregor#define STMT(CLASS, PARENT) \
104c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void Visit##CLASS(CLASS *Node);
1054bfe1968410ea8ffe3b4f629addd7c4bcf484765Sean Hunt#include "clang/AST/StmtNodes.inc"
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  };
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Stmt printing methods.
1115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// with no newline after the }.
1155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) {
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "{\n";
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (auto *I : Node->body())
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrintStmt(I);
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "}";
1215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawDecl(Decl *D) {
124f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis  D->print(OS, Policy, IndentLevel);
125071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump}
126071e4da10b07ca5278a7ce9dcabd853e0d57e5a4Mike Stump
127915c07db05375d563187f8b75fa4f766a5220b75Eli Friedmanvoid StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) {
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SmallVector<Decl*, 2> Decls(S->decls());
129f1d60eaf3f70975ee262852af2d6aeabd140ed58Argyrios Kyrtzidis  Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel);
130ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek}
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitNullStmt(NullStmt *Node) {
1335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << ";\n";
1345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
137db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  Indent();
138db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  PrintRawDeclStmt(Node);
139db23b154bb62e95e63c6412965835a510c7771d1Eli Friedman  OS << ";\n";
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawCompoundStmt(Node);
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "\n";
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
1495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "case ";
1505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRHS()) {
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ... ";
1535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRHS());
1545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ":\n";
1561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
1615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << "default:\n";
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
1665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent(-1) << Node->getName() << ":\n";
1675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getSubStmt(), 0);
1685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
170534986f2b21e6050bf00163cd6423fd92155a6edRichard Smithvoid StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
171ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  for (const auto *Attr : Node->getAttrs()) {
1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Attr->printPretty(OS, Policy);
173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
175534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith  PrintStmt(Node->getSubStmt(), 0);
176534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith}
177534986f2b21e6050bf00163cd6423fd92155a6edRichard Smith
1785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::PrintRawIfStmt(IfStmt *If) {
179bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl  OS << "if (";
180915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman  if (const DeclStmt *DS = If->getConditionVariableDeclStmt())
181915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    PrintRawDeclStmt(DS);
182915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman  else
183915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    PrintExpr(If->getCond());
184bfee9b2d909b80ef56b49980665016b9eecacf12Sebastian Redl  OS << ')';
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
1875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << ' ';
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
1895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << (If->getElse() ? ' ' : '\n');
1905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
1915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << '\n';
1925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(If->getThen());
1935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (If->getElse()) Indent();
1945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Stmt *Else = If->getElse()) {
1975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "else";
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
2005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawCompoundStmt(CS);
2025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
2045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << ' ';
2055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintRawIfStmt(ElseIf);
2065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else {
2075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      OS << '\n';
2085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintStmt(If->getElse());
2095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
2105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIfStmt(IfStmt *If) {
2145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent();
2155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintRawIfStmt(If);
2165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
2195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "switch (";
220915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman  if (const DeclStmt *DS = Node->getConditionVariableDeclStmt())
221915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    PrintRawDeclStmt(DS);
222915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman  else
223915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    PrintExpr(Node->getCond());
2245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Pretty print compoundstmt bodies (very common).
2275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
2295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintRawCompoundStmt(CS);
2305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  } else {
2325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << "\n";
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintStmt(Node->getBody());
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "while (";
239915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman  if (const DeclStmt *DS = Node->getConditionVariableDeclStmt())
240915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    PrintRawDeclStmt(DS);
241915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman  else
242915c07db05375d563187f8b75fa4f766a5220b75Eli Friedman    PrintExpr(Node->getCond());
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")\n";
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintStmt(Node->getBody());
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDoStmt(DoStmt *Node) {
2488bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  Indent() << "do ";
2498bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2508bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2518bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2528bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2538bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2548bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2558bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    Indent();
2568bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
258b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman  OS << "while (";
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
260b3e229694a5d1966fcf604073e82b0057eb3114aEli Friedman  OS << ");\n";
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitForStmt(ForStmt *Node) {
2645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "for (";
2655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getInit()) {
2665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
267ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek      PrintRawDeclStmt(DS);
2685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else
2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      PrintExpr(cast<Expr>(Node->getInit()));
2705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2718bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2728bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getCond()) {
2738bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getCond());
2758bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2768bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ";";
2778bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (Node->getInc()) {
2788bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << " ";
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getInc());
2808bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2818bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  OS << ") ";
2821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2838bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
2848bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintRawCompoundStmt(CS);
2858bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2868bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  } else {
2878bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    OS << "\n";
2888bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner    PrintStmt(Node->getBody());
2898bdcc47d2686009bfb3dbef6dcdc9f79c12b03b1Chris Lattner  }
2905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
2915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
292a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
2930196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  Indent() << "for (";
2940196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
295ecd64c5e53012ab7b1fdc64094a24f83c9893581Ted Kremenek    PrintRawDeclStmt(DS);
2960196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  else
2970196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintExpr(cast<Expr>(Node->getElement()));
2980196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << " in ";
2990196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  PrintExpr(Node->getCollection());
3000196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  OS << ") ";
3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3020196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
3030196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintRawCompoundStmt(CS);
3040196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3050196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  } else {
3060196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    OS << "\n";
3070196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian    PrintStmt(Node->getBody());
3080196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian  }
3090196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian}
3100196cab54007ff072ec2642da8911c6b7e8d3fb5Fariborz Jahanian
311ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smithvoid StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) {
312ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  Indent() << "for (";
313ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  PrintingPolicy SubPolicy(Policy);
314ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  SubPolicy.SuppressInitializers = true;
315ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel);
316ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  OS << " : ";
317ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  PrintExpr(Node->getRangeInit());
318ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  OS << ") {\n";
319ad762fcdc16b9e4705b12b09d92b8c026212b906Richard Smith  PrintStmt(Node->getBody());
320651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Indent() << "}";
321651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\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) {
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Indent() << "goto " << Node->getLabel()->getName() << ";";
342651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\n";
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "goto *";
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getTarget());
348651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ";";
349651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\n";
3505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
353651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Indent() << "continue;";
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\n";
3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
358651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Indent() << "break;";
359651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\n";
3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  Indent() << "return";
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->getRetValue()) {
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << " ";
3675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Node->getRetValue());
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
369651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ";";
370651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\n";
3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
373fe795956194141c91ae555985c9b930595bff43fChris Lattner
374df5faf5e7ae6823d0af0b801c4ac26d47f2cee97Chad Rosiervoid StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) {
37539c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  Indent() << "asm ";
3761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
37739c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  if (Node->isVolatile())
37839c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson    OS << "volatile ";
3791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
38039c47b56f45437bbc49c9568b7308a400234a730Anders Carlsson  OS << "(";
3816a0ef4b83c91a6d6d5acb4ed5577c4659fe022a3Anders Carlsson  VisitStringLiteral(Node->getAsmString());
3821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
383b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Outputs
384b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
385b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      Node->getNumClobbers() != 0)
386b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
3871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
388b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
389b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
390b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
3911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
392b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getOutputName(i).empty()) {
393b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
394b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getOutputName(i);
395b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
396b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
398b327793860737d1c103a73aeda8057dd628a101dChris Lattner    VisitStringLiteral(Node->getOutputConstraintLiteral(i));
399b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
400b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getOutputExpr(i));
401b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
4021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
403b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Inputs
404b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
405b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
407b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
408b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
409b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
4101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
411b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (!Node->getInputName(i).empty()) {
412b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << '[';
413b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << Node->getInputName(i);
414b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << "] ";
415b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    }
4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
417b327793860737d1c103a73aeda8057dd628a101dChris Lattner    VisitStringLiteral(Node->getInputConstraintLiteral(i));
418b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " ";
419b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    Visit(Node->getInputExpr(i));
420b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
4211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
422b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  // Clobbers
423b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  if (Node->getNumClobbers() != 0)
424b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    OS << " : ";
4251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
426b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
427b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson    if (i != 0)
428b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson      OS << ", ";
4291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4305c7f59445ae68109c7ffee731aca2ce32db587c7Chad Rosier    VisitStringLiteral(Node->getClobberStringLiteral(i));
431b235fc2cf37621c7fc6511bb2b8788c95f9fb9fcAnders Carlsson  }
4321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ");";
434651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Policy.IncludeNewlines) OS << "\n";
435fe795956194141c91ae555985c9b930595bff43fChris Lattner}
436fe795956194141c91ae555985c9b930595bff43fChris Lattner
4378cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosiervoid StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) {
4388cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier  // FIXME: Implement MS style inline asm statement printer.
4397bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  Indent() << "__asm ";
4407bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  if (Node->hasBraces())
4417bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier    OS << "{\n";
442aeeacf725c9e0ddd64ea9764bd008e5b6873ce51John McCall  OS << Node->getAsmString() << "\n";
4437bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier  if (Node->hasBraces())
4447bd092b054444e9800e8de1d8d71c408dbdc8eadChad Rosier    Indent() << "}\n";
4458cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier}
4468cd64b4c5553fa6284d248336cb7c82dc960a394Chad Rosier
447051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Sirajvoid StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) {
4486afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj  PrintStmt(Node->getCapturedDecl()->getBody());
449051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj}
450051303ce09291dfbed537fa33b0d8a4d92c82b75Tareq A. Siraj
451a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
4527794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  Indent() << "@try";
4537794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
4547794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    PrintRawCompoundStmt(TS);
4557794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4567794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4588f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) {
4598f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I);
4607794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    Indent() << "@catch(";
4617ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff    if (catchStmt->getCatchParamDecl()) {
4627ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff      if (Decl *DS = catchStmt->getCatchParamDecl())
4637ba138abd329e591a8f6d5001f60dd7082f71b3bSteve Naroff        PrintRawDecl(DS);
4647794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    }
4657794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << ")";
4661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
4671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      PrintRawCompoundStmt(CS);
4681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      OS << "\n";
4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
4707794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian  }
4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>(
4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        Node->getFinallyStmt())) {
4741e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    Indent() << "@finally";
4751e7eab4ca34f8a0c076a6783f48e768923a10070Fariborz Jahanian    PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
4767794cb85d394750db0631c02b7aa7837ae56764cFariborz Jahanian    OS << "\n";
4771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  }
478b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
479b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
480a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
481b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
482b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
483a526c5c67e5a0473c340903ee542ce570119665fTed Kremenekvoid StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
484b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian  Indent() << "@catch (...) { /* todo */ } \n";
485b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian}
486b210bd0404f84b99259c9987d347a44d3c202238Fariborz Jahanian
48778a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
48839f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  Indent() << "@throw";
48939f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  if (Node->getThrowExpr()) {
49039f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    OS << " ";
49139f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian    PrintExpr(Node->getThrowExpr());
49239f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  }
49339f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian  OS << ";\n";
49439f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian}
49539f8f159c488a900e5958d5aab3e467af9ec8a2bFariborz Jahanian
49678a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanianvoid StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
497c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  Indent() << "@synchronized (";
498c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  PrintExpr(Node->getSynchExpr());
499c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian  OS << ")";
50078a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  PrintRawCompoundStmt(Node->getSynchBody());
50178a677bbb5fa115fa0995b5783adeeefad67167eFariborz Jahanian  OS << "\n";
502c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian}
503c385c90c68dfa376650e2facfbb444b2ec9bd110Fariborz Jahanian
504f85e193739c953358c865005855253af4f68a497John McCallvoid StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
505f85e193739c953358c865005855253af4f68a497John McCall  Indent() << "@autoreleasepool";
506f85e193739c953358c865005855253af4f68a497John McCall  PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt()));
507f85e193739c953358c865005855253af4f68a497John McCall  OS << "\n";
508f85e193739c953358c865005855253af4f68a497John McCall}
509f85e193739c953358c865005855253af4f68a497John McCall
5108351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
5118351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  OS << "catch (";
5124b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  if (Decl *ExDecl = Node->getExceptionDecl())
5134b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl    PrintRawDecl(ExDecl);
5144b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  else
5154b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl    OS << "...";
5164b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  OS << ") ";
5174b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock()));
5188351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl}
5198351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl
5208351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
5218351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  Indent();
5228351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  PrintRawCXXCatchStmt(Node);
5238351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  OS << "\n";
5248351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl}
5258351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl
5268351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redlvoid StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
5278351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  Indent() << "try ";
5288351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  PrintRawCompoundStmt(Node->getTryBlock());
5291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) {
5308351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    OS << " ";
5318351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl    PrintRawCXXCatchStmt(Node->getHandler(i));
5328351da06ca3082dfd49dd8e3c1785a986920f57cSebastian Redl  }
5334b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl  OS << "\n";
5344b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl}
5354b07b2968f87f3cd5a3d8c76145f1cbfd718d42dSebastian Redl
53628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) {
53728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Indent() << (Node->getIsCXXTry() ? "try " : "__try ");
53828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawCompoundStmt(Node->getTryBlock());
53928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SEHExceptStmt *E = Node->getExceptHandler();
54028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  SEHFinallyStmt *F = Node->getFinallyHandler();
54128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  if(E)
54228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    PrintRawSEHExceptHandler(E);
54328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  else {
54428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    assert(F && "Must have a finally block...");
54528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley    PrintRawSEHFinallyStmt(F);
54628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  }
54728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
54828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
54928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
55028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) {
55128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "__finally ";
55228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawCompoundStmt(Node->getBlock());
55328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
55428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
55528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
55628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) {
55728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "__except (";
55828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  VisitExpr(Node->getFilterExpr());
559568ba871bbac959029671b81f8e531edb7e0d7d6Joao Matos  OS << ")\n";
56028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawCompoundStmt(Node->getBlock());
56128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
56228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
56328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
56428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) {
56528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Indent();
56628bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawSEHExceptHandler(Node);
56728bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
56828bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
56928bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
57028bbe4b8acc338476fe0825769b41fb32b423c72John Wiegleyvoid StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
57128bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  Indent();
57228bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  PrintRawSEHFinallyStmt(Node);
57328bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley  OS << "\n";
57428bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley}
57528bbe4b8acc338476fe0825769b41fb32b423c72John Wiegley
576ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) {
577ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "__leave;";
578ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Policy.IncludeNewlines) OS << "\n";
579ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
580ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
5824fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//  OpenMP clauses printing methods
5834fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===//
5844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
5854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevnamespace {
5864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevclass OMPClausePrinter : public OMPClauseVisitor<OMPClausePrinter> {
5874fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  raw_ostream &OS;
588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const PrintingPolicy &Policy;
589543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  /// \brief Process clauses with list of variables.
590543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  template <typename T>
591543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  void VisitOMPClauseList(T *Node, char StartSym);
5924fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevpublic:
593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy)
594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    : OS(OS), Policy(Policy) { }
5954fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#define OPENMP_CLAUSE(Name, Class)                              \
5964fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  void Visit##Class(Class *S);
5974fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Basic/OpenMPKinds.def"
5984fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev};
5994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) {
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << "if(";
6026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Node->getCondition()->printPretty(OS, nullptr, Policy, 0);
603651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ")";
604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPNumThreadsClause(OMPNumThreadsClause *Node) {
607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << "num_threads(";
6086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Node->getNumThreads()->printPretty(OS, nullptr, Policy, 0);
609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ")";
610651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
611651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
612651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPSafelenClause(OMPSafelenClause *Node) {
613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << "safelen(";
6146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Node->getSafelen()->printPretty(OS, nullptr, Policy, 0);
6156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OS << ")";
6166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
6176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
6186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClausePrinter::VisitOMPCollapseClause(OMPCollapseClause *Node) {
6196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OS << "collapse(";
6206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Node->getNumForLoops()->printPretty(OS, nullptr, Policy, 0);
621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ")";
622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6244fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) {
6254fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OS << "default("
6264fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev     << getOpenMPSimpleClauseTypeName(OMPC_default, Node->getDefaultKind())
6274fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev     << ")";
6284fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
6294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
6306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) {
6316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  OS << "proc_bind("
6326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, Node->getProcBindKind())
6336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines     << ")";
6346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
6356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
636ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) {
637ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  OS << "schedule("
638ef8225444452a1486bd721f3285301fe84643b00Stephen Hines     << getOpenMPSimpleClauseTypeName(OMPC_schedule, Node->getScheduleKind());
639ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Node->getChunkSize()) {
640ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << ", ";
641ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Node->getChunkSize()->printPretty(OS, nullptr, Policy);
642ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
643ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  OS << ")";
644ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
645ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
646ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *) {
647ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  OS << "ordered";
648ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
649ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
650ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) {
651ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  OS << "nowait";
652ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
653ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
654543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevtemplate<typename T>
655543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataevvoid OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) {
656543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev  for (typename T::varlist_iterator I = Node->varlist_begin(),
657543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev                                    E = Node->varlist_end();
658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         I != E; ++I) {
659ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    assert(*I && "Expected non-null Stmt");
660651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(*I)) {
661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      OS << (I == Node->varlist_begin() ? StartSym : ',');
662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      cast<NamedDecl>(DRE->getDecl())->printQualifiedName(OS);
663651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      OS << (I == Node->varlist_begin() ? StartSym : ',');
6656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      (*I)->printPretty(OS, nullptr, Policy, 0);
666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
668543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev}
6694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
6704fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataevvoid OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) {
6714fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  if (!Node->varlist_empty()) {
6724fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    OS << "private";
673543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev    VisitOMPClauseList(Node, '(');
6744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    OS << ")";
6750c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  }
6760c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev}
6770c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev
678d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataevvoid OMPClausePrinter::VisitOMPFirstprivateClause(OMPFirstprivateClause *Node) {
679d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  if (!Node->varlist_empty()) {
680d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev    OS << "firstprivate";
681d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev    VisitOMPClauseList(Node, '(');
682d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev    OS << ")";
683d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev  }
684d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev}
685d195bc38fd424b0c928e3c354038a8ca6e2ccac3Alexey Bataev
686ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPLastprivateClause(OMPLastprivateClause *Node) {
687ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (!Node->varlist_empty()) {
688ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << "lastprivate";
689ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    VisitOMPClauseList(Node, '(');
690ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << ")";
691ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
692ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
693ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
6940c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataevvoid OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) {
6950c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev  if (!Node->varlist_empty()) {
6960c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev    OS << "shared";
697543c4ae954f2bce5ac58ed22080f23cbd94794d2Alexey Bataev    VisitOMPClauseList(Node, '(');
6980c018357b8bbb1f96bbf622a5807421e626b4228Alexey Bataev    OS << ")";
6994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
7004fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
7014fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
702ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPReductionClause(OMPReductionClause *Node) {
703ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (!Node->varlist_empty()) {
704ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << "reduction(";
705ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    NestedNameSpecifier *QualifierLoc =
706ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        Node->getQualifierLoc().getNestedNameSpecifier();
707ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OverloadedOperatorKind OOK =
708ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        Node->getNameInfo().getName().getCXXOverloadedOperator();
709ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (QualifierLoc == nullptr && OOK != OO_None) {
710ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      // Print reduction identifier in C format
711ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      OS << getOperatorSpelling(OOK);
712ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    } else {
713ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      // Use C++ format
714ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      if (QualifierLoc != nullptr)
715ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        QualifierLoc->print(OS, Policy);
716ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      OS << Node->getNameInfo();
717ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
718ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << ":";
719ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    VisitOMPClauseList(Node, ' ');
720ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << ")";
721ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
722ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
723ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
7246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid OMPClausePrinter::VisitOMPLinearClause(OMPLinearClause *Node) {
7256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Node->varlist_empty()) {
7266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OS << "linear";
7276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    VisitOMPClauseList(Node, '(');
7286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Node->getStep() != nullptr) {
7296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OS << ": ";
7306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Node->getStep()->printPretty(OS, nullptr, Policy, 0);
7316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
7326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OS << ")";
7336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
7346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
7356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
736ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPAlignedClause(OMPAlignedClause *Node) {
737ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (!Node->varlist_empty()) {
738ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << "aligned";
739ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    VisitOMPClauseList(Node, '(');
740ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (Node->getAlignment() != nullptr) {
741ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      OS << ": ";
742ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Node->getAlignment()->printPretty(OS, nullptr, Policy, 0);
743ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
744ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << ")";
745ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
746ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
747ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid OMPClausePrinter::VisitOMPCopyinClause(OMPCopyinClause *Node) {
749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!Node->varlist_empty()) {
750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    OS << "copyin";
751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    VisitOMPClauseList(Node, '(');
752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    OS << ")";
753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
756ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid OMPClausePrinter::VisitOMPCopyprivateClause(OMPCopyprivateClause *Node) {
757ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (!Node->varlist_empty()) {
758ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << "copyprivate";
759ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    VisitOMPClauseList(Node, '(');
760ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OS << ")";
761ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
762ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
763ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
7644fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
7654fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
7664fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===//
7674fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//  OpenMP directives printing methods
7684fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===//
7694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S) {
771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OMPClausePrinter Printer(OS, Policy);
772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<OMPClause *> Clauses = S->clauses();
7734fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev       I != E; ++I)
7754fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (*I && !(*I)->isImplicit()) {
7764fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Printer.Visit(*I);
7774fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      OS << ' ';
7784fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
7794fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OS << "\n";
780651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (S->getAssociatedStmt()) {
781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(isa<CapturedStmt>(S->getAssociatedStmt()) &&
7824fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev           "Expected captured statement!");
783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Stmt *CS = cast<CapturedStmt>(S->getAssociatedStmt())->getCapturedStmt();
7844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    PrintStmt(CS);
7854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
7864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Indent() << "#pragma omp parallel ";
790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  PrintOMPExecutableDirective(Node);
791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) {
794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Indent() << "#pragma omp simd ";
795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  PrintOMPExecutableDirective(Node);
796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
798ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) {
799ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "#pragma omp for ";
800ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  PrintOMPExecutableDirective(Node);
801ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
802ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
803ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) {
804ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "#pragma omp sections ";
805ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  PrintOMPExecutableDirective(Node);
806ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
807ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
808ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) {
809ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "#pragma omp section";
810ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  PrintOMPExecutableDirective(Node);
811ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
812ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
813ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) {
814ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "#pragma omp single ";
815ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  PrintOMPExecutableDirective(Node);
816ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
817ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
818ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) {
819ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "#pragma omp parallel for ";
820ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  PrintOMPExecutableDirective(Node);
821ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
822ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
823ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid StmtPrinter::VisitOMPParallelSectionsDirective(
824ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    OMPParallelSectionsDirective *Node) {
825ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Indent() << "#pragma omp parallel sections ";
826ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  PrintOMPExecutableDirective(Node);
827ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
828ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
8294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev//===----------------------------------------------------------------------===//
8305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  Expr printing methods.
8315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
8325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
834a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
835a2813cec2605ce7878d1b13471d685f689b251afDouglas Gregor    Qualifier->print(OS, Policy);
836e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
837e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
8382577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getNameInfo();
839096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (Node->hasExplicitTemplateArgs())
8405eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(
8415eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy);
8421a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor}
8431a49af9681c350fef58e677f85ccb9a77e8e9d0aDouglas Gregor
844865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitDependentScopeDeclRefExpr(
845865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                           DependentScopeDeclRefExpr *Node) {
846274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
847274f83c2ece9041a1994fc3eacfe812ca86095e8Axel Naumann    Qualifier->print(OS, Policy);
848e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
849e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
8502577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getNameInfo();
851f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Node->hasExplicitTemplateArgs())
8525eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(
8535eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy);
8545953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor}
8555953d8b37f92f0cf548941f617c9b0a7703df33bDouglas Gregor
856ba13543329afac4a0d01304ec2ec4924d99306a6John McCallvoid StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
857edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor  if (Node->getQualifier())
858edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor    Node->getQualifier()->print(OS, Policy);
859e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
860e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
8612577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getNameInfo();
862f7a1a744eba4b29ceb0f20af8f34515d892fdd64John McCall  if (Node->hasExplicitTemplateArgs())
8635eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(
8645eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy);
865edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor}
866edce4dd44732dfad69f28822dddcf2b8e92b4483Douglas Gregor
8677779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroffvoid StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
868232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  if (Node->getBase()) {
869232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    PrintExpr(Node->getBase());
870232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian    OS << (Node->isArrow() ? "->" : ".");
871232220c6982e3a70d8f7fc06a011ead490a2f516Fariborz Jahanian  }
872b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  OS << *Node->getDecl();
8737779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff}
8747779db42c94405ecbd6ee45efb293483fa6cbeffSteve Naroff
875ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroffvoid StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
8768ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  if (Node->isSuperReceiver())
8778ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    OS << "super.";
878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else if (Node->isObjectReceiver() && Node->getBase()) {
879ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    PrintExpr(Node->getBase());
880ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff    OS << ".";
881651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else if (Node->isClassReceiver() && Node->getClassReceiver()) {
882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    OS << Node->getClassReceiver()->getName() << ".";
883ae7840776d6cd31b4d7a4a345b61bcbb3744df6cSteve Naroff  }
8848ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian
88512f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Node->isImplicitProperty())
886651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Node->getImplicitPropertyGetter()->getSelector().print(OS);
88712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  else
88812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    OS << Node->getExplicitProperty()->getName();
8895daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian}
8905daf570d0ce027e18ed5f9d66e6b2a14a40b720dFariborz Jahanian
891ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
892ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
893ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  PrintExpr(Node->getBaseExpr());
894ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "[";
895ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  PrintExpr(Node->getKeyExpr());
896ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "]";
897ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
898ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
899d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
900227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  switch (Node->getIdentType()) {
901227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson    default:
902b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("unknown case");
903d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Func:
904227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__func__";
905227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
906d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::Function:
907227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__FUNCTION__";
908227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
909bafa74f360cb3ec82fa8c688845330f491d167fdDavid Majnemer    case PredefinedExpr::FuncDName:
910bafa74f360cb3ec82fa8c688845330f491d167fdDavid Majnemer      OS << "__FUNCDNAME__";
911bafa74f360cb3ec82fa8c688845330f491d167fdDavid Majnemer      break;
9126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case PredefinedExpr::FuncSig:
9136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OS << "__FUNCSIG__";
9146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      break;
91528ad063b279378b19cb0704f977429df366a151eNico Weber    case PredefinedExpr::LFunction:
91628ad063b279378b19cb0704f977429df366a151eNico Weber      OS << "L__FUNCTION__";
91728ad063b279378b19cb0704f977429df366a151eNico Weber      break;
918d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    case PredefinedExpr::PrettyFunction:
919227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      OS << "__PRETTY_FUNCTION__";
920227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson      break;
921227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson  }
922227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson}
923227426661be33ff3e21f2b6b9f97971da2da044fAnders Carlsson
9245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
925b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  unsigned value = Node->getValue();
9265cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor
9275cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  switch (Node->getKind()) {
9285cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::Ascii: break; // no prefix.
9295cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::Wide:  OS << 'L'; break;
9305cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::UTF16: OS << 'u'; break;
9315cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  case CharacterLiteral::UTF32: OS << 'U'; break;
9325cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor  }
9335cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor
9348bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  switch (value) {
9358bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\\':
9368bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\\\'";
9378bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9388bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\'':
9398bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\''";
9408bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9418bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\a':
9428bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    // TODO: K&R: the meaning of '\\a' is different in traditional C
9438bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\a'";
9448bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9458bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\b':
9468bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\b'";
9478bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9488bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  // Nonstandard escape sequence.
9498bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  /*case '\e':
9508bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\e'";
9518bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;*/
9528bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\f':
9538bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\f'";
9548bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9558bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\n':
9568bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\n'";
9578bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9588bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\r':
9598bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\r'";
9608bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9618bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\t':
9628bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\t'";
9638bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9648bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  case '\v':
9658bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    OS << "'\\v'";
9668bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner    break;
9678bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner  default:
9686d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose    if (value < 256 && isPrintable((unsigned char)value))
9698bf9f079f11997df432b0b711be97b72cc497ffaChris Lattner      OS << "'" << (char)value << "'";
9706d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose    else if (value < 256)
9716d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose      OS << "'\\x" << llvm::format("%02x", value) << "'";
9726d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose    else if (value <= 0xFFFF)
9736d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose      OS << "'\\u" << llvm::format("%04x", value) << "'";
9746d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose    else
9756d4f73498cf014b002e72368f1c80b6b0a0785f0Jordan Rose      OS << "'\\U" << llvm::format("%08x", value) << "'";
976b0a721a51a85b7b1ea9b33dbe12f4a58232590e2Chris Lattner  }
9775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
9785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
9795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
9805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  bool isSigned = Node->getType()->isSignedIntegerType();
9815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << Node->getValue().toString(10, isSigned);
9821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Emit suffixes.  Integer literals are always a builtin integer type.
984183700f494ec9b6701b6efe82bcb25f4c79ba561John McCall  switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
985b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unexpected type for integer literal!");
986ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  case BuiltinType::SChar:     OS << "i8"; break;
987ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  case BuiltinType::UChar:     OS << "Ui8"; break;
988ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  case BuiltinType::Short:     OS << "i16"; break;
989ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  case BuiltinType::UShort:    OS << "Ui16"; break;
9905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Int:       break; // no suffix.
9915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::UInt:      OS << 'U'; break;
9925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::Long:      OS << 'L'; break;
9935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULong:     OS << "UL"; break;
9945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::LongLong:  OS << "LL"; break;
9955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case BuiltinType::ULongLong: OS << "ULL"; break;
99611cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  case BuiltinType::Int128:    OS << "i128"; break;
99711cbe2a7fb565678fca456f6bc2d4648ced3adb3Richard Trieu  case BuiltinType::UInt128:   OS << "Ui128"; break;
9985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
9995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1000a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer
1001a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramerstatic void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node,
1002a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer                                 bool PrintSuffix) {
1003f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<16> Str;
1004b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman  Node->getValue().toString(Str);
1005b390921e55db36ee0ab1ca203c166f0f8c96f631Eli Friedman  OS << Str;
1006a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  if (Str.find_first_not_of("-0123456789") == StringRef::npos)
1007a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer    OS << '.'; // Trailing dot in order to separate from ints.
1008a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer
1009a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  if (!PrintSuffix)
1010a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer    return;
1011a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer
1012a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  // Emit suffixes.  Float literals are always a builtin float type.
1013a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
1014a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  default: llvm_unreachable("Unexpected type for float literal!");
1015a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  case BuiltinType::Half:       break; // FIXME: suffix?
1016a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  case BuiltinType::Double:     break; // no suffix.
1017a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  case BuiltinType::Float:      OS << 'F'; break;
1018a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  case BuiltinType::LongDouble: OS << 'L'; break;
1019a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  }
1020a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer}
1021a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer
1022a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramervoid StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
1023a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  PrintFloatingLiteral(OS, Node, /*PrintSuffix=*/true);
10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10255d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
10265d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattnervoid StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
10275d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  PrintExpr(Node->getSubExpr());
10285d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner  OS << "i";
10295d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner}
10305d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
10328ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu  Str->outputString(OS);
10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitParenExpr(ParenExpr *Node) {
10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "(";
10365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
10375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
10385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
10395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
1040296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  if (!Node->isPostfix()) {
10415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
10421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10437df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    // Print a space if this is an "identifier operator" like __real, or if
10447df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman    // it might be concatenated incorrectly like '+'.
1045296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    switch (Node->getOpcode()) {
1046296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    default: break;
10472de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Real:
10482de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Imag:
10492de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Extension:
1050296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      OS << ' ';
1051296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner      break;
10522de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Plus:
10532de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall    case UO_Minus:
10547df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman      if (isa<UnaryOperator>(Node->getSubExpr()))
10557df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman        OS << ' ';
10567df71ac778e5918883c826fdb3fff7d0feffc677Eli Friedman      break;
1057296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner    }
1058296bf19bf8a2ddcaecd0b3a3dc234b612e6482cfChris Lattner  }
10595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
10601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (Node->isPostfix())
10625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
1063704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner}
1064704fe35d13c6c7c17ee8472da2321211fc5197c9Chris Lattner
10658ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregorvoid StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
10668ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << "__builtin_offsetof(";
10679d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getTypeSourceInfo()->getType().print(OS, Policy);
10689d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ", ";
10698ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  bool PrintedSomething = false;
10708ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) {
10718ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    OffsetOfExpr::OffsetOfNode ON = Node->getComponent(i);
10728ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Array) {
10738ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      // Array node
10748ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << "[";
10758ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex()));
10768ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << "]";
10778ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintedSomething = true;
10788ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      continue;
10798ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    }
1080cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
1081cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    // Skip implicit base indirections.
1082cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor    if (ON.getKind() == OffsetOfExpr::OffsetOfNode::Base)
1083cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor      continue;
1084cc8a5d5f90bbbbcb46f342117b851b7e07ec34f1Douglas Gregor
10858ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    // Field or identifier node.
10868ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    IdentifierInfo *Id = ON.getFieldName();
10878ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (!Id)
10888ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      continue;
1089c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt
10908ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    if (PrintedSomething)
10918ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      OS << ".";
10928ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor    else
10938ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor      PrintedSomething = true;
1094c302113179a1c2b1254224ea9b6f5316ceeb375cSean Hunt    OS << Id->getName();
10958ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  }
10968ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor  OS << ")";
10978ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor}
10988ecdb65716cd7914ffb2eeee993fa9039fcd31e8Douglas Gregor
1099f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){
1100f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(Node->getKind()) {
1101f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf:
1102f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    OS << "sizeof";
1103f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
1104f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf:
1105f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    if (Policy.LangOpts.CPlusPlus)
1106f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose      OS << "alignof";
1107f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    else if (Policy.LangOpts.C11)
1108f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose      OS << "_Alignof";
1109f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    else
1110f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose      OS << "__alignof";
1111f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
1112f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep:
1113f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    OS << "vec_step";
1114f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
1115f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
11169d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  if (Node->isArgumentType()) {
11179d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    OS << '(';
11189d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    Node->getArgumentType().print(OS, Policy);
11199d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    OS << ')';
11209d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  } else {
11210518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    OS << " ";
11220518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    PrintExpr(Node->getArgumentExpr());
11230518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  }
11245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1125f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
1126f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbournevoid StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
1127f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  OS << "_Generic(";
1128f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  PrintExpr(Node->getControllingExpr());
1129f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  for (unsigned i = 0; i != Node->getNumAssocs(); ++i) {
1130f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    OS << ", ";
1131f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    QualType T = Node->getAssocType(i);
1132f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    if (T.isNull())
1133f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne      OS << "default";
1134f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    else
11359d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer      T.print(OS, Policy);
1136f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    OS << ": ";
1137f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne    PrintExpr(Node->getAssocExpr(i));
1138f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  }
1139f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne  OS << ")";
1140f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
1141f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne
11425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
11432324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getLHS());
11445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "[";
11452324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek  PrintExpr(Node->getRHS());
11465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "]";
11475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1149d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::PrintCallArgs(CallExpr *Call) {
11505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
115104421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
115204421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      // Don't print any defaulted arguments
115304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner      break;
115404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner    }
115504421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
11565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (i) OS << ", ";
11575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    PrintExpr(Call->getArg(i));
11585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1159d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne}
1160d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne
1161d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbournevoid StmtPrinter::VisitCallExpr(CallExpr *Call) {
1162d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne  PrintExpr(Call->getCallee());
1163d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne  OS << "(";
1164d64e237f2099b23237d0ed4dd077a286c263e007Peter Collingbourne  PrintCallArgs(Call);
11655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
11665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
11675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
1168b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  // FIXME: Suppress printing implicit bases (like "this")
1169b3eef68111ffc220e449be96da1747998c057790Douglas Gregor  PrintExpr(Node->getBase());
1170383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie
1171383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie  MemberExpr *ParentMember = dyn_cast<MemberExpr>(Node->getBase());
1172731de313f759bdb412d38df3d2a0f149437ef401David Blaikie  FieldDecl  *ParentDecl   = ParentMember
11736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl()) : nullptr;
1174383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie
1175731de313f759bdb412d38df3d2a0f149437ef401David Blaikie  if (!ParentDecl || !ParentDecl->isAnonymousStructOrUnion())
1176383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie    OS << (Node->isArrow() ? "->" : ".");
1177383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie
117897fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian  if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl()))
117997fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian    if (FD->isAnonymousStructOrUnion())
118097fd83a8d827400afda3c5fba0840c1f10007239Fariborz Jahanian      return;
1181383ec17ecaac9ac4fce2747640623274a139badfDavid Blaikie
118283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
118383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor    Qualifier->print(OS, Policy);
1184e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
1185e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
11862577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getMemberNameInfo();
1187096832c5ed5b9106fa177ebc148489760c3bc496John McCall  if (Node->hasExplicitTemplateArgs())
11885eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(
11895eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy);
11905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1191f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroffvoid StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
1192f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  PrintExpr(Node->getBase());
1193f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff  OS << (Node->isArrow() ? "->isa" : ".isa");
1194f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff}
1195f242b1b0c4e998911cb96b2ba7e27ab4a5abaed3Steve Naroff
1196213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
119731a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  PrintExpr(Node->getBase());
119831a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << ".";
119931a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff  OS << Node->getAccessor().getName();
120031a458462c6cf417a84e0c47852b18fb22d79acbSteve Naroff}
12016eec8e883de118b431e3ead5b1e604a6ac68ff6bDouglas Gregorvoid StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
12029d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << '(';
12039d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getTypeAsWritten().print(OS, Policy);
12049d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ')';
12055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
12065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1207aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroffvoid StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
12089d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << '(';
12099d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getType().print(OS, Policy);
12109d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ')';
1211aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff  PrintExpr(Node->getInitializer());
1212aff1edd84aaafef15b737acd8ec61abcca6d6bc3Steve Naroff}
121349b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroffvoid StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
1214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // No need to print anything, simply forward to the subexpression.
121590045e8ebabf50d6f1b3a67081a621b20b5e5341Steve Naroff  PrintExpr(Node->getSubExpr());
121649b4526992a8c8a6a290aa3efa9828154a24af8dSteve Naroff}
12175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
12185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getLHS());
12195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
1220eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getRHS());
1221eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
1222eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
1223eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  PrintExpr(Node->getLHS());
1224eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner  OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
12255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
12265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
12275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
12285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getCond());
122956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OS << " ? ";
123056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PrintExpr(Node->getLHS());
123156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OS << " : ";
12325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getRHS());
12335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
12345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
12355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// GNU extensions.
12365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
123756ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallvoid
123856ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCallStmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
123956ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PrintExpr(Node->getCommon());
124056ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  OS << " ?: ";
124156ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall  PrintExpr(Node->getFalseExpr());
124256ca35d396d8692c384c785f9aeebcf22563fe1eJohn McCall}
12436481a57fefbf1a313ff439028470fe4c27a3b7a3Chris Lattnervoid StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
12445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << "&&" << Node->getLabel()->getName();
12455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
12465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1247ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattnervoid StmtPrinter::VisitStmtExpr(StmtExpr *E) {
1248ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << "(";
1249ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  PrintRawCompoundStmt(E->getSubStmt());
1250ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner  OS << ")";
1251ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner}
1252ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
1253d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroffvoid StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
1254d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << "__builtin_choose_expr(";
1255d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getCond());
125694f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
1257d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getLHS());
125894f05e36488fd08e404ac409d3bcb1db1da1bd4dChris Lattner  OS << ", ";
1259d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  PrintExpr(Node->getRHS());
1260d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff  OS << ")";
1261d04fdd5f99f985abf2e7b7d7d4d427eebe001e55Steve Naroff}
1262ab18c4c0ac1a46a38aa84c2c8ea485612e21a614Chris Lattner
12632d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregorvoid StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
12642d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor  OS << "__null";
12652d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor}
12662d8b273470684a9cd47f0ce24743cc1f71ef7cbcDouglas Gregor
1267d38617c8a50f9729c254ab76cd359af797c6739bEli Friedmanvoid StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
1268d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << "__builtin_shufflevector(";
1269d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
1270d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    if (i) OS << ", ";
1271d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman    PrintExpr(Node->getExpr(i));
1272d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  }
1273d38617c8a50f9729c254ab76cd359af797c6739bEli Friedman  OS << ")";
1274e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman}
1275e2ce1d9440186cf3332368291cd884a6e3ae8946Nate Begeman
1276414a1bdbdaf250e0488589f12865c8961831b65dHal Finkelvoid StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) {
1277414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  OS << "__builtin_convertvector(";
1278414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  PrintExpr(Node->getSrcExpr());
1279414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  OS << ", ";
1280414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  Node->getType().print(OS, Policy);
1281414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel  OS << ")";
1282414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel}
1283414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel
128466b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlssonvoid StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
128564f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor  if (Node->getSyntacticForm()) {
128664f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor    Visit(Node->getSyntacticForm());
128764f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor    return;
128864f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor  }
128964f650062fbe5e2bc6fb6d341c46a2ec0284694fDouglas Gregor
129066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << "{ ";
129166b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
129266b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson    if (i) OS << ", ";
12934c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    if (Node->getInit(i))
12944c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      PrintExpr(Node->getInit(i));
12954c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    else
12964c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "0";
129766b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  }
129866b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson  OS << " }";
129966b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson}
130066b5a8a39088598c01a9fa6f032dc908612dc8ecAnders Carlsson
13012ef13e5abef0570a9f567b4671367275c05d4d34Nate Begemanvoid StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
13022ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  OS << "( ";
13032ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {
13042ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    if (i) OS << ", ";
13052ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman    PrintExpr(Node->getExpr(i));
13062ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  }
13072ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman  OS << " )";
13082ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman}
13092ef13e5abef0570a9f567b4671367275c05d4d34Nate Begeman
131005c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregorvoid StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
13114c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  for (DesignatedInitExpr::designators_iterator D = Node->designators_begin(),
13124c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor                      DEnd = Node->designators_end();
13134c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor       D != DEnd; ++D) {
13144c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    if (D->isFieldDesignator()) {
1315ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      if (D->getDotLoc().isInvalid()) {
1316ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        if (IdentifierInfo *II = D->getFieldName())
1317ef8225444452a1486bd721f3285301fe84643b00Stephen Hines          OS << II->getName() << ":";
1318ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      } else {
13194c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << "." << D->getFieldName()->getName();
1320ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      }
13214c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    } else {
13224c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "[";
13234c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      if (D->isArrayDesignator()) {
13244c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        PrintExpr(Node->getArrayIndex(*D));
13254c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      } else {
13264c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        PrintExpr(Node->getArrayRangeStart(*D));
13274c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor        OS << " ... ";
13281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        PrintExpr(Node->getArrayRangeEnd(*D));
13294c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      }
13304c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor      OS << "]";
13314c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor    }
13324c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  }
13334c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor
13344c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  OS << " = ";
13354c67834407ca6ab344dcf44fc599ad4938cfa96dDouglas Gregor  PrintExpr(Node->getInit());
133605c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor}
133705c13a3411782108d65aab3c77b1a231a4963bc0Douglas Gregor
13383498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregorvoid StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
13399d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  if (Policy.LangOpts.CPlusPlus) {
13409d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    OS << "/*implicit*/";
13419d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    Node->getType().print(OS, Policy);
13429d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    OS << "()";
13439d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  } else {
13449d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    OS << "/*implicit*/(";
13459d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    Node->getType().print(OS, Policy);
13469d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    OS << ')';
13474fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    if (Node->getType()->isRecordType())
13484fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      OS << "{}";
13494fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    else
13504fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor      OS << 0;
13514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
13523498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor}
13533498bdb9e9cb300de74c7b51c92608e2902b2348Douglas Gregor
13547c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlssonvoid StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
135542f42c0dd5cf71fbfc6fa282d03079a902f6e342Eli Friedman  OS << "__builtin_va_arg(";
13567c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  PrintExpr(Node->getSubExpr());
13577c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ", ";
13589d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getType().print(OS, Policy);
13597c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson  OS << ")";
13607c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson}
13617c50aca2fe36f6daa9bf1c8c428f30e72f96470aAnders Carlsson
13624b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
13634b9c2d235fb9449e249d74f48ecfec601650de93John McCall  PrintExpr(Node->getSyntacticForm());
13644b9c2d235fb9449e249d74f48ecfec601650de93John McCall}
13654b9c2d235fb9449e249d74f48ecfec601650de93John McCall
1366276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
13676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  const char *Name = nullptr;
1368276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  switch (Node->getOp()) {
1369ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#define BUILTIN(ID, TYPE, ATTRS)
1370ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1371ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  case AtomicExpr::AO ## ID: \
1372ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    Name = #ID "("; \
1373ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    break;
1374ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith#include "clang/Basic/Builtins.def"
1375276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1376276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  OS << Name;
1377ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1378ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // AtomicExpr stores its subexpressions in a permuted order.
1379276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  PrintExpr(Node->getPtr());
1380ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1381ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      Node->getOp() != AtomicExpr::AO__atomic_load_n) {
1382276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    OS << ", ";
138328fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith    PrintExpr(Node->getVal1());
1384276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1385ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1386ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      Node->isCmpXChg()) {
1387276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    OS << ", ";
138828fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith    PrintExpr(Node->getVal2());
1389276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1390ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1391ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1392ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    OS << ", ";
139328fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith    PrintExpr(Node->getWeak());
1394ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
139528fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith  if (Node->getOp() != AtomicExpr::AO__c11_atomic_init) {
139628fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith    OS << ", ";
13977a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall    PrintExpr(Node->getOrder());
139828fff5394fc9521ec0ee1d4f7ef4cca5e4f78071Richard Smith  }
1399276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (Node->isCmpXChg()) {
1400276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    OS << ", ";
1401276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    PrintExpr(Node->getOrderFail());
1402276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1403276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  OS << ")";
1404276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
1405276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
14065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// C++
1407b4609806e9232593ece09ce08b630836e825865cDouglas Gregorvoid StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
1408b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  const char *OpStrings[NUM_OVERLOADED_OPERATORS] = {
1409b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    "",
1410b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
1411b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    Spelling,
1412b4609806e9232593ece09ce08b630836e825865cDouglas Gregor#include "clang/Basic/OperatorKinds.def"
1413b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  };
1414b4609806e9232593ece09ce08b630836e825865cDouglas Gregor
1415b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  OverloadedOperatorKind Kind = Node->getOperator();
1416b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
1417b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    if (Node->getNumArgs() == 1) {
1418b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << OpStrings[Kind] << ' ';
1419b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
1420b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    } else {
1421b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      PrintExpr(Node->getArg(0));
1422b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      OS << ' ' << OpStrings[Kind];
1423b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
1424a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman  } else if (Kind == OO_Arrow) {
1425a143a9dcebea2ade67a2e9de1a939fbb70964015Eli Friedman    PrintExpr(Node->getArg(0));
1426b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Call) {
1427b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1428b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '(';
1429b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) {
1430b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (ArgIdx > 1)
1431b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        OS << ", ";
1432b4609806e9232593ece09ce08b630836e825865cDouglas Gregor      if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx)))
1433b4609806e9232593ece09ce08b630836e825865cDouglas Gregor        PrintExpr(Node->getArg(ArgIdx));
1434b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    }
1435b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ')';
1436b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Kind == OO_Subscript) {
1437b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1438b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << '[';
1439b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
1440b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ']';
1441b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 1) {
1442b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << OpStrings[Kind] << ' ';
1443b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1444b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else if (Node->getNumArgs() == 2) {
1445b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(0));
1446b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    OS << ' ' << OpStrings[Kind] << ' ';
1447b4609806e9232593ece09ce08b630836e825865cDouglas Gregor    PrintExpr(Node->getArg(1));
1448b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  } else {
1449b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("unknown overloaded operator");
1450b4609806e9232593ece09ce08b630836e825865cDouglas Gregor  }
1451b4609806e9232593ece09ce08b630836e825865cDouglas Gregor}
14525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145388a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregorvoid StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
1454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If we have a conversion operator call only print the argument.
1455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CXXMethodDecl *MD = Node->getMethodDecl();
1456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (MD && isa<CXXConversionDecl>(MD)) {
1457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrintExpr(Node->getImplicitObjectArgument());
1458651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
1459651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
146088a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor  VisitCallExpr(cast<CallExpr>(Node));
146188a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor}
146288a3514f36de96b19cdf50141c640df1a5f13f6cDouglas Gregor
1463e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbournevoid StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
1464e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  PrintExpr(Node->getCallee());
1465e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  OS << "<<<";
1466e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  PrintCallArgs(Node->getConfig());
1467e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  OS << ">>>(";
1468e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  PrintCallArgs(Node);
1469e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne  OS << ")";
1470e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne}
1471e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
147249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
147349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  OS << Node->getCastName() << '<';
14749d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getTypeAsWritten().print(OS, Policy);
14759d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ">(";
14765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  PrintExpr(Node->getSubExpr());
14775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << ")";
14785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
14795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
148049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
148149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
148249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
148349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
148449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
148549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
148649badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
148749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
148849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
148949badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
149049badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
149149badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
149249badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
149349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor  VisitCXXNamedCastExpr(Node);
149449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
149549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
1496c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redlvoid StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
1497c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << "typeid(";
1498c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  if (Node->isTypeOperand()) {
1499fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer    Node->getTypeOperandSourceInfo()->getType().print(OS, Policy);
1500c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  } else {
1501c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl    PrintExpr(Node->getExprOperand());
1502c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  }
1503c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl  OS << ")";
1504c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl}
1505c42e1183846228a7fa5143ad76507d6d60f5c6f3Sebastian Redl
150601b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichetvoid StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
150701b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  OS << "__uuidof(";
150801b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  if (Node->isTypeOperand()) {
1509fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer    Node->getTypeOperandSourceInfo()->getType().print(OS, Policy);
151001b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  } else {
151101b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet    PrintExpr(Node->getExprOperand());
151201b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  }
151301b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet  OS << ")";
151401b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet}
151501b7c3028da5bbcb9f8e52ba67e4613070de0e60Francois Pichet
151676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCallvoid StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) {
151776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  PrintExpr(Node->getBaseExpr());
151876da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  if (Node->isArrow())
151976da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall    OS << "->";
152076da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  else
152176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall    OS << ".";
152276da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  if (NestedNameSpecifier *Qualifier =
152376da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall      Node->getQualifierLoc().getNestedNameSpecifier())
152476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall    Qualifier->print(OS, Policy);
152576da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall  OS << Node->getPropertyDecl()->getDeclName();
152676da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall}
152776da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall
15289fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smithvoid StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
15299fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  switch (Node->getLiteralOperatorKind()) {
15309fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Raw:
1531ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    OS << cast<StringLiteral>(Node->getArg(0)->IgnoreImpCasts())->getString();
15329fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    break;
15339fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Template: {
1534ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    DeclRefExpr *DRE = cast<DeclRefExpr>(Node->getCallee()->IgnoreImpCasts());
1535ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    const TemplateArgumentList *Args =
1536ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith      cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
1537ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    assert(Args);
1538ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    const TemplateArgument &Pack = Args->get(0);
1539ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith    for (TemplateArgument::pack_iterator I = Pack.pack_begin(),
1540ef9f29804fa8932282a17b414ef0dde2ea4eec03Richard Smith                                         E = Pack.pack_end(); I != E; ++I) {
1541855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      char C = (char)I->getAsIntegral().getZExtValue();
15429fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith      OS << C;
15439fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    }
15449fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    break;
15459fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  }
1546916883004c36291b70355d5e73abb05e138804fbRichard Smith  case UserDefinedLiteral::LOK_Integer: {
1547916883004c36291b70355d5e73abb05e138804fbRichard Smith    // Print integer literal without suffix.
1548916883004c36291b70355d5e73abb05e138804fbRichard Smith    IntegerLiteral *Int = cast<IntegerLiteral>(Node->getCookedLiteral());
1549916883004c36291b70355d5e73abb05e138804fbRichard Smith    OS << Int->getValue().toString(10, /*isSigned*/false);
1550916883004c36291b70355d5e73abb05e138804fbRichard Smith    break;
1551916883004c36291b70355d5e73abb05e138804fbRichard Smith  }
1552a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  case UserDefinedLiteral::LOK_Floating: {
1553a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer    // Print floating literal without suffix.
1554a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer    FloatingLiteral *Float = cast<FloatingLiteral>(Node->getCookedLiteral());
1555a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer    PrintFloatingLiteral(OS, Float, /*PrintSuffix=*/false);
1556a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer    break;
1557a0a3c90abde4b52b96ce70bd062d81041092900cBenjamin Kramer  }
15589fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_String:
15599fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  case UserDefinedLiteral::LOK_Character:
15609fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    PrintExpr(Node->getCookedLiteral());
15619fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith    break;
15629fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  }
15639fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith  OS << Node->getUDSuffix()->getName();
15649fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith}
15659fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith
15665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencervoid StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
15675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  OS << (Node->getValue() ? "true" : "false");
15685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
15695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
15706e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redlvoid StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
15716e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl  OS << "nullptr";
15726e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl}
15736e8ed16ffef02b82995a90bdcf10ffff7d63839aSebastian Redl
1574796da18402f286b897782a298ae3b20c459c102eDouglas Gregorvoid StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
1575796da18402f286b897782a298ae3b20c459c102eDouglas Gregor  OS << "this";
1576796da18402f286b897782a298ae3b20c459c102eDouglas Gregor}
1577796da18402f286b897782a298ae3b20c459c102eDouglas Gregor
157850dd289f45738ed22b7583d52ed2525b927042ffChris Lattnervoid StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
15796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Node->getSubExpr())
158050dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw";
158150dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  else {
158250dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    OS << "throw ";
158350dd289f45738ed22b7583d52ed2525b927042ffChris Lattner    PrintExpr(Node->getSubExpr());
158450dd289f45738ed22b7583d52ed2525b927042ffChris Lattner  }
158550dd289f45738ed22b7583d52ed2525b927042ffChris Lattner}
158650dd289f45738ed22b7583d52ed2525b927042ffChris Lattner
158704421087832a031c90bd58f128c7c0e741db8dd2Chris Lattnervoid StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
1588c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  // Nothing to print: we picked up the default argument.
1589c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith}
1590c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith
1591c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smithvoid StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) {
1592c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith  // Nothing to print: we picked up the default initializer.
159304421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner}
159404421087832a031c90bd58f128c7c0e741db8dd2Chris Lattner
1595987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidisvoid StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
15969d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getType().print(OS, Policy);
1597987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << "(";
1598987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  PrintExpr(Node->getSubExpr());
1599987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis  OS << ")";
1600987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
1601987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
1602fceb0a8adba9d25db99a4d73e9655c2831a96ecdAnders Carlssonvoid StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
1603eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson  PrintExpr(Node->getSubExpr());
1604eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson}
1605eb60edffa147e061278c436e513b0df9b4c4e7f6Anders Carlsson
1606506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregorvoid StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
16079d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getType().print(OS, Policy);
1608506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << "(";
1609506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(),
16101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                         ArgEnd = Node->arg_end();
1611506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor       Arg != ArgEnd; ++Arg) {
1612d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola    if (Arg->isDefaultArgument())
1613d3bb9ffb9aa3c78ac9b525f5c8071c5a7c5309d4Rafael Espindola      break;
1614506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    if (Arg != Node->arg_begin())
1615506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor      OS << ", ";
1616506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor    PrintExpr(*Arg);
1617506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  }
1618506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor  OS << ")";
1619506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor}
1620506ae418eb171d072f2fb4f6bc46d258b52cbf97Douglas Gregor
162101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregorvoid StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) {
162201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  OS << '[';
162301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  bool NeedComma = false;
162401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  switch (Node->getCaptureDefault()) {
162501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCD_None:
162601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
162701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
162801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCD_ByCopy:
162901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << '=';
163001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = true;
163101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
163201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
163301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  case LCD_ByRef:
163401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << '&';
163501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = true;
163601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    break;
163701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
163801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  for (LambdaExpr::capture_iterator C = Node->explicit_capture_begin(),
163901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor                                 CEnd = Node->explicit_capture_end();
164001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor       C != CEnd;
164101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor       ++C) {
164201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    if (NeedComma)
164301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << ", ";
164401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = true;
164501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
164601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    switch (C->getCaptureKind()) {
164701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    case LCK_This:
164801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << "this";
164901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      break;
165001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
165101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    case LCK_ByRef:
165204fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith      if (Node->getCaptureDefault() != LCD_ByRef || C->isInitCapture())
165301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << '&';
165401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << C->getCapturedVar()->getName();
165501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      break;
165601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
165701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    case LCK_ByCopy:
165801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << C->getCapturedVar()->getName();
165901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      break;
166001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
166104fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith
166204fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith    if (C->isInitCapture())
166304fa7a33279808dc3e5117c41b5f84c40eeb7362Richard Smith      PrintExpr(C->getCapturedVar()->getInit());
166401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
166501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  OS << ']';
166601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
166701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  if (Node->hasExplicitParameters()) {
166801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << " (";
166901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    CXXMethodDecl *Method = Node->getCallOperator();
167001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    NeedComma = false;
1671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    for (auto P : Method->params()) {
167201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      if (NeedComma) {
167301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << ", ";
167401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      } else {
167501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        NeedComma = true;
167601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      }
1677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::string ParamStr = P->getNameAsString();
1678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      P->getOriginalType().print(OS, Policy, ParamStr);
167901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
168001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    if (Method->isVariadic()) {
168101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      if (NeedComma)
168201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor        OS << ", ";
168301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << "...";
168401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    }
168501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    OS << ')';
168601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
168701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    if (Node->isMutable())
168801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      OS << " mutable";
168901d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
169001d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor    const FunctionProtoType *Proto
169101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor      = Method->getType()->getAs<FunctionProtoType>();
16925eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    Proto->printExceptionSpecification(OS, Policy);
169301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
1694ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling    // FIXME: Attributes
169501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
1696dfca6f53ab97d28d43e3fa2564209df08f3d282cDouglas Gregor    // Print the trailing return type if it was specified in the source.
16979d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    if (Node->hasExplicitResultType()) {
16989d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer      OS << " -> ";
1699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Proto->getReturnType().print(OS, Policy);
17009d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    }
170101d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  }
170201d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
170301d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  // Print the body.
170401d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  CompoundStmt *Body = Node->getBody();
170501d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  OS << ' ';
170601d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor  PrintStmt(Body);
170701d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor}
170801d08018b7cf5ce1601707cfd7a84d22015fc04eDouglas Gregor
1709ed8abf18329df67b0abcbb3a10458bd8c1d2a595Douglas Gregorvoid StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
1710ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo())
17119d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    TSInfo->getType().print(OS, Policy);
1712ab6677ec401cfd2c82b34e4cdfebd55a9dc25778Douglas Gregor  else
17139d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    Node->getType().print(OS, Policy);
17149d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << "()";
1715987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis}
1716987a14bf5883ef6e5d07f1c83eb6d41a8212a78cArgyrios Kyrtzidis
17174c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
17184c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalNew())
17194c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
17204c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "new ";
17214c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  unsigned NumPlace = E->getNumPlacementArgs();
1722d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman  if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(E->getPlacementArg(0))) {
17234c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
17244c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    PrintExpr(E->getPlacementArg(0));
17254c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    for (unsigned i = 1; i < NumPlace; ++i) {
1726d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman      if (isa<CXXDefaultArgExpr>(E->getPlacementArg(i)))
1727d03ef04ed32e9c9d7c714e8f1b31693c5b907dd2Eli Friedman        break;
17284c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      OS << ", ";
17294c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl      PrintExpr(E->getPlacementArg(i));
17304c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    }
17314c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ") ";
17324c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
17334c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
17344c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "(";
17356fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  std::string TypeS;
17366fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  if (Expr *Size = E->getArraySize()) {
17376fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl    llvm::raw_string_ostream s(TypeS);
17389d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    s << '[';
1739d1420c6fa788669e49f21e184927c7833881e399Richard Smith    Size->printPretty(s, Helper, Policy);
17409d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    s << ']';
17416fec64874f282f7084d5c626e42241cdcbafac9dSebastian Redl  }
17429d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  E->getAllocatedType().print(OS, Policy, TypeS);
17434c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isParenTypeId())
17444c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << ")";
17454c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
17462aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle();
17472aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  if (InitStyle) {
17482aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (InitStyle == CXXNewExpr::CallInit)
17492aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl      OS << "(";
17502aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    PrintExpr(E->getInitializer());
17512aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (InitStyle == CXXNewExpr::CallInit)
17522aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl      OS << ")";
17534c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  }
17544c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
17554c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
17564c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redlvoid StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
17574c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isGlobalDelete())
17584c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "::";
17594c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  OS << "delete ";
17604c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  if (E->isArrayForm())
17614c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl    OS << "[] ";
17624c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl  PrintExpr(E->getArgument());
17634c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl}
17644c5d320a7581f4b80b151630c91cea5727fa9923Sebastian Redl
1765a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregorvoid StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
1766a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  PrintExpr(E->getBase());
1767a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->isArrow())
1768a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    OS << "->";
1769a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  else
1770a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    OS << '.';
1771a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor  if (E->getQualifier())
1772a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor    E->getQualifier()->print(OS, Policy);
1773a7a38cb64e0781b8489332cedcfae9c8f95ba22eEli Friedman  OS << "~";
17741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1775a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  if (IdentifierInfo *II = E->getDestroyedTypeIdentifier())
1776a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor    OS << II->getName();
1777a2e7dd2f4a50d835351153aee568d35ccc986310Douglas Gregor  else
17789d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    E->getDestroyedType().print(OS, Policy);
1779a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor}
1780a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor
1781e349bea668622ef31bd51a229960a73d69940709Anders Carlssonvoid StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
1782c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith  if (E->isListInitialization())
1783c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith    OS << "{ ";
1784c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith
1785d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor  for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
1786d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    if (isa<CXXDefaultArgExpr>(E->getArg(i))) {
1787d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor      // Don't print any defaulted arguments
1788d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor      break;
1789d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    }
1790d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor
1791d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    if (i) OS << ", ";
1792d0fb3adeed631385a53d15ced60d67c5f64eb133Douglas Gregor    PrintExpr(E->getArg(i));
1793c75da518fde1f3b93643ac4e376ff2acd260facdFariborz Jahanian  }
1794c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith
1795c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith  if (E->isListInitialization())
1796c83c2300e1946fea78ecd3c2e93d9c2dd2638a2bRichard Smith    OS << " }";
1797e349bea668622ef31bd51a229960a73d69940709Anders Carlsson}
1798e349bea668622ef31bd51a229960a73d69940709Anders Carlsson
17997c3e615f01e8f9f587315800fdaf2305ed824568Richard Smithvoid StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
18007c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith  PrintExpr(E->getSubExpr());
18017c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith}
18027c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith
18034765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
1804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Just forward to the subexpression.
180502bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson  PrintExpr(E->getSubExpr());
180602bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson}
180702bbfa33590dfe3107e801fb526b7ab0bdfd00eeAnders Carlsson
18081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
1809d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas GregorStmtPrinter::VisitCXXUnresolvedConstructExpr(
1810d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor                                           CXXUnresolvedConstructExpr *Node) {
18119d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getTypeAsWritten().print(OS, Policy);
1812d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << "(";
1813d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(),
18141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                             ArgEnd = Node->arg_end();
1815d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor       Arg != ArgEnd; ++Arg) {
1816d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    if (Arg != Node->arg_begin())
1817d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor      OS << ", ";
1818d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor    PrintExpr(*Arg);
1819d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  }
1820d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor  OS << ")";
1821d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor}
1822d81e6ca6e378c3996a139066a5c4b7fc1869630cDouglas Gregor
1823865d447ac6a4721ab58e898d014a21f2eff74b06John McCallvoid StmtPrinter::VisitCXXDependentScopeMemberExpr(
1824865d447ac6a4721ab58e898d014a21f2eff74b06John McCall                                         CXXDependentScopeMemberExpr *Node) {
1825aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Node->isImplicitAccess()) {
1826aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    PrintExpr(Node->getBase());
1827aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OS << (Node->isArrow() ? "->" : ".");
1828aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1829a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1830a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor    Qualifier->print(OS, Policy);
1831e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
18323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor    OS << "template ";
18332577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getMemberNameInfo();
18345eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer  if (Node->hasExplicitTemplateArgs())
18355eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(
18365eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy);
18371c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor}
18381c0ca59416999129d0439c2661d137ef38e86209Douglas Gregor
1839129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCallvoid StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
1840aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  if (!Node->isImplicitAccess()) {
1841aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    PrintExpr(Node->getBase());
1842aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall    OS << (Node->isArrow() ? "->" : ".");
1843aa81e1658d87b9011125c632aa902d154ae4b02cJohn McCall  }
1844129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall  if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1845129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall    Qualifier->print(OS, Policy);
1846e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara  if (Node->hasTemplateKeyword())
1847e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara    OS << "template ";
18482577743c5650c646fb705df01403707e94f2df04Abramo Bagnara  OS << Node->getMemberNameInfo();
18495eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer  if (Node->hasExplicitTemplateArgs())
18505eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer    TemplateSpecializationType::PrintTemplateArgumentList(
18515eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer        OS, Node->getTemplateArgs(), Node->getNumTemplateArgs(), Policy);
1852129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall}
1853129e2df52ed7e0434b3f1cf1867fd6a5cb083ff6John McCall
18544ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorstatic const char *getTypeTraitName(TypeTrait TT) {
18554ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  switch (TT) {
1856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define TYPE_TRAIT_1(Spelling, Name, Key) \
1857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinescase clang::UTT_##Name: return #Spelling;
1858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define TYPE_TRAIT_2(Spelling, Name, Key) \
1859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinescase clang::BTT_##Name: return #Spelling;
1860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#define TYPE_TRAIT_N(Spelling, Name, Key) \
1861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case clang::TT_##Name: return #Spelling;
1862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/TokenKinds.def"
18634ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  }
18644ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  llvm_unreachable("Type trait not covered by switch");
18654ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
18664ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
186721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleystatic const char *getTypeTraitName(ArrayTypeTrait ATT) {
186821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  switch (ATT) {
186921ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  case ATT_ArrayRank:        return "__array_rank";
187021ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  case ATT_ArrayExtent:      return "__array_extent";
187121ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley  }
1872a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth  llvm_unreachable("Array type trait not covered by switch");
187321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
187421ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1875552622067dc45013d240f73952fece703f5e63bdJohn Wiegleystatic const char *getExpressionTraitName(ExpressionTrait ET) {
1876552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  switch (ET) {
1877552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  case ET_IsLValueExpr:      return "__is_lvalue_expr";
1878552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  case ET_IsRValueExpr:      return "__is_rvalue_expr";
1879552622067dc45013d240f73952fece703f5e63bdJohn Wiegley  }
1880a280bc86b1b982c7ab7e0fc96f172967f27d1863Chandler Carruth  llvm_unreachable("Expression type trait not covered by switch");
1881552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1882552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
18834ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregorvoid StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
18844ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  OS << getTypeTraitName(E->getTrait()) << "(";
18854ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
18864ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor    if (I > 0)
18874ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor      OS << ", ";
18889d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    E->getArg(I)->getType().print(OS, Policy);
18894ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  }
18904ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor  OS << ")";
18914ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor}
18924ca8ac2e61c37ddadf37024af86f3e1019af8532Douglas Gregor
189321ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegleyvoid StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
18949d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << getTypeTraitName(E->getTrait()) << '(';
18959d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  E->getQueriedType().print(OS, Policy);
18969d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ')';
189721ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley}
189821ff2e516b0e0bc8c1dbf965cb3d44bac3c64330John Wiegley
1899552622067dc45013d240f73952fece703f5e63bdJohn Wiegleyvoid StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
19009d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << getExpressionTraitName(E->getTrait()) << '(';
19019d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  PrintExpr(E->getQueriedExpression());
19029d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ')';
1903552622067dc45013d240f73952fece703f5e63bdJohn Wiegley}
1904552622067dc45013d240f73952fece703f5e63bdJohn Wiegley
19052e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redlvoid StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
19062e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  OS << "noexcept(";
19072e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  PrintExpr(E->getOperand());
19082e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl  OS << ")";
19092e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl}
19102e156225a29407a50dd19041aa5750171ad44ea3Sebastian Redl
1911ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
1912be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  PrintExpr(E->getPattern());
1913be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor  OS << "...";
1914be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor}
1915be230c36e32142cbdcdbe9c97511d097beeecbabDouglas Gregor
1916ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregorvoid StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
1917a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer  OS << "sizeof...(" << *E->getPack() << ")";
1918ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor}
1919ee8aff06f6a96214731de17b2cb6df407c6c1820Douglas Gregor
1920c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregorvoid StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
1921c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor                                       SubstNonTypeTemplateParmPackExpr *Node) {
1922a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer  OS << *Node->getParameterPack();
1923c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor}
1924c7793c73ba8a343de3f2552d984851985a46f159Douglas Gregor
192591a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCallvoid StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
192691a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall                                       SubstNonTypeTemplateParmExpr *Node) {
192791a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall  Visit(Node->getReplacement());
192891a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall}
192991a5755ad73c5dc1dfb167e448fdd74e75a6df56John McCall
19309a4db032ecd991626d236a502e770126db32bd31Richard Smithvoid StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
19319a4db032ecd991626d236a502e770126db32bd31Richard Smith  OS << *E->getParameterPack();
19329a4db032ecd991626d236a502e770126db32bd31Richard Smith}
19339a4db032ecd991626d236a502e770126db32bd31Richard Smith
193403e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregorvoid StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
193503e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor  PrintExpr(Node->GetTemporaryExpr());
193603e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor}
193703e80030515c800d1ab44125b9052dfffd1bd04cDouglas Gregor
19381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// Obj-C
19395508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
19405508518a2702b00be3b15a26d772bde968972f54Anders Carlssonvoid StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
19415508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  OS << "@";
19425508518a2702b00be3b15a26d772bde968972f54Anders Carlsson  VisitStringLiteral(Node->getString());
19435508518a2702b00be3b15a26d772bde968972f54Anders Carlsson}
19445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1945eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beardvoid StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
1946ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "@";
1947eb382ec1507cf2c8c12d7443d0b67c076223aec6Patrick Beard  Visit(E->getSubExpr());
1948ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1949ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1950ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
1951ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "@[ ";
1952ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  StmtRange ch = E->children();
1953ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (ch.first != ch.second) {
1954ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    while (1) {
1955ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      Visit(*ch.first);
1956ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      ++ch.first;
1957ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      if (ch.first == ch.second) break;
1958ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      OS << ", ";
1959ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    }
1960ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  }
1961ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " ]";
1962ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1963ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1964ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
1965ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << "@{ ";
1966ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
1967ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    if (I > 0)
1968ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      OS << ", ";
1969ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1970ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    ObjCDictionaryElement Element = E->getKeyValueElement(I);
1971ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    Visit(Element.Key);
1972ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " : ";
1973ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    Visit(Element.Value);
1974ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    if (Element.isPackExpansion())
1975ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      OS << "...";
1976ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  }
1977ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " }";
1978ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
1979ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
1980f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
19819d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << "@encode(";
19829d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getEncodedType().print(OS, Policy);
19839d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ')';
1984f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
1985f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
1986b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
1987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << "@selector(";
1988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Node->getSelector().print(OS);
1989651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  OS << ')';
1990b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
1991b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
1992390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
1993b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  OS << "@protocol(" << *Node->getProtocol() << ')';
1994390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
1995390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian
1996563477da25f824e37c535131695dc4dc9b68c465Steve Naroffvoid StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
1997563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "[";
199804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Mess->getReceiverKind()) {
199904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
200004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    PrintExpr(Mess->getInstanceReceiver());
200104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
200204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
200304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
20049d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer    Mess->getClassReceiver().print(OS, Policy);
200504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
200604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
200704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance:
200804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
200904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << "Super";
201004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
201104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
201204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
2013c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek  OS << ' ';
201497b7f26a92d87e514530a5b652460190ce48c974Ted Kremenek  Selector selector = Mess->getSelector();
20156a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  if (selector.isUnarySelector()) {
2016813d8346529bf094eb2b249648906ba7fd226688Douglas Gregor    OS << selector.getNameForSlot(0);
20176a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff  } else {
20186a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
2019c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      if (i < selector.getNumArgs()) {
2020c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (i > 0) OS << ' ';
2021c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        if (selector.getIdentifierInfoForSlot(i))
202239f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner          OS << selector.getIdentifierInfoForSlot(i)->getName() << ':';
2023c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek        else
2024c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek           OS << ":";
2025c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      }
2026c29efd829a638fff380284f43c79355b98e2a2abTed Kremenek      else OS << ", "; // Handle variadic methods.
20271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20286a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff      PrintExpr(Mess->getArg(i));
20296a8a9a41e9067b708498c02180159bafecfa044fSteve Naroff    }
2030563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  }
2031563477da25f824e37c535131695dc4dc9b68c465Steve Naroff  OS << "]";
2032563477da25f824e37c535131695dc4dc9b68c465Steve Naroff}
2033563477da25f824e37c535131695dc4dc9b68c465Steve Naroff
2034ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
2035ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << (Node->getValue() ? "__objc_yes" : "__objc_no");
2036ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
2037ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
2038f85e193739c953358c865005855253af4f68a497John McCallvoid
2039f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
2040f85e193739c953358c865005855253af4f68a497John McCall  PrintExpr(E->getSubExpr());
2041f85e193739c953358c865005855253af4f68a497John McCall}
2042f85e193739c953358c865005855253af4f68a497John McCall
2043f85e193739c953358c865005855253af4f68a497John McCallvoid
2044f85e193739c953358c865005855253af4f68a497John McCallStmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
20459d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << '(' << E->getBridgeKindName();
20469d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  E->getType().print(OS, Policy);
20479d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ')';
2048f85e193739c953358c865005855253af4f68a497John McCall  PrintExpr(E->getSubExpr());
2049f85e193739c953358c865005855253af4f68a497John McCall}
2050cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
20514eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroffvoid StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
205256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff  BlockDecl *BD = Node->getBlockDecl();
20534eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  OS << "^";
20541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
20554eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  const FunctionType *AFT = Node->getFunctionType();
20561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
205772564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  if (isa<FunctionNoProtoType>(AFT)) {
20584eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << "()";
205972564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor  } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
20604eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << '(';
206156ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff    for (BlockDecl::param_iterator AI = BD->param_begin(),
206256ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff         E = BD->param_end(); AI != E; ++AI) {
206356ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (AI != BD->param_begin()) OS << ", ";
20649d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer      std::string ParamStr = (*AI)->getNameAsString();
20659d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer      (*AI)->getType().print(OS, Policy, ParamStr);
20664eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
20671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
206872564e73277e29f6db3305d1f27ba408abb7ed88Douglas Gregor    const FunctionProtoType *FT = cast<FunctionProtoType>(AFT);
20694eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    if (FT->isVariadic()) {
207056ee6896f2efebffb4a2cce5a7610cdf1eddbbbeSteve Naroff      if (!BD->param_empty()) OS << ", ";
20714eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff      OS << "...";
20724eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    }
20734eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff    OS << ')';
20744eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff  }
20753e2fe86dd0dd65bff254e3bbdc0ea8df9282dc35Fariborz Jahanian  OS << "{ }";
20764eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff}
20774eb206bebcdab28ababe8df55c6185cec2cdc071Steve Naroff
2078381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenekvoid StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
2079381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek  PrintExpr(Node->getSourceExpr());
2080381c0662095014532bce6706858fd8c4e34da3f7Ted Kremenek}
20817cd7d1ad33fdf49eef83942e8855fe20d95aa1b9John McCall
208261eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattnervoid StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
208361eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  OS << "__builtin_astype(";
208461eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  PrintExpr(Node->getSrcExpr());
20859d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  OS << ", ";
20869d4df46b6c78825303ffbdd01bbe8d4b4513ed89Benjamin Kramer  Node->getType().print(OS, Policy);
208761eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner  OS << ")";
208861eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner}
208961eee0ca33b29e102f11bab77c8b74cc00e2392bTanya Lattner
20905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
20915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// Stmt method implementations
20925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
20935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
20948b4b98b7cb18cc4a99cca0aefa515cc8756dc06dCraig Toppervoid Stmt::dumpPretty(const ASTContext &Context) const {
20956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  printPretty(llvm::errs(), nullptr, PrintingPolicy(Context.getLangOpts()));
20965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
20975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2098d1420c6fa788669e49f21e184927c7833881e399Richard Smithvoid Stmt::printPretty(raw_ostream &OS,
2099d1420c6fa788669e49f21e184927c7833881e399Richard Smith                       PrinterHelper *Helper,
2100d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                       const PrintingPolicy &Policy,
2101d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                       unsigned Indentation) const {
2102d1420c6fa788669e49f21e184927c7833881e399Richard Smith  StmtPrinter P(OS, Helper, Policy, Indentation);
2103c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner  P.Visit(const_cast<Stmt*>(this));
21045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
210542a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
210642a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
210742a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// PrinterHelper
210842a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek//===----------------------------------------------------------------------===//
210942a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek
211042a509f6a4f71bb805cc4abbb26722a34dffdddeTed Kremenek// Implement virtual destructor.
21118467583c2704e7a9691ea56939a029015f0ade0aGabor GreifPrinterHelper::~PrinterHelper() {}
2112