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