48#include "llvm/ADT/ArrayRef.h"
49#include "llvm/ADT/STLExtras.h"
50#include "llvm/ADT/StringExtras.h"
51#include "llvm/ADT/StringRef.h"
52#include "llvm/Support/Compiler.h"
53#include "llvm/Support/ErrorHandling.h"
54#include "llvm/Support/raw_ostream.h"
67 class StmtPrinter :
public StmtVisitor<StmtPrinter> {
70 PrinterHelper* Helper;
71 PrintingPolicy Policy;
73 const ASTContext *Context;
76 StmtPrinter(raw_ostream &os, PrinterHelper *helper,
77 const PrintingPolicy &Policy,
unsigned Indentation = 0,
78 StringRef NL =
"\n",
const ASTContext *Context =
nullptr)
79 : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy),
80 NL(NL), Context(Context) {}
82 void PrintStmt(Stmt *S) { PrintStmt(S, Policy.Indentation); }
84 void PrintStmt(Stmt *S,
int SubIndent) {
85 IndentLevel += SubIndent;
86 if (isa_and_nonnull<Expr>(S)) {
94 Indent() <<
"<<<NULL STATEMENT>>>" << NL;
96 IndentLevel -= SubIndent;
99 void PrintInitStmt(Stmt *S,
unsigned PrefixWidth) {
101 IndentLevel += (PrefixWidth + 1) / 2;
102 if (
auto *DS = dyn_cast<DeclStmt>(S))
103 PrintRawDeclStmt(DS);
107 IndentLevel -= (PrefixWidth + 1) / 2;
110 void PrintControlledStmt(Stmt *S) {
111 if (
auto *CS = dyn_cast<CompoundStmt>(S)) {
113 PrintRawCompoundStmt(CS);
122 void PrintRawDecl(Decl *D);
123 void PrintRawDeclStmt(
const DeclStmt *S);
124 void PrintRawIfStmt(IfStmt *
If);
125 void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
126 void PrintCallArgs(CallExpr *E);
127 void PrintRawSEHExceptHandler(SEHExceptStmt *S);
128 void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
129 void PrintOMPExecutableDirective(OMPExecutableDirective *S,
130 bool ForceNoStmt =
false);
132 void PrintOpenACCClauseList(OpenACCConstructStmt *S);
133 void PrintOpenACCConstruct(OpenACCConstructStmt *S);
135 void PrintExpr(Expr *E) {
142 raw_ostream &
Indent(
int Delta = 0) {
143 for (
int i = 0, e = IndentLevel+Delta; i < e; ++i)
148 void Visit(Stmt* S) {
149 if (Helper && Helper->handledStmt(S,OS))
151 else StmtVisitor<StmtPrinter>::Visit(S);
154 [[maybe_unused]]
void VisitStmt(Stmt *Node) {
155 Indent() <<
"<<unknown stmt type>>" << NL;
158 [[maybe_unused]]
void VisitExpr(Expr *Node) {
159 OS <<
"<<unknown expr type>>";
162 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
164#define ABSTRACT_STMT(CLASS)
165#define STMT(CLASS, PARENT) \
166 void Visit##CLASS(CLASS *Node);
167#include "clang/AST/StmtNodes.inc"
178void StmtPrinter::PrintRawCompoundStmt(
CompoundStmt *Node) {
179 assert(Node &&
"Compound statement cannot be null");
181 PrintFPPragmas(Node);
182 for (
auto *I : Node->
body())
192 bool FEnvAccess =
false;
193 if (FPO.hasAllowFEnvAccessOverride()) {
194 FEnvAccess = FPO.getAllowFEnvAccessOverride();
195 Indent() <<
"#pragma STDC FENV_ACCESS " << (FEnvAccess ?
"ON" :
"OFF")
198 if (FPO.hasSpecifiedExceptionModeOverride()) {
199 LangOptions::FPExceptionModeKind EM =
200 FPO.getSpecifiedExceptionModeOverride();
201 if (!FEnvAccess || EM != LangOptions::FPE_Strict) {
202 Indent() <<
"#pragma clang fp exceptions(";
203 switch (FPO.getSpecifiedExceptionModeOverride()) {
206 case LangOptions::FPE_Ignore:
209 case LangOptions::FPE_MayTrap:
212 case LangOptions::FPE_Strict:
219 if (FPO.hasConstRoundingModeOverride()) {
220 LangOptions::RoundingMode RM = FPO.getConstRoundingModeOverride();
221 Indent() <<
"#pragma STDC FENV_ROUND ";
223 case llvm::RoundingMode::TowardZero:
224 OS <<
"FE_TOWARDZERO";
226 case llvm::RoundingMode::NearestTiesToEven:
227 OS <<
"FE_TONEAREST";
229 case llvm::RoundingMode::TowardPositive:
232 case llvm::RoundingMode::TowardNegative:
235 case llvm::RoundingMode::NearestTiesToAway:
236 OS <<
"FE_TONEARESTFROMZERO";
238 case llvm::RoundingMode::Dynamic:
242 llvm_unreachable(
"Invalid rounding mode");
248void StmtPrinter::PrintRawDecl(Decl *D) {
252void StmtPrinter::PrintRawDeclStmt(
const DeclStmt *S) {
253 SmallVector<Decl *, 2> Decls(S->
decls());
257void StmtPrinter::VisitNullStmt(NullStmt *Node) {
261void StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
263 PrintRawDeclStmt(Node);
271void StmtPrinter::VisitCompoundStmt(
CompoundStmt *Node) {
273 PrintRawCompoundStmt(Node);
277void StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
279 PrintExpr(Node->
getLHS());
282 PrintExpr(Node->
getRHS());
289void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
290 Indent(-1) <<
"default:" << NL;
294void StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
299void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
300 ArrayRef<const Attr *> Attrs = Node->
getAttrs();
301 for (
const auto *Attr : Attrs) {
302 Attr->printPretty(OS, Policy);
303 if (Attr != Attrs.back())
310void StmtPrinter::PrintRawIfStmt(IfStmt *
If) {
311 if (
If->isConsteval()) {
313 if (
If->isNegatedConsteval())
317 PrintStmt(
If->getThen());
318 if (Stmt *Else =
If->getElse()) {
329 PrintInitStmt(
If->getInit(), 4);
330 if (
const DeclStmt *DS =
If->getConditionVariableDeclStmt())
331 PrintRawDeclStmt(DS);
333 PrintExpr(
If->getCond());
336 if (
auto *CS = dyn_cast<CompoundStmt>(
If->getThen())) {
338 PrintRawCompoundStmt(CS);
339 OS << (
If->getElse() ?
" " : NL);
342 PrintStmt(
If->getThen());
346 if (Stmt *Else =
If->getElse()) {
349 if (
auto *CS = dyn_cast<CompoundStmt>(Else)) {
351 PrintRawCompoundStmt(CS);
353 }
else if (
auto *ElseIf = dyn_cast<IfStmt>(Else)) {
355 PrintRawIfStmt(ElseIf);
358 PrintStmt(
If->getElse());
363void StmtPrinter::VisitIfStmt(IfStmt *
If) {
368void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
371 PrintInitStmt(Node->
getInit(), 8);
373 PrintRawDeclStmt(DS);
377 PrintControlledStmt(Node->
getBody());
380void StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
383 PrintRawDeclStmt(DS);
390void StmtPrinter::VisitDoStmt(DoStmt *Node) {
392 if (
auto *CS = dyn_cast<CompoundStmt>(Node->
getBody())) {
393 PrintRawCompoundStmt(CS);
406void StmtPrinter::VisitForStmt(ForStmt *Node) {
409 PrintInitStmt(Node->
getInit(), 5);
413 PrintRawDeclStmt(DS);
419 PrintExpr(Node->
getInc());
422 PrintControlledStmt(Node->
getBody());
425void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
427 if (
auto *DS = dyn_cast<DeclStmt>(Node->
getElement()))
428 PrintRawDeclStmt(DS);
434 PrintControlledStmt(Node->
getBody());
437void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) {
440 PrintInitStmt(Node->
getInit(), 5);
441 PrintingPolicy SubPolicy(Policy);
442 SubPolicy.SuppressInitializers =
true;
447 PrintControlledStmt(Node->
getBody());
450void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) {
453 OS <<
"__if_exists (";
455 OS <<
"__if_not_exists (";
463void StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
468void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
475void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
485void StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
494void StmtPrinter::VisitDeferStmt(DeferStmt *Node) {
496 PrintControlledStmt(Node->
getBody());
499void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
509void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) {
526 for (
unsigned i = 0, e = Node->
getNumOutputs(); i != e; ++i) {
547 for (
unsigned i = 0, e = Node->
getNumInputs(); i != e; ++i) {
578 for (
unsigned i = 0, e = Node->
getNumLabels(); i != e; ++i) {
588void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) {
598void StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) {
602void StmtPrinter::VisitSYCLKernelCallStmt(SYCLKernelCallStmt *Node) {
606void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
608 if (
auto *TS = dyn_cast<CompoundStmt>(Node->
getTryBody())) {
609 PrintRawCompoundStmt(TS);
613 for (ObjCAtCatchStmt *catchStmt : Node->
catch_stmts()) {
615 if (Decl *DS = catchStmt->getCatchParamDecl())
618 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
619 PrintRawCompoundStmt(CS);
626 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
627 PrintRawCompoundStmt(CS);
633void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
636void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
637 Indent() <<
"@catch (...) { /* todo */ } " << NL;
640void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
649void StmtPrinter::VisitObjCAvailabilityCheckExpr(
650 ObjCAvailabilityCheckExpr *Node) {
651 OS <<
"@available(...)";
654void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
655 Indent() <<
"@synchronized (";
662void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
663 Indent() <<
"@autoreleasepool";
668void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
671 PrintRawDecl(ExDecl);
678void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
680 PrintRawCXXCatchStmt(Node);
684void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
694void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) {
700 PrintRawSEHExceptHandler(E);
702 assert(F &&
"Must have a finally block...");
703 PrintRawSEHFinallyStmt(F);
708void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) {
710 PrintRawCompoundStmt(Node->
getBlock());
714void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) {
718 PrintRawCompoundStmt(Node->
getBlock());
722void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) {
724 PrintRawSEHExceptHandler(Node);
728void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
730 PrintRawSEHFinallyStmt(Node);
734void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) {
743void StmtPrinter::VisitOMPCanonicalLoop(OMPCanonicalLoop *Node) {
744 PrintStmt(Node->getLoopStmt());
747void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S,
749 unsigned OpenMPVersion =
750 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
751 OMPClausePrinter Printer(OS, Policy, OpenMPVersion);
752 ArrayRef<OMPClause *> Clauses = S->clauses();
753 for (
auto *Clause : Clauses)
754 if (Clause && !Clause->isImplicit()) {
756 Printer.Visit(Clause);
759 if (!ForceNoStmt && S->hasAssociatedStmt())
760 PrintStmt(S->getRawStmt());
763void StmtPrinter::VisitOMPMetaDirective(OMPMetaDirective *Node) {
764 Indent() <<
"#pragma omp metadirective";
765 PrintOMPExecutableDirective(Node);
768void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
769 Indent() <<
"#pragma omp parallel";
770 PrintOMPExecutableDirective(Node);
773void StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) {
774 Indent() <<
"#pragma omp simd";
775 PrintOMPExecutableDirective(Node);
778void StmtPrinter::VisitOMPTileDirective(OMPTileDirective *Node) {
779 Indent() <<
"#pragma omp tile";
780 PrintOMPExecutableDirective(Node);
783void StmtPrinter::VisitOMPStripeDirective(OMPStripeDirective *Node) {
784 Indent() <<
"#pragma omp stripe";
785 PrintOMPExecutableDirective(Node);
788void StmtPrinter::VisitOMPUnrollDirective(OMPUnrollDirective *Node) {
789 Indent() <<
"#pragma omp unroll";
790 PrintOMPExecutableDirective(Node);
793void StmtPrinter::VisitOMPReverseDirective(OMPReverseDirective *Node) {
794 Indent() <<
"#pragma omp reverse";
795 PrintOMPExecutableDirective(Node);
798void StmtPrinter::VisitOMPInterchangeDirective(OMPInterchangeDirective *Node) {
799 Indent() <<
"#pragma omp interchange";
800 PrintOMPExecutableDirective(Node);
803void StmtPrinter::VisitOMPSplitDirective(OMPSplitDirective *Node) {
804 Indent() <<
"#pragma omp split";
805 PrintOMPExecutableDirective(Node);
808void StmtPrinter::VisitOMPFuseDirective(OMPFuseDirective *Node) {
809 Indent() <<
"#pragma omp fuse";
810 PrintOMPExecutableDirective(Node);
813void StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) {
814 Indent() <<
"#pragma omp for";
815 PrintOMPExecutableDirective(Node);
818void StmtPrinter::VisitOMPForSimdDirective(OMPForSimdDirective *Node) {
819 Indent() <<
"#pragma omp for simd";
820 PrintOMPExecutableDirective(Node);
823void StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) {
824 Indent() <<
"#pragma omp sections";
825 PrintOMPExecutableDirective(Node);
828void StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) {
829 Indent() <<
"#pragma omp section";
830 PrintOMPExecutableDirective(Node);
833void StmtPrinter::VisitOMPScopeDirective(OMPScopeDirective *Node) {
834 Indent() <<
"#pragma omp scope";
835 PrintOMPExecutableDirective(Node);
838void StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) {
839 Indent() <<
"#pragma omp single";
840 PrintOMPExecutableDirective(Node);
843void StmtPrinter::VisitOMPMasterDirective(OMPMasterDirective *Node) {
844 Indent() <<
"#pragma omp master";
845 PrintOMPExecutableDirective(Node);
848void StmtPrinter::VisitOMPCriticalDirective(OMPCriticalDirective *Node) {
849 Indent() <<
"#pragma omp critical";
850 if (Node->getDirectiveName().getName()) {
852 Node->getDirectiveName().printName(OS, Policy);
855 PrintOMPExecutableDirective(Node);
858void StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) {
859 Indent() <<
"#pragma omp parallel for";
860 PrintOMPExecutableDirective(Node);
863void StmtPrinter::VisitOMPParallelForSimdDirective(
864 OMPParallelForSimdDirective *Node) {
865 Indent() <<
"#pragma omp parallel for simd";
866 PrintOMPExecutableDirective(Node);
869void StmtPrinter::VisitOMPParallelMasterDirective(
870 OMPParallelMasterDirective *Node) {
871 Indent() <<
"#pragma omp parallel master";
872 PrintOMPExecutableDirective(Node);
875void StmtPrinter::VisitOMPParallelMaskedDirective(
876 OMPParallelMaskedDirective *Node) {
877 Indent() <<
"#pragma omp parallel masked";
878 PrintOMPExecutableDirective(Node);
881void StmtPrinter::VisitOMPParallelSectionsDirective(
882 OMPParallelSectionsDirective *Node) {
883 Indent() <<
"#pragma omp parallel sections";
884 PrintOMPExecutableDirective(Node);
887void StmtPrinter::VisitOMPTaskDirective(OMPTaskDirective *Node) {
888 Indent() <<
"#pragma omp task";
889 PrintOMPExecutableDirective(Node);
892void StmtPrinter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *Node) {
893 Indent() <<
"#pragma omp taskyield";
894 PrintOMPExecutableDirective(Node);
897void StmtPrinter::VisitOMPBarrierDirective(OMPBarrierDirective *Node) {
898 Indent() <<
"#pragma omp barrier";
899 PrintOMPExecutableDirective(Node);
902void StmtPrinter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *Node) {
903 Indent() <<
"#pragma omp taskwait";
904 PrintOMPExecutableDirective(Node);
907void StmtPrinter::VisitOMPAssumeDirective(OMPAssumeDirective *Node) {
908 Indent() <<
"#pragma omp assume";
909 PrintOMPExecutableDirective(Node);
912void StmtPrinter::VisitOMPErrorDirective(OMPErrorDirective *Node) {
913 Indent() <<
"#pragma omp error";
914 PrintOMPExecutableDirective(Node);
917void StmtPrinter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *Node) {
918 Indent() <<
"#pragma omp taskgroup";
919 PrintOMPExecutableDirective(Node);
922void StmtPrinter::VisitOMPFlushDirective(OMPFlushDirective *Node) {
923 Indent() <<
"#pragma omp flush";
924 PrintOMPExecutableDirective(Node);
927void StmtPrinter::VisitOMPDepobjDirective(OMPDepobjDirective *Node) {
928 Indent() <<
"#pragma omp depobj";
929 PrintOMPExecutableDirective(Node);
932void StmtPrinter::VisitOMPScanDirective(OMPScanDirective *Node) {
933 Indent() <<
"#pragma omp scan";
934 PrintOMPExecutableDirective(Node);
937void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) {
938 Indent() <<
"#pragma omp ordered";
939 PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>());
942void StmtPrinter::VisitOMPAtomicDirective(OMPAtomicDirective *Node) {
943 Indent() <<
"#pragma omp atomic";
944 PrintOMPExecutableDirective(Node);
947void StmtPrinter::VisitOMPTargetDirective(OMPTargetDirective *Node) {
948 Indent() <<
"#pragma omp target";
949 PrintOMPExecutableDirective(Node);
952void StmtPrinter::VisitOMPTargetDataDirective(OMPTargetDataDirective *Node) {
953 Indent() <<
"#pragma omp target data";
954 PrintOMPExecutableDirective(Node);
957void StmtPrinter::VisitOMPTargetEnterDataDirective(
958 OMPTargetEnterDataDirective *Node) {
959 Indent() <<
"#pragma omp target enter data";
960 PrintOMPExecutableDirective(Node,
true);
963void StmtPrinter::VisitOMPTargetExitDataDirective(
964 OMPTargetExitDataDirective *Node) {
965 Indent() <<
"#pragma omp target exit data";
966 PrintOMPExecutableDirective(Node,
true);
969void StmtPrinter::VisitOMPTargetParallelDirective(
970 OMPTargetParallelDirective *Node) {
971 Indent() <<
"#pragma omp target parallel";
972 PrintOMPExecutableDirective(Node);
975void StmtPrinter::VisitOMPTargetParallelForDirective(
976 OMPTargetParallelForDirective *Node) {
977 Indent() <<
"#pragma omp target parallel for";
978 PrintOMPExecutableDirective(Node);
981void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) {
982 Indent() <<
"#pragma omp teams";
983 PrintOMPExecutableDirective(Node);
986void StmtPrinter::VisitOMPCancellationPointDirective(
987 OMPCancellationPointDirective *Node) {
988 unsigned OpenMPVersion =
989 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
990 Indent() <<
"#pragma omp cancellation point "
992 PrintOMPExecutableDirective(Node);
995void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) {
996 unsigned OpenMPVersion =
997 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
998 Indent() <<
"#pragma omp cancel "
1000 PrintOMPExecutableDirective(Node);
1003void StmtPrinter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *Node) {
1004 Indent() <<
"#pragma omp taskloop";
1005 PrintOMPExecutableDirective(Node);
1008void StmtPrinter::VisitOMPTaskLoopSimdDirective(
1009 OMPTaskLoopSimdDirective *Node) {
1010 Indent() <<
"#pragma omp taskloop simd";
1011 PrintOMPExecutableDirective(Node);
1014void StmtPrinter::VisitOMPMasterTaskLoopDirective(
1015 OMPMasterTaskLoopDirective *Node) {
1016 Indent() <<
"#pragma omp master taskloop";
1017 PrintOMPExecutableDirective(Node);
1020void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
1021 OMPMaskedTaskLoopDirective *Node) {
1022 Indent() <<
"#pragma omp masked taskloop";
1023 PrintOMPExecutableDirective(Node);
1026void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
1027 OMPMasterTaskLoopSimdDirective *Node) {
1028 Indent() <<
"#pragma omp master taskloop simd";
1029 PrintOMPExecutableDirective(Node);
1032void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
1033 OMPMaskedTaskLoopSimdDirective *Node) {
1034 Indent() <<
"#pragma omp masked taskloop simd";
1035 PrintOMPExecutableDirective(Node);
1038void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
1039 OMPParallelMasterTaskLoopDirective *Node) {
1040 Indent() <<
"#pragma omp parallel master taskloop";
1041 PrintOMPExecutableDirective(Node);
1044void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1045 OMPParallelMaskedTaskLoopDirective *Node) {
1046 Indent() <<
"#pragma omp parallel masked taskloop";
1047 PrintOMPExecutableDirective(Node);
1050void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1051 OMPParallelMasterTaskLoopSimdDirective *Node) {
1052 Indent() <<
"#pragma omp parallel master taskloop simd";
1053 PrintOMPExecutableDirective(Node);
1056void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1057 OMPParallelMaskedTaskLoopSimdDirective *Node) {
1058 Indent() <<
"#pragma omp parallel masked taskloop simd";
1059 PrintOMPExecutableDirective(Node);
1062void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective *Node) {
1063 Indent() <<
"#pragma omp distribute";
1064 PrintOMPExecutableDirective(Node);
1067void StmtPrinter::VisitOMPTargetUpdateDirective(
1068 OMPTargetUpdateDirective *Node) {
1069 Indent() <<
"#pragma omp target update";
1070 PrintOMPExecutableDirective(Node,
true);
1073void StmtPrinter::VisitOMPDistributeParallelForDirective(
1074 OMPDistributeParallelForDirective *Node) {
1075 Indent() <<
"#pragma omp distribute parallel for";
1076 PrintOMPExecutableDirective(Node);
1079void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1080 OMPDistributeParallelForSimdDirective *Node) {
1081 Indent() <<
"#pragma omp distribute parallel for simd";
1082 PrintOMPExecutableDirective(Node);
1085void StmtPrinter::VisitOMPDistributeSimdDirective(
1086 OMPDistributeSimdDirective *Node) {
1087 Indent() <<
"#pragma omp distribute simd";
1088 PrintOMPExecutableDirective(Node);
1091void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1092 OMPTargetParallelForSimdDirective *Node) {
1093 Indent() <<
"#pragma omp target parallel for simd";
1094 PrintOMPExecutableDirective(Node);
1097void StmtPrinter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *Node) {
1098 Indent() <<
"#pragma omp target simd";
1099 PrintOMPExecutableDirective(Node);
1102void StmtPrinter::VisitOMPTeamsDistributeDirective(
1103 OMPTeamsDistributeDirective *Node) {
1104 Indent() <<
"#pragma omp teams distribute";
1105 PrintOMPExecutableDirective(Node);
1108void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1109 OMPTeamsDistributeSimdDirective *Node) {
1110 Indent() <<
"#pragma omp teams distribute simd";
1111 PrintOMPExecutableDirective(Node);
1114void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1115 OMPTeamsDistributeParallelForSimdDirective *Node) {
1116 Indent() <<
"#pragma omp teams distribute parallel for simd";
1117 PrintOMPExecutableDirective(Node);
1120void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1121 OMPTeamsDistributeParallelForDirective *Node) {
1122 Indent() <<
"#pragma omp teams distribute parallel for";
1123 PrintOMPExecutableDirective(Node);
1126void StmtPrinter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *Node) {
1127 Indent() <<
"#pragma omp target teams";
1128 PrintOMPExecutableDirective(Node);
1131void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1132 OMPTargetTeamsDistributeDirective *Node) {
1133 Indent() <<
"#pragma omp target teams distribute";
1134 PrintOMPExecutableDirective(Node);
1137void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1138 OMPTargetTeamsDistributeParallelForDirective *Node) {
1139 Indent() <<
"#pragma omp target teams distribute parallel for";
1140 PrintOMPExecutableDirective(Node);
1143void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1144 OMPTargetTeamsDistributeParallelForSimdDirective *Node) {
1145 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1146 PrintOMPExecutableDirective(Node);
1149void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1150 OMPTargetTeamsDistributeSimdDirective *Node) {
1151 Indent() <<
"#pragma omp target teams distribute simd";
1152 PrintOMPExecutableDirective(Node);
1155void StmtPrinter::VisitOMPInteropDirective(OMPInteropDirective *Node) {
1156 Indent() <<
"#pragma omp interop";
1157 PrintOMPExecutableDirective(Node);
1160void StmtPrinter::VisitOMPDispatchDirective(OMPDispatchDirective *Node) {
1161 Indent() <<
"#pragma omp dispatch";
1162 PrintOMPExecutableDirective(Node);
1165void StmtPrinter::VisitOMPMaskedDirective(OMPMaskedDirective *Node) {
1166 Indent() <<
"#pragma omp masked";
1167 PrintOMPExecutableDirective(Node);
1170void StmtPrinter::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *Node) {
1171 Indent() <<
"#pragma omp loop";
1172 PrintOMPExecutableDirective(Node);
1175void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1176 OMPTeamsGenericLoopDirective *Node) {
1177 Indent() <<
"#pragma omp teams loop";
1178 PrintOMPExecutableDirective(Node);
1181void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1182 OMPTargetTeamsGenericLoopDirective *Node) {
1183 Indent() <<
"#pragma omp target teams loop";
1184 PrintOMPExecutableDirective(Node);
1187void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1188 OMPParallelGenericLoopDirective *Node) {
1189 Indent() <<
"#pragma omp parallel loop";
1190 PrintOMPExecutableDirective(Node);
1193void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1194 OMPTargetParallelGenericLoopDirective *Node) {
1195 Indent() <<
"#pragma omp target parallel loop";
1196 PrintOMPExecutableDirective(Node);
1202void StmtPrinter::PrintOpenACCClauseList(OpenACCConstructStmt *S) {
1205 OpenACCClausePrinter Printer(OS, Policy);
1206 Printer.VisitClauseList(S->
clauses());
1209void StmtPrinter::PrintOpenACCConstruct(OpenACCConstructStmt *S) {
1211 PrintOpenACCClauseList(S);
1215 PrintOpenACCConstruct(S);
1216 PrintStmt(S->getStructuredBlock());
1219void StmtPrinter::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {
1220 PrintOpenACCConstruct(S);
1224void StmtPrinter::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {
1225 PrintOpenACCConstruct(S);
1229void StmtPrinter::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {
1230 PrintOpenACCConstruct(S);
1233void StmtPrinter::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {
1234 PrintOpenACCConstruct(S);
1237void StmtPrinter::VisitOpenACCEnterDataConstruct(OpenACCEnterDataConstruct *S) {
1238 PrintOpenACCConstruct(S);
1240void StmtPrinter::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {
1241 PrintOpenACCConstruct(S);
1243void StmtPrinter::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {
1244 PrintOpenACCConstruct(S);
1246void StmtPrinter::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {
1247 PrintOpenACCConstruct(S);
1249void StmtPrinter::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {
1250 PrintOpenACCConstruct(S);
1252void StmtPrinter::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {
1253 PrintOpenACCConstruct(S);
1256void StmtPrinter::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {
1257 Indent() <<
"#pragma acc wait";
1270 E->printPretty(OS, nullptr, Policy);
1276 PrintOpenACCClauseList(S);
1280void StmtPrinter::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {
1281 Indent() <<
"#pragma acc atomic";
1286 PrintOpenACCClauseList(S);
1291void StmtPrinter::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {
1292 Indent() <<
"#pragma acc cache(";
1296 llvm::interleaveComma(S->
getVarList(), OS, [&](
const Expr *E) {
1297 E->printPretty(OS, nullptr, Policy);
1307void StmtPrinter::VisitSourceLocExpr(SourceLocExpr *Node) {
1311void StmtPrinter::VisitEmbedExpr(EmbedExpr *Node) {
1319void StmtPrinter::VisitConstantExpr(ConstantExpr *Node) {
1323void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
1324 ValueDecl *VD = Node->
getDecl();
1325 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(VD)) {
1326 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1329 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(VD)) {
1330 TPOD->printAsExpr(OS, Policy);
1333 bool ForceAnonymous =
1345 DeclarationNameInfo NameInfo = Node->
getNameInfo();
1349 if (CleanUglifiedParameter && ID)
1350 OS <<
ID->deuglifiedName();
1355 case Decl::NonTypeTemplateParm: {
1357 OS <<
"value-parameter-" << TD->getDepth() <<
'-' << TD->getIndex()
1361 case Decl::ParmVar: {
1363 OS <<
"function-parameter-" << PD->getFunctionScopeDepth() <<
'-'
1364 << PD->getFunctionScopeIndex();
1367 case Decl::Decomposition:
1368 OS <<
"decomposition";
1370 OS <<
'-' << I->getName();
1379 const TemplateParameterList *TPL =
nullptr;
1381 if (
auto *TD = dyn_cast<TemplateDecl>(VD))
1382 TPL = TD->getTemplateParameters();
1387void StmtPrinter::VisitDependentScopeDeclRefExpr(
1388 DependentScopeDeclRefExpr *Node) {
1397void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
1407 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
1408 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1410 DRE->getBeginLoc().isInvalid())
1417void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
1428void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
1440 Getter->getSelector().print(OS);
1448void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
1455void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1456 SYCLUniqueStableNameExpr *Node) {
1457 OS <<
"__builtin_sycl_unique_stable_name(";
1462void StmtPrinter::VisitUnresolvedSYCLKernelCallStmt(
1463 UnresolvedSYCLKernelCallStmt *Node) {
1467void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
1471void StmtPrinter::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *Node) {
1475void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
1488 Context->getSourceManager(), Context->getLangOpts(), &
Invalid);
1496void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
1503 OS << (isSigned ?
"wb" :
"uwb");
1508 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1509 default: llvm_unreachable(
"Unexpected type for integer literal!");
1510 case BuiltinType::Char_S:
1511 case BuiltinType::Char_U:
OS <<
"i8";
break;
1512 case BuiltinType::UChar:
OS <<
"Ui8";
break;
1513 case BuiltinType::SChar:
OS <<
"i8";
break;
1514 case BuiltinType::Short:
OS <<
"i16";
break;
1515 case BuiltinType::UShort:
OS <<
"Ui16";
break;
1516 case BuiltinType::Int:
break;
1517 case BuiltinType::UInt:
OS <<
'U';
break;
1518 case BuiltinType::Long:
OS <<
'L';
break;
1519 case BuiltinType::ULong:
OS <<
"UL";
break;
1520 case BuiltinType::LongLong:
OS <<
"LL";
break;
1521 case BuiltinType::ULongLong:
OS <<
"ULL";
break;
1522 case BuiltinType::Int128:
1524 case BuiltinType::UInt128:
1526 case BuiltinType::WChar_S:
1527 case BuiltinType::WChar_U:
1532void StmtPrinter::VisitFixedPointLiteral(FixedPointLiteral *Node) {
1537 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1538 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1539 case BuiltinType::ShortFract:
OS <<
"hr";
break;
1540 case BuiltinType::ShortAccum:
OS <<
"hk";
break;
1541 case BuiltinType::UShortFract:
OS <<
"uhr";
break;
1542 case BuiltinType::UShortAccum:
OS <<
"uhk";
break;
1543 case BuiltinType::Fract:
OS <<
"r";
break;
1544 case BuiltinType::Accum:
OS <<
"k";
break;
1545 case BuiltinType::UFract:
OS <<
"ur";
break;
1546 case BuiltinType::UAccum:
OS <<
"uk";
break;
1547 case BuiltinType::LongFract:
OS <<
"lr";
break;
1548 case BuiltinType::LongAccum:
OS <<
"lk";
break;
1549 case BuiltinType::ULongFract:
OS <<
"ulr";
break;
1550 case BuiltinType::ULongAccum:
OS <<
"ulk";
break;
1559 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1567 default: llvm_unreachable(
"Unexpected type for float literal!");
1568 case BuiltinType::Half:
break;
1569 case BuiltinType::Ibm128:
break;
1570 case BuiltinType::Double:
break;
1571 case BuiltinType::Float16: OS <<
"F16";
break;
1572 case BuiltinType::Float: OS <<
'F';
break;
1573 case BuiltinType::LongDouble: OS <<
'L';
break;
1574 case BuiltinType::Float128: OS <<
'Q';
break;
1578void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
1584void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
1589void StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
1593void StmtPrinter::VisitParenExpr(ParenExpr *Node) {
1599void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
1625void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
1626 OS <<
"__builtin_offsetof(";
1629 bool PrintedSomething =
false;
1637 PrintedSomething =
true;
1650 if (PrintedSomething)
1653 PrintedSomething =
true;
1659void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1660 UnaryExprOrTypeTraitExpr *Node) {
1662 if (Node->
getKind() == UETT_AlignOf) {
1664 Spelling =
"alignof";
1666 Spelling =
"_Alignof";
1668 Spelling =
"__alignof";
1683void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
1692 QualType T = Assoc.getType();
1696 T.
print(OS, Policy);
1698 PrintExpr(Assoc.getAssociationExpr());
1703void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
1704 PrintExpr(Node->
getLHS());
1706 PrintExpr(Node->
getRHS());
1710void StmtPrinter::VisitMatrixSingleSubscriptExpr(
1711 MatrixSingleSubscriptExpr *Node) {
1718void StmtPrinter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *Node) {
1728void StmtPrinter::VisitArraySectionExpr(ArraySectionExpr *Node) {
1746void StmtPrinter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *Node) {
1757void StmtPrinter::VisitOMPIteratorExpr(OMPIteratorExpr *Node) {
1764 PrintExpr(
Range.Begin);
1766 PrintExpr(
Range.End);
1769 PrintExpr(
Range.Step);
1777void StmtPrinter::PrintCallArgs(CallExpr *
Call) {
1778 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1785 PrintExpr(
Call->getArg(i));
1789void StmtPrinter::VisitCallExpr(CallExpr *
Call) {
1790 PrintExpr(
Call->getCallee());
1792 PrintCallArgs(
Call);
1797 if (
const auto *TE = dyn_cast<CXXThisExpr>(E))
1798 return TE->isImplicit();
1802void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
1806 auto *ParentMember = dyn_cast<MemberExpr>(Node->
getBase());
1807 FieldDecl *ParentDecl =
1808 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1816 if (FD->isAnonymousStructOrUnion())
1823 const TemplateParameterList *TPL =
nullptr;
1824 if (
auto *FD = dyn_cast<FunctionDecl>(Node->
getMemberDecl())) {
1826 if (
auto *FTD = FD->getPrimaryTemplate())
1827 TPL = FTD->getTemplateParameters();
1828 }
else if (
auto *VTSD =
1829 dyn_cast<VarTemplateSpecializationDecl>(Node->
getMemberDecl()))
1830 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1835void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
1837 OS << (Node->
isArrow() ?
"->isa" :
".isa");
1840void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
1846void StmtPrinter::VisitMatrixElementExpr(MatrixElementExpr *Node) {
1852void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
1859void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
1866void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
1871void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
1872 PrintExpr(Node->
getLHS());
1874 PrintExpr(Node->
getRHS());
1877void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
1878 PrintExpr(Node->
getLHS());
1880 PrintExpr(Node->
getRHS());
1883void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
1886 PrintExpr(Node->
getLHS());
1888 PrintExpr(Node->
getRHS());
1894StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
1900void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
1904void StmtPrinter::VisitStmtExpr(StmtExpr *E) {
1910void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
1911 OS <<
"__builtin_choose_expr(";
1914 PrintExpr(Node->
getLHS());
1916 PrintExpr(Node->
getRHS());
1920void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
1924void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
1925 OS <<
"__builtin_shufflevector(";
1933void StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) {
1934 OS <<
"__builtin_convertvector(";
1941void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
1948 for (
unsigned i = 0, e = Node->
getNumInits(); i != e; ++i) {
1958void StmtPrinter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *Node) {
1966void StmtPrinter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *Node) {
1970void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
1972 for (
unsigned i = 0, e = Node->
getNumExprs(); i != e; ++i) {
1979void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
1980 bool NeedsEquals =
true;
1981 for (
const DesignatedInitExpr::Designator &D : Node->
designators()) {
1982 if (D.isFieldDesignator()) {
1983 if (D.getDotLoc().isInvalid()) {
1984 if (
const IdentifierInfo *II = D.getFieldName()) {
1985 OS << II->getName() <<
":";
1986 NeedsEquals =
false;
1989 OS <<
"." << D.getFieldName()->getName();
1993 if (D.isArrayDesignator()) {
2011void StmtPrinter::VisitDesignatedInitUpdateExpr(
2012 DesignatedInitUpdateExpr *Node) {
2018 OS <<
"/*updater*/";
2023void StmtPrinter::VisitNoInitExpr(NoInitExpr *Node) {
2024 OS <<
"/*no init*/";
2027void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
2029 OS <<
"/*implicit*/";
2033 OS <<
"/*implicit*/(";
2043void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
2044 OS <<
"__builtin_va_arg(";
2051void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
2055void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
2056 const char *Name =
nullptr;
2057 switch (Node->
getOp()) {
2058#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
2059 case AtomicExpr::AO ## ID: \
2062#include "clang/Basic/Builtins.inc"
2067 PrintExpr(Node->
getPtr());
2072 if (Node->
getOp() == AtomicExpr::AO__atomic_exchange ||
2077 if (Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange ||
2078 Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
2082 if (Node->
getOp() != AtomicExpr::AO__c11_atomic_init &&
2083 Node->
getOp() != AtomicExpr::AO__opencl_atomic_init) {
2095void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
2097 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
2100 PrintExpr(Node->
getArg(0));
2102 PrintExpr(Node->
getArg(0));
2105 }
else if (Kind == OO_Arrow) {
2106 PrintExpr(Node->
getArg(0));
2107 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
2108 PrintExpr(Node->
getArg(0));
2109 OS << (
Kind == OO_Call ?
'(' :
'[');
2110 for (
unsigned ArgIdx = 1; ArgIdx < Node->
getNumArgs(); ++ArgIdx) {
2114 PrintExpr(Node->
getArg(ArgIdx));
2116 OS << (
Kind == OO_Call ?
')' :
']');
2119 PrintExpr(Node->
getArg(0));
2121 PrintExpr(Node->
getArg(0));
2123 PrintExpr(Node->
getArg(1));
2125 llvm_unreachable(
"unknown overloaded operator");
2129void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
2132 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
2139void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
2144 PrintCallArgs(Node);
2148void StmtPrinter::VisitCXXRewrittenBinaryOperator(
2149 CXXRewrittenBinaryOperator *Node) {
2150 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2152 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
2154 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
2157void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
2165void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
2166 VisitCXXNamedCastExpr(Node);
2169void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
2170 VisitCXXNamedCastExpr(Node);
2173void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
2174 VisitCXXNamedCastExpr(Node);
2177void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
2178 VisitCXXNamedCastExpr(Node);
2181void StmtPrinter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *Node) {
2182 OS <<
"__builtin_bit_cast(";
2189void StmtPrinter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *Node) {
2190 VisitCXXNamedCastExpr(Node);
2193void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
2203void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
2213void StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) {
2223void StmtPrinter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *Node) {
2226 PrintExpr(Node->
getIdx());
2230void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
2237 const TemplateArgumentList *Args =
2242 const TemplateParameterList *TPL =
nullptr;
2243 if (!DRE->hadMultipleCandidates())
2244 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2245 TPL = TD->getTemplateParameters();
2247 printTemplateArgumentList(OS, Args->
asArray(), Policy, TPL);
2252 const TemplateArgument &Pack = Args->
get(0);
2254 char C = (char)P.getAsIntegral().getZExtValue();
2279void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
2283void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
2287void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
2291void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
2300void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
2304void StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) {
2308void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
2309 auto TargetType = Node->
getType();
2311 bool Bare =
Auto &&
Auto->isDeduced();
2316 TargetType.print(OS, Policy);
2328void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
2332void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
2340 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->
arg_begin(),
2342 Arg != ArgEnd; ++Arg) {
2343 if ((*Arg)->isDefaultArgument())
2357void StmtPrinter::VisitLambdaExpr(
LambdaExpr *Node) {
2359 bool NeedComma =
false;
2378 if (
C->capturesVLAType())
2385 switch (
C->getCaptureKind()) {
2397 OS <<
C->getCapturedVar()->getName();
2401 OS <<
C->getCapturedVar()->getName();
2405 llvm_unreachable(
"VLA type in explicit captures.");
2408 if (
C->isPackExpansion())
2415 llvm::StringRef
Pre;
2416 llvm::StringRef
Post;
2426 PrintExpr(D->getInit());
2442 for (
const auto *P :
Method->parameters()) {
2448 std::string ParamStr =
2450 ? P->getIdentifier()->deuglifiedName().str()
2451 : P->getNameAsString();
2452 P->getOriginalType().print(OS, Policy, ParamStr);
2454 if (
Method->isVariadic()) {
2464 auto *Proto =
Method->getType()->castAs<FunctionProtoType>();
2465 Proto->printExceptionSpecification(OS, Policy);
2472 Proto->getReturnType().print(OS, Policy);
2484void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
2486 TSInfo->getType().print(OS, Policy);
2492void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
2500 for (
unsigned i = 1; i < NumPlace; ++i) {
2512 llvm::raw_string_ostream s(TypeS);
2515 (*Size)->printPretty(s, Helper, Policy);
2523 if (InitStyle != CXXNewInitializationStyle::None) {
2524 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2534void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
2543void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
2553 OS << II->getName();
2558void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
2562 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
2576void StmtPrinter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
2578 OS <<
"<forwarded>";
2581void StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
2585void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
2590void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2591 CXXUnresolvedConstructExpr *Node) {
2595 for (
auto Arg = Node->
arg_begin(), ArgEnd = Node->
arg_end(); Arg != ArgEnd;
2605void StmtPrinter::VisitCXXReflectExpr(CXXReflectExpr *S) {
2607 assert(
false &&
"not implemented yet");
2610void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2611 CXXDependentScopeMemberExpr *Node) {
2624void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
2637void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
2639 for (
unsigned I = 0, N = E->
getNumArgs(); I != N; ++I) {
2647void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
2653void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
2659void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
2665void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
2670void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2671 OS <<
"sizeof...(" << *E->
getPack() <<
")";
2674void StmtPrinter::VisitPackIndexingExpr(PackIndexingExpr *E) {
2681void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2682 SubstNonTypeTemplateParmPackExpr *Node) {
2686void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2687 SubstNonTypeTemplateParmExpr *Node) {
2691void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2695void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
2699void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) {
2713void StmtPrinter::VisitCXXParenListInitExpr(CXXParenListInitExpr *Node) {
2715 [&](Expr *E) { PrintExpr(E); });
2718void StmtPrinter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {
2732 if (!LocalParameters.empty()) {
2734 for (ParmVarDecl *LocalParam : LocalParameters) {
2735 PrintRawDecl(LocalParam);
2736 if (LocalParam != LocalParameters.back())
2744 for (concepts::Requirement *Req : Requirements) {
2745 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2746 if (TypeReq->isSubstitutionFailure())
2747 OS <<
"<<error-type>>";
2749 TypeReq->getType()->getType().print(OS, Policy);
2750 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2751 if (ExprReq->isCompound())
2753 if (ExprReq->isExprSubstitutionFailure())
2754 OS <<
"<<error-expression>>";
2756 PrintExpr(ExprReq->getExpr());
2757 if (ExprReq->isCompound()) {
2759 if (ExprReq->getNoexceptLoc().isValid())
2761 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2762 if (!RetReq.isEmpty()) {
2764 if (RetReq.isSubstitutionFailure())
2765 OS <<
"<<error-type>>";
2766 else if (RetReq.isTypeConstraint())
2767 RetReq.getTypeConstraint()->print(OS, Policy);
2773 if (NestedReq->hasInvalidConstraint())
2774 OS <<
"<<error-expression>>";
2776 PrintExpr(NestedReq->getConstraintExpr());
2785void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
2789void StmtPrinter::VisitCoreturnStmt(CoreturnStmt *S) {
2798void StmtPrinter::VisitCoawaitExpr(CoawaitExpr *S) {
2803void StmtPrinter::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) {
2808void StmtPrinter::VisitCoyieldExpr(CoyieldExpr *S) {
2815void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
2820void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
2825void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
2827 ObjCArrayLiteral::child_range Ch = E->
children();
2828 for (
auto I = Ch.begin(), E = Ch.end(); I != E; ++I) {
2829 if (I != Ch.begin())
2836void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
2845 Visit(Element.
Value);
2852void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
2858void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
2864void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
2868void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
2890 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2892 if (i > 0)
OS <<
' ';
2900 PrintExpr(Mess->
getArg(i));
2906void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
2907 OS << (Node->
getValue() ?
"__objc_yes" :
"__objc_no");
2911StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
2916StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
2923void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
2936 std::string ParamStr = (*AI)->getNameAsString();
2937 (*AI)->getType().print(OS, Policy, ParamStr);
2941 if (FT->isVariadic()) {
2950void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
2954void StmtPrinter::VisitRecoveryExpr(RecoveryExpr *Node) {
2955 OS <<
"<recovery-expr>(";
2956 const char *Sep =
"";
2965void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
2966 OS <<
"__builtin_astype(";
2973void StmtPrinter::VisitHLSLOutArgExpr(HLSLOutArgExpr *Node) {
2987 StringRef NL,
const ASTContext *Context)
const {
2988 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
2989 P.Visit(
const_cast<Stmt *
>(
this));
2994 unsigned Indentation, StringRef NL,
2996 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
2997 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
3003 llvm::raw_string_ostream TempOut(Buf);
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenACC nodes for declarative directives.
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines enumerations for expression traits intrinsics.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines the Objective-C statement AST node classes.
This file defines OpenMP AST classes for executable directives and clauses.
static bool isImplicitThis(const Expr *E)
static bool isImplicitSelf(const Expr *E)
static void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node, bool PrintSuffix)
static bool printExprAsWritten(raw_ostream &OS, Expr *E, const ASTContext *Context)
Prints the given expression using the original source text.
This file defines SYCL AST classes used to represent calls to SYCL kernels.
Defines enumerations for the type traits support.
C Language Family Type Representation.
OpenMPDirectiveKind getCancelRegion() const
Get cancellation region for the current cancellation point.
OpenMPDirectiveKind getCancelRegion() const
Get cancellation region for the current cancellation point.
const Stmt * getAssociatedStmt() const
OpenACCAtomicKind getAtomicKind() const
ArrayRef< Expr * > getVarList() const
Stmt * getStructuredBlock()
Stmt * getStructuredBlock()
bool hasQueuesTag() const
bool hasDevNumExpr() const
ArrayRef< Expr * > getQueueIdExprs() const
SourceLocation getLParenLoc() const
Expr * getDevNumExpr() const
llvm::APInt getValue() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const LangOptions & getLangOpts() const
LabelDecl * getLabel() const
Expr * getSubExpr() const
Get the initializer to use for each array element.
Expr * getBase()
Get base of the array section.
Expr * getLength()
Get length of array section.
bool isOMPArraySection() const
Expr * getStride()
Get stride of array section.
SourceLocation getColonLocSecond() const
Expr * getLowerBound()
Get lower bound of array section.
SourceLocation getColonLocFirst() const
Expr * getLHS()
An array access can be written A[4] or 4[A] (both are equivalent).
ArrayTypeTrait getTrait() const
QualType getQueriedType() const
Expr * getSrcExpr() const
getSrcExpr - Return the Expr to be converted.
unsigned getNumClobbers() const
unsigned getNumOutputs() const
unsigned getNumInputs() const
Expr * getOrderFail() const
bool hasVal1Operand() const
ArrayRef< const Attr * > getAttrs() const
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
StringRef getOpcodeStr() const
param_iterator param_end()
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
param_iterator param_begin()
const FunctionProtoType * getFunctionType() const
getFunctionType - Return the underlying function type for this block.
const BlockDecl * getBlockDecl() const
This class is used for builtin types like 'int'.
const CallExpr * getConfig() const
const Expr * getSubExpr() const
Stmt * getHandlerBlock() const
VarDecl * getExceptionDecl() const
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
bool isGlobalDelete() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the member name.
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the name of the member that this expression refers to.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
ArrayRef< TemplateArgumentLoc > template_arguments() const
BinaryOperatorKind getOperator() const
VarDecl * getLoopVariable()
bool isListInitialization() const
Determine whether this expression models list-initialization.
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Expr * getImplicitObjectArgument() const
Retrieve the implicit object argument for the member call.
const char * getCastName() const
getCastName - Get the name of the C++ cast being used, e.g., "static_cast", "dynamic_cast",...
QualType getAllocatedType() const
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
Expr * getPlacementArg(unsigned I)
unsigned getNumPlacementArgs() const
bool isParenTypeId() const
Expr * getInitializer()
The initializer of this new-expression.
Expr * getOperand() const
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
ArrayRef< Expr * > getUserSpecifiedInitExprs() const
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
QualType getDestroyedType() const
Retrieve the type being destroyed.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
DecomposedForm getDecomposedForm() const LLVM_READONLY
Decompose this operator into its syntactic form.
TypeSourceInfo * getTypeSourceInfo() const
const Expr * getSubExpr() const
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
CompoundStmt * getTryBlock()
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getExprOperand() const
bool isListInitialization() const
Determine whether this expression models list-initialization.
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
Expr * getExprOperand() const
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
CapturedDecl * getCapturedDecl()
Retrieve the outlined function declaration.
static CharSourceRange getTokenRange(SourceRange R)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
unsigned getValue() const
CharacterLiteralKind getKind() const
const Expr * getInitializer() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
bool hasStoredFPFeatures() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
SourceLocation getTemplateKWLoc() const
ConceptDecl * getNamedConcept() const
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Expr * getSrcExpr() const
getSrcExpr - Return the Expr to be converted.
Expr * getOperand() const
Retrieve the operand of the 'co_return' statement.
CompoundStmt * getBody() const
Retrieve the body of the coroutine as written.
Expr * getOperand() const
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
DeclarationNameInfo getNameInfo() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
bool hadMultipleCandidates() const
Returns true if this expression refers to a function that was resolved from an overloaded set having ...
bool hasTemplateKeyword() const
Determines whether the name in this declaration reference was preceded by the template keyword.
bool isSingleDecl() const
isSingleDecl - This method returns true if this DeclStmt refers to a single Decl.
const Decl * getSingleDecl() const
ASTContext & getASTContext() const LLVM_READONLY
const char * getDeclKindName() const
static void printGroup(Decl **Begin, unsigned NumDecls, raw_ostream &Out, const PrintingPolicy &Policy, unsigned Indentation=0)
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
NameKind getNameKind() const
Determine what kind of name this is.
Expr * getOperand() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
bool hasExplicitTemplateArgs() const
Determines whether this lookup had explicit template arguments.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
const DeclarationNameInfo & getNameInfo() const
Retrieve the name that this expression refers to.
Expr * getArrayRangeEnd(const Designator &D) const
Expr * getArrayRangeStart(const Designator &D) const
MutableArrayRef< Designator > designators()
Expr * getArrayIndex(const Designator &D) const
Expr * getInit() const
Retrieve the initializer value.
InitListExpr * getUpdater() const
IdentifierInfo & getAccessor() const
const Expr * getBase() const
StringRef getFileName() const
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
This represents one expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
std::string getValueAsString(unsigned Radix) const
llvm::APFloat getValue() const
DeclStmt * getConditionVariableDeclStmt()
If this ForStmt has a condition variable, return the faux DeclStmt associated with the creation of th...
const Expr * getSubExpr() const
ValueDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
unsigned getNumLabels() const
const Expr * getOutputConstraintExpr(unsigned i) const
StringRef getLabelName(unsigned i) const
StringRef getInputName(unsigned i) const
StringRef getOutputName(unsigned i) const
const Expr * getInputConstraintExpr(unsigned i) const
const Expr * getAsmStringExpr() const
Expr * getOutputExpr(unsigned i)
Expr * getClobberExpr(unsigned i)
Expr * getInputExpr(unsigned i)
AssociationTy< false > Association
TypeSourceInfo * getControllingType()
Return the controlling type of this generic selection expression.
bool isExprPredicate() const
Whether this generic selection uses an expression as its controlling argument.
association_range associations()
Expr * getControllingExpr()
Return the controlling expression of this generic selection expression.
LabelDecl * getLabel() const
const Expr * getArgLValue() const
Return the l-value expression that was written as the argument in source.
StringRef getName() const
Return the actual identifier string.
const Expr * getSubExpr() const
unsigned getNumInits() const
InitListExpr * getSyntacticForm() const
const Expr * getInit(unsigned Init) const
const char * getName() const
bool hasExplicitParameters() const
Determine whether this lambda has an explicit parameter list vs.
bool isMutable() const
Determine whether the lambda is mutable, meaning that any captures values can be modified.
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
const CompoundStmt * getCompoundStmtBody() const
Retrieve the CompoundStmt representing the body of the lambda.
bool hasExplicitResultType() const
Whether this lambda had its result type explicitly specified.
TemplateParameterList * getTemplateParameterList() const
If this is a generic lambda expression, retrieve the template parameter list associated with it,...
ArrayRef< NamedDecl * > getExplicitTemplateParameters() const
Get the template parameters were explicitly specified (as opposed to being invented by use of an auto...
capture_iterator explicit_capture_end() const
Retrieve an iterator pointing past the end of the sequence of explicit lambda captures.
const LambdaCapture * capture_iterator
An iterator that walks over the captures of the lambda, both implicit and explicit.
capture_iterator explicit_capture_begin() const
Retrieve an iterator pointing to the first explicit lambda capture.
LambdaCaptureDefault getCaptureDefault() const
Determine the default capture kind for this lambda.
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
LabelDecl * getLabelDecl()
bool hasLabelTarget() const
StringRef getAsmString() const
bool isIfExists() const
Determine whether this is an __if_exists statement.
DeclarationNameInfo getNameInfo() const
Retrieve the name of the entity we're testing for, along with location information.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies this name, if any.
CompoundStmt * getSubStmt() const
Retrieve the compound statement that will be included in the program only if the existence of the sym...
NestedNameSpecifierLoc getQualifierLoc() const
MSPropertyDecl * getPropertyDecl() const
Expr * getBaseExpr() const
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
ArrayRef< TemplateArgumentLoc > template_arguments() const
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
bool hadMultipleCandidates() const
Returns true if this member expression refers to a method that was resolved from an overloaded set ha...
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) const
Print this nested name specifier to the given output stream.
Expr * getBase()
Fetches base expression of array shaping expression.
ArrayRef< Expr * > getDimensions() const
Fetches the dimensions for array shaping expression.
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
unsigned numOfIterators() const
Returns number of iterator definitions.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
const Expr * getSynchExpr() const
const CompoundStmt * getSynchBody() const
const Expr * getThrowExpr() const
const ObjCAtFinallyStmt * getFinallyStmt() const
Retrieve the @finally statement, if any.
const Stmt * getTryBody() const
Retrieve the @try body.
catch_range catch_stmts()
const Stmt * getSubStmt() const
StringRef getBridgeKindName() const
Retrieve the kind of bridge being performed as a string.
unsigned getNumElements() const
getNumElements - Return number of elements of objective-c dictionary literal.
ObjCDictionaryElement getKeyValueElement(unsigned Index) const
QualType getEncodedType() const
const Expr * getBase() const
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Expr * getInstanceReceiver()
Returns the object expression (receiver) for an instance message, or null for a message that is not a...
Selector getSelector() const
@ SuperInstance
The receiver is the instance of the superclass object.
@ Instance
The receiver is an object instance.
@ SuperClass
The receiver is a superclass.
@ Class
The receiver is a class.
QualType getClassReceiver() const
Returns the type of a class message send, or NULL if the message is not a class message.
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
unsigned getNumArgs() const
Return the number of actual arguments in this message, not counting the receiver.
Selector getSelector() const
ObjCPropertyDecl * getExplicitProperty() const
ObjCMethodDecl * getImplicitPropertyGetter() const
const Expr * getBase() const
bool isObjectReceiver() const
bool isImplicitProperty() const
ObjCMethodDecl * getImplicitPropertySetter() const
ObjCInterfaceDecl * getClassReceiver() const
bool isClassReceiver() const
bool isSuperReceiver() const
ObjCProtocolDecl * getProtocol() const
Selector getSelector() const
StringLiteral * getString()
Expr * getKeyExpr() const
Expr * getBaseExpr() const
Expr * getIndexExpr(unsigned Idx)
const OffsetOfNode & getComponent(unsigned Idx) const
TypeSourceInfo * getTypeSourceInfo() const
unsigned getNumComponents() const
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
unsigned getArrayExprIndex() const
For an array element node, returns the index into the array of expressions.
@ Array
An index into an array.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Kind getKind() const
Determine what kind of offsetof node this is.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
OpenACCDirectiveKind getDirectiveKind() const
ArrayRef< const OpenACCClause * > clauses() const
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
const DeclarationNameInfo & getNameInfo() const
Gets the full name info.
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
ArrayRef< TemplateArgumentLoc > template_arguments() const
Expr * getPattern()
Retrieve the pattern of the pack expansion.
Expr * getIndexExpr() const
Expr * getPackIdExpression() const
const Expr * getSubExpr() const
Expr * getExpr(unsigned Init)
unsigned getNumExprs() const
Return the number of expressions in this paren list.
StringRef getIdentKindName() const
PredefinedIdentKind getIdentKind() const
Expr * getSyntacticForm()
Return the syntactic form of this expression, i.e.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
ArrayRef< Expr * > subExpressions()
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
CompoundStmt * getBlock() const
Expr * getFilterExpr() const
CompoundStmt * getBlock() const
CompoundStmt * getTryBlock() const
SEHFinallyStmt * getFinallyHandler() const
SEHExceptStmt * getExceptHandler() const
Returns 0 if not defined.
CompoundStmt * getOriginalStmt()
TypeSourceInfo * getTypeSourceInfo()
static std::string getPropertyNameFromSetterSelector(Selector Sel)
Return the property name for the given setter selector.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
bool isUnarySelector() const
unsigned getNumArgs() const
unsigned getNumSubExprs() const
getNumSubExprs - Return the size of the SubExprs array.
Expr * getExpr(unsigned Index)
getExpr - Return the Expr at the specified index.
NamedDecl * getPack() const
Retrieve the parameter pack.
StringRef getBuiltinStr() const
Return a string representing the name of the specific builtin function.
bool isValid() const
Return true if this is a valid SourceLocation object.
CompoundStmt * getSubStmt()
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
void printJson(raw_ostream &Out, PrinterHelper *Helper, const PrintingPolicy &Policy, bool AddQuotes) const
Pretty-prints in JSON format.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
void printPrettyControlled(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
void dumpPretty(const ASTContext &Context) const
dumpPretty/printPretty - These two methods do a "pretty print" of the AST back to its original source...
void outputString(raw_ostream &OS) const
Expr * getReplacement() const
NonTypeTemplateParmDecl * getParameterPack() const
Retrieve the non-type template parameter pack being substituted.
DeclStmt * getConditionVariableDeclStmt()
If this SwitchStmt has a condition variable, return the faux DeclStmt associated with the creation of...
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
void print(raw_ostream &Out, const ASTContext &Context, bool OmitTemplateKW=false) const
QualType getType() const
Return the type wrapped by this type source info.
TypeSourceInfo * getArg(unsigned I) const
Retrieve the Ith argument.
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
TypeTrait getTrait() const
Determine which type trait this expression uses.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
const T * castAs() const
Member-template castAs<specific type>.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isRecordType() const
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTrait getKind() const
static bool isPostfix(Opcode Op)
isPostfix - Return true if this is a postfix operation, like x++.
Expr * getSubExpr() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the full name info for the member that this expression refers to.
CompoundStmt * getOriginalStmt()
LiteralOperatorKind getLiteralOperatorKind() const
Returns the kind of literal operator invocation which this expression represents.
const IdentifierInfo * getUDSuffix() const
Returns the ud-suffix specified for this literal.
Expr * getCookedLiteral()
If this is not a raw user-defined literal, get the underlying cooked literal (representing the litera...
@ LOK_String
operator "" X (const CharT *, size_t)
@ LOK_Raw
Raw form: operator "" X (const char *)
@ LOK_Floating
operator "" X (long double)
@ LOK_Integer
operator "" X (unsigned long long)
@ LOK_Template
Raw form: operator "" X<cs...> ()
@ LOK_Character
operator "" X (CharT)
const Expr * getSubExpr() const
@ CInit
C-style initialization with assignment.
@ CallInit
Call-style initialization (C++98)
DeclStmt * getConditionVariableDeclStmt()
If this WhileStmt has a condition variable, return the faux DeclStmt associated with the creation of ...
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
std::string JsonFormat(StringRef RawSR, bool AddQuotes)
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
@ ObjCSelf
Parameter for Objective-C 'self' argument.
CXXNewInitializationStyle
ArrayRef< TemplateArgumentLoc > arguments() const
DeclarationName getName() const
getName - Returns the embedded declaration name.
void printName(raw_ostream &OS, PrintingPolicy Policy) const
printName - Print the human-readable name to a stream.
Expr * Value
The value of the dictionary element.
bool isPackExpansion() const
Determines whether this dictionary element is a pack expansion.
Expr * Key
The key for the dictionary element.
Describes how types, statements, expressions, and declarations should be printed.
unsigned FullyQualifiedName
When true, print the fully qualified name of function declarations.
unsigned Alignof
Whether we can use 'alignof' rather than '__alignof'.
unsigned CleanUglifiedParameters
Whether to strip underscores when printing reserved parameter names.
unsigned ConstantsAsWritten
Whether we should print the constant expressions as written in the sources.
unsigned IncludeNewlines
When true, include newlines after statements like "break", etc.
unsigned TerseOutput
Provide a 'terse' output.
unsigned PrintAsCanonical
Whether to print entities as written or canonically.
unsigned SuppressLambdaBody
Whether to suppress printing the body of a lambda.
unsigned UnderscoreAlignof
Whether we can use '_Alignof' rather than '__alignof'.
unsigned SuppressImplicitBase
When true, don't print the implicit 'self' or 'this' expressions.