1*67e74705SXin Li //===--- StmtPrinter.cpp - Printing implementation for Stmt ASTs ----------===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file implements the Stmt::dumpPretty/Stmt::printPretty methods, which
11*67e74705SXin Li // pretty print the AST back out to C code.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li
15*67e74705SXin Li #include "clang/AST/ASTContext.h"
16*67e74705SXin Li #include "clang/AST/Attr.h"
17*67e74705SXin Li #include "clang/AST/DeclCXX.h"
18*67e74705SXin Li #include "clang/AST/DeclObjC.h"
19*67e74705SXin Li #include "clang/AST/DeclOpenMP.h"
20*67e74705SXin Li #include "clang/AST/DeclTemplate.h"
21*67e74705SXin Li #include "clang/AST/Expr.h"
22*67e74705SXin Li #include "clang/AST/ExprCXX.h"
23*67e74705SXin Li #include "clang/AST/ExprOpenMP.h"
24*67e74705SXin Li #include "clang/AST/PrettyPrinter.h"
25*67e74705SXin Li #include "clang/AST/StmtVisitor.h"
26*67e74705SXin Li #include "clang/Basic/CharInfo.h"
27*67e74705SXin Li #include "llvm/ADT/SmallString.h"
28*67e74705SXin Li #include "llvm/Support/Format.h"
29*67e74705SXin Li using namespace clang;
30*67e74705SXin Li
31*67e74705SXin Li //===----------------------------------------------------------------------===//
32*67e74705SXin Li // StmtPrinter Visitor
33*67e74705SXin Li //===----------------------------------------------------------------------===//
34*67e74705SXin Li
35*67e74705SXin Li namespace {
36*67e74705SXin Li class StmtPrinter : public StmtVisitor<StmtPrinter> {
37*67e74705SXin Li raw_ostream &OS;
38*67e74705SXin Li unsigned IndentLevel;
39*67e74705SXin Li clang::PrinterHelper* Helper;
40*67e74705SXin Li PrintingPolicy Policy;
41*67e74705SXin Li
42*67e74705SXin Li public:
StmtPrinter(raw_ostream & os,PrinterHelper * helper,const PrintingPolicy & Policy,unsigned Indentation=0)43*67e74705SXin Li StmtPrinter(raw_ostream &os, PrinterHelper* helper,
44*67e74705SXin Li const PrintingPolicy &Policy,
45*67e74705SXin Li unsigned Indentation = 0)
46*67e74705SXin Li : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy) {}
47*67e74705SXin Li
PrintStmt(Stmt * S)48*67e74705SXin Li void PrintStmt(Stmt *S) {
49*67e74705SXin Li PrintStmt(S, Policy.Indentation);
50*67e74705SXin Li }
51*67e74705SXin Li
PrintStmt(Stmt * S,int SubIndent)52*67e74705SXin Li void PrintStmt(Stmt *S, int SubIndent) {
53*67e74705SXin Li IndentLevel += SubIndent;
54*67e74705SXin Li if (S && isa<Expr>(S)) {
55*67e74705SXin Li // If this is an expr used in a stmt context, indent and newline it.
56*67e74705SXin Li Indent();
57*67e74705SXin Li Visit(S);
58*67e74705SXin Li OS << ";\n";
59*67e74705SXin Li } else if (S) {
60*67e74705SXin Li Visit(S);
61*67e74705SXin Li } else {
62*67e74705SXin Li Indent() << "<<<NULL STATEMENT>>>\n";
63*67e74705SXin Li }
64*67e74705SXin Li IndentLevel -= SubIndent;
65*67e74705SXin Li }
66*67e74705SXin Li
67*67e74705SXin Li void PrintRawCompoundStmt(CompoundStmt *S);
68*67e74705SXin Li void PrintRawDecl(Decl *D);
69*67e74705SXin Li void PrintRawDeclStmt(const DeclStmt *S);
70*67e74705SXin Li void PrintRawIfStmt(IfStmt *If);
71*67e74705SXin Li void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
72*67e74705SXin Li void PrintCallArgs(CallExpr *E);
73*67e74705SXin Li void PrintRawSEHExceptHandler(SEHExceptStmt *S);
74*67e74705SXin Li void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
75*67e74705SXin Li void PrintOMPExecutableDirective(OMPExecutableDirective *S);
76*67e74705SXin Li
PrintExpr(Expr * E)77*67e74705SXin Li void PrintExpr(Expr *E) {
78*67e74705SXin Li if (E)
79*67e74705SXin Li Visit(E);
80*67e74705SXin Li else
81*67e74705SXin Li OS << "<null expr>";
82*67e74705SXin Li }
83*67e74705SXin Li
Indent(int Delta=0)84*67e74705SXin Li raw_ostream &Indent(int Delta = 0) {
85*67e74705SXin Li for (int i = 0, e = IndentLevel+Delta; i < e; ++i)
86*67e74705SXin Li OS << " ";
87*67e74705SXin Li return OS;
88*67e74705SXin Li }
89*67e74705SXin Li
Visit(Stmt * S)90*67e74705SXin Li void Visit(Stmt* S) {
91*67e74705SXin Li if (Helper && Helper->handledStmt(S,OS))
92*67e74705SXin Li return;
93*67e74705SXin Li else StmtVisitor<StmtPrinter>::Visit(S);
94*67e74705SXin Li }
95*67e74705SXin Li
VisitStmt(Stmt * Node)96*67e74705SXin Li void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED {
97*67e74705SXin Li Indent() << "<<unknown stmt type>>\n";
98*67e74705SXin Li }
VisitExpr(Expr * Node)99*67e74705SXin Li void VisitExpr(Expr *Node) LLVM_ATTRIBUTE_UNUSED {
100*67e74705SXin Li OS << "<<unknown expr type>>";
101*67e74705SXin Li }
102*67e74705SXin Li void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
103*67e74705SXin Li
104*67e74705SXin Li #define ABSTRACT_STMT(CLASS)
105*67e74705SXin Li #define STMT(CLASS, PARENT) \
106*67e74705SXin Li void Visit##CLASS(CLASS *Node);
107*67e74705SXin Li #include "clang/AST/StmtNodes.inc"
108*67e74705SXin Li };
109*67e74705SXin Li }
110*67e74705SXin Li
111*67e74705SXin Li //===----------------------------------------------------------------------===//
112*67e74705SXin Li // Stmt printing methods.
113*67e74705SXin Li //===----------------------------------------------------------------------===//
114*67e74705SXin Li
115*67e74705SXin Li /// PrintRawCompoundStmt - Print a compound stmt without indenting the {, and
116*67e74705SXin Li /// with no newline after the }.
PrintRawCompoundStmt(CompoundStmt * Node)117*67e74705SXin Li void StmtPrinter::PrintRawCompoundStmt(CompoundStmt *Node) {
118*67e74705SXin Li OS << "{\n";
119*67e74705SXin Li for (auto *I : Node->body())
120*67e74705SXin Li PrintStmt(I);
121*67e74705SXin Li
122*67e74705SXin Li Indent() << "}";
123*67e74705SXin Li }
124*67e74705SXin Li
PrintRawDecl(Decl * D)125*67e74705SXin Li void StmtPrinter::PrintRawDecl(Decl *D) {
126*67e74705SXin Li D->print(OS, Policy, IndentLevel);
127*67e74705SXin Li }
128*67e74705SXin Li
PrintRawDeclStmt(const DeclStmt * S)129*67e74705SXin Li void StmtPrinter::PrintRawDeclStmt(const DeclStmt *S) {
130*67e74705SXin Li SmallVector<Decl*, 2> Decls(S->decls());
131*67e74705SXin Li Decl::printGroup(Decls.data(), Decls.size(), OS, Policy, IndentLevel);
132*67e74705SXin Li }
133*67e74705SXin Li
VisitNullStmt(NullStmt * Node)134*67e74705SXin Li void StmtPrinter::VisitNullStmt(NullStmt *Node) {
135*67e74705SXin Li Indent() << ";\n";
136*67e74705SXin Li }
137*67e74705SXin Li
VisitDeclStmt(DeclStmt * Node)138*67e74705SXin Li void StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
139*67e74705SXin Li Indent();
140*67e74705SXin Li PrintRawDeclStmt(Node);
141*67e74705SXin Li OS << ";\n";
142*67e74705SXin Li }
143*67e74705SXin Li
VisitCompoundStmt(CompoundStmt * Node)144*67e74705SXin Li void StmtPrinter::VisitCompoundStmt(CompoundStmt *Node) {
145*67e74705SXin Li Indent();
146*67e74705SXin Li PrintRawCompoundStmt(Node);
147*67e74705SXin Li OS << "\n";
148*67e74705SXin Li }
149*67e74705SXin Li
VisitCaseStmt(CaseStmt * Node)150*67e74705SXin Li void StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
151*67e74705SXin Li Indent(-1) << "case ";
152*67e74705SXin Li PrintExpr(Node->getLHS());
153*67e74705SXin Li if (Node->getRHS()) {
154*67e74705SXin Li OS << " ... ";
155*67e74705SXin Li PrintExpr(Node->getRHS());
156*67e74705SXin Li }
157*67e74705SXin Li OS << ":\n";
158*67e74705SXin Li
159*67e74705SXin Li PrintStmt(Node->getSubStmt(), 0);
160*67e74705SXin Li }
161*67e74705SXin Li
VisitDefaultStmt(DefaultStmt * Node)162*67e74705SXin Li void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
163*67e74705SXin Li Indent(-1) << "default:\n";
164*67e74705SXin Li PrintStmt(Node->getSubStmt(), 0);
165*67e74705SXin Li }
166*67e74705SXin Li
VisitLabelStmt(LabelStmt * Node)167*67e74705SXin Li void StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
168*67e74705SXin Li Indent(-1) << Node->getName() << ":\n";
169*67e74705SXin Li PrintStmt(Node->getSubStmt(), 0);
170*67e74705SXin Li }
171*67e74705SXin Li
VisitAttributedStmt(AttributedStmt * Node)172*67e74705SXin Li void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
173*67e74705SXin Li for (const auto *Attr : Node->getAttrs()) {
174*67e74705SXin Li Attr->printPretty(OS, Policy);
175*67e74705SXin Li }
176*67e74705SXin Li
177*67e74705SXin Li PrintStmt(Node->getSubStmt(), 0);
178*67e74705SXin Li }
179*67e74705SXin Li
PrintRawIfStmt(IfStmt * If)180*67e74705SXin Li void StmtPrinter::PrintRawIfStmt(IfStmt *If) {
181*67e74705SXin Li OS << "if (";
182*67e74705SXin Li if (const DeclStmt *DS = If->getConditionVariableDeclStmt())
183*67e74705SXin Li PrintRawDeclStmt(DS);
184*67e74705SXin Li else
185*67e74705SXin Li PrintExpr(If->getCond());
186*67e74705SXin Li OS << ')';
187*67e74705SXin Li
188*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(If->getThen())) {
189*67e74705SXin Li OS << ' ';
190*67e74705SXin Li PrintRawCompoundStmt(CS);
191*67e74705SXin Li OS << (If->getElse() ? ' ' : '\n');
192*67e74705SXin Li } else {
193*67e74705SXin Li OS << '\n';
194*67e74705SXin Li PrintStmt(If->getThen());
195*67e74705SXin Li if (If->getElse()) Indent();
196*67e74705SXin Li }
197*67e74705SXin Li
198*67e74705SXin Li if (Stmt *Else = If->getElse()) {
199*67e74705SXin Li OS << "else";
200*67e74705SXin Li
201*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Else)) {
202*67e74705SXin Li OS << ' ';
203*67e74705SXin Li PrintRawCompoundStmt(CS);
204*67e74705SXin Li OS << '\n';
205*67e74705SXin Li } else if (IfStmt *ElseIf = dyn_cast<IfStmt>(Else)) {
206*67e74705SXin Li OS << ' ';
207*67e74705SXin Li PrintRawIfStmt(ElseIf);
208*67e74705SXin Li } else {
209*67e74705SXin Li OS << '\n';
210*67e74705SXin Li PrintStmt(If->getElse());
211*67e74705SXin Li }
212*67e74705SXin Li }
213*67e74705SXin Li }
214*67e74705SXin Li
VisitIfStmt(IfStmt * If)215*67e74705SXin Li void StmtPrinter::VisitIfStmt(IfStmt *If) {
216*67e74705SXin Li Indent();
217*67e74705SXin Li PrintRawIfStmt(If);
218*67e74705SXin Li }
219*67e74705SXin Li
VisitSwitchStmt(SwitchStmt * Node)220*67e74705SXin Li void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
221*67e74705SXin Li Indent() << "switch (";
222*67e74705SXin Li if (const DeclStmt *DS = Node->getConditionVariableDeclStmt())
223*67e74705SXin Li PrintRawDeclStmt(DS);
224*67e74705SXin Li else
225*67e74705SXin Li PrintExpr(Node->getCond());
226*67e74705SXin Li OS << ")";
227*67e74705SXin Li
228*67e74705SXin Li // Pretty print compoundstmt bodies (very common).
229*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
230*67e74705SXin Li OS << " ";
231*67e74705SXin Li PrintRawCompoundStmt(CS);
232*67e74705SXin Li OS << "\n";
233*67e74705SXin Li } else {
234*67e74705SXin Li OS << "\n";
235*67e74705SXin Li PrintStmt(Node->getBody());
236*67e74705SXin Li }
237*67e74705SXin Li }
238*67e74705SXin Li
VisitWhileStmt(WhileStmt * Node)239*67e74705SXin Li void StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
240*67e74705SXin Li Indent() << "while (";
241*67e74705SXin Li if (const DeclStmt *DS = Node->getConditionVariableDeclStmt())
242*67e74705SXin Li PrintRawDeclStmt(DS);
243*67e74705SXin Li else
244*67e74705SXin Li PrintExpr(Node->getCond());
245*67e74705SXin Li OS << ")\n";
246*67e74705SXin Li PrintStmt(Node->getBody());
247*67e74705SXin Li }
248*67e74705SXin Li
VisitDoStmt(DoStmt * Node)249*67e74705SXin Li void StmtPrinter::VisitDoStmt(DoStmt *Node) {
250*67e74705SXin Li Indent() << "do ";
251*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
252*67e74705SXin Li PrintRawCompoundStmt(CS);
253*67e74705SXin Li OS << " ";
254*67e74705SXin Li } else {
255*67e74705SXin Li OS << "\n";
256*67e74705SXin Li PrintStmt(Node->getBody());
257*67e74705SXin Li Indent();
258*67e74705SXin Li }
259*67e74705SXin Li
260*67e74705SXin Li OS << "while (";
261*67e74705SXin Li PrintExpr(Node->getCond());
262*67e74705SXin Li OS << ");\n";
263*67e74705SXin Li }
264*67e74705SXin Li
VisitForStmt(ForStmt * Node)265*67e74705SXin Li void StmtPrinter::VisitForStmt(ForStmt *Node) {
266*67e74705SXin Li Indent() << "for (";
267*67e74705SXin Li if (Node->getInit()) {
268*67e74705SXin Li if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getInit()))
269*67e74705SXin Li PrintRawDeclStmt(DS);
270*67e74705SXin Li else
271*67e74705SXin Li PrintExpr(cast<Expr>(Node->getInit()));
272*67e74705SXin Li }
273*67e74705SXin Li OS << ";";
274*67e74705SXin Li if (Node->getCond()) {
275*67e74705SXin Li OS << " ";
276*67e74705SXin Li PrintExpr(Node->getCond());
277*67e74705SXin Li }
278*67e74705SXin Li OS << ";";
279*67e74705SXin Li if (Node->getInc()) {
280*67e74705SXin Li OS << " ";
281*67e74705SXin Li PrintExpr(Node->getInc());
282*67e74705SXin Li }
283*67e74705SXin Li OS << ") ";
284*67e74705SXin Li
285*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
286*67e74705SXin Li PrintRawCompoundStmt(CS);
287*67e74705SXin Li OS << "\n";
288*67e74705SXin Li } else {
289*67e74705SXin Li OS << "\n";
290*67e74705SXin Li PrintStmt(Node->getBody());
291*67e74705SXin Li }
292*67e74705SXin Li }
293*67e74705SXin Li
VisitObjCForCollectionStmt(ObjCForCollectionStmt * Node)294*67e74705SXin Li void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
295*67e74705SXin Li Indent() << "for (";
296*67e74705SXin Li if (DeclStmt *DS = dyn_cast<DeclStmt>(Node->getElement()))
297*67e74705SXin Li PrintRawDeclStmt(DS);
298*67e74705SXin Li else
299*67e74705SXin Li PrintExpr(cast<Expr>(Node->getElement()));
300*67e74705SXin Li OS << " in ";
301*67e74705SXin Li PrintExpr(Node->getCollection());
302*67e74705SXin Li OS << ") ";
303*67e74705SXin Li
304*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(Node->getBody())) {
305*67e74705SXin Li PrintRawCompoundStmt(CS);
306*67e74705SXin Li OS << "\n";
307*67e74705SXin Li } else {
308*67e74705SXin Li OS << "\n";
309*67e74705SXin Li PrintStmt(Node->getBody());
310*67e74705SXin Li }
311*67e74705SXin Li }
312*67e74705SXin Li
VisitCXXForRangeStmt(CXXForRangeStmt * Node)313*67e74705SXin Li void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) {
314*67e74705SXin Li Indent() << "for (";
315*67e74705SXin Li PrintingPolicy SubPolicy(Policy);
316*67e74705SXin Li SubPolicy.SuppressInitializers = true;
317*67e74705SXin Li Node->getLoopVariable()->print(OS, SubPolicy, IndentLevel);
318*67e74705SXin Li OS << " : ";
319*67e74705SXin Li PrintExpr(Node->getRangeInit());
320*67e74705SXin Li OS << ") {\n";
321*67e74705SXin Li PrintStmt(Node->getBody());
322*67e74705SXin Li Indent() << "}";
323*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
324*67e74705SXin Li }
325*67e74705SXin Li
VisitMSDependentExistsStmt(MSDependentExistsStmt * Node)326*67e74705SXin Li void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) {
327*67e74705SXin Li Indent();
328*67e74705SXin Li if (Node->isIfExists())
329*67e74705SXin Li OS << "__if_exists (";
330*67e74705SXin Li else
331*67e74705SXin Li OS << "__if_not_exists (";
332*67e74705SXin Li
333*67e74705SXin Li if (NestedNameSpecifier *Qualifier
334*67e74705SXin Li = Node->getQualifierLoc().getNestedNameSpecifier())
335*67e74705SXin Li Qualifier->print(OS, Policy);
336*67e74705SXin Li
337*67e74705SXin Li OS << Node->getNameInfo() << ") ";
338*67e74705SXin Li
339*67e74705SXin Li PrintRawCompoundStmt(Node->getSubStmt());
340*67e74705SXin Li }
341*67e74705SXin Li
VisitGotoStmt(GotoStmt * Node)342*67e74705SXin Li void StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
343*67e74705SXin Li Indent() << "goto " << Node->getLabel()->getName() << ";";
344*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
345*67e74705SXin Li }
346*67e74705SXin Li
VisitIndirectGotoStmt(IndirectGotoStmt * Node)347*67e74705SXin Li void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
348*67e74705SXin Li Indent() << "goto *";
349*67e74705SXin Li PrintExpr(Node->getTarget());
350*67e74705SXin Li OS << ";";
351*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
352*67e74705SXin Li }
353*67e74705SXin Li
VisitContinueStmt(ContinueStmt * Node)354*67e74705SXin Li void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
355*67e74705SXin Li Indent() << "continue;";
356*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
357*67e74705SXin Li }
358*67e74705SXin Li
VisitBreakStmt(BreakStmt * Node)359*67e74705SXin Li void StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
360*67e74705SXin Li Indent() << "break;";
361*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
362*67e74705SXin Li }
363*67e74705SXin Li
364*67e74705SXin Li
VisitReturnStmt(ReturnStmt * Node)365*67e74705SXin Li void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
366*67e74705SXin Li Indent() << "return";
367*67e74705SXin Li if (Node->getRetValue()) {
368*67e74705SXin Li OS << " ";
369*67e74705SXin Li PrintExpr(Node->getRetValue());
370*67e74705SXin Li }
371*67e74705SXin Li OS << ";";
372*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
373*67e74705SXin Li }
374*67e74705SXin Li
375*67e74705SXin Li
VisitGCCAsmStmt(GCCAsmStmt * Node)376*67e74705SXin Li void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) {
377*67e74705SXin Li Indent() << "asm ";
378*67e74705SXin Li
379*67e74705SXin Li if (Node->isVolatile())
380*67e74705SXin Li OS << "volatile ";
381*67e74705SXin Li
382*67e74705SXin Li OS << "(";
383*67e74705SXin Li VisitStringLiteral(Node->getAsmString());
384*67e74705SXin Li
385*67e74705SXin Li // Outputs
386*67e74705SXin Li if (Node->getNumOutputs() != 0 || Node->getNumInputs() != 0 ||
387*67e74705SXin Li Node->getNumClobbers() != 0)
388*67e74705SXin Li OS << " : ";
389*67e74705SXin Li
390*67e74705SXin Li for (unsigned i = 0, e = Node->getNumOutputs(); i != e; ++i) {
391*67e74705SXin Li if (i != 0)
392*67e74705SXin Li OS << ", ";
393*67e74705SXin Li
394*67e74705SXin Li if (!Node->getOutputName(i).empty()) {
395*67e74705SXin Li OS << '[';
396*67e74705SXin Li OS << Node->getOutputName(i);
397*67e74705SXin Li OS << "] ";
398*67e74705SXin Li }
399*67e74705SXin Li
400*67e74705SXin Li VisitStringLiteral(Node->getOutputConstraintLiteral(i));
401*67e74705SXin Li OS << " (";
402*67e74705SXin Li Visit(Node->getOutputExpr(i));
403*67e74705SXin Li OS << ")";
404*67e74705SXin Li }
405*67e74705SXin Li
406*67e74705SXin Li // Inputs
407*67e74705SXin Li if (Node->getNumInputs() != 0 || Node->getNumClobbers() != 0)
408*67e74705SXin Li OS << " : ";
409*67e74705SXin Li
410*67e74705SXin Li for (unsigned i = 0, e = Node->getNumInputs(); i != e; ++i) {
411*67e74705SXin Li if (i != 0)
412*67e74705SXin Li OS << ", ";
413*67e74705SXin Li
414*67e74705SXin Li if (!Node->getInputName(i).empty()) {
415*67e74705SXin Li OS << '[';
416*67e74705SXin Li OS << Node->getInputName(i);
417*67e74705SXin Li OS << "] ";
418*67e74705SXin Li }
419*67e74705SXin Li
420*67e74705SXin Li VisitStringLiteral(Node->getInputConstraintLiteral(i));
421*67e74705SXin Li OS << " (";
422*67e74705SXin Li Visit(Node->getInputExpr(i));
423*67e74705SXin Li OS << ")";
424*67e74705SXin Li }
425*67e74705SXin Li
426*67e74705SXin Li // Clobbers
427*67e74705SXin Li if (Node->getNumClobbers() != 0)
428*67e74705SXin Li OS << " : ";
429*67e74705SXin Li
430*67e74705SXin Li for (unsigned i = 0, e = Node->getNumClobbers(); i != e; ++i) {
431*67e74705SXin Li if (i != 0)
432*67e74705SXin Li OS << ", ";
433*67e74705SXin Li
434*67e74705SXin Li VisitStringLiteral(Node->getClobberStringLiteral(i));
435*67e74705SXin Li }
436*67e74705SXin Li
437*67e74705SXin Li OS << ");";
438*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
439*67e74705SXin Li }
440*67e74705SXin Li
VisitMSAsmStmt(MSAsmStmt * Node)441*67e74705SXin Li void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) {
442*67e74705SXin Li // FIXME: Implement MS style inline asm statement printer.
443*67e74705SXin Li Indent() << "__asm ";
444*67e74705SXin Li if (Node->hasBraces())
445*67e74705SXin Li OS << "{\n";
446*67e74705SXin Li OS << Node->getAsmString() << "\n";
447*67e74705SXin Li if (Node->hasBraces())
448*67e74705SXin Li Indent() << "}\n";
449*67e74705SXin Li }
450*67e74705SXin Li
VisitCapturedStmt(CapturedStmt * Node)451*67e74705SXin Li void StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) {
452*67e74705SXin Li PrintStmt(Node->getCapturedDecl()->getBody());
453*67e74705SXin Li }
454*67e74705SXin Li
VisitObjCAtTryStmt(ObjCAtTryStmt * Node)455*67e74705SXin Li void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
456*67e74705SXin Li Indent() << "@try";
457*67e74705SXin Li if (CompoundStmt *TS = dyn_cast<CompoundStmt>(Node->getTryBody())) {
458*67e74705SXin Li PrintRawCompoundStmt(TS);
459*67e74705SXin Li OS << "\n";
460*67e74705SXin Li }
461*67e74705SXin Li
462*67e74705SXin Li for (unsigned I = 0, N = Node->getNumCatchStmts(); I != N; ++I) {
463*67e74705SXin Li ObjCAtCatchStmt *catchStmt = Node->getCatchStmt(I);
464*67e74705SXin Li Indent() << "@catch(";
465*67e74705SXin Li if (catchStmt->getCatchParamDecl()) {
466*67e74705SXin Li if (Decl *DS = catchStmt->getCatchParamDecl())
467*67e74705SXin Li PrintRawDecl(DS);
468*67e74705SXin Li }
469*67e74705SXin Li OS << ")";
470*67e74705SXin Li if (CompoundStmt *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
471*67e74705SXin Li PrintRawCompoundStmt(CS);
472*67e74705SXin Li OS << "\n";
473*67e74705SXin Li }
474*67e74705SXin Li }
475*67e74705SXin Li
476*67e74705SXin Li if (ObjCAtFinallyStmt *FS = static_cast<ObjCAtFinallyStmt *>(
477*67e74705SXin Li Node->getFinallyStmt())) {
478*67e74705SXin Li Indent() << "@finally";
479*67e74705SXin Li PrintRawCompoundStmt(dyn_cast<CompoundStmt>(FS->getFinallyBody()));
480*67e74705SXin Li OS << "\n";
481*67e74705SXin Li }
482*67e74705SXin Li }
483*67e74705SXin Li
VisitObjCAtFinallyStmt(ObjCAtFinallyStmt * Node)484*67e74705SXin Li void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
485*67e74705SXin Li }
486*67e74705SXin Li
VisitObjCAtCatchStmt(ObjCAtCatchStmt * Node)487*67e74705SXin Li void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
488*67e74705SXin Li Indent() << "@catch (...) { /* todo */ } \n";
489*67e74705SXin Li }
490*67e74705SXin Li
VisitObjCAtThrowStmt(ObjCAtThrowStmt * Node)491*67e74705SXin Li void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
492*67e74705SXin Li Indent() << "@throw";
493*67e74705SXin Li if (Node->getThrowExpr()) {
494*67e74705SXin Li OS << " ";
495*67e74705SXin Li PrintExpr(Node->getThrowExpr());
496*67e74705SXin Li }
497*67e74705SXin Li OS << ";\n";
498*67e74705SXin Li }
499*67e74705SXin Li
VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt * Node)500*67e74705SXin Li void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
501*67e74705SXin Li Indent() << "@synchronized (";
502*67e74705SXin Li PrintExpr(Node->getSynchExpr());
503*67e74705SXin Li OS << ")";
504*67e74705SXin Li PrintRawCompoundStmt(Node->getSynchBody());
505*67e74705SXin Li OS << "\n";
506*67e74705SXin Li }
507*67e74705SXin Li
VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt * Node)508*67e74705SXin Li void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
509*67e74705SXin Li Indent() << "@autoreleasepool";
510*67e74705SXin Li PrintRawCompoundStmt(dyn_cast<CompoundStmt>(Node->getSubStmt()));
511*67e74705SXin Li OS << "\n";
512*67e74705SXin Li }
513*67e74705SXin Li
PrintRawCXXCatchStmt(CXXCatchStmt * Node)514*67e74705SXin Li void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
515*67e74705SXin Li OS << "catch (";
516*67e74705SXin Li if (Decl *ExDecl = Node->getExceptionDecl())
517*67e74705SXin Li PrintRawDecl(ExDecl);
518*67e74705SXin Li else
519*67e74705SXin Li OS << "...";
520*67e74705SXin Li OS << ") ";
521*67e74705SXin Li PrintRawCompoundStmt(cast<CompoundStmt>(Node->getHandlerBlock()));
522*67e74705SXin Li }
523*67e74705SXin Li
VisitCXXCatchStmt(CXXCatchStmt * Node)524*67e74705SXin Li void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
525*67e74705SXin Li Indent();
526*67e74705SXin Li PrintRawCXXCatchStmt(Node);
527*67e74705SXin Li OS << "\n";
528*67e74705SXin Li }
529*67e74705SXin Li
VisitCXXTryStmt(CXXTryStmt * Node)530*67e74705SXin Li void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
531*67e74705SXin Li Indent() << "try ";
532*67e74705SXin Li PrintRawCompoundStmt(Node->getTryBlock());
533*67e74705SXin Li for (unsigned i = 0, e = Node->getNumHandlers(); i < e; ++i) {
534*67e74705SXin Li OS << " ";
535*67e74705SXin Li PrintRawCXXCatchStmt(Node->getHandler(i));
536*67e74705SXin Li }
537*67e74705SXin Li OS << "\n";
538*67e74705SXin Li }
539*67e74705SXin Li
VisitSEHTryStmt(SEHTryStmt * Node)540*67e74705SXin Li void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) {
541*67e74705SXin Li Indent() << (Node->getIsCXXTry() ? "try " : "__try ");
542*67e74705SXin Li PrintRawCompoundStmt(Node->getTryBlock());
543*67e74705SXin Li SEHExceptStmt *E = Node->getExceptHandler();
544*67e74705SXin Li SEHFinallyStmt *F = Node->getFinallyHandler();
545*67e74705SXin Li if(E)
546*67e74705SXin Li PrintRawSEHExceptHandler(E);
547*67e74705SXin Li else {
548*67e74705SXin Li assert(F && "Must have a finally block...");
549*67e74705SXin Li PrintRawSEHFinallyStmt(F);
550*67e74705SXin Li }
551*67e74705SXin Li OS << "\n";
552*67e74705SXin Li }
553*67e74705SXin Li
PrintRawSEHFinallyStmt(SEHFinallyStmt * Node)554*67e74705SXin Li void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) {
555*67e74705SXin Li OS << "__finally ";
556*67e74705SXin Li PrintRawCompoundStmt(Node->getBlock());
557*67e74705SXin Li OS << "\n";
558*67e74705SXin Li }
559*67e74705SXin Li
PrintRawSEHExceptHandler(SEHExceptStmt * Node)560*67e74705SXin Li void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) {
561*67e74705SXin Li OS << "__except (";
562*67e74705SXin Li VisitExpr(Node->getFilterExpr());
563*67e74705SXin Li OS << ")\n";
564*67e74705SXin Li PrintRawCompoundStmt(Node->getBlock());
565*67e74705SXin Li OS << "\n";
566*67e74705SXin Li }
567*67e74705SXin Li
VisitSEHExceptStmt(SEHExceptStmt * Node)568*67e74705SXin Li void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) {
569*67e74705SXin Li Indent();
570*67e74705SXin Li PrintRawSEHExceptHandler(Node);
571*67e74705SXin Li OS << "\n";
572*67e74705SXin Li }
573*67e74705SXin Li
VisitSEHFinallyStmt(SEHFinallyStmt * Node)574*67e74705SXin Li void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
575*67e74705SXin Li Indent();
576*67e74705SXin Li PrintRawSEHFinallyStmt(Node);
577*67e74705SXin Li OS << "\n";
578*67e74705SXin Li }
579*67e74705SXin Li
VisitSEHLeaveStmt(SEHLeaveStmt * Node)580*67e74705SXin Li void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) {
581*67e74705SXin Li Indent() << "__leave;";
582*67e74705SXin Li if (Policy.IncludeNewlines) OS << "\n";
583*67e74705SXin Li }
584*67e74705SXin Li
585*67e74705SXin Li //===----------------------------------------------------------------------===//
586*67e74705SXin Li // OpenMP clauses printing methods
587*67e74705SXin Li //===----------------------------------------------------------------------===//
588*67e74705SXin Li
589*67e74705SXin Li namespace {
590*67e74705SXin Li class OMPClausePrinter : public OMPClauseVisitor<OMPClausePrinter> {
591*67e74705SXin Li raw_ostream &OS;
592*67e74705SXin Li const PrintingPolicy &Policy;
593*67e74705SXin Li /// \brief Process clauses with list of variables.
594*67e74705SXin Li template <typename T>
595*67e74705SXin Li void VisitOMPClauseList(T *Node, char StartSym);
596*67e74705SXin Li public:
OMPClausePrinter(raw_ostream & OS,const PrintingPolicy & Policy)597*67e74705SXin Li OMPClausePrinter(raw_ostream &OS, const PrintingPolicy &Policy)
598*67e74705SXin Li : OS(OS), Policy(Policy) { }
599*67e74705SXin Li #define OPENMP_CLAUSE(Name, Class) \
600*67e74705SXin Li void Visit##Class(Class *S);
601*67e74705SXin Li #include "clang/Basic/OpenMPKinds.def"
602*67e74705SXin Li };
603*67e74705SXin Li
VisitOMPIfClause(OMPIfClause * Node)604*67e74705SXin Li void OMPClausePrinter::VisitOMPIfClause(OMPIfClause *Node) {
605*67e74705SXin Li OS << "if(";
606*67e74705SXin Li if (Node->getNameModifier() != OMPD_unknown)
607*67e74705SXin Li OS << getOpenMPDirectiveName(Node->getNameModifier()) << ": ";
608*67e74705SXin Li Node->getCondition()->printPretty(OS, nullptr, Policy, 0);
609*67e74705SXin Li OS << ")";
610*67e74705SXin Li }
611*67e74705SXin Li
VisitOMPFinalClause(OMPFinalClause * Node)612*67e74705SXin Li void OMPClausePrinter::VisitOMPFinalClause(OMPFinalClause *Node) {
613*67e74705SXin Li OS << "final(";
614*67e74705SXin Li Node->getCondition()->printPretty(OS, nullptr, Policy, 0);
615*67e74705SXin Li OS << ")";
616*67e74705SXin Li }
617*67e74705SXin Li
VisitOMPNumThreadsClause(OMPNumThreadsClause * Node)618*67e74705SXin Li void OMPClausePrinter::VisitOMPNumThreadsClause(OMPNumThreadsClause *Node) {
619*67e74705SXin Li OS << "num_threads(";
620*67e74705SXin Li Node->getNumThreads()->printPretty(OS, nullptr, Policy, 0);
621*67e74705SXin Li OS << ")";
622*67e74705SXin Li }
623*67e74705SXin Li
VisitOMPSafelenClause(OMPSafelenClause * Node)624*67e74705SXin Li void OMPClausePrinter::VisitOMPSafelenClause(OMPSafelenClause *Node) {
625*67e74705SXin Li OS << "safelen(";
626*67e74705SXin Li Node->getSafelen()->printPretty(OS, nullptr, Policy, 0);
627*67e74705SXin Li OS << ")";
628*67e74705SXin Li }
629*67e74705SXin Li
VisitOMPSimdlenClause(OMPSimdlenClause * Node)630*67e74705SXin Li void OMPClausePrinter::VisitOMPSimdlenClause(OMPSimdlenClause *Node) {
631*67e74705SXin Li OS << "simdlen(";
632*67e74705SXin Li Node->getSimdlen()->printPretty(OS, nullptr, Policy, 0);
633*67e74705SXin Li OS << ")";
634*67e74705SXin Li }
635*67e74705SXin Li
VisitOMPCollapseClause(OMPCollapseClause * Node)636*67e74705SXin Li void OMPClausePrinter::VisitOMPCollapseClause(OMPCollapseClause *Node) {
637*67e74705SXin Li OS << "collapse(";
638*67e74705SXin Li Node->getNumForLoops()->printPretty(OS, nullptr, Policy, 0);
639*67e74705SXin Li OS << ")";
640*67e74705SXin Li }
641*67e74705SXin Li
VisitOMPDefaultClause(OMPDefaultClause * Node)642*67e74705SXin Li void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) {
643*67e74705SXin Li OS << "default("
644*67e74705SXin Li << getOpenMPSimpleClauseTypeName(OMPC_default, Node->getDefaultKind())
645*67e74705SXin Li << ")";
646*67e74705SXin Li }
647*67e74705SXin Li
VisitOMPProcBindClause(OMPProcBindClause * Node)648*67e74705SXin Li void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) {
649*67e74705SXin Li OS << "proc_bind("
650*67e74705SXin Li << getOpenMPSimpleClauseTypeName(OMPC_proc_bind, Node->getProcBindKind())
651*67e74705SXin Li << ")";
652*67e74705SXin Li }
653*67e74705SXin Li
VisitOMPScheduleClause(OMPScheduleClause * Node)654*67e74705SXin Li void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) {
655*67e74705SXin Li OS << "schedule(";
656*67e74705SXin Li if (Node->getFirstScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) {
657*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_schedule,
658*67e74705SXin Li Node->getFirstScheduleModifier());
659*67e74705SXin Li if (Node->getSecondScheduleModifier() != OMPC_SCHEDULE_MODIFIER_unknown) {
660*67e74705SXin Li OS << ", ";
661*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_schedule,
662*67e74705SXin Li Node->getSecondScheduleModifier());
663*67e74705SXin Li }
664*67e74705SXin Li OS << ": ";
665*67e74705SXin Li }
666*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_schedule, Node->getScheduleKind());
667*67e74705SXin Li if (auto *E = Node->getChunkSize()) {
668*67e74705SXin Li OS << ", ";
669*67e74705SXin Li E->printPretty(OS, nullptr, Policy);
670*67e74705SXin Li }
671*67e74705SXin Li OS << ")";
672*67e74705SXin Li }
673*67e74705SXin Li
VisitOMPOrderedClause(OMPOrderedClause * Node)674*67e74705SXin Li void OMPClausePrinter::VisitOMPOrderedClause(OMPOrderedClause *Node) {
675*67e74705SXin Li OS << "ordered";
676*67e74705SXin Li if (auto *Num = Node->getNumForLoops()) {
677*67e74705SXin Li OS << "(";
678*67e74705SXin Li Num->printPretty(OS, nullptr, Policy, 0);
679*67e74705SXin Li OS << ")";
680*67e74705SXin Li }
681*67e74705SXin Li }
682*67e74705SXin Li
VisitOMPNowaitClause(OMPNowaitClause *)683*67e74705SXin Li void OMPClausePrinter::VisitOMPNowaitClause(OMPNowaitClause *) {
684*67e74705SXin Li OS << "nowait";
685*67e74705SXin Li }
686*67e74705SXin Li
VisitOMPUntiedClause(OMPUntiedClause *)687*67e74705SXin Li void OMPClausePrinter::VisitOMPUntiedClause(OMPUntiedClause *) {
688*67e74705SXin Li OS << "untied";
689*67e74705SXin Li }
690*67e74705SXin Li
VisitOMPNogroupClause(OMPNogroupClause *)691*67e74705SXin Li void OMPClausePrinter::VisitOMPNogroupClause(OMPNogroupClause *) {
692*67e74705SXin Li OS << "nogroup";
693*67e74705SXin Li }
694*67e74705SXin Li
VisitOMPMergeableClause(OMPMergeableClause *)695*67e74705SXin Li void OMPClausePrinter::VisitOMPMergeableClause(OMPMergeableClause *) {
696*67e74705SXin Li OS << "mergeable";
697*67e74705SXin Li }
698*67e74705SXin Li
VisitOMPReadClause(OMPReadClause *)699*67e74705SXin Li void OMPClausePrinter::VisitOMPReadClause(OMPReadClause *) { OS << "read"; }
700*67e74705SXin Li
VisitOMPWriteClause(OMPWriteClause *)701*67e74705SXin Li void OMPClausePrinter::VisitOMPWriteClause(OMPWriteClause *) { OS << "write"; }
702*67e74705SXin Li
VisitOMPUpdateClause(OMPUpdateClause *)703*67e74705SXin Li void OMPClausePrinter::VisitOMPUpdateClause(OMPUpdateClause *) {
704*67e74705SXin Li OS << "update";
705*67e74705SXin Li }
706*67e74705SXin Li
VisitOMPCaptureClause(OMPCaptureClause *)707*67e74705SXin Li void OMPClausePrinter::VisitOMPCaptureClause(OMPCaptureClause *) {
708*67e74705SXin Li OS << "capture";
709*67e74705SXin Li }
710*67e74705SXin Li
VisitOMPSeqCstClause(OMPSeqCstClause *)711*67e74705SXin Li void OMPClausePrinter::VisitOMPSeqCstClause(OMPSeqCstClause *) {
712*67e74705SXin Li OS << "seq_cst";
713*67e74705SXin Li }
714*67e74705SXin Li
VisitOMPThreadsClause(OMPThreadsClause *)715*67e74705SXin Li void OMPClausePrinter::VisitOMPThreadsClause(OMPThreadsClause *) {
716*67e74705SXin Li OS << "threads";
717*67e74705SXin Li }
718*67e74705SXin Li
VisitOMPSIMDClause(OMPSIMDClause *)719*67e74705SXin Li void OMPClausePrinter::VisitOMPSIMDClause(OMPSIMDClause *) { OS << "simd"; }
720*67e74705SXin Li
VisitOMPDeviceClause(OMPDeviceClause * Node)721*67e74705SXin Li void OMPClausePrinter::VisitOMPDeviceClause(OMPDeviceClause *Node) {
722*67e74705SXin Li OS << "device(";
723*67e74705SXin Li Node->getDevice()->printPretty(OS, nullptr, Policy, 0);
724*67e74705SXin Li OS << ")";
725*67e74705SXin Li }
726*67e74705SXin Li
VisitOMPNumTeamsClause(OMPNumTeamsClause * Node)727*67e74705SXin Li void OMPClausePrinter::VisitOMPNumTeamsClause(OMPNumTeamsClause *Node) {
728*67e74705SXin Li OS << "num_teams(";
729*67e74705SXin Li Node->getNumTeams()->printPretty(OS, nullptr, Policy, 0);
730*67e74705SXin Li OS << ")";
731*67e74705SXin Li }
732*67e74705SXin Li
VisitOMPThreadLimitClause(OMPThreadLimitClause * Node)733*67e74705SXin Li void OMPClausePrinter::VisitOMPThreadLimitClause(OMPThreadLimitClause *Node) {
734*67e74705SXin Li OS << "thread_limit(";
735*67e74705SXin Li Node->getThreadLimit()->printPretty(OS, nullptr, Policy, 0);
736*67e74705SXin Li OS << ")";
737*67e74705SXin Li }
738*67e74705SXin Li
VisitOMPPriorityClause(OMPPriorityClause * Node)739*67e74705SXin Li void OMPClausePrinter::VisitOMPPriorityClause(OMPPriorityClause *Node) {
740*67e74705SXin Li OS << "priority(";
741*67e74705SXin Li Node->getPriority()->printPretty(OS, nullptr, Policy, 0);
742*67e74705SXin Li OS << ")";
743*67e74705SXin Li }
744*67e74705SXin Li
VisitOMPGrainsizeClause(OMPGrainsizeClause * Node)745*67e74705SXin Li void OMPClausePrinter::VisitOMPGrainsizeClause(OMPGrainsizeClause *Node) {
746*67e74705SXin Li OS << "grainsize(";
747*67e74705SXin Li Node->getGrainsize()->printPretty(OS, nullptr, Policy, 0);
748*67e74705SXin Li OS << ")";
749*67e74705SXin Li }
750*67e74705SXin Li
VisitOMPNumTasksClause(OMPNumTasksClause * Node)751*67e74705SXin Li void OMPClausePrinter::VisitOMPNumTasksClause(OMPNumTasksClause *Node) {
752*67e74705SXin Li OS << "num_tasks(";
753*67e74705SXin Li Node->getNumTasks()->printPretty(OS, nullptr, Policy, 0);
754*67e74705SXin Li OS << ")";
755*67e74705SXin Li }
756*67e74705SXin Li
VisitOMPHintClause(OMPHintClause * Node)757*67e74705SXin Li void OMPClausePrinter::VisitOMPHintClause(OMPHintClause *Node) {
758*67e74705SXin Li OS << "hint(";
759*67e74705SXin Li Node->getHint()->printPretty(OS, nullptr, Policy, 0);
760*67e74705SXin Li OS << ")";
761*67e74705SXin Li }
762*67e74705SXin Li
763*67e74705SXin Li template<typename T>
VisitOMPClauseList(T * Node,char StartSym)764*67e74705SXin Li void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) {
765*67e74705SXin Li for (typename T::varlist_iterator I = Node->varlist_begin(),
766*67e74705SXin Li E = Node->varlist_end();
767*67e74705SXin Li I != E; ++I) {
768*67e74705SXin Li assert(*I && "Expected non-null Stmt");
769*67e74705SXin Li OS << (I == Node->varlist_begin() ? StartSym : ',');
770*67e74705SXin Li if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(*I)) {
771*67e74705SXin Li if (isa<OMPCapturedExprDecl>(DRE->getDecl()))
772*67e74705SXin Li DRE->printPretty(OS, nullptr, Policy, 0);
773*67e74705SXin Li else
774*67e74705SXin Li DRE->getDecl()->printQualifiedName(OS);
775*67e74705SXin Li } else
776*67e74705SXin Li (*I)->printPretty(OS, nullptr, Policy, 0);
777*67e74705SXin Li }
778*67e74705SXin Li }
779*67e74705SXin Li
VisitOMPPrivateClause(OMPPrivateClause * Node)780*67e74705SXin Li void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) {
781*67e74705SXin Li if (!Node->varlist_empty()) {
782*67e74705SXin Li OS << "private";
783*67e74705SXin Li VisitOMPClauseList(Node, '(');
784*67e74705SXin Li OS << ")";
785*67e74705SXin Li }
786*67e74705SXin Li }
787*67e74705SXin Li
VisitOMPFirstprivateClause(OMPFirstprivateClause * Node)788*67e74705SXin Li void OMPClausePrinter::VisitOMPFirstprivateClause(OMPFirstprivateClause *Node) {
789*67e74705SXin Li if (!Node->varlist_empty()) {
790*67e74705SXin Li OS << "firstprivate";
791*67e74705SXin Li VisitOMPClauseList(Node, '(');
792*67e74705SXin Li OS << ")";
793*67e74705SXin Li }
794*67e74705SXin Li }
795*67e74705SXin Li
VisitOMPLastprivateClause(OMPLastprivateClause * Node)796*67e74705SXin Li void OMPClausePrinter::VisitOMPLastprivateClause(OMPLastprivateClause *Node) {
797*67e74705SXin Li if (!Node->varlist_empty()) {
798*67e74705SXin Li OS << "lastprivate";
799*67e74705SXin Li VisitOMPClauseList(Node, '(');
800*67e74705SXin Li OS << ")";
801*67e74705SXin Li }
802*67e74705SXin Li }
803*67e74705SXin Li
VisitOMPSharedClause(OMPSharedClause * Node)804*67e74705SXin Li void OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) {
805*67e74705SXin Li if (!Node->varlist_empty()) {
806*67e74705SXin Li OS << "shared";
807*67e74705SXin Li VisitOMPClauseList(Node, '(');
808*67e74705SXin Li OS << ")";
809*67e74705SXin Li }
810*67e74705SXin Li }
811*67e74705SXin Li
VisitOMPReductionClause(OMPReductionClause * Node)812*67e74705SXin Li void OMPClausePrinter::VisitOMPReductionClause(OMPReductionClause *Node) {
813*67e74705SXin Li if (!Node->varlist_empty()) {
814*67e74705SXin Li OS << "reduction(";
815*67e74705SXin Li NestedNameSpecifier *QualifierLoc =
816*67e74705SXin Li Node->getQualifierLoc().getNestedNameSpecifier();
817*67e74705SXin Li OverloadedOperatorKind OOK =
818*67e74705SXin Li Node->getNameInfo().getName().getCXXOverloadedOperator();
819*67e74705SXin Li if (QualifierLoc == nullptr && OOK != OO_None) {
820*67e74705SXin Li // Print reduction identifier in C format
821*67e74705SXin Li OS << getOperatorSpelling(OOK);
822*67e74705SXin Li } else {
823*67e74705SXin Li // Use C++ format
824*67e74705SXin Li if (QualifierLoc != nullptr)
825*67e74705SXin Li QualifierLoc->print(OS, Policy);
826*67e74705SXin Li OS << Node->getNameInfo();
827*67e74705SXin Li }
828*67e74705SXin Li OS << ":";
829*67e74705SXin Li VisitOMPClauseList(Node, ' ');
830*67e74705SXin Li OS << ")";
831*67e74705SXin Li }
832*67e74705SXin Li }
833*67e74705SXin Li
VisitOMPLinearClause(OMPLinearClause * Node)834*67e74705SXin Li void OMPClausePrinter::VisitOMPLinearClause(OMPLinearClause *Node) {
835*67e74705SXin Li if (!Node->varlist_empty()) {
836*67e74705SXin Li OS << "linear";
837*67e74705SXin Li if (Node->getModifierLoc().isValid()) {
838*67e74705SXin Li OS << '('
839*67e74705SXin Li << getOpenMPSimpleClauseTypeName(OMPC_linear, Node->getModifier());
840*67e74705SXin Li }
841*67e74705SXin Li VisitOMPClauseList(Node, '(');
842*67e74705SXin Li if (Node->getModifierLoc().isValid())
843*67e74705SXin Li OS << ')';
844*67e74705SXin Li if (Node->getStep() != nullptr) {
845*67e74705SXin Li OS << ": ";
846*67e74705SXin Li Node->getStep()->printPretty(OS, nullptr, Policy, 0);
847*67e74705SXin Li }
848*67e74705SXin Li OS << ")";
849*67e74705SXin Li }
850*67e74705SXin Li }
851*67e74705SXin Li
VisitOMPAlignedClause(OMPAlignedClause * Node)852*67e74705SXin Li void OMPClausePrinter::VisitOMPAlignedClause(OMPAlignedClause *Node) {
853*67e74705SXin Li if (!Node->varlist_empty()) {
854*67e74705SXin Li OS << "aligned";
855*67e74705SXin Li VisitOMPClauseList(Node, '(');
856*67e74705SXin Li if (Node->getAlignment() != nullptr) {
857*67e74705SXin Li OS << ": ";
858*67e74705SXin Li Node->getAlignment()->printPretty(OS, nullptr, Policy, 0);
859*67e74705SXin Li }
860*67e74705SXin Li OS << ")";
861*67e74705SXin Li }
862*67e74705SXin Li }
863*67e74705SXin Li
VisitOMPCopyinClause(OMPCopyinClause * Node)864*67e74705SXin Li void OMPClausePrinter::VisitOMPCopyinClause(OMPCopyinClause *Node) {
865*67e74705SXin Li if (!Node->varlist_empty()) {
866*67e74705SXin Li OS << "copyin";
867*67e74705SXin Li VisitOMPClauseList(Node, '(');
868*67e74705SXin Li OS << ")";
869*67e74705SXin Li }
870*67e74705SXin Li }
871*67e74705SXin Li
VisitOMPCopyprivateClause(OMPCopyprivateClause * Node)872*67e74705SXin Li void OMPClausePrinter::VisitOMPCopyprivateClause(OMPCopyprivateClause *Node) {
873*67e74705SXin Li if (!Node->varlist_empty()) {
874*67e74705SXin Li OS << "copyprivate";
875*67e74705SXin Li VisitOMPClauseList(Node, '(');
876*67e74705SXin Li OS << ")";
877*67e74705SXin Li }
878*67e74705SXin Li }
879*67e74705SXin Li
VisitOMPFlushClause(OMPFlushClause * Node)880*67e74705SXin Li void OMPClausePrinter::VisitOMPFlushClause(OMPFlushClause *Node) {
881*67e74705SXin Li if (!Node->varlist_empty()) {
882*67e74705SXin Li VisitOMPClauseList(Node, '(');
883*67e74705SXin Li OS << ")";
884*67e74705SXin Li }
885*67e74705SXin Li }
886*67e74705SXin Li
VisitOMPDependClause(OMPDependClause * Node)887*67e74705SXin Li void OMPClausePrinter::VisitOMPDependClause(OMPDependClause *Node) {
888*67e74705SXin Li OS << "depend(";
889*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
890*67e74705SXin Li Node->getDependencyKind());
891*67e74705SXin Li if (!Node->varlist_empty()) {
892*67e74705SXin Li OS << " :";
893*67e74705SXin Li VisitOMPClauseList(Node, ' ');
894*67e74705SXin Li }
895*67e74705SXin Li OS << ")";
896*67e74705SXin Li }
897*67e74705SXin Li
VisitOMPMapClause(OMPMapClause * Node)898*67e74705SXin Li void OMPClausePrinter::VisitOMPMapClause(OMPMapClause *Node) {
899*67e74705SXin Li if (!Node->varlist_empty()) {
900*67e74705SXin Li OS << "map(";
901*67e74705SXin Li if (Node->getMapType() != OMPC_MAP_unknown) {
902*67e74705SXin Li if (Node->getMapTypeModifier() != OMPC_MAP_unknown) {
903*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_map,
904*67e74705SXin Li Node->getMapTypeModifier());
905*67e74705SXin Li OS << ',';
906*67e74705SXin Li }
907*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_map, Node->getMapType());
908*67e74705SXin Li OS << ':';
909*67e74705SXin Li }
910*67e74705SXin Li VisitOMPClauseList(Node, ' ');
911*67e74705SXin Li OS << ")";
912*67e74705SXin Li }
913*67e74705SXin Li }
914*67e74705SXin Li
VisitOMPToClause(OMPToClause * Node)915*67e74705SXin Li void OMPClausePrinter::VisitOMPToClause(OMPToClause *Node) {
916*67e74705SXin Li if (!Node->varlist_empty()) {
917*67e74705SXin Li OS << "to";
918*67e74705SXin Li VisitOMPClauseList(Node, '(');
919*67e74705SXin Li OS << ")";
920*67e74705SXin Li }
921*67e74705SXin Li }
922*67e74705SXin Li
VisitOMPFromClause(OMPFromClause * Node)923*67e74705SXin Li void OMPClausePrinter::VisitOMPFromClause(OMPFromClause *Node) {
924*67e74705SXin Li if (!Node->varlist_empty()) {
925*67e74705SXin Li OS << "from";
926*67e74705SXin Li VisitOMPClauseList(Node, '(');
927*67e74705SXin Li OS << ")";
928*67e74705SXin Li }
929*67e74705SXin Li }
930*67e74705SXin Li
VisitOMPDistScheduleClause(OMPDistScheduleClause * Node)931*67e74705SXin Li void OMPClausePrinter::VisitOMPDistScheduleClause(OMPDistScheduleClause *Node) {
932*67e74705SXin Li OS << "dist_schedule(" << getOpenMPSimpleClauseTypeName(
933*67e74705SXin Li OMPC_dist_schedule, Node->getDistScheduleKind());
934*67e74705SXin Li if (auto *E = Node->getChunkSize()) {
935*67e74705SXin Li OS << ", ";
936*67e74705SXin Li E->printPretty(OS, nullptr, Policy);
937*67e74705SXin Li }
938*67e74705SXin Li OS << ")";
939*67e74705SXin Li }
940*67e74705SXin Li
VisitOMPDefaultmapClause(OMPDefaultmapClause * Node)941*67e74705SXin Li void OMPClausePrinter::VisitOMPDefaultmapClause(OMPDefaultmapClause *Node) {
942*67e74705SXin Li OS << "defaultmap(";
943*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap,
944*67e74705SXin Li Node->getDefaultmapModifier());
945*67e74705SXin Li OS << ": ";
946*67e74705SXin Li OS << getOpenMPSimpleClauseTypeName(OMPC_defaultmap,
947*67e74705SXin Li Node->getDefaultmapKind());
948*67e74705SXin Li OS << ")";
949*67e74705SXin Li }
950*67e74705SXin Li
VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause * Node)951*67e74705SXin Li void OMPClausePrinter::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *Node) {
952*67e74705SXin Li if (!Node->varlist_empty()) {
953*67e74705SXin Li OS << "use_device_ptr";
954*67e74705SXin Li VisitOMPClauseList(Node, '(');
955*67e74705SXin Li OS << ")";
956*67e74705SXin Li }
957*67e74705SXin Li }
958*67e74705SXin Li
VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause * Node)959*67e74705SXin Li void OMPClausePrinter::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *Node) {
960*67e74705SXin Li if (!Node->varlist_empty()) {
961*67e74705SXin Li OS << "is_device_ptr";
962*67e74705SXin Li VisitOMPClauseList(Node, '(');
963*67e74705SXin Li OS << ")";
964*67e74705SXin Li }
965*67e74705SXin Li }
966*67e74705SXin Li }
967*67e74705SXin Li
968*67e74705SXin Li //===----------------------------------------------------------------------===//
969*67e74705SXin Li // OpenMP directives printing methods
970*67e74705SXin Li //===----------------------------------------------------------------------===//
971*67e74705SXin Li
PrintOMPExecutableDirective(OMPExecutableDirective * S)972*67e74705SXin Li void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S) {
973*67e74705SXin Li OMPClausePrinter Printer(OS, Policy);
974*67e74705SXin Li ArrayRef<OMPClause *> Clauses = S->clauses();
975*67e74705SXin Li for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
976*67e74705SXin Li I != E; ++I)
977*67e74705SXin Li if (*I && !(*I)->isImplicit()) {
978*67e74705SXin Li Printer.Visit(*I);
979*67e74705SXin Li OS << ' ';
980*67e74705SXin Li }
981*67e74705SXin Li OS << "\n";
982*67e74705SXin Li if (S->hasAssociatedStmt() && S->getAssociatedStmt()) {
983*67e74705SXin Li assert(isa<CapturedStmt>(S->getAssociatedStmt()) &&
984*67e74705SXin Li "Expected captured statement!");
985*67e74705SXin Li Stmt *CS = cast<CapturedStmt>(S->getAssociatedStmt())->getCapturedStmt();
986*67e74705SXin Li PrintStmt(CS);
987*67e74705SXin Li }
988*67e74705SXin Li }
989*67e74705SXin Li
VisitOMPParallelDirective(OMPParallelDirective * Node)990*67e74705SXin Li void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
991*67e74705SXin Li Indent() << "#pragma omp parallel ";
992*67e74705SXin Li PrintOMPExecutableDirective(Node);
993*67e74705SXin Li }
994*67e74705SXin Li
VisitOMPSimdDirective(OMPSimdDirective * Node)995*67e74705SXin Li void StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) {
996*67e74705SXin Li Indent() << "#pragma omp simd ";
997*67e74705SXin Li PrintOMPExecutableDirective(Node);
998*67e74705SXin Li }
999*67e74705SXin Li
VisitOMPForDirective(OMPForDirective * Node)1000*67e74705SXin Li void StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) {
1001*67e74705SXin Li Indent() << "#pragma omp for ";
1002*67e74705SXin Li PrintOMPExecutableDirective(Node);
1003*67e74705SXin Li }
1004*67e74705SXin Li
VisitOMPForSimdDirective(OMPForSimdDirective * Node)1005*67e74705SXin Li void StmtPrinter::VisitOMPForSimdDirective(OMPForSimdDirective *Node) {
1006*67e74705SXin Li Indent() << "#pragma omp for simd ";
1007*67e74705SXin Li PrintOMPExecutableDirective(Node);
1008*67e74705SXin Li }
1009*67e74705SXin Li
VisitOMPSectionsDirective(OMPSectionsDirective * Node)1010*67e74705SXin Li void StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) {
1011*67e74705SXin Li Indent() << "#pragma omp sections ";
1012*67e74705SXin Li PrintOMPExecutableDirective(Node);
1013*67e74705SXin Li }
1014*67e74705SXin Li
VisitOMPSectionDirective(OMPSectionDirective * Node)1015*67e74705SXin Li void StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) {
1016*67e74705SXin Li Indent() << "#pragma omp section";
1017*67e74705SXin Li PrintOMPExecutableDirective(Node);
1018*67e74705SXin Li }
1019*67e74705SXin Li
VisitOMPSingleDirective(OMPSingleDirective * Node)1020*67e74705SXin Li void StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) {
1021*67e74705SXin Li Indent() << "#pragma omp single ";
1022*67e74705SXin Li PrintOMPExecutableDirective(Node);
1023*67e74705SXin Li }
1024*67e74705SXin Li
VisitOMPMasterDirective(OMPMasterDirective * Node)1025*67e74705SXin Li void StmtPrinter::VisitOMPMasterDirective(OMPMasterDirective *Node) {
1026*67e74705SXin Li Indent() << "#pragma omp master";
1027*67e74705SXin Li PrintOMPExecutableDirective(Node);
1028*67e74705SXin Li }
1029*67e74705SXin Li
VisitOMPCriticalDirective(OMPCriticalDirective * Node)1030*67e74705SXin Li void StmtPrinter::VisitOMPCriticalDirective(OMPCriticalDirective *Node) {
1031*67e74705SXin Li Indent() << "#pragma omp critical";
1032*67e74705SXin Li if (Node->getDirectiveName().getName()) {
1033*67e74705SXin Li OS << " (";
1034*67e74705SXin Li Node->getDirectiveName().printName(OS);
1035*67e74705SXin Li OS << ")";
1036*67e74705SXin Li }
1037*67e74705SXin Li OS << " ";
1038*67e74705SXin Li PrintOMPExecutableDirective(Node);
1039*67e74705SXin Li }
1040*67e74705SXin Li
VisitOMPParallelForDirective(OMPParallelForDirective * Node)1041*67e74705SXin Li void StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) {
1042*67e74705SXin Li Indent() << "#pragma omp parallel for ";
1043*67e74705SXin Li PrintOMPExecutableDirective(Node);
1044*67e74705SXin Li }
1045*67e74705SXin Li
VisitOMPParallelForSimdDirective(OMPParallelForSimdDirective * Node)1046*67e74705SXin Li void StmtPrinter::VisitOMPParallelForSimdDirective(
1047*67e74705SXin Li OMPParallelForSimdDirective *Node) {
1048*67e74705SXin Li Indent() << "#pragma omp parallel for simd ";
1049*67e74705SXin Li PrintOMPExecutableDirective(Node);
1050*67e74705SXin Li }
1051*67e74705SXin Li
VisitOMPParallelSectionsDirective(OMPParallelSectionsDirective * Node)1052*67e74705SXin Li void StmtPrinter::VisitOMPParallelSectionsDirective(
1053*67e74705SXin Li OMPParallelSectionsDirective *Node) {
1054*67e74705SXin Li Indent() << "#pragma omp parallel sections ";
1055*67e74705SXin Li PrintOMPExecutableDirective(Node);
1056*67e74705SXin Li }
1057*67e74705SXin Li
VisitOMPTaskDirective(OMPTaskDirective * Node)1058*67e74705SXin Li void StmtPrinter::VisitOMPTaskDirective(OMPTaskDirective *Node) {
1059*67e74705SXin Li Indent() << "#pragma omp task ";
1060*67e74705SXin Li PrintOMPExecutableDirective(Node);
1061*67e74705SXin Li }
1062*67e74705SXin Li
VisitOMPTaskyieldDirective(OMPTaskyieldDirective * Node)1063*67e74705SXin Li void StmtPrinter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *Node) {
1064*67e74705SXin Li Indent() << "#pragma omp taskyield";
1065*67e74705SXin Li PrintOMPExecutableDirective(Node);
1066*67e74705SXin Li }
1067*67e74705SXin Li
VisitOMPBarrierDirective(OMPBarrierDirective * Node)1068*67e74705SXin Li void StmtPrinter::VisitOMPBarrierDirective(OMPBarrierDirective *Node) {
1069*67e74705SXin Li Indent() << "#pragma omp barrier";
1070*67e74705SXin Li PrintOMPExecutableDirective(Node);
1071*67e74705SXin Li }
1072*67e74705SXin Li
VisitOMPTaskwaitDirective(OMPTaskwaitDirective * Node)1073*67e74705SXin Li void StmtPrinter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *Node) {
1074*67e74705SXin Li Indent() << "#pragma omp taskwait";
1075*67e74705SXin Li PrintOMPExecutableDirective(Node);
1076*67e74705SXin Li }
1077*67e74705SXin Li
VisitOMPTaskgroupDirective(OMPTaskgroupDirective * Node)1078*67e74705SXin Li void StmtPrinter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *Node) {
1079*67e74705SXin Li Indent() << "#pragma omp taskgroup";
1080*67e74705SXin Li PrintOMPExecutableDirective(Node);
1081*67e74705SXin Li }
1082*67e74705SXin Li
VisitOMPFlushDirective(OMPFlushDirective * Node)1083*67e74705SXin Li void StmtPrinter::VisitOMPFlushDirective(OMPFlushDirective *Node) {
1084*67e74705SXin Li Indent() << "#pragma omp flush ";
1085*67e74705SXin Li PrintOMPExecutableDirective(Node);
1086*67e74705SXin Li }
1087*67e74705SXin Li
VisitOMPOrderedDirective(OMPOrderedDirective * Node)1088*67e74705SXin Li void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) {
1089*67e74705SXin Li Indent() << "#pragma omp ordered ";
1090*67e74705SXin Li PrintOMPExecutableDirective(Node);
1091*67e74705SXin Li }
1092*67e74705SXin Li
VisitOMPAtomicDirective(OMPAtomicDirective * Node)1093*67e74705SXin Li void StmtPrinter::VisitOMPAtomicDirective(OMPAtomicDirective *Node) {
1094*67e74705SXin Li Indent() << "#pragma omp atomic ";
1095*67e74705SXin Li PrintOMPExecutableDirective(Node);
1096*67e74705SXin Li }
1097*67e74705SXin Li
VisitOMPTargetDirective(OMPTargetDirective * Node)1098*67e74705SXin Li void StmtPrinter::VisitOMPTargetDirective(OMPTargetDirective *Node) {
1099*67e74705SXin Li Indent() << "#pragma omp target ";
1100*67e74705SXin Li PrintOMPExecutableDirective(Node);
1101*67e74705SXin Li }
1102*67e74705SXin Li
VisitOMPTargetDataDirective(OMPTargetDataDirective * Node)1103*67e74705SXin Li void StmtPrinter::VisitOMPTargetDataDirective(OMPTargetDataDirective *Node) {
1104*67e74705SXin Li Indent() << "#pragma omp target data ";
1105*67e74705SXin Li PrintOMPExecutableDirective(Node);
1106*67e74705SXin Li }
1107*67e74705SXin Li
VisitOMPTargetEnterDataDirective(OMPTargetEnterDataDirective * Node)1108*67e74705SXin Li void StmtPrinter::VisitOMPTargetEnterDataDirective(
1109*67e74705SXin Li OMPTargetEnterDataDirective *Node) {
1110*67e74705SXin Li Indent() << "#pragma omp target enter data ";
1111*67e74705SXin Li PrintOMPExecutableDirective(Node);
1112*67e74705SXin Li }
1113*67e74705SXin Li
VisitOMPTargetExitDataDirective(OMPTargetExitDataDirective * Node)1114*67e74705SXin Li void StmtPrinter::VisitOMPTargetExitDataDirective(
1115*67e74705SXin Li OMPTargetExitDataDirective *Node) {
1116*67e74705SXin Li Indent() << "#pragma omp target exit data ";
1117*67e74705SXin Li PrintOMPExecutableDirective(Node);
1118*67e74705SXin Li }
1119*67e74705SXin Li
VisitOMPTargetParallelDirective(OMPTargetParallelDirective * Node)1120*67e74705SXin Li void StmtPrinter::VisitOMPTargetParallelDirective(
1121*67e74705SXin Li OMPTargetParallelDirective *Node) {
1122*67e74705SXin Li Indent() << "#pragma omp target parallel ";
1123*67e74705SXin Li PrintOMPExecutableDirective(Node);
1124*67e74705SXin Li }
1125*67e74705SXin Li
VisitOMPTargetParallelForDirective(OMPTargetParallelForDirective * Node)1126*67e74705SXin Li void StmtPrinter::VisitOMPTargetParallelForDirective(
1127*67e74705SXin Li OMPTargetParallelForDirective *Node) {
1128*67e74705SXin Li Indent() << "#pragma omp target parallel for ";
1129*67e74705SXin Li PrintOMPExecutableDirective(Node);
1130*67e74705SXin Li }
1131*67e74705SXin Li
VisitOMPTeamsDirective(OMPTeamsDirective * Node)1132*67e74705SXin Li void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) {
1133*67e74705SXin Li Indent() << "#pragma omp teams ";
1134*67e74705SXin Li PrintOMPExecutableDirective(Node);
1135*67e74705SXin Li }
1136*67e74705SXin Li
VisitOMPCancellationPointDirective(OMPCancellationPointDirective * Node)1137*67e74705SXin Li void StmtPrinter::VisitOMPCancellationPointDirective(
1138*67e74705SXin Li OMPCancellationPointDirective *Node) {
1139*67e74705SXin Li Indent() << "#pragma omp cancellation point "
1140*67e74705SXin Li << getOpenMPDirectiveName(Node->getCancelRegion());
1141*67e74705SXin Li PrintOMPExecutableDirective(Node);
1142*67e74705SXin Li }
1143*67e74705SXin Li
VisitOMPCancelDirective(OMPCancelDirective * Node)1144*67e74705SXin Li void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) {
1145*67e74705SXin Li Indent() << "#pragma omp cancel "
1146*67e74705SXin Li << getOpenMPDirectiveName(Node->getCancelRegion()) << " ";
1147*67e74705SXin Li PrintOMPExecutableDirective(Node);
1148*67e74705SXin Li }
1149*67e74705SXin Li
VisitOMPTaskLoopDirective(OMPTaskLoopDirective * Node)1150*67e74705SXin Li void StmtPrinter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *Node) {
1151*67e74705SXin Li Indent() << "#pragma omp taskloop ";
1152*67e74705SXin Li PrintOMPExecutableDirective(Node);
1153*67e74705SXin Li }
1154*67e74705SXin Li
VisitOMPTaskLoopSimdDirective(OMPTaskLoopSimdDirective * Node)1155*67e74705SXin Li void StmtPrinter::VisitOMPTaskLoopSimdDirective(
1156*67e74705SXin Li OMPTaskLoopSimdDirective *Node) {
1157*67e74705SXin Li Indent() << "#pragma omp taskloop simd ";
1158*67e74705SXin Li PrintOMPExecutableDirective(Node);
1159*67e74705SXin Li }
1160*67e74705SXin Li
VisitOMPDistributeDirective(OMPDistributeDirective * Node)1161*67e74705SXin Li void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective *Node) {
1162*67e74705SXin Li Indent() << "#pragma omp distribute ";
1163*67e74705SXin Li PrintOMPExecutableDirective(Node);
1164*67e74705SXin Li }
1165*67e74705SXin Li
VisitOMPTargetUpdateDirective(OMPTargetUpdateDirective * Node)1166*67e74705SXin Li void StmtPrinter::VisitOMPTargetUpdateDirective(
1167*67e74705SXin Li OMPTargetUpdateDirective *Node) {
1168*67e74705SXin Li Indent() << "#pragma omp target update ";
1169*67e74705SXin Li PrintOMPExecutableDirective(Node);
1170*67e74705SXin Li }
1171*67e74705SXin Li
VisitOMPDistributeParallelForDirective(OMPDistributeParallelForDirective * Node)1172*67e74705SXin Li void StmtPrinter::VisitOMPDistributeParallelForDirective(
1173*67e74705SXin Li OMPDistributeParallelForDirective *Node) {
1174*67e74705SXin Li Indent() << "#pragma omp distribute parallel for ";
1175*67e74705SXin Li PrintOMPExecutableDirective(Node);
1176*67e74705SXin Li }
1177*67e74705SXin Li
VisitOMPDistributeParallelForSimdDirective(OMPDistributeParallelForSimdDirective * Node)1178*67e74705SXin Li void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1179*67e74705SXin Li OMPDistributeParallelForSimdDirective *Node) {
1180*67e74705SXin Li Indent() << "#pragma omp distribute parallel for simd ";
1181*67e74705SXin Li PrintOMPExecutableDirective(Node);
1182*67e74705SXin Li }
1183*67e74705SXin Li
VisitOMPDistributeSimdDirective(OMPDistributeSimdDirective * Node)1184*67e74705SXin Li void StmtPrinter::VisitOMPDistributeSimdDirective(
1185*67e74705SXin Li OMPDistributeSimdDirective *Node) {
1186*67e74705SXin Li Indent() << "#pragma omp distribute simd ";
1187*67e74705SXin Li PrintOMPExecutableDirective(Node);
1188*67e74705SXin Li }
1189*67e74705SXin Li
VisitOMPTargetParallelForSimdDirective(OMPTargetParallelForSimdDirective * Node)1190*67e74705SXin Li void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1191*67e74705SXin Li OMPTargetParallelForSimdDirective *Node) {
1192*67e74705SXin Li Indent() << "#pragma omp target parallel for simd ";
1193*67e74705SXin Li PrintOMPExecutableDirective(Node);
1194*67e74705SXin Li }
1195*67e74705SXin Li
1196*67e74705SXin Li //===----------------------------------------------------------------------===//
1197*67e74705SXin Li // Expr printing methods.
1198*67e74705SXin Li //===----------------------------------------------------------------------===//
1199*67e74705SXin Li
VisitDeclRefExpr(DeclRefExpr * Node)1200*67e74705SXin Li void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
1201*67e74705SXin Li if (auto *OCED = dyn_cast<OMPCapturedExprDecl>(Node->getDecl())) {
1202*67e74705SXin Li OCED->getInit()->IgnoreImpCasts()->printPretty(OS, nullptr, Policy);
1203*67e74705SXin Li return;
1204*67e74705SXin Li }
1205*67e74705SXin Li if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1206*67e74705SXin Li Qualifier->print(OS, Policy);
1207*67e74705SXin Li if (Node->hasTemplateKeyword())
1208*67e74705SXin Li OS << "template ";
1209*67e74705SXin Li OS << Node->getNameInfo();
1210*67e74705SXin Li if (Node->hasExplicitTemplateArgs())
1211*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
1212*67e74705SXin Li OS, Node->template_arguments(), Policy);
1213*67e74705SXin Li }
1214*67e74705SXin Li
VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr * Node)1215*67e74705SXin Li void StmtPrinter::VisitDependentScopeDeclRefExpr(
1216*67e74705SXin Li DependentScopeDeclRefExpr *Node) {
1217*67e74705SXin Li if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1218*67e74705SXin Li Qualifier->print(OS, Policy);
1219*67e74705SXin Li if (Node->hasTemplateKeyword())
1220*67e74705SXin Li OS << "template ";
1221*67e74705SXin Li OS << Node->getNameInfo();
1222*67e74705SXin Li if (Node->hasExplicitTemplateArgs())
1223*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
1224*67e74705SXin Li OS, Node->template_arguments(), Policy);
1225*67e74705SXin Li }
1226*67e74705SXin Li
VisitUnresolvedLookupExpr(UnresolvedLookupExpr * Node)1227*67e74705SXin Li void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
1228*67e74705SXin Li if (Node->getQualifier())
1229*67e74705SXin Li Node->getQualifier()->print(OS, Policy);
1230*67e74705SXin Li if (Node->hasTemplateKeyword())
1231*67e74705SXin Li OS << "template ";
1232*67e74705SXin Li OS << Node->getNameInfo();
1233*67e74705SXin Li if (Node->hasExplicitTemplateArgs())
1234*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
1235*67e74705SXin Li OS, Node->template_arguments(), Policy);
1236*67e74705SXin Li }
1237*67e74705SXin Li
VisitObjCIvarRefExpr(ObjCIvarRefExpr * Node)1238*67e74705SXin Li void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
1239*67e74705SXin Li if (Node->getBase()) {
1240*67e74705SXin Li PrintExpr(Node->getBase());
1241*67e74705SXin Li OS << (Node->isArrow() ? "->" : ".");
1242*67e74705SXin Li }
1243*67e74705SXin Li OS << *Node->getDecl();
1244*67e74705SXin Li }
1245*67e74705SXin Li
VisitObjCPropertyRefExpr(ObjCPropertyRefExpr * Node)1246*67e74705SXin Li void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
1247*67e74705SXin Li if (Node->isSuperReceiver())
1248*67e74705SXin Li OS << "super.";
1249*67e74705SXin Li else if (Node->isObjectReceiver() && Node->getBase()) {
1250*67e74705SXin Li PrintExpr(Node->getBase());
1251*67e74705SXin Li OS << ".";
1252*67e74705SXin Li } else if (Node->isClassReceiver() && Node->getClassReceiver()) {
1253*67e74705SXin Li OS << Node->getClassReceiver()->getName() << ".";
1254*67e74705SXin Li }
1255*67e74705SXin Li
1256*67e74705SXin Li if (Node->isImplicitProperty())
1257*67e74705SXin Li Node->getImplicitPropertyGetter()->getSelector().print(OS);
1258*67e74705SXin Li else
1259*67e74705SXin Li OS << Node->getExplicitProperty()->getName();
1260*67e74705SXin Li }
1261*67e74705SXin Li
VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr * Node)1262*67e74705SXin Li void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
1263*67e74705SXin Li
1264*67e74705SXin Li PrintExpr(Node->getBaseExpr());
1265*67e74705SXin Li OS << "[";
1266*67e74705SXin Li PrintExpr(Node->getKeyExpr());
1267*67e74705SXin Li OS << "]";
1268*67e74705SXin Li }
1269*67e74705SXin Li
VisitPredefinedExpr(PredefinedExpr * Node)1270*67e74705SXin Li void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
1271*67e74705SXin Li OS << PredefinedExpr::getIdentTypeName(Node->getIdentType());
1272*67e74705SXin Li }
1273*67e74705SXin Li
VisitCharacterLiteral(CharacterLiteral * Node)1274*67e74705SXin Li void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
1275*67e74705SXin Li unsigned value = Node->getValue();
1276*67e74705SXin Li
1277*67e74705SXin Li switch (Node->getKind()) {
1278*67e74705SXin Li case CharacterLiteral::Ascii: break; // no prefix.
1279*67e74705SXin Li case CharacterLiteral::Wide: OS << 'L'; break;
1280*67e74705SXin Li case CharacterLiteral::UTF8: OS << "u8"; break;
1281*67e74705SXin Li case CharacterLiteral::UTF16: OS << 'u'; break;
1282*67e74705SXin Li case CharacterLiteral::UTF32: OS << 'U'; break;
1283*67e74705SXin Li }
1284*67e74705SXin Li
1285*67e74705SXin Li switch (value) {
1286*67e74705SXin Li case '\\':
1287*67e74705SXin Li OS << "'\\\\'";
1288*67e74705SXin Li break;
1289*67e74705SXin Li case '\'':
1290*67e74705SXin Li OS << "'\\''";
1291*67e74705SXin Li break;
1292*67e74705SXin Li case '\a':
1293*67e74705SXin Li // TODO: K&R: the meaning of '\\a' is different in traditional C
1294*67e74705SXin Li OS << "'\\a'";
1295*67e74705SXin Li break;
1296*67e74705SXin Li case '\b':
1297*67e74705SXin Li OS << "'\\b'";
1298*67e74705SXin Li break;
1299*67e74705SXin Li // Nonstandard escape sequence.
1300*67e74705SXin Li /*case '\e':
1301*67e74705SXin Li OS << "'\\e'";
1302*67e74705SXin Li break;*/
1303*67e74705SXin Li case '\f':
1304*67e74705SXin Li OS << "'\\f'";
1305*67e74705SXin Li break;
1306*67e74705SXin Li case '\n':
1307*67e74705SXin Li OS << "'\\n'";
1308*67e74705SXin Li break;
1309*67e74705SXin Li case '\r':
1310*67e74705SXin Li OS << "'\\r'";
1311*67e74705SXin Li break;
1312*67e74705SXin Li case '\t':
1313*67e74705SXin Li OS << "'\\t'";
1314*67e74705SXin Li break;
1315*67e74705SXin Li case '\v':
1316*67e74705SXin Li OS << "'\\v'";
1317*67e74705SXin Li break;
1318*67e74705SXin Li default:
1319*67e74705SXin Li // A character literal might be sign-extended, which
1320*67e74705SXin Li // would result in an invalid \U escape sequence.
1321*67e74705SXin Li // FIXME: multicharacter literals such as '\xFF\xFF\xFF\xFF'
1322*67e74705SXin Li // are not correctly handled.
1323*67e74705SXin Li if ((value & ~0xFFu) == ~0xFFu && Node->getKind() == CharacterLiteral::Ascii)
1324*67e74705SXin Li value &= 0xFFu;
1325*67e74705SXin Li if (value < 256 && isPrintable((unsigned char)value))
1326*67e74705SXin Li OS << "'" << (char)value << "'";
1327*67e74705SXin Li else if (value < 256)
1328*67e74705SXin Li OS << "'\\x" << llvm::format("%02x", value) << "'";
1329*67e74705SXin Li else if (value <= 0xFFFF)
1330*67e74705SXin Li OS << "'\\u" << llvm::format("%04x", value) << "'";
1331*67e74705SXin Li else
1332*67e74705SXin Li OS << "'\\U" << llvm::format("%08x", value) << "'";
1333*67e74705SXin Li }
1334*67e74705SXin Li }
1335*67e74705SXin Li
VisitIntegerLiteral(IntegerLiteral * Node)1336*67e74705SXin Li void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
1337*67e74705SXin Li bool isSigned = Node->getType()->isSignedIntegerType();
1338*67e74705SXin Li OS << Node->getValue().toString(10, isSigned);
1339*67e74705SXin Li
1340*67e74705SXin Li // Emit suffixes. Integer literals are always a builtin integer type.
1341*67e74705SXin Li switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
1342*67e74705SXin Li default: llvm_unreachable("Unexpected type for integer literal!");
1343*67e74705SXin Li case BuiltinType::Char_S:
1344*67e74705SXin Li case BuiltinType::Char_U: OS << "i8"; break;
1345*67e74705SXin Li case BuiltinType::UChar: OS << "Ui8"; break;
1346*67e74705SXin Li case BuiltinType::Short: OS << "i16"; break;
1347*67e74705SXin Li case BuiltinType::UShort: OS << "Ui16"; break;
1348*67e74705SXin Li case BuiltinType::Int: break; // no suffix.
1349*67e74705SXin Li case BuiltinType::UInt: OS << 'U'; break;
1350*67e74705SXin Li case BuiltinType::Long: OS << 'L'; break;
1351*67e74705SXin Li case BuiltinType::ULong: OS << "UL"; break;
1352*67e74705SXin Li case BuiltinType::LongLong: OS << "LL"; break;
1353*67e74705SXin Li case BuiltinType::ULongLong: OS << "ULL"; break;
1354*67e74705SXin Li }
1355*67e74705SXin Li }
1356*67e74705SXin Li
PrintFloatingLiteral(raw_ostream & OS,FloatingLiteral * Node,bool PrintSuffix)1357*67e74705SXin Li static void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node,
1358*67e74705SXin Li bool PrintSuffix) {
1359*67e74705SXin Li SmallString<16> Str;
1360*67e74705SXin Li Node->getValue().toString(Str);
1361*67e74705SXin Li OS << Str;
1362*67e74705SXin Li if (Str.find_first_not_of("-0123456789") == StringRef::npos)
1363*67e74705SXin Li OS << '.'; // Trailing dot in order to separate from ints.
1364*67e74705SXin Li
1365*67e74705SXin Li if (!PrintSuffix)
1366*67e74705SXin Li return;
1367*67e74705SXin Li
1368*67e74705SXin Li // Emit suffixes. Float literals are always a builtin float type.
1369*67e74705SXin Li switch (Node->getType()->getAs<BuiltinType>()->getKind()) {
1370*67e74705SXin Li default: llvm_unreachable("Unexpected type for float literal!");
1371*67e74705SXin Li case BuiltinType::Half: break; // FIXME: suffix?
1372*67e74705SXin Li case BuiltinType::Double: break; // no suffix.
1373*67e74705SXin Li case BuiltinType::Float: OS << 'F'; break;
1374*67e74705SXin Li case BuiltinType::LongDouble: OS << 'L'; break;
1375*67e74705SXin Li case BuiltinType::Float128: OS << 'Q'; break;
1376*67e74705SXin Li }
1377*67e74705SXin Li }
1378*67e74705SXin Li
VisitFloatingLiteral(FloatingLiteral * Node)1379*67e74705SXin Li void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
1380*67e74705SXin Li PrintFloatingLiteral(OS, Node, /*PrintSuffix=*/true);
1381*67e74705SXin Li }
1382*67e74705SXin Li
VisitImaginaryLiteral(ImaginaryLiteral * Node)1383*67e74705SXin Li void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
1384*67e74705SXin Li PrintExpr(Node->getSubExpr());
1385*67e74705SXin Li OS << "i";
1386*67e74705SXin Li }
1387*67e74705SXin Li
VisitStringLiteral(StringLiteral * Str)1388*67e74705SXin Li void StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
1389*67e74705SXin Li Str->outputString(OS);
1390*67e74705SXin Li }
VisitParenExpr(ParenExpr * Node)1391*67e74705SXin Li void StmtPrinter::VisitParenExpr(ParenExpr *Node) {
1392*67e74705SXin Li OS << "(";
1393*67e74705SXin Li PrintExpr(Node->getSubExpr());
1394*67e74705SXin Li OS << ")";
1395*67e74705SXin Li }
VisitUnaryOperator(UnaryOperator * Node)1396*67e74705SXin Li void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
1397*67e74705SXin Li if (!Node->isPostfix()) {
1398*67e74705SXin Li OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
1399*67e74705SXin Li
1400*67e74705SXin Li // Print a space if this is an "identifier operator" like __real, or if
1401*67e74705SXin Li // it might be concatenated incorrectly like '+'.
1402*67e74705SXin Li switch (Node->getOpcode()) {
1403*67e74705SXin Li default: break;
1404*67e74705SXin Li case UO_Real:
1405*67e74705SXin Li case UO_Imag:
1406*67e74705SXin Li case UO_Extension:
1407*67e74705SXin Li OS << ' ';
1408*67e74705SXin Li break;
1409*67e74705SXin Li case UO_Plus:
1410*67e74705SXin Li case UO_Minus:
1411*67e74705SXin Li if (isa<UnaryOperator>(Node->getSubExpr()))
1412*67e74705SXin Li OS << ' ';
1413*67e74705SXin Li break;
1414*67e74705SXin Li }
1415*67e74705SXin Li }
1416*67e74705SXin Li PrintExpr(Node->getSubExpr());
1417*67e74705SXin Li
1418*67e74705SXin Li if (Node->isPostfix())
1419*67e74705SXin Li OS << UnaryOperator::getOpcodeStr(Node->getOpcode());
1420*67e74705SXin Li }
1421*67e74705SXin Li
VisitOffsetOfExpr(OffsetOfExpr * Node)1422*67e74705SXin Li void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
1423*67e74705SXin Li OS << "__builtin_offsetof(";
1424*67e74705SXin Li Node->getTypeSourceInfo()->getType().print(OS, Policy);
1425*67e74705SXin Li OS << ", ";
1426*67e74705SXin Li bool PrintedSomething = false;
1427*67e74705SXin Li for (unsigned i = 0, n = Node->getNumComponents(); i < n; ++i) {
1428*67e74705SXin Li OffsetOfNode ON = Node->getComponent(i);
1429*67e74705SXin Li if (ON.getKind() == OffsetOfNode::Array) {
1430*67e74705SXin Li // Array node
1431*67e74705SXin Li OS << "[";
1432*67e74705SXin Li PrintExpr(Node->getIndexExpr(ON.getArrayExprIndex()));
1433*67e74705SXin Li OS << "]";
1434*67e74705SXin Li PrintedSomething = true;
1435*67e74705SXin Li continue;
1436*67e74705SXin Li }
1437*67e74705SXin Li
1438*67e74705SXin Li // Skip implicit base indirections.
1439*67e74705SXin Li if (ON.getKind() == OffsetOfNode::Base)
1440*67e74705SXin Li continue;
1441*67e74705SXin Li
1442*67e74705SXin Li // Field or identifier node.
1443*67e74705SXin Li IdentifierInfo *Id = ON.getFieldName();
1444*67e74705SXin Li if (!Id)
1445*67e74705SXin Li continue;
1446*67e74705SXin Li
1447*67e74705SXin Li if (PrintedSomething)
1448*67e74705SXin Li OS << ".";
1449*67e74705SXin Li else
1450*67e74705SXin Li PrintedSomething = true;
1451*67e74705SXin Li OS << Id->getName();
1452*67e74705SXin Li }
1453*67e74705SXin Li OS << ")";
1454*67e74705SXin Li }
1455*67e74705SXin Li
VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr * Node)1456*67e74705SXin Li void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node){
1457*67e74705SXin Li switch(Node->getKind()) {
1458*67e74705SXin Li case UETT_SizeOf:
1459*67e74705SXin Li OS << "sizeof";
1460*67e74705SXin Li break;
1461*67e74705SXin Li case UETT_AlignOf:
1462*67e74705SXin Li if (Policy.Alignof)
1463*67e74705SXin Li OS << "alignof";
1464*67e74705SXin Li else if (Policy.UnderscoreAlignof)
1465*67e74705SXin Li OS << "_Alignof";
1466*67e74705SXin Li else
1467*67e74705SXin Li OS << "__alignof";
1468*67e74705SXin Li break;
1469*67e74705SXin Li case UETT_VecStep:
1470*67e74705SXin Li OS << "vec_step";
1471*67e74705SXin Li break;
1472*67e74705SXin Li case UETT_OpenMPRequiredSimdAlign:
1473*67e74705SXin Li OS << "__builtin_omp_required_simd_align";
1474*67e74705SXin Li break;
1475*67e74705SXin Li }
1476*67e74705SXin Li if (Node->isArgumentType()) {
1477*67e74705SXin Li OS << '(';
1478*67e74705SXin Li Node->getArgumentType().print(OS, Policy);
1479*67e74705SXin Li OS << ')';
1480*67e74705SXin Li } else {
1481*67e74705SXin Li OS << " ";
1482*67e74705SXin Li PrintExpr(Node->getArgumentExpr());
1483*67e74705SXin Li }
1484*67e74705SXin Li }
1485*67e74705SXin Li
VisitGenericSelectionExpr(GenericSelectionExpr * Node)1486*67e74705SXin Li void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
1487*67e74705SXin Li OS << "_Generic(";
1488*67e74705SXin Li PrintExpr(Node->getControllingExpr());
1489*67e74705SXin Li for (unsigned i = 0; i != Node->getNumAssocs(); ++i) {
1490*67e74705SXin Li OS << ", ";
1491*67e74705SXin Li QualType T = Node->getAssocType(i);
1492*67e74705SXin Li if (T.isNull())
1493*67e74705SXin Li OS << "default";
1494*67e74705SXin Li else
1495*67e74705SXin Li T.print(OS, Policy);
1496*67e74705SXin Li OS << ": ";
1497*67e74705SXin Li PrintExpr(Node->getAssocExpr(i));
1498*67e74705SXin Li }
1499*67e74705SXin Li OS << ")";
1500*67e74705SXin Li }
1501*67e74705SXin Li
VisitArraySubscriptExpr(ArraySubscriptExpr * Node)1502*67e74705SXin Li void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
1503*67e74705SXin Li PrintExpr(Node->getLHS());
1504*67e74705SXin Li OS << "[";
1505*67e74705SXin Li PrintExpr(Node->getRHS());
1506*67e74705SXin Li OS << "]";
1507*67e74705SXin Li }
1508*67e74705SXin Li
VisitOMPArraySectionExpr(OMPArraySectionExpr * Node)1509*67e74705SXin Li void StmtPrinter::VisitOMPArraySectionExpr(OMPArraySectionExpr *Node) {
1510*67e74705SXin Li PrintExpr(Node->getBase());
1511*67e74705SXin Li OS << "[";
1512*67e74705SXin Li if (Node->getLowerBound())
1513*67e74705SXin Li PrintExpr(Node->getLowerBound());
1514*67e74705SXin Li if (Node->getColonLoc().isValid()) {
1515*67e74705SXin Li OS << ":";
1516*67e74705SXin Li if (Node->getLength())
1517*67e74705SXin Li PrintExpr(Node->getLength());
1518*67e74705SXin Li }
1519*67e74705SXin Li OS << "]";
1520*67e74705SXin Li }
1521*67e74705SXin Li
PrintCallArgs(CallExpr * Call)1522*67e74705SXin Li void StmtPrinter::PrintCallArgs(CallExpr *Call) {
1523*67e74705SXin Li for (unsigned i = 0, e = Call->getNumArgs(); i != e; ++i) {
1524*67e74705SXin Li if (isa<CXXDefaultArgExpr>(Call->getArg(i))) {
1525*67e74705SXin Li // Don't print any defaulted arguments
1526*67e74705SXin Li break;
1527*67e74705SXin Li }
1528*67e74705SXin Li
1529*67e74705SXin Li if (i) OS << ", ";
1530*67e74705SXin Li PrintExpr(Call->getArg(i));
1531*67e74705SXin Li }
1532*67e74705SXin Li }
1533*67e74705SXin Li
VisitCallExpr(CallExpr * Call)1534*67e74705SXin Li void StmtPrinter::VisitCallExpr(CallExpr *Call) {
1535*67e74705SXin Li PrintExpr(Call->getCallee());
1536*67e74705SXin Li OS << "(";
1537*67e74705SXin Li PrintCallArgs(Call);
1538*67e74705SXin Li OS << ")";
1539*67e74705SXin Li }
VisitMemberExpr(MemberExpr * Node)1540*67e74705SXin Li void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
1541*67e74705SXin Li // FIXME: Suppress printing implicit bases (like "this")
1542*67e74705SXin Li PrintExpr(Node->getBase());
1543*67e74705SXin Li
1544*67e74705SXin Li MemberExpr *ParentMember = dyn_cast<MemberExpr>(Node->getBase());
1545*67e74705SXin Li FieldDecl *ParentDecl = ParentMember
1546*67e74705SXin Li ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl()) : nullptr;
1547*67e74705SXin Li
1548*67e74705SXin Li if (!ParentDecl || !ParentDecl->isAnonymousStructOrUnion())
1549*67e74705SXin Li OS << (Node->isArrow() ? "->" : ".");
1550*67e74705SXin Li
1551*67e74705SXin Li if (FieldDecl *FD = dyn_cast<FieldDecl>(Node->getMemberDecl()))
1552*67e74705SXin Li if (FD->isAnonymousStructOrUnion())
1553*67e74705SXin Li return;
1554*67e74705SXin Li
1555*67e74705SXin Li if (NestedNameSpecifier *Qualifier = Node->getQualifier())
1556*67e74705SXin Li Qualifier->print(OS, Policy);
1557*67e74705SXin Li if (Node->hasTemplateKeyword())
1558*67e74705SXin Li OS << "template ";
1559*67e74705SXin Li OS << Node->getMemberNameInfo();
1560*67e74705SXin Li if (Node->hasExplicitTemplateArgs())
1561*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
1562*67e74705SXin Li OS, Node->template_arguments(), Policy);
1563*67e74705SXin Li }
VisitObjCIsaExpr(ObjCIsaExpr * Node)1564*67e74705SXin Li void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
1565*67e74705SXin Li PrintExpr(Node->getBase());
1566*67e74705SXin Li OS << (Node->isArrow() ? "->isa" : ".isa");
1567*67e74705SXin Li }
1568*67e74705SXin Li
VisitExtVectorElementExpr(ExtVectorElementExpr * Node)1569*67e74705SXin Li void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
1570*67e74705SXin Li PrintExpr(Node->getBase());
1571*67e74705SXin Li OS << ".";
1572*67e74705SXin Li OS << Node->getAccessor().getName();
1573*67e74705SXin Li }
VisitCStyleCastExpr(CStyleCastExpr * Node)1574*67e74705SXin Li void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
1575*67e74705SXin Li OS << '(';
1576*67e74705SXin Li Node->getTypeAsWritten().print(OS, Policy);
1577*67e74705SXin Li OS << ')';
1578*67e74705SXin Li PrintExpr(Node->getSubExpr());
1579*67e74705SXin Li }
VisitCompoundLiteralExpr(CompoundLiteralExpr * Node)1580*67e74705SXin Li void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
1581*67e74705SXin Li OS << '(';
1582*67e74705SXin Li Node->getType().print(OS, Policy);
1583*67e74705SXin Li OS << ')';
1584*67e74705SXin Li PrintExpr(Node->getInitializer());
1585*67e74705SXin Li }
VisitImplicitCastExpr(ImplicitCastExpr * Node)1586*67e74705SXin Li void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
1587*67e74705SXin Li // No need to print anything, simply forward to the subexpression.
1588*67e74705SXin Li PrintExpr(Node->getSubExpr());
1589*67e74705SXin Li }
VisitBinaryOperator(BinaryOperator * Node)1590*67e74705SXin Li void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
1591*67e74705SXin Li PrintExpr(Node->getLHS());
1592*67e74705SXin Li OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
1593*67e74705SXin Li PrintExpr(Node->getRHS());
1594*67e74705SXin Li }
VisitCompoundAssignOperator(CompoundAssignOperator * Node)1595*67e74705SXin Li void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
1596*67e74705SXin Li PrintExpr(Node->getLHS());
1597*67e74705SXin Li OS << " " << BinaryOperator::getOpcodeStr(Node->getOpcode()) << " ";
1598*67e74705SXin Li PrintExpr(Node->getRHS());
1599*67e74705SXin Li }
VisitConditionalOperator(ConditionalOperator * Node)1600*67e74705SXin Li void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
1601*67e74705SXin Li PrintExpr(Node->getCond());
1602*67e74705SXin Li OS << " ? ";
1603*67e74705SXin Li PrintExpr(Node->getLHS());
1604*67e74705SXin Li OS << " : ";
1605*67e74705SXin Li PrintExpr(Node->getRHS());
1606*67e74705SXin Li }
1607*67e74705SXin Li
1608*67e74705SXin Li // GNU extensions.
1609*67e74705SXin Li
1610*67e74705SXin Li void
VisitBinaryConditionalOperator(BinaryConditionalOperator * Node)1611*67e74705SXin Li StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
1612*67e74705SXin Li PrintExpr(Node->getCommon());
1613*67e74705SXin Li OS << " ?: ";
1614*67e74705SXin Li PrintExpr(Node->getFalseExpr());
1615*67e74705SXin Li }
VisitAddrLabelExpr(AddrLabelExpr * Node)1616*67e74705SXin Li void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
1617*67e74705SXin Li OS << "&&" << Node->getLabel()->getName();
1618*67e74705SXin Li }
1619*67e74705SXin Li
VisitStmtExpr(StmtExpr * E)1620*67e74705SXin Li void StmtPrinter::VisitStmtExpr(StmtExpr *E) {
1621*67e74705SXin Li OS << "(";
1622*67e74705SXin Li PrintRawCompoundStmt(E->getSubStmt());
1623*67e74705SXin Li OS << ")";
1624*67e74705SXin Li }
1625*67e74705SXin Li
VisitChooseExpr(ChooseExpr * Node)1626*67e74705SXin Li void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
1627*67e74705SXin Li OS << "__builtin_choose_expr(";
1628*67e74705SXin Li PrintExpr(Node->getCond());
1629*67e74705SXin Li OS << ", ";
1630*67e74705SXin Li PrintExpr(Node->getLHS());
1631*67e74705SXin Li OS << ", ";
1632*67e74705SXin Li PrintExpr(Node->getRHS());
1633*67e74705SXin Li OS << ")";
1634*67e74705SXin Li }
1635*67e74705SXin Li
VisitGNUNullExpr(GNUNullExpr *)1636*67e74705SXin Li void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
1637*67e74705SXin Li OS << "__null";
1638*67e74705SXin Li }
1639*67e74705SXin Li
VisitShuffleVectorExpr(ShuffleVectorExpr * Node)1640*67e74705SXin Li void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
1641*67e74705SXin Li OS << "__builtin_shufflevector(";
1642*67e74705SXin Li for (unsigned i = 0, e = Node->getNumSubExprs(); i != e; ++i) {
1643*67e74705SXin Li if (i) OS << ", ";
1644*67e74705SXin Li PrintExpr(Node->getExpr(i));
1645*67e74705SXin Li }
1646*67e74705SXin Li OS << ")";
1647*67e74705SXin Li }
1648*67e74705SXin Li
VisitConvertVectorExpr(ConvertVectorExpr * Node)1649*67e74705SXin Li void StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) {
1650*67e74705SXin Li OS << "__builtin_convertvector(";
1651*67e74705SXin Li PrintExpr(Node->getSrcExpr());
1652*67e74705SXin Li OS << ", ";
1653*67e74705SXin Li Node->getType().print(OS, Policy);
1654*67e74705SXin Li OS << ")";
1655*67e74705SXin Li }
1656*67e74705SXin Li
VisitInitListExpr(InitListExpr * Node)1657*67e74705SXin Li void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
1658*67e74705SXin Li if (Node->getSyntacticForm()) {
1659*67e74705SXin Li Visit(Node->getSyntacticForm());
1660*67e74705SXin Li return;
1661*67e74705SXin Li }
1662*67e74705SXin Li
1663*67e74705SXin Li OS << "{";
1664*67e74705SXin Li for (unsigned i = 0, e = Node->getNumInits(); i != e; ++i) {
1665*67e74705SXin Li if (i) OS << ", ";
1666*67e74705SXin Li if (Node->getInit(i))
1667*67e74705SXin Li PrintExpr(Node->getInit(i));
1668*67e74705SXin Li else
1669*67e74705SXin Li OS << "{}";
1670*67e74705SXin Li }
1671*67e74705SXin Li OS << "}";
1672*67e74705SXin Li }
1673*67e74705SXin Li
VisitParenListExpr(ParenListExpr * Node)1674*67e74705SXin Li void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
1675*67e74705SXin Li OS << "(";
1676*67e74705SXin Li for (unsigned i = 0, e = Node->getNumExprs(); i != e; ++i) {
1677*67e74705SXin Li if (i) OS << ", ";
1678*67e74705SXin Li PrintExpr(Node->getExpr(i));
1679*67e74705SXin Li }
1680*67e74705SXin Li OS << ")";
1681*67e74705SXin Li }
1682*67e74705SXin Li
VisitDesignatedInitExpr(DesignatedInitExpr * Node)1683*67e74705SXin Li void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
1684*67e74705SXin Li bool NeedsEquals = true;
1685*67e74705SXin Li for (const DesignatedInitExpr::Designator &D : Node->designators()) {
1686*67e74705SXin Li if (D.isFieldDesignator()) {
1687*67e74705SXin Li if (D.getDotLoc().isInvalid()) {
1688*67e74705SXin Li if (IdentifierInfo *II = D.getFieldName()) {
1689*67e74705SXin Li OS << II->getName() << ":";
1690*67e74705SXin Li NeedsEquals = false;
1691*67e74705SXin Li }
1692*67e74705SXin Li } else {
1693*67e74705SXin Li OS << "." << D.getFieldName()->getName();
1694*67e74705SXin Li }
1695*67e74705SXin Li } else {
1696*67e74705SXin Li OS << "[";
1697*67e74705SXin Li if (D.isArrayDesignator()) {
1698*67e74705SXin Li PrintExpr(Node->getArrayIndex(D));
1699*67e74705SXin Li } else {
1700*67e74705SXin Li PrintExpr(Node->getArrayRangeStart(D));
1701*67e74705SXin Li OS << " ... ";
1702*67e74705SXin Li PrintExpr(Node->getArrayRangeEnd(D));
1703*67e74705SXin Li }
1704*67e74705SXin Li OS << "]";
1705*67e74705SXin Li }
1706*67e74705SXin Li }
1707*67e74705SXin Li
1708*67e74705SXin Li if (NeedsEquals)
1709*67e74705SXin Li OS << " = ";
1710*67e74705SXin Li else
1711*67e74705SXin Li OS << " ";
1712*67e74705SXin Li PrintExpr(Node->getInit());
1713*67e74705SXin Li }
1714*67e74705SXin Li
VisitDesignatedInitUpdateExpr(DesignatedInitUpdateExpr * Node)1715*67e74705SXin Li void StmtPrinter::VisitDesignatedInitUpdateExpr(
1716*67e74705SXin Li DesignatedInitUpdateExpr *Node) {
1717*67e74705SXin Li OS << "{";
1718*67e74705SXin Li OS << "/*base*/";
1719*67e74705SXin Li PrintExpr(Node->getBase());
1720*67e74705SXin Li OS << ", ";
1721*67e74705SXin Li
1722*67e74705SXin Li OS << "/*updater*/";
1723*67e74705SXin Li PrintExpr(Node->getUpdater());
1724*67e74705SXin Li OS << "}";
1725*67e74705SXin Li }
1726*67e74705SXin Li
VisitNoInitExpr(NoInitExpr * Node)1727*67e74705SXin Li void StmtPrinter::VisitNoInitExpr(NoInitExpr *Node) {
1728*67e74705SXin Li OS << "/*no init*/";
1729*67e74705SXin Li }
1730*67e74705SXin Li
VisitImplicitValueInitExpr(ImplicitValueInitExpr * Node)1731*67e74705SXin Li void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
1732*67e74705SXin Li if (Node->getType()->getAsCXXRecordDecl()) {
1733*67e74705SXin Li OS << "/*implicit*/";
1734*67e74705SXin Li Node->getType().print(OS, Policy);
1735*67e74705SXin Li OS << "()";
1736*67e74705SXin Li } else {
1737*67e74705SXin Li OS << "/*implicit*/(";
1738*67e74705SXin Li Node->getType().print(OS, Policy);
1739*67e74705SXin Li OS << ')';
1740*67e74705SXin Li if (Node->getType()->isRecordType())
1741*67e74705SXin Li OS << "{}";
1742*67e74705SXin Li else
1743*67e74705SXin Li OS << 0;
1744*67e74705SXin Li }
1745*67e74705SXin Li }
1746*67e74705SXin Li
VisitVAArgExpr(VAArgExpr * Node)1747*67e74705SXin Li void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
1748*67e74705SXin Li OS << "__builtin_va_arg(";
1749*67e74705SXin Li PrintExpr(Node->getSubExpr());
1750*67e74705SXin Li OS << ", ";
1751*67e74705SXin Li Node->getType().print(OS, Policy);
1752*67e74705SXin Li OS << ")";
1753*67e74705SXin Li }
1754*67e74705SXin Li
VisitPseudoObjectExpr(PseudoObjectExpr * Node)1755*67e74705SXin Li void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
1756*67e74705SXin Li PrintExpr(Node->getSyntacticForm());
1757*67e74705SXin Li }
1758*67e74705SXin Li
VisitAtomicExpr(AtomicExpr * Node)1759*67e74705SXin Li void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
1760*67e74705SXin Li const char *Name = nullptr;
1761*67e74705SXin Li switch (Node->getOp()) {
1762*67e74705SXin Li #define BUILTIN(ID, TYPE, ATTRS)
1763*67e74705SXin Li #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1764*67e74705SXin Li case AtomicExpr::AO ## ID: \
1765*67e74705SXin Li Name = #ID "("; \
1766*67e74705SXin Li break;
1767*67e74705SXin Li #include "clang/Basic/Builtins.def"
1768*67e74705SXin Li }
1769*67e74705SXin Li OS << Name;
1770*67e74705SXin Li
1771*67e74705SXin Li // AtomicExpr stores its subexpressions in a permuted order.
1772*67e74705SXin Li PrintExpr(Node->getPtr());
1773*67e74705SXin Li if (Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1774*67e74705SXin Li Node->getOp() != AtomicExpr::AO__atomic_load_n) {
1775*67e74705SXin Li OS << ", ";
1776*67e74705SXin Li PrintExpr(Node->getVal1());
1777*67e74705SXin Li }
1778*67e74705SXin Li if (Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1779*67e74705SXin Li Node->isCmpXChg()) {
1780*67e74705SXin Li OS << ", ";
1781*67e74705SXin Li PrintExpr(Node->getVal2());
1782*67e74705SXin Li }
1783*67e74705SXin Li if (Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1784*67e74705SXin Li Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1785*67e74705SXin Li OS << ", ";
1786*67e74705SXin Li PrintExpr(Node->getWeak());
1787*67e74705SXin Li }
1788*67e74705SXin Li if (Node->getOp() != AtomicExpr::AO__c11_atomic_init) {
1789*67e74705SXin Li OS << ", ";
1790*67e74705SXin Li PrintExpr(Node->getOrder());
1791*67e74705SXin Li }
1792*67e74705SXin Li if (Node->isCmpXChg()) {
1793*67e74705SXin Li OS << ", ";
1794*67e74705SXin Li PrintExpr(Node->getOrderFail());
1795*67e74705SXin Li }
1796*67e74705SXin Li OS << ")";
1797*67e74705SXin Li }
1798*67e74705SXin Li
1799*67e74705SXin Li // C++
VisitCXXOperatorCallExpr(CXXOperatorCallExpr * Node)1800*67e74705SXin Li void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
1801*67e74705SXin Li const char *OpStrings[NUM_OVERLOADED_OPERATORS] = {
1802*67e74705SXin Li "",
1803*67e74705SXin Li #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
1804*67e74705SXin Li Spelling,
1805*67e74705SXin Li #include "clang/Basic/OperatorKinds.def"
1806*67e74705SXin Li };
1807*67e74705SXin Li
1808*67e74705SXin Li OverloadedOperatorKind Kind = Node->getOperator();
1809*67e74705SXin Li if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
1810*67e74705SXin Li if (Node->getNumArgs() == 1) {
1811*67e74705SXin Li OS << OpStrings[Kind] << ' ';
1812*67e74705SXin Li PrintExpr(Node->getArg(0));
1813*67e74705SXin Li } else {
1814*67e74705SXin Li PrintExpr(Node->getArg(0));
1815*67e74705SXin Li OS << ' ' << OpStrings[Kind];
1816*67e74705SXin Li }
1817*67e74705SXin Li } else if (Kind == OO_Arrow) {
1818*67e74705SXin Li PrintExpr(Node->getArg(0));
1819*67e74705SXin Li } else if (Kind == OO_Call) {
1820*67e74705SXin Li PrintExpr(Node->getArg(0));
1821*67e74705SXin Li OS << '(';
1822*67e74705SXin Li for (unsigned ArgIdx = 1; ArgIdx < Node->getNumArgs(); ++ArgIdx) {
1823*67e74705SXin Li if (ArgIdx > 1)
1824*67e74705SXin Li OS << ", ";
1825*67e74705SXin Li if (!isa<CXXDefaultArgExpr>(Node->getArg(ArgIdx)))
1826*67e74705SXin Li PrintExpr(Node->getArg(ArgIdx));
1827*67e74705SXin Li }
1828*67e74705SXin Li OS << ')';
1829*67e74705SXin Li } else if (Kind == OO_Subscript) {
1830*67e74705SXin Li PrintExpr(Node->getArg(0));
1831*67e74705SXin Li OS << '[';
1832*67e74705SXin Li PrintExpr(Node->getArg(1));
1833*67e74705SXin Li OS << ']';
1834*67e74705SXin Li } else if (Node->getNumArgs() == 1) {
1835*67e74705SXin Li OS << OpStrings[Kind] << ' ';
1836*67e74705SXin Li PrintExpr(Node->getArg(0));
1837*67e74705SXin Li } else if (Node->getNumArgs() == 2) {
1838*67e74705SXin Li PrintExpr(Node->getArg(0));
1839*67e74705SXin Li OS << ' ' << OpStrings[Kind] << ' ';
1840*67e74705SXin Li PrintExpr(Node->getArg(1));
1841*67e74705SXin Li } else {
1842*67e74705SXin Li llvm_unreachable("unknown overloaded operator");
1843*67e74705SXin Li }
1844*67e74705SXin Li }
1845*67e74705SXin Li
VisitCXXMemberCallExpr(CXXMemberCallExpr * Node)1846*67e74705SXin Li void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
1847*67e74705SXin Li // If we have a conversion operator call only print the argument.
1848*67e74705SXin Li CXXMethodDecl *MD = Node->getMethodDecl();
1849*67e74705SXin Li if (MD && isa<CXXConversionDecl>(MD)) {
1850*67e74705SXin Li PrintExpr(Node->getImplicitObjectArgument());
1851*67e74705SXin Li return;
1852*67e74705SXin Li }
1853*67e74705SXin Li VisitCallExpr(cast<CallExpr>(Node));
1854*67e74705SXin Li }
1855*67e74705SXin Li
VisitCUDAKernelCallExpr(CUDAKernelCallExpr * Node)1856*67e74705SXin Li void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
1857*67e74705SXin Li PrintExpr(Node->getCallee());
1858*67e74705SXin Li OS << "<<<";
1859*67e74705SXin Li PrintCallArgs(Node->getConfig());
1860*67e74705SXin Li OS << ">>>(";
1861*67e74705SXin Li PrintCallArgs(Node);
1862*67e74705SXin Li OS << ")";
1863*67e74705SXin Li }
1864*67e74705SXin Li
VisitCXXNamedCastExpr(CXXNamedCastExpr * Node)1865*67e74705SXin Li void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
1866*67e74705SXin Li OS << Node->getCastName() << '<';
1867*67e74705SXin Li Node->getTypeAsWritten().print(OS, Policy);
1868*67e74705SXin Li OS << ">(";
1869*67e74705SXin Li PrintExpr(Node->getSubExpr());
1870*67e74705SXin Li OS << ")";
1871*67e74705SXin Li }
1872*67e74705SXin Li
VisitCXXStaticCastExpr(CXXStaticCastExpr * Node)1873*67e74705SXin Li void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
1874*67e74705SXin Li VisitCXXNamedCastExpr(Node);
1875*67e74705SXin Li }
1876*67e74705SXin Li
VisitCXXDynamicCastExpr(CXXDynamicCastExpr * Node)1877*67e74705SXin Li void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
1878*67e74705SXin Li VisitCXXNamedCastExpr(Node);
1879*67e74705SXin Li }
1880*67e74705SXin Li
VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr * Node)1881*67e74705SXin Li void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
1882*67e74705SXin Li VisitCXXNamedCastExpr(Node);
1883*67e74705SXin Li }
1884*67e74705SXin Li
VisitCXXConstCastExpr(CXXConstCastExpr * Node)1885*67e74705SXin Li void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
1886*67e74705SXin Li VisitCXXNamedCastExpr(Node);
1887*67e74705SXin Li }
1888*67e74705SXin Li
VisitCXXTypeidExpr(CXXTypeidExpr * Node)1889*67e74705SXin Li void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
1890*67e74705SXin Li OS << "typeid(";
1891*67e74705SXin Li if (Node->isTypeOperand()) {
1892*67e74705SXin Li Node->getTypeOperandSourceInfo()->getType().print(OS, Policy);
1893*67e74705SXin Li } else {
1894*67e74705SXin Li PrintExpr(Node->getExprOperand());
1895*67e74705SXin Li }
1896*67e74705SXin Li OS << ")";
1897*67e74705SXin Li }
1898*67e74705SXin Li
VisitCXXUuidofExpr(CXXUuidofExpr * Node)1899*67e74705SXin Li void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
1900*67e74705SXin Li OS << "__uuidof(";
1901*67e74705SXin Li if (Node->isTypeOperand()) {
1902*67e74705SXin Li Node->getTypeOperandSourceInfo()->getType().print(OS, Policy);
1903*67e74705SXin Li } else {
1904*67e74705SXin Li PrintExpr(Node->getExprOperand());
1905*67e74705SXin Li }
1906*67e74705SXin Li OS << ")";
1907*67e74705SXin Li }
1908*67e74705SXin Li
VisitMSPropertyRefExpr(MSPropertyRefExpr * Node)1909*67e74705SXin Li void StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) {
1910*67e74705SXin Li PrintExpr(Node->getBaseExpr());
1911*67e74705SXin Li if (Node->isArrow())
1912*67e74705SXin Li OS << "->";
1913*67e74705SXin Li else
1914*67e74705SXin Li OS << ".";
1915*67e74705SXin Li if (NestedNameSpecifier *Qualifier =
1916*67e74705SXin Li Node->getQualifierLoc().getNestedNameSpecifier())
1917*67e74705SXin Li Qualifier->print(OS, Policy);
1918*67e74705SXin Li OS << Node->getPropertyDecl()->getDeclName();
1919*67e74705SXin Li }
1920*67e74705SXin Li
VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr * Node)1921*67e74705SXin Li void StmtPrinter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *Node) {
1922*67e74705SXin Li PrintExpr(Node->getBase());
1923*67e74705SXin Li OS << "[";
1924*67e74705SXin Li PrintExpr(Node->getIdx());
1925*67e74705SXin Li OS << "]";
1926*67e74705SXin Li }
1927*67e74705SXin Li
VisitUserDefinedLiteral(UserDefinedLiteral * Node)1928*67e74705SXin Li void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
1929*67e74705SXin Li switch (Node->getLiteralOperatorKind()) {
1930*67e74705SXin Li case UserDefinedLiteral::LOK_Raw:
1931*67e74705SXin Li OS << cast<StringLiteral>(Node->getArg(0)->IgnoreImpCasts())->getString();
1932*67e74705SXin Li break;
1933*67e74705SXin Li case UserDefinedLiteral::LOK_Template: {
1934*67e74705SXin Li DeclRefExpr *DRE = cast<DeclRefExpr>(Node->getCallee()->IgnoreImpCasts());
1935*67e74705SXin Li const TemplateArgumentList *Args =
1936*67e74705SXin Li cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
1937*67e74705SXin Li assert(Args);
1938*67e74705SXin Li
1939*67e74705SXin Li if (Args->size() != 1) {
1940*67e74705SXin Li OS << "operator\"\"" << Node->getUDSuffix()->getName();
1941*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
1942*67e74705SXin Li OS, Args->asArray(), Policy);
1943*67e74705SXin Li OS << "()";
1944*67e74705SXin Li return;
1945*67e74705SXin Li }
1946*67e74705SXin Li
1947*67e74705SXin Li const TemplateArgument &Pack = Args->get(0);
1948*67e74705SXin Li for (const auto &P : Pack.pack_elements()) {
1949*67e74705SXin Li char C = (char)P.getAsIntegral().getZExtValue();
1950*67e74705SXin Li OS << C;
1951*67e74705SXin Li }
1952*67e74705SXin Li break;
1953*67e74705SXin Li }
1954*67e74705SXin Li case UserDefinedLiteral::LOK_Integer: {
1955*67e74705SXin Li // Print integer literal without suffix.
1956*67e74705SXin Li IntegerLiteral *Int = cast<IntegerLiteral>(Node->getCookedLiteral());
1957*67e74705SXin Li OS << Int->getValue().toString(10, /*isSigned*/false);
1958*67e74705SXin Li break;
1959*67e74705SXin Li }
1960*67e74705SXin Li case UserDefinedLiteral::LOK_Floating: {
1961*67e74705SXin Li // Print floating literal without suffix.
1962*67e74705SXin Li FloatingLiteral *Float = cast<FloatingLiteral>(Node->getCookedLiteral());
1963*67e74705SXin Li PrintFloatingLiteral(OS, Float, /*PrintSuffix=*/false);
1964*67e74705SXin Li break;
1965*67e74705SXin Li }
1966*67e74705SXin Li case UserDefinedLiteral::LOK_String:
1967*67e74705SXin Li case UserDefinedLiteral::LOK_Character:
1968*67e74705SXin Li PrintExpr(Node->getCookedLiteral());
1969*67e74705SXin Li break;
1970*67e74705SXin Li }
1971*67e74705SXin Li OS << Node->getUDSuffix()->getName();
1972*67e74705SXin Li }
1973*67e74705SXin Li
VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr * Node)1974*67e74705SXin Li void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
1975*67e74705SXin Li OS << (Node->getValue() ? "true" : "false");
1976*67e74705SXin Li }
1977*67e74705SXin Li
VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr * Node)1978*67e74705SXin Li void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
1979*67e74705SXin Li OS << "nullptr";
1980*67e74705SXin Li }
1981*67e74705SXin Li
VisitCXXThisExpr(CXXThisExpr * Node)1982*67e74705SXin Li void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
1983*67e74705SXin Li OS << "this";
1984*67e74705SXin Li }
1985*67e74705SXin Li
VisitCXXThrowExpr(CXXThrowExpr * Node)1986*67e74705SXin Li void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
1987*67e74705SXin Li if (!Node->getSubExpr())
1988*67e74705SXin Li OS << "throw";
1989*67e74705SXin Li else {
1990*67e74705SXin Li OS << "throw ";
1991*67e74705SXin Li PrintExpr(Node->getSubExpr());
1992*67e74705SXin Li }
1993*67e74705SXin Li }
1994*67e74705SXin Li
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * Node)1995*67e74705SXin Li void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
1996*67e74705SXin Li // Nothing to print: we picked up the default argument.
1997*67e74705SXin Li }
1998*67e74705SXin Li
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * Node)1999*67e74705SXin Li void StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) {
2000*67e74705SXin Li // Nothing to print: we picked up the default initializer.
2001*67e74705SXin Li }
2002*67e74705SXin Li
VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr * Node)2003*67e74705SXin Li void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
2004*67e74705SXin Li Node->getType().print(OS, Policy);
2005*67e74705SXin Li // If there are no parens, this is list-initialization, and the braces are
2006*67e74705SXin Li // part of the syntax of the inner construct.
2007*67e74705SXin Li if (Node->getLParenLoc().isValid())
2008*67e74705SXin Li OS << "(";
2009*67e74705SXin Li PrintExpr(Node->getSubExpr());
2010*67e74705SXin Li if (Node->getLParenLoc().isValid())
2011*67e74705SXin Li OS << ")";
2012*67e74705SXin Li }
2013*67e74705SXin Li
VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr * Node)2014*67e74705SXin Li void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
2015*67e74705SXin Li PrintExpr(Node->getSubExpr());
2016*67e74705SXin Li }
2017*67e74705SXin Li
VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr * Node)2018*67e74705SXin Li void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
2019*67e74705SXin Li Node->getType().print(OS, Policy);
2020*67e74705SXin Li if (Node->isStdInitListInitialization())
2021*67e74705SXin Li /* Nothing to do; braces are part of creating the std::initializer_list. */;
2022*67e74705SXin Li else if (Node->isListInitialization())
2023*67e74705SXin Li OS << "{";
2024*67e74705SXin Li else
2025*67e74705SXin Li OS << "(";
2026*67e74705SXin Li for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->arg_begin(),
2027*67e74705SXin Li ArgEnd = Node->arg_end();
2028*67e74705SXin Li Arg != ArgEnd; ++Arg) {
2029*67e74705SXin Li if ((*Arg)->isDefaultArgument())
2030*67e74705SXin Li break;
2031*67e74705SXin Li if (Arg != Node->arg_begin())
2032*67e74705SXin Li OS << ", ";
2033*67e74705SXin Li PrintExpr(*Arg);
2034*67e74705SXin Li }
2035*67e74705SXin Li if (Node->isStdInitListInitialization())
2036*67e74705SXin Li /* See above. */;
2037*67e74705SXin Li else if (Node->isListInitialization())
2038*67e74705SXin Li OS << "}";
2039*67e74705SXin Li else
2040*67e74705SXin Li OS << ")";
2041*67e74705SXin Li }
2042*67e74705SXin Li
VisitLambdaExpr(LambdaExpr * Node)2043*67e74705SXin Li void StmtPrinter::VisitLambdaExpr(LambdaExpr *Node) {
2044*67e74705SXin Li OS << '[';
2045*67e74705SXin Li bool NeedComma = false;
2046*67e74705SXin Li switch (Node->getCaptureDefault()) {
2047*67e74705SXin Li case LCD_None:
2048*67e74705SXin Li break;
2049*67e74705SXin Li
2050*67e74705SXin Li case LCD_ByCopy:
2051*67e74705SXin Li OS << '=';
2052*67e74705SXin Li NeedComma = true;
2053*67e74705SXin Li break;
2054*67e74705SXin Li
2055*67e74705SXin Li case LCD_ByRef:
2056*67e74705SXin Li OS << '&';
2057*67e74705SXin Li NeedComma = true;
2058*67e74705SXin Li break;
2059*67e74705SXin Li }
2060*67e74705SXin Li for (LambdaExpr::capture_iterator C = Node->explicit_capture_begin(),
2061*67e74705SXin Li CEnd = Node->explicit_capture_end();
2062*67e74705SXin Li C != CEnd;
2063*67e74705SXin Li ++C) {
2064*67e74705SXin Li if (NeedComma)
2065*67e74705SXin Li OS << ", ";
2066*67e74705SXin Li NeedComma = true;
2067*67e74705SXin Li
2068*67e74705SXin Li switch (C->getCaptureKind()) {
2069*67e74705SXin Li case LCK_This:
2070*67e74705SXin Li OS << "this";
2071*67e74705SXin Li break;
2072*67e74705SXin Li case LCK_StarThis:
2073*67e74705SXin Li OS << "*this";
2074*67e74705SXin Li break;
2075*67e74705SXin Li case LCK_ByRef:
2076*67e74705SXin Li if (Node->getCaptureDefault() != LCD_ByRef || Node->isInitCapture(C))
2077*67e74705SXin Li OS << '&';
2078*67e74705SXin Li OS << C->getCapturedVar()->getName();
2079*67e74705SXin Li break;
2080*67e74705SXin Li
2081*67e74705SXin Li case LCK_ByCopy:
2082*67e74705SXin Li OS << C->getCapturedVar()->getName();
2083*67e74705SXin Li break;
2084*67e74705SXin Li case LCK_VLAType:
2085*67e74705SXin Li llvm_unreachable("VLA type in explicit captures.");
2086*67e74705SXin Li }
2087*67e74705SXin Li
2088*67e74705SXin Li if (Node->isInitCapture(C))
2089*67e74705SXin Li PrintExpr(C->getCapturedVar()->getInit());
2090*67e74705SXin Li }
2091*67e74705SXin Li OS << ']';
2092*67e74705SXin Li
2093*67e74705SXin Li if (Node->hasExplicitParameters()) {
2094*67e74705SXin Li OS << " (";
2095*67e74705SXin Li CXXMethodDecl *Method = Node->getCallOperator();
2096*67e74705SXin Li NeedComma = false;
2097*67e74705SXin Li for (auto P : Method->parameters()) {
2098*67e74705SXin Li if (NeedComma) {
2099*67e74705SXin Li OS << ", ";
2100*67e74705SXin Li } else {
2101*67e74705SXin Li NeedComma = true;
2102*67e74705SXin Li }
2103*67e74705SXin Li std::string ParamStr = P->getNameAsString();
2104*67e74705SXin Li P->getOriginalType().print(OS, Policy, ParamStr);
2105*67e74705SXin Li }
2106*67e74705SXin Li if (Method->isVariadic()) {
2107*67e74705SXin Li if (NeedComma)
2108*67e74705SXin Li OS << ", ";
2109*67e74705SXin Li OS << "...";
2110*67e74705SXin Li }
2111*67e74705SXin Li OS << ')';
2112*67e74705SXin Li
2113*67e74705SXin Li if (Node->isMutable())
2114*67e74705SXin Li OS << " mutable";
2115*67e74705SXin Li
2116*67e74705SXin Li const FunctionProtoType *Proto
2117*67e74705SXin Li = Method->getType()->getAs<FunctionProtoType>();
2118*67e74705SXin Li Proto->printExceptionSpecification(OS, Policy);
2119*67e74705SXin Li
2120*67e74705SXin Li // FIXME: Attributes
2121*67e74705SXin Li
2122*67e74705SXin Li // Print the trailing return type if it was specified in the source.
2123*67e74705SXin Li if (Node->hasExplicitResultType()) {
2124*67e74705SXin Li OS << " -> ";
2125*67e74705SXin Li Proto->getReturnType().print(OS, Policy);
2126*67e74705SXin Li }
2127*67e74705SXin Li }
2128*67e74705SXin Li
2129*67e74705SXin Li // Print the body.
2130*67e74705SXin Li CompoundStmt *Body = Node->getBody();
2131*67e74705SXin Li OS << ' ';
2132*67e74705SXin Li PrintStmt(Body);
2133*67e74705SXin Li }
2134*67e74705SXin Li
VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr * Node)2135*67e74705SXin Li void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
2136*67e74705SXin Li if (TypeSourceInfo *TSInfo = Node->getTypeSourceInfo())
2137*67e74705SXin Li TSInfo->getType().print(OS, Policy);
2138*67e74705SXin Li else
2139*67e74705SXin Li Node->getType().print(OS, Policy);
2140*67e74705SXin Li OS << "()";
2141*67e74705SXin Li }
2142*67e74705SXin Li
VisitCXXNewExpr(CXXNewExpr * E)2143*67e74705SXin Li void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
2144*67e74705SXin Li if (E->isGlobalNew())
2145*67e74705SXin Li OS << "::";
2146*67e74705SXin Li OS << "new ";
2147*67e74705SXin Li unsigned NumPlace = E->getNumPlacementArgs();
2148*67e74705SXin Li if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(E->getPlacementArg(0))) {
2149*67e74705SXin Li OS << "(";
2150*67e74705SXin Li PrintExpr(E->getPlacementArg(0));
2151*67e74705SXin Li for (unsigned i = 1; i < NumPlace; ++i) {
2152*67e74705SXin Li if (isa<CXXDefaultArgExpr>(E->getPlacementArg(i)))
2153*67e74705SXin Li break;
2154*67e74705SXin Li OS << ", ";
2155*67e74705SXin Li PrintExpr(E->getPlacementArg(i));
2156*67e74705SXin Li }
2157*67e74705SXin Li OS << ") ";
2158*67e74705SXin Li }
2159*67e74705SXin Li if (E->isParenTypeId())
2160*67e74705SXin Li OS << "(";
2161*67e74705SXin Li std::string TypeS;
2162*67e74705SXin Li if (Expr *Size = E->getArraySize()) {
2163*67e74705SXin Li llvm::raw_string_ostream s(TypeS);
2164*67e74705SXin Li s << '[';
2165*67e74705SXin Li Size->printPretty(s, Helper, Policy);
2166*67e74705SXin Li s << ']';
2167*67e74705SXin Li }
2168*67e74705SXin Li E->getAllocatedType().print(OS, Policy, TypeS);
2169*67e74705SXin Li if (E->isParenTypeId())
2170*67e74705SXin Li OS << ")";
2171*67e74705SXin Li
2172*67e74705SXin Li CXXNewExpr::InitializationStyle InitStyle = E->getInitializationStyle();
2173*67e74705SXin Li if (InitStyle) {
2174*67e74705SXin Li if (InitStyle == CXXNewExpr::CallInit)
2175*67e74705SXin Li OS << "(";
2176*67e74705SXin Li PrintExpr(E->getInitializer());
2177*67e74705SXin Li if (InitStyle == CXXNewExpr::CallInit)
2178*67e74705SXin Li OS << ")";
2179*67e74705SXin Li }
2180*67e74705SXin Li }
2181*67e74705SXin Li
VisitCXXDeleteExpr(CXXDeleteExpr * E)2182*67e74705SXin Li void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
2183*67e74705SXin Li if (E->isGlobalDelete())
2184*67e74705SXin Li OS << "::";
2185*67e74705SXin Li OS << "delete ";
2186*67e74705SXin Li if (E->isArrayForm())
2187*67e74705SXin Li OS << "[] ";
2188*67e74705SXin Li PrintExpr(E->getArgument());
2189*67e74705SXin Li }
2190*67e74705SXin Li
VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr * E)2191*67e74705SXin Li void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
2192*67e74705SXin Li PrintExpr(E->getBase());
2193*67e74705SXin Li if (E->isArrow())
2194*67e74705SXin Li OS << "->";
2195*67e74705SXin Li else
2196*67e74705SXin Li OS << '.';
2197*67e74705SXin Li if (E->getQualifier())
2198*67e74705SXin Li E->getQualifier()->print(OS, Policy);
2199*67e74705SXin Li OS << "~";
2200*67e74705SXin Li
2201*67e74705SXin Li if (IdentifierInfo *II = E->getDestroyedTypeIdentifier())
2202*67e74705SXin Li OS << II->getName();
2203*67e74705SXin Li else
2204*67e74705SXin Li E->getDestroyedType().print(OS, Policy);
2205*67e74705SXin Li }
2206*67e74705SXin Li
VisitCXXConstructExpr(CXXConstructExpr * E)2207*67e74705SXin Li void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
2208*67e74705SXin Li if (E->isListInitialization() && !E->isStdInitListInitialization())
2209*67e74705SXin Li OS << "{";
2210*67e74705SXin Li
2211*67e74705SXin Li for (unsigned i = 0, e = E->getNumArgs(); i != e; ++i) {
2212*67e74705SXin Li if (isa<CXXDefaultArgExpr>(E->getArg(i))) {
2213*67e74705SXin Li // Don't print any defaulted arguments
2214*67e74705SXin Li break;
2215*67e74705SXin Li }
2216*67e74705SXin Li
2217*67e74705SXin Li if (i) OS << ", ";
2218*67e74705SXin Li PrintExpr(E->getArg(i));
2219*67e74705SXin Li }
2220*67e74705SXin Li
2221*67e74705SXin Li if (E->isListInitialization() && !E->isStdInitListInitialization())
2222*67e74705SXin Li OS << "}";
2223*67e74705SXin Li }
2224*67e74705SXin Li
VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr * E)2225*67e74705SXin Li void StmtPrinter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
2226*67e74705SXin Li // Parens are printed by the surrounding context.
2227*67e74705SXin Li OS << "<forwarded>";
2228*67e74705SXin Li }
2229*67e74705SXin Li
VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr * E)2230*67e74705SXin Li void StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
2231*67e74705SXin Li PrintExpr(E->getSubExpr());
2232*67e74705SXin Li }
2233*67e74705SXin Li
VisitExprWithCleanups(ExprWithCleanups * E)2234*67e74705SXin Li void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
2235*67e74705SXin Li // Just forward to the subexpression.
2236*67e74705SXin Li PrintExpr(E->getSubExpr());
2237*67e74705SXin Li }
2238*67e74705SXin Li
2239*67e74705SXin Li void
VisitCXXUnresolvedConstructExpr(CXXUnresolvedConstructExpr * Node)2240*67e74705SXin Li StmtPrinter::VisitCXXUnresolvedConstructExpr(
2241*67e74705SXin Li CXXUnresolvedConstructExpr *Node) {
2242*67e74705SXin Li Node->getTypeAsWritten().print(OS, Policy);
2243*67e74705SXin Li OS << "(";
2244*67e74705SXin Li for (CXXUnresolvedConstructExpr::arg_iterator Arg = Node->arg_begin(),
2245*67e74705SXin Li ArgEnd = Node->arg_end();
2246*67e74705SXin Li Arg != ArgEnd; ++Arg) {
2247*67e74705SXin Li if (Arg != Node->arg_begin())
2248*67e74705SXin Li OS << ", ";
2249*67e74705SXin Li PrintExpr(*Arg);
2250*67e74705SXin Li }
2251*67e74705SXin Li OS << ")";
2252*67e74705SXin Li }
2253*67e74705SXin Li
VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr * Node)2254*67e74705SXin Li void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2255*67e74705SXin Li CXXDependentScopeMemberExpr *Node) {
2256*67e74705SXin Li if (!Node->isImplicitAccess()) {
2257*67e74705SXin Li PrintExpr(Node->getBase());
2258*67e74705SXin Li OS << (Node->isArrow() ? "->" : ".");
2259*67e74705SXin Li }
2260*67e74705SXin Li if (NestedNameSpecifier *Qualifier = Node->getQualifier())
2261*67e74705SXin Li Qualifier->print(OS, Policy);
2262*67e74705SXin Li if (Node->hasTemplateKeyword())
2263*67e74705SXin Li OS << "template ";
2264*67e74705SXin Li OS << Node->getMemberNameInfo();
2265*67e74705SXin Li if (Node->hasExplicitTemplateArgs())
2266*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
2267*67e74705SXin Li OS, Node->template_arguments(), Policy);
2268*67e74705SXin Li }
2269*67e74705SXin Li
VisitUnresolvedMemberExpr(UnresolvedMemberExpr * Node)2270*67e74705SXin Li void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
2271*67e74705SXin Li if (!Node->isImplicitAccess()) {
2272*67e74705SXin Li PrintExpr(Node->getBase());
2273*67e74705SXin Li OS << (Node->isArrow() ? "->" : ".");
2274*67e74705SXin Li }
2275*67e74705SXin Li if (NestedNameSpecifier *Qualifier = Node->getQualifier())
2276*67e74705SXin Li Qualifier->print(OS, Policy);
2277*67e74705SXin Li if (Node->hasTemplateKeyword())
2278*67e74705SXin Li OS << "template ";
2279*67e74705SXin Li OS << Node->getMemberNameInfo();
2280*67e74705SXin Li if (Node->hasExplicitTemplateArgs())
2281*67e74705SXin Li TemplateSpecializationType::PrintTemplateArgumentList(
2282*67e74705SXin Li OS, Node->template_arguments(), Policy);
2283*67e74705SXin Li }
2284*67e74705SXin Li
getTypeTraitName(TypeTrait TT)2285*67e74705SXin Li static const char *getTypeTraitName(TypeTrait TT) {
2286*67e74705SXin Li switch (TT) {
2287*67e74705SXin Li #define TYPE_TRAIT_1(Spelling, Name, Key) \
2288*67e74705SXin Li case clang::UTT_##Name: return #Spelling;
2289*67e74705SXin Li #define TYPE_TRAIT_2(Spelling, Name, Key) \
2290*67e74705SXin Li case clang::BTT_##Name: return #Spelling;
2291*67e74705SXin Li #define TYPE_TRAIT_N(Spelling, Name, Key) \
2292*67e74705SXin Li case clang::TT_##Name: return #Spelling;
2293*67e74705SXin Li #include "clang/Basic/TokenKinds.def"
2294*67e74705SXin Li }
2295*67e74705SXin Li llvm_unreachable("Type trait not covered by switch");
2296*67e74705SXin Li }
2297*67e74705SXin Li
getTypeTraitName(ArrayTypeTrait ATT)2298*67e74705SXin Li static const char *getTypeTraitName(ArrayTypeTrait ATT) {
2299*67e74705SXin Li switch (ATT) {
2300*67e74705SXin Li case ATT_ArrayRank: return "__array_rank";
2301*67e74705SXin Li case ATT_ArrayExtent: return "__array_extent";
2302*67e74705SXin Li }
2303*67e74705SXin Li llvm_unreachable("Array type trait not covered by switch");
2304*67e74705SXin Li }
2305*67e74705SXin Li
getExpressionTraitName(ExpressionTrait ET)2306*67e74705SXin Li static const char *getExpressionTraitName(ExpressionTrait ET) {
2307*67e74705SXin Li switch (ET) {
2308*67e74705SXin Li case ET_IsLValueExpr: return "__is_lvalue_expr";
2309*67e74705SXin Li case ET_IsRValueExpr: return "__is_rvalue_expr";
2310*67e74705SXin Li }
2311*67e74705SXin Li llvm_unreachable("Expression type trait not covered by switch");
2312*67e74705SXin Li }
2313*67e74705SXin Li
VisitTypeTraitExpr(TypeTraitExpr * E)2314*67e74705SXin Li void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
2315*67e74705SXin Li OS << getTypeTraitName(E->getTrait()) << "(";
2316*67e74705SXin Li for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
2317*67e74705SXin Li if (I > 0)
2318*67e74705SXin Li OS << ", ";
2319*67e74705SXin Li E->getArg(I)->getType().print(OS, Policy);
2320*67e74705SXin Li }
2321*67e74705SXin Li OS << ")";
2322*67e74705SXin Li }
2323*67e74705SXin Li
VisitArrayTypeTraitExpr(ArrayTypeTraitExpr * E)2324*67e74705SXin Li void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
2325*67e74705SXin Li OS << getTypeTraitName(E->getTrait()) << '(';
2326*67e74705SXin Li E->getQueriedType().print(OS, Policy);
2327*67e74705SXin Li OS << ')';
2328*67e74705SXin Li }
2329*67e74705SXin Li
VisitExpressionTraitExpr(ExpressionTraitExpr * E)2330*67e74705SXin Li void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
2331*67e74705SXin Li OS << getExpressionTraitName(E->getTrait()) << '(';
2332*67e74705SXin Li PrintExpr(E->getQueriedExpression());
2333*67e74705SXin Li OS << ')';
2334*67e74705SXin Li }
2335*67e74705SXin Li
VisitCXXNoexceptExpr(CXXNoexceptExpr * E)2336*67e74705SXin Li void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
2337*67e74705SXin Li OS << "noexcept(";
2338*67e74705SXin Li PrintExpr(E->getOperand());
2339*67e74705SXin Li OS << ")";
2340*67e74705SXin Li }
2341*67e74705SXin Li
VisitPackExpansionExpr(PackExpansionExpr * E)2342*67e74705SXin Li void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
2343*67e74705SXin Li PrintExpr(E->getPattern());
2344*67e74705SXin Li OS << "...";
2345*67e74705SXin Li }
2346*67e74705SXin Li
VisitSizeOfPackExpr(SizeOfPackExpr * E)2347*67e74705SXin Li void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2348*67e74705SXin Li OS << "sizeof...(" << *E->getPack() << ")";
2349*67e74705SXin Li }
2350*67e74705SXin Li
VisitSubstNonTypeTemplateParmPackExpr(SubstNonTypeTemplateParmPackExpr * Node)2351*67e74705SXin Li void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2352*67e74705SXin Li SubstNonTypeTemplateParmPackExpr *Node) {
2353*67e74705SXin Li OS << *Node->getParameterPack();
2354*67e74705SXin Li }
2355*67e74705SXin Li
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * Node)2356*67e74705SXin Li void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2357*67e74705SXin Li SubstNonTypeTemplateParmExpr *Node) {
2358*67e74705SXin Li Visit(Node->getReplacement());
2359*67e74705SXin Li }
2360*67e74705SXin Li
VisitFunctionParmPackExpr(FunctionParmPackExpr * E)2361*67e74705SXin Li void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2362*67e74705SXin Li OS << *E->getParameterPack();
2363*67e74705SXin Li }
2364*67e74705SXin Li
VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr * Node)2365*67e74705SXin Li void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
2366*67e74705SXin Li PrintExpr(Node->GetTemporaryExpr());
2367*67e74705SXin Li }
2368*67e74705SXin Li
VisitCXXFoldExpr(CXXFoldExpr * E)2369*67e74705SXin Li void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) {
2370*67e74705SXin Li OS << "(";
2371*67e74705SXin Li if (E->getLHS()) {
2372*67e74705SXin Li PrintExpr(E->getLHS());
2373*67e74705SXin Li OS << " " << BinaryOperator::getOpcodeStr(E->getOperator()) << " ";
2374*67e74705SXin Li }
2375*67e74705SXin Li OS << "...";
2376*67e74705SXin Li if (E->getRHS()) {
2377*67e74705SXin Li OS << " " << BinaryOperator::getOpcodeStr(E->getOperator()) << " ";
2378*67e74705SXin Li PrintExpr(E->getRHS());
2379*67e74705SXin Li }
2380*67e74705SXin Li OS << ")";
2381*67e74705SXin Li }
2382*67e74705SXin Li
2383*67e74705SXin Li // C++ Coroutines TS
2384*67e74705SXin Li
VisitCoroutineBodyStmt(CoroutineBodyStmt * S)2385*67e74705SXin Li void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
2386*67e74705SXin Li Visit(S->getBody());
2387*67e74705SXin Li }
2388*67e74705SXin Li
VisitCoreturnStmt(CoreturnStmt * S)2389*67e74705SXin Li void StmtPrinter::VisitCoreturnStmt(CoreturnStmt *S) {
2390*67e74705SXin Li OS << "co_return";
2391*67e74705SXin Li if (S->getOperand()) {
2392*67e74705SXin Li OS << " ";
2393*67e74705SXin Li Visit(S->getOperand());
2394*67e74705SXin Li }
2395*67e74705SXin Li OS << ";";
2396*67e74705SXin Li }
2397*67e74705SXin Li
VisitCoawaitExpr(CoawaitExpr * S)2398*67e74705SXin Li void StmtPrinter::VisitCoawaitExpr(CoawaitExpr *S) {
2399*67e74705SXin Li OS << "co_await ";
2400*67e74705SXin Li PrintExpr(S->getOperand());
2401*67e74705SXin Li }
2402*67e74705SXin Li
VisitCoyieldExpr(CoyieldExpr * S)2403*67e74705SXin Li void StmtPrinter::VisitCoyieldExpr(CoyieldExpr *S) {
2404*67e74705SXin Li OS << "co_yield ";
2405*67e74705SXin Li PrintExpr(S->getOperand());
2406*67e74705SXin Li }
2407*67e74705SXin Li
2408*67e74705SXin Li // Obj-C
2409*67e74705SXin Li
VisitObjCStringLiteral(ObjCStringLiteral * Node)2410*67e74705SXin Li void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
2411*67e74705SXin Li OS << "@";
2412*67e74705SXin Li VisitStringLiteral(Node->getString());
2413*67e74705SXin Li }
2414*67e74705SXin Li
VisitObjCBoxedExpr(ObjCBoxedExpr * E)2415*67e74705SXin Li void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
2416*67e74705SXin Li OS << "@";
2417*67e74705SXin Li Visit(E->getSubExpr());
2418*67e74705SXin Li }
2419*67e74705SXin Li
VisitObjCArrayLiteral(ObjCArrayLiteral * E)2420*67e74705SXin Li void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
2421*67e74705SXin Li OS << "@[ ";
2422*67e74705SXin Li ObjCArrayLiteral::child_range Ch = E->children();
2423*67e74705SXin Li for (auto I = Ch.begin(), E = Ch.end(); I != E; ++I) {
2424*67e74705SXin Li if (I != Ch.begin())
2425*67e74705SXin Li OS << ", ";
2426*67e74705SXin Li Visit(*I);
2427*67e74705SXin Li }
2428*67e74705SXin Li OS << " ]";
2429*67e74705SXin Li }
2430*67e74705SXin Li
VisitObjCDictionaryLiteral(ObjCDictionaryLiteral * E)2431*67e74705SXin Li void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
2432*67e74705SXin Li OS << "@{ ";
2433*67e74705SXin Li for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
2434*67e74705SXin Li if (I > 0)
2435*67e74705SXin Li OS << ", ";
2436*67e74705SXin Li
2437*67e74705SXin Li ObjCDictionaryElement Element = E->getKeyValueElement(I);
2438*67e74705SXin Li Visit(Element.Key);
2439*67e74705SXin Li OS << " : ";
2440*67e74705SXin Li Visit(Element.Value);
2441*67e74705SXin Li if (Element.isPackExpansion())
2442*67e74705SXin Li OS << "...";
2443*67e74705SXin Li }
2444*67e74705SXin Li OS << " }";
2445*67e74705SXin Li }
2446*67e74705SXin Li
VisitObjCEncodeExpr(ObjCEncodeExpr * Node)2447*67e74705SXin Li void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
2448*67e74705SXin Li OS << "@encode(";
2449*67e74705SXin Li Node->getEncodedType().print(OS, Policy);
2450*67e74705SXin Li OS << ')';
2451*67e74705SXin Li }
2452*67e74705SXin Li
VisitObjCSelectorExpr(ObjCSelectorExpr * Node)2453*67e74705SXin Li void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
2454*67e74705SXin Li OS << "@selector(";
2455*67e74705SXin Li Node->getSelector().print(OS);
2456*67e74705SXin Li OS << ')';
2457*67e74705SXin Li }
2458*67e74705SXin Li
VisitObjCProtocolExpr(ObjCProtocolExpr * Node)2459*67e74705SXin Li void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
2460*67e74705SXin Li OS << "@protocol(" << *Node->getProtocol() << ')';
2461*67e74705SXin Li }
2462*67e74705SXin Li
VisitObjCMessageExpr(ObjCMessageExpr * Mess)2463*67e74705SXin Li void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
2464*67e74705SXin Li OS << "[";
2465*67e74705SXin Li switch (Mess->getReceiverKind()) {
2466*67e74705SXin Li case ObjCMessageExpr::Instance:
2467*67e74705SXin Li PrintExpr(Mess->getInstanceReceiver());
2468*67e74705SXin Li break;
2469*67e74705SXin Li
2470*67e74705SXin Li case ObjCMessageExpr::Class:
2471*67e74705SXin Li Mess->getClassReceiver().print(OS, Policy);
2472*67e74705SXin Li break;
2473*67e74705SXin Li
2474*67e74705SXin Li case ObjCMessageExpr::SuperInstance:
2475*67e74705SXin Li case ObjCMessageExpr::SuperClass:
2476*67e74705SXin Li OS << "Super";
2477*67e74705SXin Li break;
2478*67e74705SXin Li }
2479*67e74705SXin Li
2480*67e74705SXin Li OS << ' ';
2481*67e74705SXin Li Selector selector = Mess->getSelector();
2482*67e74705SXin Li if (selector.isUnarySelector()) {
2483*67e74705SXin Li OS << selector.getNameForSlot(0);
2484*67e74705SXin Li } else {
2485*67e74705SXin Li for (unsigned i = 0, e = Mess->getNumArgs(); i != e; ++i) {
2486*67e74705SXin Li if (i < selector.getNumArgs()) {
2487*67e74705SXin Li if (i > 0) OS << ' ';
2488*67e74705SXin Li if (selector.getIdentifierInfoForSlot(i))
2489*67e74705SXin Li OS << selector.getIdentifierInfoForSlot(i)->getName() << ':';
2490*67e74705SXin Li else
2491*67e74705SXin Li OS << ":";
2492*67e74705SXin Li }
2493*67e74705SXin Li else OS << ", "; // Handle variadic methods.
2494*67e74705SXin Li
2495*67e74705SXin Li PrintExpr(Mess->getArg(i));
2496*67e74705SXin Li }
2497*67e74705SXin Li }
2498*67e74705SXin Li OS << "]";
2499*67e74705SXin Li }
2500*67e74705SXin Li
VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr * Node)2501*67e74705SXin Li void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
2502*67e74705SXin Li OS << (Node->getValue() ? "__objc_yes" : "__objc_no");
2503*67e74705SXin Li }
2504*67e74705SXin Li
2505*67e74705SXin Li void
VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr * E)2506*67e74705SXin Li StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
2507*67e74705SXin Li PrintExpr(E->getSubExpr());
2508*67e74705SXin Li }
2509*67e74705SXin Li
2510*67e74705SXin Li void
VisitObjCBridgedCastExpr(ObjCBridgedCastExpr * E)2511*67e74705SXin Li StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
2512*67e74705SXin Li OS << '(' << E->getBridgeKindName();
2513*67e74705SXin Li E->getType().print(OS, Policy);
2514*67e74705SXin Li OS << ')';
2515*67e74705SXin Li PrintExpr(E->getSubExpr());
2516*67e74705SXin Li }
2517*67e74705SXin Li
VisitBlockExpr(BlockExpr * Node)2518*67e74705SXin Li void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
2519*67e74705SXin Li BlockDecl *BD = Node->getBlockDecl();
2520*67e74705SXin Li OS << "^";
2521*67e74705SXin Li
2522*67e74705SXin Li const FunctionType *AFT = Node->getFunctionType();
2523*67e74705SXin Li
2524*67e74705SXin Li if (isa<FunctionNoProtoType>(AFT)) {
2525*67e74705SXin Li OS << "()";
2526*67e74705SXin Li } else if (!BD->param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
2527*67e74705SXin Li OS << '(';
2528*67e74705SXin Li for (BlockDecl::param_iterator AI = BD->param_begin(),
2529*67e74705SXin Li E = BD->param_end(); AI != E; ++AI) {
2530*67e74705SXin Li if (AI != BD->param_begin()) OS << ", ";
2531*67e74705SXin Li std::string ParamStr = (*AI)->getNameAsString();
2532*67e74705SXin Li (*AI)->getType().print(OS, Policy, ParamStr);
2533*67e74705SXin Li }
2534*67e74705SXin Li
2535*67e74705SXin Li const FunctionProtoType *FT = cast<FunctionProtoType>(AFT);
2536*67e74705SXin Li if (FT->isVariadic()) {
2537*67e74705SXin Li if (!BD->param_empty()) OS << ", ";
2538*67e74705SXin Li OS << "...";
2539*67e74705SXin Li }
2540*67e74705SXin Li OS << ')';
2541*67e74705SXin Li }
2542*67e74705SXin Li OS << "{ }";
2543*67e74705SXin Li }
2544*67e74705SXin Li
VisitOpaqueValueExpr(OpaqueValueExpr * Node)2545*67e74705SXin Li void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
2546*67e74705SXin Li PrintExpr(Node->getSourceExpr());
2547*67e74705SXin Li }
2548*67e74705SXin Li
VisitTypoExpr(TypoExpr * Node)2549*67e74705SXin Li void StmtPrinter::VisitTypoExpr(TypoExpr *Node) {
2550*67e74705SXin Li // TODO: Print something reasonable for a TypoExpr, if necessary.
2551*67e74705SXin Li llvm_unreachable("Cannot print TypoExpr nodes");
2552*67e74705SXin Li }
2553*67e74705SXin Li
VisitAsTypeExpr(AsTypeExpr * Node)2554*67e74705SXin Li void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
2555*67e74705SXin Li OS << "__builtin_astype(";
2556*67e74705SXin Li PrintExpr(Node->getSrcExpr());
2557*67e74705SXin Li OS << ", ";
2558*67e74705SXin Li Node->getType().print(OS, Policy);
2559*67e74705SXin Li OS << ")";
2560*67e74705SXin Li }
2561*67e74705SXin Li
2562*67e74705SXin Li //===----------------------------------------------------------------------===//
2563*67e74705SXin Li // Stmt method implementations
2564*67e74705SXin Li //===----------------------------------------------------------------------===//
2565*67e74705SXin Li
dumpPretty(const ASTContext & Context) const2566*67e74705SXin Li void Stmt::dumpPretty(const ASTContext &Context) const {
2567*67e74705SXin Li printPretty(llvm::errs(), nullptr, PrintingPolicy(Context.getLangOpts()));
2568*67e74705SXin Li }
2569*67e74705SXin Li
printPretty(raw_ostream & OS,PrinterHelper * Helper,const PrintingPolicy & Policy,unsigned Indentation) const2570*67e74705SXin Li void Stmt::printPretty(raw_ostream &OS,
2571*67e74705SXin Li PrinterHelper *Helper,
2572*67e74705SXin Li const PrintingPolicy &Policy,
2573*67e74705SXin Li unsigned Indentation) const {
2574*67e74705SXin Li StmtPrinter P(OS, Helper, Policy, Indentation);
2575*67e74705SXin Li P.Visit(const_cast<Stmt*>(this));
2576*67e74705SXin Li }
2577*67e74705SXin Li
2578*67e74705SXin Li //===----------------------------------------------------------------------===//
2579*67e74705SXin Li // PrinterHelper
2580*67e74705SXin Li //===----------------------------------------------------------------------===//
2581*67e74705SXin Li
2582*67e74705SXin Li // Implement virtual destructor.
~PrinterHelper()2583*67e74705SXin Li PrinterHelper::~PrinterHelper() {}
2584