47#include "llvm/ADT/ArrayRef.h"
48#include "llvm/ADT/STLExtras.h"
49#include "llvm/ADT/StringExtras.h"
50#include "llvm/ADT/StringRef.h"
51#include "llvm/Support/Compiler.h"
52#include "llvm/Support/ErrorHandling.h"
53#include "llvm/Support/raw_ostream.h"
66 class StmtPrinter :
public StmtVisitor<StmtPrinter> {
69 PrinterHelper* Helper;
70 PrintingPolicy Policy;
72 const ASTContext *Context;
75 StmtPrinter(raw_ostream &os, PrinterHelper *helper,
76 const PrintingPolicy &Policy,
unsigned Indentation = 0,
77 StringRef NL =
"\n",
const ASTContext *Context =
nullptr)
78 : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy),
79 NL(NL), Context(Context) {}
81 void PrintStmt(Stmt *S) { PrintStmt(S, Policy.Indentation); }
83 void PrintStmt(Stmt *S,
int SubIndent) {
84 IndentLevel += SubIndent;
85 if (isa_and_nonnull<Expr>(S)) {
93 Indent() <<
"<<<NULL STATEMENT>>>" << NL;
95 IndentLevel -= SubIndent;
98 void PrintInitStmt(Stmt *S,
unsigned PrefixWidth) {
100 IndentLevel += (PrefixWidth + 1) / 2;
101 if (
auto *DS = dyn_cast<DeclStmt>(S))
102 PrintRawDeclStmt(DS);
106 IndentLevel -= (PrefixWidth + 1) / 2;
109 void PrintControlledStmt(Stmt *S) {
110 if (
auto *CS = dyn_cast<CompoundStmt>(S)) {
112 PrintRawCompoundStmt(CS);
121 void PrintRawDecl(Decl *D);
122 void PrintRawDeclStmt(
const DeclStmt *S);
123 void PrintRawIfStmt(IfStmt *
If);
124 void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
125 void PrintCallArgs(CallExpr *E);
126 void PrintRawSEHExceptHandler(SEHExceptStmt *S);
127 void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
128 void PrintOMPExecutableDirective(OMPExecutableDirective *S,
129 bool ForceNoStmt =
false);
131 void PrintOpenACCClauseList(OpenACCConstructStmt *S);
132 void PrintOpenACCConstruct(OpenACCConstructStmt *S);
134 void PrintExpr(Expr *E) {
141 raw_ostream &
Indent(
int Delta = 0) {
142 for (
int i = 0, e = IndentLevel+Delta; i < e; ++i)
147 void Visit(Stmt* S) {
148 if (Helper && Helper->handledStmt(S,OS))
150 else StmtVisitor<StmtPrinter>::Visit(S);
153 [[maybe_unused]]
void VisitStmt(Stmt *Node) {
154 Indent() <<
"<<unknown stmt type>>" << NL;
157 [[maybe_unused]]
void VisitExpr(Expr *Node) {
158 OS <<
"<<unknown expr type>>";
161 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
163 void VisitBinComma(BinaryOperator *Node);
165#define ABSTRACT_STMT(CLASS)
166#define STMT(CLASS, PARENT) \
167 void Visit##CLASS(CLASS *Node);
168#include "clang/AST/StmtNodes.inc"
179void StmtPrinter::PrintRawCompoundStmt(
CompoundStmt *Node) {
180 assert(Node &&
"Compound statement cannot be null");
182 PrintFPPragmas(Node);
183 for (
auto *I : Node->
body())
193 bool FEnvAccess =
false;
194 if (FPO.hasAllowFEnvAccessOverride()) {
195 FEnvAccess = FPO.getAllowFEnvAccessOverride();
196 Indent() <<
"#pragma STDC FENV_ACCESS " << (FEnvAccess ?
"ON" :
"OFF")
199 if (FPO.hasSpecifiedExceptionModeOverride()) {
200 LangOptions::FPExceptionModeKind EM =
201 FPO.getSpecifiedExceptionModeOverride();
202 if (!FEnvAccess || EM != LangOptions::FPE_Strict) {
203 Indent() <<
"#pragma clang fp exceptions(";
204 switch (FPO.getSpecifiedExceptionModeOverride()) {
207 case LangOptions::FPE_Ignore:
210 case LangOptions::FPE_MayTrap:
213 case LangOptions::FPE_Strict:
220 if (FPO.hasConstRoundingModeOverride()) {
221 LangOptions::RoundingMode RM = FPO.getConstRoundingModeOverride();
222 Indent() <<
"#pragma STDC FENV_ROUND ";
224 case llvm::RoundingMode::TowardZero:
225 OS <<
"FE_TOWARDZERO";
227 case llvm::RoundingMode::NearestTiesToEven:
228 OS <<
"FE_TONEAREST";
230 case llvm::RoundingMode::TowardPositive:
233 case llvm::RoundingMode::TowardNegative:
236 case llvm::RoundingMode::NearestTiesToAway:
237 OS <<
"FE_TONEARESTFROMZERO";
239 case llvm::RoundingMode::Dynamic:
243 llvm_unreachable(
"Invalid rounding mode");
249void StmtPrinter::PrintRawDecl(Decl *D) {
253void StmtPrinter::PrintRawDeclStmt(
const DeclStmt *S) {
254 SmallVector<Decl *, 2> Decls(S->
decls());
258void StmtPrinter::VisitNullStmt(NullStmt *Node) {
262void StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
264 PrintRawDeclStmt(Node);
273void StmtPrinter::VisitCompoundStmt(
CompoundStmt *Node) {
275 PrintRawCompoundStmt(Node);
279void StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
281 PrintExpr(Node->
getLHS());
284 PrintExpr(Node->
getRHS());
291void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
292 Indent(-1) <<
"default:" << NL;
296void StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
301void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
302 ArrayRef<const Attr *> Attrs = Node->
getAttrs();
303 for (
const auto *Attr : Attrs) {
304 Attr->printPretty(OS, Policy);
305 if (Attr != Attrs.back())
312void StmtPrinter::PrintRawIfStmt(IfStmt *
If) {
313 if (
If->isConsteval()) {
315 if (
If->isNegatedConsteval())
319 PrintStmt(
If->getThen());
320 if (Stmt *Else =
If->getElse()) {
331 PrintInitStmt(
If->getInit(), 4);
332 if (
const DeclStmt *DS =
If->getConditionVariableDeclStmt())
333 PrintRawDeclStmt(DS);
335 PrintExpr(
If->getCond());
338 if (
auto *CS = dyn_cast<CompoundStmt>(
If->getThen())) {
340 PrintRawCompoundStmt(CS);
341 OS << (
If->getElse() ?
" " : NL);
344 PrintStmt(
If->getThen());
348 if (Stmt *Else =
If->getElse()) {
351 if (
auto *CS = dyn_cast<CompoundStmt>(Else)) {
353 PrintRawCompoundStmt(CS);
355 }
else if (
auto *ElseIf = dyn_cast<IfStmt>(Else)) {
357 PrintRawIfStmt(ElseIf);
360 PrintStmt(
If->getElse());
365void StmtPrinter::VisitIfStmt(IfStmt *
If) {
370void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
373 PrintInitStmt(Node->
getInit(), 8);
375 PrintRawDeclStmt(DS);
379 PrintControlledStmt(Node->
getBody());
382void StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
385 PrintRawDeclStmt(DS);
392void StmtPrinter::VisitDoStmt(DoStmt *Node) {
394 if (
auto *CS = dyn_cast<CompoundStmt>(Node->
getBody())) {
395 PrintRawCompoundStmt(CS);
408void StmtPrinter::VisitForStmt(ForStmt *Node) {
411 PrintInitStmt(Node->
getInit(), 5);
415 PrintRawDeclStmt(DS);
421 PrintExpr(Node->
getInc());
424 PrintControlledStmt(Node->
getBody());
427void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
429 if (
auto *DS = dyn_cast<DeclStmt>(Node->
getElement()))
430 PrintRawDeclStmt(DS);
436 PrintControlledStmt(Node->
getBody());
439void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) {
442 PrintInitStmt(Node->
getInit(), 5);
443 PrintingPolicy SubPolicy(Policy);
444 SubPolicy.SuppressInitializers =
true;
449 PrintControlledStmt(Node->
getBody());
452void StmtPrinter::VisitCXXExpansionStmtPattern(CXXExpansionStmtPattern *Node) {
453 OS <<
"template for (";
455 PrintInitStmt(Node->
getInit(), 14);
456 PrintingPolicy SubPolicy(Policy);
457 SubPolicy.SuppressInitializers =
true;
471 PrintControlledStmt(Node->
getBody());
474void StmtPrinter::VisitCXXExpansionStmtInstantiation(
475 CXXExpansionStmtInstantiation *) {
476 llvm_unreachable(
"should never be printed");
479void StmtPrinter::VisitCXXExpansionSelectExpr(CXXExpansionSelectExpr *Node) {
483void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) {
486 OS <<
"__if_exists (";
488 OS <<
"__if_not_exists (";
496void StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
501void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
508void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
518void StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
527void StmtPrinter::VisitDeferStmt(DeferStmt *Node) {
529 PrintControlledStmt(Node->
getBody());
532void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
542void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) {
559 for (
unsigned i = 0, e = Node->
getNumOutputs(); i != e; ++i) {
580 for (
unsigned i = 0, e = Node->
getNumInputs(); i != e; ++i) {
611 for (
unsigned i = 0, e = Node->
getNumLabels(); i != e; ++i) {
621void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) {
631void StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) {
635void StmtPrinter::VisitSYCLKernelCallStmt(SYCLKernelCallStmt *Node) {
639void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
641 if (
auto *TS = dyn_cast<CompoundStmt>(Node->
getTryBody())) {
642 PrintRawCompoundStmt(TS);
646 for (ObjCAtCatchStmt *catchStmt : Node->
catch_stmts()) {
648 if (Decl *DS = catchStmt->getCatchParamDecl())
651 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
652 PrintRawCompoundStmt(CS);
659 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
660 PrintRawCompoundStmt(CS);
666void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
669void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
670 Indent() <<
"@catch (...) { /* todo */ } " << NL;
673void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
682void StmtPrinter::VisitObjCAvailabilityCheckExpr(
683 ObjCAvailabilityCheckExpr *Node) {
684 OS <<
"@available(...)";
687void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
688 Indent() <<
"@synchronized (";
695void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
696 Indent() <<
"@autoreleasepool";
701void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
704 PrintRawDecl(ExDecl);
711void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
713 PrintRawCXXCatchStmt(Node);
717void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
727void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) {
733 PrintRawSEHExceptHandler(E);
735 assert(F &&
"Must have a finally block...");
736 PrintRawSEHFinallyStmt(F);
741void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) {
743 PrintRawCompoundStmt(Node->
getBlock());
747void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) {
751 PrintRawCompoundStmt(Node->
getBlock());
755void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) {
757 PrintRawSEHExceptHandler(Node);
761void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
763 PrintRawSEHFinallyStmt(Node);
767void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) {
776void StmtPrinter::VisitOMPCanonicalLoop(OMPCanonicalLoop *Node) {
777 PrintStmt(Node->getLoopStmt());
780void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S,
782 unsigned OpenMPVersion =
783 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
784 OMPClausePrinter Printer(OS, Policy, OpenMPVersion);
785 ArrayRef<OMPClause *> Clauses = S->clauses();
786 for (
auto *Clause : Clauses)
787 if (Clause && !Clause->isImplicit()) {
789 Printer.Visit(Clause);
792 if (!ForceNoStmt && S->hasAssociatedStmt())
793 PrintStmt(S->getRawStmt());
796void StmtPrinter::VisitOMPMetaDirective(OMPMetaDirective *Node) {
797 Indent() <<
"#pragma omp metadirective";
798 PrintOMPExecutableDirective(Node);
801void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
802 Indent() <<
"#pragma omp parallel";
803 PrintOMPExecutableDirective(Node);
806void StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) {
807 Indent() <<
"#pragma omp simd";
808 PrintOMPExecutableDirective(Node);
811void StmtPrinter::VisitOMPTileDirective(OMPTileDirective *Node) {
812 Indent() <<
"#pragma omp tile";
813 PrintOMPExecutableDirective(Node);
816void StmtPrinter::VisitOMPStripeDirective(OMPStripeDirective *Node) {
817 Indent() <<
"#pragma omp stripe";
818 PrintOMPExecutableDirective(Node);
821void StmtPrinter::VisitOMPUnrollDirective(OMPUnrollDirective *Node) {
822 Indent() <<
"#pragma omp unroll";
823 PrintOMPExecutableDirective(Node);
826void StmtPrinter::VisitOMPReverseDirective(OMPReverseDirective *Node) {
827 Indent() <<
"#pragma omp reverse";
828 PrintOMPExecutableDirective(Node);
831void StmtPrinter::VisitOMPInterchangeDirective(OMPInterchangeDirective *Node) {
832 Indent() <<
"#pragma omp interchange";
833 PrintOMPExecutableDirective(Node);
836void StmtPrinter::VisitOMPSplitDirective(OMPSplitDirective *Node) {
837 Indent() <<
"#pragma omp split";
838 PrintOMPExecutableDirective(Node);
841void StmtPrinter::VisitOMPFuseDirective(OMPFuseDirective *Node) {
842 Indent() <<
"#pragma omp fuse";
843 PrintOMPExecutableDirective(Node);
846void StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) {
847 Indent() <<
"#pragma omp for";
848 PrintOMPExecutableDirective(Node);
851void StmtPrinter::VisitOMPForSimdDirective(OMPForSimdDirective *Node) {
852 Indent() <<
"#pragma omp for simd";
853 PrintOMPExecutableDirective(Node);
856void StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) {
857 Indent() <<
"#pragma omp sections";
858 PrintOMPExecutableDirective(Node);
861void StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) {
862 Indent() <<
"#pragma omp section";
863 PrintOMPExecutableDirective(Node);
866void StmtPrinter::VisitOMPScopeDirective(OMPScopeDirective *Node) {
867 Indent() <<
"#pragma omp scope";
868 PrintOMPExecutableDirective(Node);
871void StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) {
872 Indent() <<
"#pragma omp single";
873 PrintOMPExecutableDirective(Node);
876void StmtPrinter::VisitOMPMasterDirective(OMPMasterDirective *Node) {
877 Indent() <<
"#pragma omp master";
878 PrintOMPExecutableDirective(Node);
881void StmtPrinter::VisitOMPCriticalDirective(OMPCriticalDirective *Node) {
882 Indent() <<
"#pragma omp critical";
883 if (Node->getDirectiveName().getName()) {
885 Node->getDirectiveName().printName(OS, Policy);
888 PrintOMPExecutableDirective(Node);
891void StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) {
892 Indent() <<
"#pragma omp parallel for";
893 PrintOMPExecutableDirective(Node);
896void StmtPrinter::VisitOMPParallelForSimdDirective(
897 OMPParallelForSimdDirective *Node) {
898 Indent() <<
"#pragma omp parallel for simd";
899 PrintOMPExecutableDirective(Node);
902void StmtPrinter::VisitOMPParallelMasterDirective(
903 OMPParallelMasterDirective *Node) {
904 Indent() <<
"#pragma omp parallel master";
905 PrintOMPExecutableDirective(Node);
908void StmtPrinter::VisitOMPParallelMaskedDirective(
909 OMPParallelMaskedDirective *Node) {
910 Indent() <<
"#pragma omp parallel masked";
911 PrintOMPExecutableDirective(Node);
914void StmtPrinter::VisitOMPParallelSectionsDirective(
915 OMPParallelSectionsDirective *Node) {
916 Indent() <<
"#pragma omp parallel sections";
917 PrintOMPExecutableDirective(Node);
920void StmtPrinter::VisitOMPTaskDirective(OMPTaskDirective *Node) {
921 Indent() <<
"#pragma omp task";
922 PrintOMPExecutableDirective(Node);
925void StmtPrinter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *Node) {
926 Indent() <<
"#pragma omp taskyield";
927 PrintOMPExecutableDirective(Node);
930void StmtPrinter::VisitOMPBarrierDirective(OMPBarrierDirective *Node) {
931 Indent() <<
"#pragma omp barrier";
932 PrintOMPExecutableDirective(Node);
935void StmtPrinter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *Node) {
936 Indent() <<
"#pragma omp taskwait";
937 PrintOMPExecutableDirective(Node);
940void StmtPrinter::VisitOMPAssumeDirective(OMPAssumeDirective *Node) {
941 Indent() <<
"#pragma omp assume";
942 PrintOMPExecutableDirective(Node);
945void StmtPrinter::VisitOMPErrorDirective(OMPErrorDirective *Node) {
946 Indent() <<
"#pragma omp error";
947 PrintOMPExecutableDirective(Node);
950void StmtPrinter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *Node) {
951 Indent() <<
"#pragma omp taskgroup";
952 PrintOMPExecutableDirective(Node);
955void StmtPrinter::VisitOMPFlushDirective(OMPFlushDirective *Node) {
956 Indent() <<
"#pragma omp flush";
957 PrintOMPExecutableDirective(Node);
960void StmtPrinter::VisitOMPDepobjDirective(OMPDepobjDirective *Node) {
961 Indent() <<
"#pragma omp depobj";
962 PrintOMPExecutableDirective(Node);
965void StmtPrinter::VisitOMPScanDirective(OMPScanDirective *Node) {
966 Indent() <<
"#pragma omp scan";
967 PrintOMPExecutableDirective(Node);
970void StmtPrinter::VisitOMPOrderedStandaloneDirective(
971 OMPOrderedStandaloneDirective *Node) {
972 Indent() <<
"#pragma omp ordered";
973 PrintOMPExecutableDirective(Node,
true);
976void StmtPrinter::VisitOMPOrderedBlockAssocDirective(
977 OMPOrderedBlockAssocDirective *Node) {
978 Indent() <<
"#pragma omp ordered";
979 PrintOMPExecutableDirective(Node);
982void StmtPrinter::VisitOMPAtomicDirective(OMPAtomicDirective *Node) {
983 Indent() <<
"#pragma omp atomic";
984 PrintOMPExecutableDirective(Node);
987void StmtPrinter::VisitOMPTargetDirective(OMPTargetDirective *Node) {
988 Indent() <<
"#pragma omp target";
989 PrintOMPExecutableDirective(Node);
992void StmtPrinter::VisitOMPTargetDataDirective(OMPTargetDataDirective *Node) {
993 Indent() <<
"#pragma omp target data";
994 PrintOMPExecutableDirective(Node);
997void StmtPrinter::VisitOMPTargetEnterDataDirective(
998 OMPTargetEnterDataDirective *Node) {
999 Indent() <<
"#pragma omp target enter data";
1000 PrintOMPExecutableDirective(Node,
true);
1003void StmtPrinter::VisitOMPTargetExitDataDirective(
1004 OMPTargetExitDataDirective *Node) {
1005 Indent() <<
"#pragma omp target exit data";
1006 PrintOMPExecutableDirective(Node,
true);
1009void StmtPrinter::VisitOMPTargetParallelDirective(
1010 OMPTargetParallelDirective *Node) {
1011 Indent() <<
"#pragma omp target parallel";
1012 PrintOMPExecutableDirective(Node);
1015void StmtPrinter::VisitOMPTargetParallelForDirective(
1016 OMPTargetParallelForDirective *Node) {
1017 Indent() <<
"#pragma omp target parallel for";
1018 PrintOMPExecutableDirective(Node);
1021void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) {
1022 Indent() <<
"#pragma omp teams";
1023 PrintOMPExecutableDirective(Node);
1026void StmtPrinter::VisitOMPCancellationPointDirective(
1027 OMPCancellationPointDirective *Node) {
1028 unsigned OpenMPVersion =
1029 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
1030 Indent() <<
"#pragma omp cancellation point "
1032 PrintOMPExecutableDirective(Node);
1035void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) {
1036 unsigned OpenMPVersion =
1037 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
1038 Indent() <<
"#pragma omp cancel "
1040 PrintOMPExecutableDirective(Node);
1043void StmtPrinter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *Node) {
1044 Indent() <<
"#pragma omp taskloop";
1045 PrintOMPExecutableDirective(Node);
1048void StmtPrinter::VisitOMPTaskLoopSimdDirective(
1049 OMPTaskLoopSimdDirective *Node) {
1050 Indent() <<
"#pragma omp taskloop simd";
1051 PrintOMPExecutableDirective(Node);
1054void StmtPrinter::VisitOMPMasterTaskLoopDirective(
1055 OMPMasterTaskLoopDirective *Node) {
1056 Indent() <<
"#pragma omp master taskloop";
1057 PrintOMPExecutableDirective(Node);
1060void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
1061 OMPMaskedTaskLoopDirective *Node) {
1062 Indent() <<
"#pragma omp masked taskloop";
1063 PrintOMPExecutableDirective(Node);
1066void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
1067 OMPMasterTaskLoopSimdDirective *Node) {
1068 Indent() <<
"#pragma omp master taskloop simd";
1069 PrintOMPExecutableDirective(Node);
1072void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
1073 OMPMaskedTaskLoopSimdDirective *Node) {
1074 Indent() <<
"#pragma omp masked taskloop simd";
1075 PrintOMPExecutableDirective(Node);
1078void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
1079 OMPParallelMasterTaskLoopDirective *Node) {
1080 Indent() <<
"#pragma omp parallel master taskloop";
1081 PrintOMPExecutableDirective(Node);
1084void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1085 OMPParallelMaskedTaskLoopDirective *Node) {
1086 Indent() <<
"#pragma omp parallel masked taskloop";
1087 PrintOMPExecutableDirective(Node);
1090void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1091 OMPParallelMasterTaskLoopSimdDirective *Node) {
1092 Indent() <<
"#pragma omp parallel master taskloop simd";
1093 PrintOMPExecutableDirective(Node);
1096void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1097 OMPParallelMaskedTaskLoopSimdDirective *Node) {
1098 Indent() <<
"#pragma omp parallel masked taskloop simd";
1099 PrintOMPExecutableDirective(Node);
1102void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective *Node) {
1103 Indent() <<
"#pragma omp distribute";
1104 PrintOMPExecutableDirective(Node);
1107void StmtPrinter::VisitOMPTargetUpdateDirective(
1108 OMPTargetUpdateDirective *Node) {
1109 Indent() <<
"#pragma omp target update";
1110 PrintOMPExecutableDirective(Node,
true);
1113void StmtPrinter::VisitOMPDistributeParallelForDirective(
1114 OMPDistributeParallelForDirective *Node) {
1115 Indent() <<
"#pragma omp distribute parallel for";
1116 PrintOMPExecutableDirective(Node);
1119void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1120 OMPDistributeParallelForSimdDirective *Node) {
1121 Indent() <<
"#pragma omp distribute parallel for simd";
1122 PrintOMPExecutableDirective(Node);
1125void StmtPrinter::VisitOMPDistributeSimdDirective(
1126 OMPDistributeSimdDirective *Node) {
1127 Indent() <<
"#pragma omp distribute simd";
1128 PrintOMPExecutableDirective(Node);
1131void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1132 OMPTargetParallelForSimdDirective *Node) {
1133 Indent() <<
"#pragma omp target parallel for simd";
1134 PrintOMPExecutableDirective(Node);
1137void StmtPrinter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *Node) {
1138 Indent() <<
"#pragma omp target simd";
1139 PrintOMPExecutableDirective(Node);
1142void StmtPrinter::VisitOMPTeamsDistributeDirective(
1143 OMPTeamsDistributeDirective *Node) {
1144 Indent() <<
"#pragma omp teams distribute";
1145 PrintOMPExecutableDirective(Node);
1148void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1149 OMPTeamsDistributeSimdDirective *Node) {
1150 Indent() <<
"#pragma omp teams distribute simd";
1151 PrintOMPExecutableDirective(Node);
1154void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1155 OMPTeamsDistributeParallelForSimdDirective *Node) {
1156 Indent() <<
"#pragma omp teams distribute parallel for simd";
1157 PrintOMPExecutableDirective(Node);
1160void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1161 OMPTeamsDistributeParallelForDirective *Node) {
1162 Indent() <<
"#pragma omp teams distribute parallel for";
1163 PrintOMPExecutableDirective(Node);
1166void StmtPrinter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *Node) {
1167 Indent() <<
"#pragma omp target teams";
1168 PrintOMPExecutableDirective(Node);
1171void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1172 OMPTargetTeamsDistributeDirective *Node) {
1173 Indent() <<
"#pragma omp target teams distribute";
1174 PrintOMPExecutableDirective(Node);
1177void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1178 OMPTargetTeamsDistributeParallelForDirective *Node) {
1179 Indent() <<
"#pragma omp target teams distribute parallel for";
1180 PrintOMPExecutableDirective(Node);
1183void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1184 OMPTargetTeamsDistributeParallelForSimdDirective *Node) {
1185 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1186 PrintOMPExecutableDirective(Node);
1189void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1190 OMPTargetTeamsDistributeSimdDirective *Node) {
1191 Indent() <<
"#pragma omp target teams distribute simd";
1192 PrintOMPExecutableDirective(Node);
1195void StmtPrinter::VisitOMPInteropDirective(OMPInteropDirective *Node) {
1196 Indent() <<
"#pragma omp interop";
1197 PrintOMPExecutableDirective(Node);
1200void StmtPrinter::VisitOMPDispatchDirective(OMPDispatchDirective *Node) {
1201 Indent() <<
"#pragma omp dispatch";
1202 PrintOMPExecutableDirective(Node);
1205void StmtPrinter::VisitOMPMaskedDirective(OMPMaskedDirective *Node) {
1206 Indent() <<
"#pragma omp masked";
1207 PrintOMPExecutableDirective(Node);
1210void StmtPrinter::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *Node) {
1211 Indent() <<
"#pragma omp loop";
1212 PrintOMPExecutableDirective(Node);
1215void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1216 OMPTeamsGenericLoopDirective *Node) {
1217 Indent() <<
"#pragma omp teams loop";
1218 PrintOMPExecutableDirective(Node);
1221void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1222 OMPTargetTeamsGenericLoopDirective *Node) {
1223 Indent() <<
"#pragma omp target teams loop";
1224 PrintOMPExecutableDirective(Node);
1227void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1228 OMPParallelGenericLoopDirective *Node) {
1229 Indent() <<
"#pragma omp parallel loop";
1230 PrintOMPExecutableDirective(Node);
1233void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1234 OMPTargetParallelGenericLoopDirective *Node) {
1235 Indent() <<
"#pragma omp target parallel loop";
1236 PrintOMPExecutableDirective(Node);
1242void StmtPrinter::PrintOpenACCClauseList(OpenACCConstructStmt *S) {
1245 OpenACCClausePrinter Printer(OS, Policy);
1246 Printer.VisitClauseList(S->
clauses());
1249void StmtPrinter::PrintOpenACCConstruct(OpenACCConstructStmt *S) {
1251 PrintOpenACCClauseList(S);
1255 PrintOpenACCConstruct(S);
1256 PrintStmt(S->getStructuredBlock());
1259void StmtPrinter::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {
1260 PrintOpenACCConstruct(S);
1264void StmtPrinter::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {
1265 PrintOpenACCConstruct(S);
1269void StmtPrinter::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {
1270 PrintOpenACCConstruct(S);
1273void StmtPrinter::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {
1274 PrintOpenACCConstruct(S);
1277void StmtPrinter::VisitOpenACCEnterDataConstruct(OpenACCEnterDataConstruct *S) {
1278 PrintOpenACCConstruct(S);
1280void StmtPrinter::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {
1281 PrintOpenACCConstruct(S);
1283void StmtPrinter::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {
1284 PrintOpenACCConstruct(S);
1286void StmtPrinter::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {
1287 PrintOpenACCConstruct(S);
1289void StmtPrinter::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {
1290 PrintOpenACCConstruct(S);
1292void StmtPrinter::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {
1293 PrintOpenACCConstruct(S);
1296void StmtPrinter::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {
1297 Indent() <<
"#pragma acc wait";
1310 E->printPretty(OS, nullptr, Policy);
1316 PrintOpenACCClauseList(S);
1320void StmtPrinter::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {
1321 Indent() <<
"#pragma acc atomic";
1326 PrintOpenACCClauseList(S);
1331void StmtPrinter::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {
1332 Indent() <<
"#pragma acc cache(";
1336 llvm::interleaveComma(S->
getVarList(), OS, [&](
const Expr *E) {
1337 E->printPretty(OS, nullptr, Policy);
1347void StmtPrinter::VisitSourceLocExpr(SourceLocExpr *Node) {
1351void StmtPrinter::VisitEmbedExpr(EmbedExpr *Node) {
1359void StmtPrinter::VisitConstantExpr(ConstantExpr *Node) {
1363void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
1364 ValueDecl *VD = Node->
getDecl();
1365 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(VD)) {
1366 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1369 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(VD)) {
1370 TPOD->printAsExpr(OS, Policy);
1373 bool ForceAnonymous =
1385 DeclarationNameInfo NameInfo = Node->
getNameInfo();
1389 if (CleanUglifiedParameter && ID)
1390 OS <<
ID->deuglifiedName();
1395 case Decl::NonTypeTemplateParm: {
1397 OS <<
"value-parameter-" << TD->getDepth() <<
'-' << TD->getIndex()
1401 case Decl::ParmVar: {
1403 OS <<
"function-parameter-" << PD->getFunctionScopeDepth() <<
'-'
1404 << PD->getFunctionScopeIndex();
1407 case Decl::Decomposition:
1408 OS <<
"decomposition";
1410 OS <<
'-' << I->getName();
1419 const TemplateParameterList *TPL =
nullptr;
1421 if (
auto *TD = dyn_cast<TemplateDecl>(VD))
1422 TPL = TD->getTemplateParameters();
1427void StmtPrinter::VisitDependentScopeDeclRefExpr(
1428 DependentScopeDeclRefExpr *Node) {
1437void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
1447 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
1448 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1450 DRE->getBeginLoc().isInvalid())
1457void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
1468void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
1480 Getter->getSelector().print(OS);
1488void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
1495void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1496 SYCLUniqueStableNameExpr *Node) {
1497 OS <<
"__builtin_sycl_unique_stable_name(";
1502void StmtPrinter::VisitUnresolvedSYCLKernelCallStmt(
1503 UnresolvedSYCLKernelCallStmt *Node) {
1507void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
1511void StmtPrinter::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *Node) {
1515void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
1528 Context->getSourceManager(), Context->getLangOpts(), &
Invalid);
1536void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
1543 OS << (isSigned ?
"wb" :
"uwb");
1548 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1549 default: llvm_unreachable(
"Unexpected type for integer literal!");
1550 case BuiltinType::Char_S:
1551 case BuiltinType::Char_U:
OS <<
"i8";
break;
1552 case BuiltinType::UChar:
OS <<
"Ui8";
break;
1553 case BuiltinType::SChar:
OS <<
"i8";
break;
1554 case BuiltinType::Short:
OS <<
"i16";
break;
1555 case BuiltinType::UShort:
OS <<
"Ui16";
break;
1556 case BuiltinType::Int:
break;
1557 case BuiltinType::UInt:
OS <<
'U';
break;
1558 case BuiltinType::Long:
OS <<
'L';
break;
1559 case BuiltinType::ULong:
OS <<
"UL";
break;
1560 case BuiltinType::LongLong:
OS <<
"LL";
break;
1561 case BuiltinType::ULongLong:
OS <<
"ULL";
break;
1562 case BuiltinType::Int128:
1564 case BuiltinType::UInt128:
1566 case BuiltinType::WChar_S:
1567 case BuiltinType::WChar_U:
1572void StmtPrinter::VisitFixedPointLiteral(FixedPointLiteral *Node) {
1577 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1578 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1579 case BuiltinType::ShortFract:
OS <<
"hr";
break;
1580 case BuiltinType::ShortAccum:
OS <<
"hk";
break;
1581 case BuiltinType::UShortFract:
OS <<
"uhr";
break;
1582 case BuiltinType::UShortAccum:
OS <<
"uhk";
break;
1583 case BuiltinType::Fract:
OS <<
"r";
break;
1584 case BuiltinType::Accum:
OS <<
"k";
break;
1585 case BuiltinType::UFract:
OS <<
"ur";
break;
1586 case BuiltinType::UAccum:
OS <<
"uk";
break;
1587 case BuiltinType::LongFract:
OS <<
"lr";
break;
1588 case BuiltinType::LongAccum:
OS <<
"lk";
break;
1589 case BuiltinType::ULongFract:
OS <<
"ulr";
break;
1590 case BuiltinType::ULongAccum:
OS <<
"ulk";
break;
1599 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1607 default: llvm_unreachable(
"Unexpected type for float literal!");
1608 case BuiltinType::Half:
break;
1609 case BuiltinType::Ibm128:
break;
1610 case BuiltinType::Double:
break;
1611 case BuiltinType::Float16: OS <<
"F16";
break;
1612 case BuiltinType::Float: OS <<
'F';
break;
1613 case BuiltinType::LongDouble: OS <<
'L';
break;
1614 case BuiltinType::Float128: OS <<
'Q';
break;
1618void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
1624void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
1629void StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
1633void StmtPrinter::VisitParenExpr(ParenExpr *Node) {
1639void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
1665void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
1666 OS <<
"__builtin_offsetof(";
1669 bool PrintedSomething =
false;
1677 PrintedSomething =
true;
1690 if (PrintedSomething)
1693 PrintedSomething =
true;
1699void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1700 UnaryExprOrTypeTraitExpr *Node) {
1702 if (Node->
getKind() == UETT_AlignOf) {
1704 Spelling =
"alignof";
1706 Spelling =
"_Alignof";
1708 Spelling =
"__alignof";
1723void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
1732 QualType
T = Assoc.getType();
1736 T.print(OS, Policy);
1738 PrintExpr(Assoc.getAssociationExpr());
1743void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
1744 PrintExpr(Node->
getLHS());
1746 PrintExpr(Node->
getRHS());
1750void StmtPrinter::VisitMatrixSingleSubscriptExpr(
1751 MatrixSingleSubscriptExpr *Node) {
1758void StmtPrinter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *Node) {
1768void StmtPrinter::VisitArraySectionExpr(ArraySectionExpr *Node) {
1786void StmtPrinter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *Node) {
1797void StmtPrinter::VisitOMPIteratorExpr(OMPIteratorExpr *Node) {
1804 PrintExpr(
Range.Begin);
1806 PrintExpr(
Range.End);
1809 PrintExpr(
Range.Step);
1817void StmtPrinter::PrintCallArgs(CallExpr *
Call) {
1818 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1825 PrintExpr(
Call->getArg(i));
1829void StmtPrinter::VisitCallExpr(CallExpr *
Call) {
1830 PrintExpr(
Call->getCallee());
1832 PrintCallArgs(
Call);
1837 if (
const auto *TE = dyn_cast<CXXThisExpr>(E))
1838 return TE->isImplicit();
1842void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
1846 auto *ParentMember = dyn_cast<MemberExpr>(Node->
getBase());
1847 FieldDecl *ParentDecl =
1848 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1856 if (FD->isAnonymousStructOrUnion())
1863 const TemplateParameterList *TPL =
nullptr;
1864 if (
auto *FD = dyn_cast<FunctionDecl>(Node->
getMemberDecl())) {
1866 if (
auto *FTD = FD->getPrimaryTemplate())
1867 TPL = FTD->getTemplateParameters();
1868 }
else if (
auto *VTSD =
1869 dyn_cast<VarTemplateSpecializationDecl>(Node->
getMemberDecl()))
1870 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1875void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
1877 OS << (Node->
isArrow() ?
"->isa" :
".isa");
1880void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
1886void StmtPrinter::VisitMatrixElementExpr(MatrixElementExpr *Node) {
1892void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
1897 const auto *IL = dyn_cast<IntegerLiteral>(Node->
getSubExpr());
1900 llvm::APInt Val = IL->getValue();
1902 llvm::find_if(ED->enumerators(), [&](
const EnumConstantDecl *ECD) {
1903 return llvm::APInt::isSameValue(ECD->getInitVal(), Val);
1905 if (ECD != ED->enumerator_end()) {
1906 ECD->printQualifiedName(OS, Policy);
1917void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
1924void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
1929void StmtPrinter::VisitBinComma(BinaryOperator *Node) {
1930 PrintExpr(Node->
getLHS());
1932 PrintExpr(Node->
getRHS());
1935void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
1936 PrintExpr(Node->
getLHS());
1938 PrintExpr(Node->
getRHS());
1941void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
1942 PrintExpr(Node->
getLHS());
1944 PrintExpr(Node->
getRHS());
1947void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
1950 PrintExpr(Node->
getLHS());
1952 PrintExpr(Node->
getRHS());
1958StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
1964void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
1968void StmtPrinter::VisitStmtExpr(StmtExpr *E) {
1974void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
1975 OS <<
"__builtin_choose_expr(";
1978 PrintExpr(Node->
getLHS());
1980 PrintExpr(Node->
getRHS());
1984void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
1988void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
1989 OS <<
"__builtin_shufflevector(";
1997void StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) {
1998 OS <<
"__builtin_convertvector(";
2005void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
2012 for (
unsigned i = 0, e = Node->
getNumInits(); i != e; ++i) {
2022void StmtPrinter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *Node) {
2030void StmtPrinter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *Node) {
2034void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
2036 for (
unsigned i = 0, e = Node->
getNumExprs(); i != e; ++i) {
2043void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
2044 bool NeedsEquals =
true;
2045 for (
const DesignatedInitExpr::Designator &D : Node->
designators()) {
2046 if (D.isFieldDesignator()) {
2047 if (D.getDotLoc().isInvalid()) {
2048 if (
const IdentifierInfo *II = D.getFieldName()) {
2049 OS << II->getName() <<
":";
2050 NeedsEquals =
false;
2053 OS <<
"." << D.getFieldName()->getName();
2057 if (D.isArrayDesignator()) {
2075void StmtPrinter::VisitDesignatedInitUpdateExpr(
2076 DesignatedInitUpdateExpr *Node) {
2082 OS <<
"/*updater*/";
2087void StmtPrinter::VisitNoInitExpr(NoInitExpr *Node) {
2088 OS <<
"/*no init*/";
2091void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
2093 OS <<
"/*implicit*/";
2097 OS <<
"/*implicit*/(";
2107void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
2108 OS <<
"__builtin_va_arg(";
2115void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
2119void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
2120 const char *Name =
nullptr;
2121 switch (Node->
getOp()) {
2122#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
2123 case AtomicExpr::AO ## ID: \
2126#include "clang/Basic/Builtins.inc"
2131 PrintExpr(Node->
getPtr());
2136 if (Node->
getOp() == AtomicExpr::AO__atomic_exchange ||
2141 if (Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange ||
2142 Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
2146 if (Node->
getOp() != AtomicExpr::AO__c11_atomic_init &&
2147 Node->
getOp() != AtomicExpr::AO__opencl_atomic_init) {
2159void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
2161 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
2164 PrintExpr(Node->
getArg(0));
2166 PrintExpr(Node->
getArg(0));
2169 }
else if (Kind == OO_Arrow) {
2170 PrintExpr(Node->
getArg(0));
2171 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
2172 PrintExpr(Node->
getArg(0));
2173 OS << (
Kind == OO_Call ?
'(' :
'[');
2174 for (
unsigned ArgIdx = 1; ArgIdx < Node->
getNumArgs(); ++ArgIdx) {
2178 PrintExpr(Node->
getArg(ArgIdx));
2180 OS << (
Kind == OO_Call ?
')' :
']');
2183 PrintExpr(Node->
getArg(0));
2185 PrintExpr(Node->
getArg(0));
2187 PrintExpr(Node->
getArg(1));
2189 llvm_unreachable(
"unknown overloaded operator");
2193void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
2196 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
2203void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
2208 PrintCallArgs(Node);
2212void StmtPrinter::VisitCXXRewrittenBinaryOperator(
2213 CXXRewrittenBinaryOperator *Node) {
2214 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2216 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
2218 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
2221void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
2229void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
2230 VisitCXXNamedCastExpr(Node);
2233void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
2234 VisitCXXNamedCastExpr(Node);
2237void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
2238 VisitCXXNamedCastExpr(Node);
2241void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
2242 VisitCXXNamedCastExpr(Node);
2245void StmtPrinter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *Node) {
2246 OS <<
"__builtin_bit_cast(";
2253void StmtPrinter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *Node) {
2254 VisitCXXNamedCastExpr(Node);
2257void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
2267void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
2277void StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) {
2287void StmtPrinter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *Node) {
2290 PrintExpr(Node->
getIdx());
2294void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
2301 const TemplateArgumentList *Args =
2306 const TemplateParameterList *TPL =
nullptr;
2307 if (!DRE->hadMultipleCandidates())
2308 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2309 TPL = TD->getTemplateParameters();
2311 printTemplateArgumentList(OS, Args->
asArray(), Policy, TPL);
2316 const TemplateArgument &Pack = Args->
get(0);
2318 char C = (char)P.getAsIntegral().getZExtValue();
2343void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
2347void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
2351void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
2355void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
2364void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
2368void StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) {
2372void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
2373 auto TargetType = Node->
getType();
2375 bool Bare =
Auto &&
Auto->isDeduced();
2380 TargetType.print(OS, Policy);
2392void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
2396void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
2404 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->
arg_begin(),
2406 Arg != ArgEnd; ++Arg) {
2407 if ((*Arg)->isDefaultArgument())
2421void StmtPrinter::VisitLambdaExpr(
LambdaExpr *Node) {
2423 bool NeedComma =
false;
2442 if (
C->capturesVLAType())
2449 switch (
C->getCaptureKind()) {
2461 OS <<
C->getCapturedVar()->getName();
2465 OS <<
C->getCapturedVar()->getName();
2469 llvm_unreachable(
"VLA type in explicit captures.");
2472 if (
C->isPackExpansion())
2479 llvm::StringRef
Pre;
2480 llvm::StringRef
Post;
2490 PrintExpr(D->getInit());
2506 for (
const auto *P :
Method->parameters()) {
2512 std::string ParamStr =
2514 ? P->getIdentifier()->deuglifiedName().str()
2515 : P->getNameAsString();
2516 P->getOriginalType().print(OS, Policy, ParamStr);
2518 if (
Method->isVariadic()) {
2528 auto *Proto =
Method->getType()->castAs<FunctionProtoType>();
2529 Proto->printExceptionSpecification(OS, Policy);
2536 Proto->getReturnType().print(OS, Policy);
2548void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
2550 TSInfo->getType().print(OS, Policy);
2556void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
2564 for (
unsigned i = 1; i < NumPlace; ++i) {
2576 llvm::raw_string_ostream s(TypeS);
2579 (*Size)->printPretty(s, Helper, Policy);
2587 if (InitStyle != CXXNewInitializationStyle::None) {
2588 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2598void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
2607void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
2617 OS << II->getName();
2622void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
2626 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
2640void StmtPrinter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
2642 OS <<
"<forwarded>";
2645void StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
2649void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
2654void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2655 CXXUnresolvedConstructExpr *Node) {
2659 for (
auto Arg = Node->
arg_begin(), ArgEnd = Node->
arg_end(); Arg != ArgEnd;
2669void StmtPrinter::VisitCXXReflectExpr(CXXReflectExpr *S) {
2671 assert(
false &&
"not implemented yet");
2674void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2675 CXXDependentScopeMemberExpr *Node) {
2688void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
2701void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
2703 for (
unsigned I = 0, N = E->
getNumArgs(); I != N; ++I) {
2711void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
2717void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
2723void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
2729void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
2734void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2735 OS <<
"sizeof...(" << *E->
getPack() <<
")";
2738void StmtPrinter::VisitPackIndexingExpr(PackIndexingExpr *E) {
2745void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2746 SubstNonTypeTemplateParmPackExpr *Node) {
2750void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2751 SubstNonTypeTemplateParmExpr *Node) {
2755void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2759void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
2763void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) {
2777void StmtPrinter::VisitCXXParenListInitExpr(CXXParenListInitExpr *Node) {
2779 [&](Expr *E) { PrintExpr(E); });
2782void StmtPrinter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {
2796 if (!LocalParameters.empty()) {
2798 for (ParmVarDecl *LocalParam : LocalParameters) {
2799 PrintRawDecl(LocalParam);
2800 if (LocalParam != LocalParameters.back())
2808 for (concepts::Requirement *Req : Requirements) {
2809 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2810 if (TypeReq->isSubstitutionFailure())
2811 OS <<
"<<error-type>>";
2813 TypeReq->getType()->getType().print(OS, Policy);
2814 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2815 if (ExprReq->isCompound())
2817 if (ExprReq->isExprSubstitutionFailure())
2818 OS <<
"<<error-expression>>";
2820 PrintExpr(ExprReq->getExpr());
2821 if (ExprReq->isCompound()) {
2823 if (ExprReq->getNoexceptLoc().isValid())
2825 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2826 if (!RetReq.isEmpty()) {
2828 if (RetReq.isSubstitutionFailure())
2829 OS <<
"<<error-type>>";
2830 else if (RetReq.isTypeConstraint())
2831 RetReq.getTypeConstraint()->print(OS, Policy);
2837 if (NestedReq->hasInvalidConstraint())
2838 OS <<
"<<error-expression>>";
2840 PrintExpr(NestedReq->getConstraintExpr());
2849void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
2853void StmtPrinter::VisitCoreturnStmt(CoreturnStmt *S) {
2862void StmtPrinter::VisitCoawaitExpr(CoawaitExpr *S) {
2867void StmtPrinter::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) {
2872void StmtPrinter::VisitCoyieldExpr(CoyieldExpr *S) {
2879void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
2884void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
2889void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
2891 ObjCArrayLiteral::child_range Ch = E->
children();
2892 for (
auto I = Ch.begin(), E = Ch.end(); I != E; ++I) {
2893 if (I != Ch.begin())
2900void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
2909 Visit(Element.
Value);
2916void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
2922void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
2928void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
2932void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
2954 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2956 if (i > 0)
OS <<
' ';
2964 PrintExpr(Mess->
getArg(i));
2970void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
2971 OS << (Node->
getValue() ?
"__objc_yes" :
"__objc_no");
2975StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
2980StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
2987void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
3000 std::string ParamStr = (*AI)->getNameAsString();
3001 (*AI)->getType().print(OS, Policy, ParamStr);
3005 if (FT->isVariadic()) {
3014void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
3018void StmtPrinter::VisitRecoveryExpr(RecoveryExpr *Node) {
3019 OS <<
"<recovery-expr>(";
3020 const char *Sep =
"";
3029void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
3030 OS <<
"__builtin_astype(";
3037void StmtPrinter::VisitHLSLOutArgExpr(HLSLOutArgExpr *Node) {
3051 StringRef NL,
const ASTContext *Context)
const {
3052 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
3053 P.Visit(
const_cast<Stmt *
>(
this));
3058 unsigned Indentation, StringRef NL,
3060 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
3061 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
3067 llvm::raw_string_ostream TempOut(Buf);
Defines the clang::ASTContext interface.
Defines enumerations for traits support.
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 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.
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
InitListExpr * getRangeExpr()
DecompositionDecl * getDecompositionDecl()
const VarDecl * getRangeVar() const
Expr * getExpansionInitializer()
bool isDestructuring() const
VarDecl * getExpansionVariable()
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.
MutableArrayRef< Expr * > getUserSpecifiedInitExprs()
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.
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>.
bool isEnumeralType() const
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
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)
const Expr * getInit() const
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,...
Top level wrappers for InstallAPI frontend operations.
const char * getTraitSpelling(TypeTrait T) LLVM_READONLY
Return the spelling of the trait T. Never null.
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)
const FunctionProtoType * T
std::string JsonFormat(StringRef RawSR, bool AddQuotes)
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 PrettyEnums
Whether to print enumerators with a matching enumerator name or via cast.
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.