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