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::VisitOMPOrderedDirective(OMPOrderedDirective *Node) {
971 Indent() <<
"#pragma omp ordered";
972 PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>());
975void StmtPrinter::VisitOMPAtomicDirective(OMPAtomicDirective *Node) {
976 Indent() <<
"#pragma omp atomic";
977 PrintOMPExecutableDirective(Node);
980void StmtPrinter::VisitOMPTargetDirective(OMPTargetDirective *Node) {
981 Indent() <<
"#pragma omp target";
982 PrintOMPExecutableDirective(Node);
985void StmtPrinter::VisitOMPTargetDataDirective(OMPTargetDataDirective *Node) {
986 Indent() <<
"#pragma omp target data";
987 PrintOMPExecutableDirective(Node);
990void StmtPrinter::VisitOMPTargetEnterDataDirective(
991 OMPTargetEnterDataDirective *Node) {
992 Indent() <<
"#pragma omp target enter data";
993 PrintOMPExecutableDirective(Node,
true);
996void StmtPrinter::VisitOMPTargetExitDataDirective(
997 OMPTargetExitDataDirective *Node) {
998 Indent() <<
"#pragma omp target exit data";
999 PrintOMPExecutableDirective(Node,
true);
1002void StmtPrinter::VisitOMPTargetParallelDirective(
1003 OMPTargetParallelDirective *Node) {
1004 Indent() <<
"#pragma omp target parallel";
1005 PrintOMPExecutableDirective(Node);
1008void StmtPrinter::VisitOMPTargetParallelForDirective(
1009 OMPTargetParallelForDirective *Node) {
1010 Indent() <<
"#pragma omp target parallel for";
1011 PrintOMPExecutableDirective(Node);
1014void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) {
1015 Indent() <<
"#pragma omp teams";
1016 PrintOMPExecutableDirective(Node);
1019void StmtPrinter::VisitOMPCancellationPointDirective(
1020 OMPCancellationPointDirective *Node) {
1021 unsigned OpenMPVersion =
1022 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
1023 Indent() <<
"#pragma omp cancellation point "
1025 PrintOMPExecutableDirective(Node);
1028void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) {
1029 unsigned OpenMPVersion =
1030 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
1031 Indent() <<
"#pragma omp cancel "
1033 PrintOMPExecutableDirective(Node);
1036void StmtPrinter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *Node) {
1037 Indent() <<
"#pragma omp taskloop";
1038 PrintOMPExecutableDirective(Node);
1041void StmtPrinter::VisitOMPTaskLoopSimdDirective(
1042 OMPTaskLoopSimdDirective *Node) {
1043 Indent() <<
"#pragma omp taskloop simd";
1044 PrintOMPExecutableDirective(Node);
1047void StmtPrinter::VisitOMPMasterTaskLoopDirective(
1048 OMPMasterTaskLoopDirective *Node) {
1049 Indent() <<
"#pragma omp master taskloop";
1050 PrintOMPExecutableDirective(Node);
1053void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
1054 OMPMaskedTaskLoopDirective *Node) {
1055 Indent() <<
"#pragma omp masked taskloop";
1056 PrintOMPExecutableDirective(Node);
1059void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
1060 OMPMasterTaskLoopSimdDirective *Node) {
1061 Indent() <<
"#pragma omp master taskloop simd";
1062 PrintOMPExecutableDirective(Node);
1065void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
1066 OMPMaskedTaskLoopSimdDirective *Node) {
1067 Indent() <<
"#pragma omp masked taskloop simd";
1068 PrintOMPExecutableDirective(Node);
1071void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
1072 OMPParallelMasterTaskLoopDirective *Node) {
1073 Indent() <<
"#pragma omp parallel master taskloop";
1074 PrintOMPExecutableDirective(Node);
1077void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1078 OMPParallelMaskedTaskLoopDirective *Node) {
1079 Indent() <<
"#pragma omp parallel masked taskloop";
1080 PrintOMPExecutableDirective(Node);
1083void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1084 OMPParallelMasterTaskLoopSimdDirective *Node) {
1085 Indent() <<
"#pragma omp parallel master taskloop simd";
1086 PrintOMPExecutableDirective(Node);
1089void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1090 OMPParallelMaskedTaskLoopSimdDirective *Node) {
1091 Indent() <<
"#pragma omp parallel masked taskloop simd";
1092 PrintOMPExecutableDirective(Node);
1095void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective *Node) {
1096 Indent() <<
"#pragma omp distribute";
1097 PrintOMPExecutableDirective(Node);
1100void StmtPrinter::VisitOMPTargetUpdateDirective(
1101 OMPTargetUpdateDirective *Node) {
1102 Indent() <<
"#pragma omp target update";
1103 PrintOMPExecutableDirective(Node,
true);
1106void StmtPrinter::VisitOMPDistributeParallelForDirective(
1107 OMPDistributeParallelForDirective *Node) {
1108 Indent() <<
"#pragma omp distribute parallel for";
1109 PrintOMPExecutableDirective(Node);
1112void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1113 OMPDistributeParallelForSimdDirective *Node) {
1114 Indent() <<
"#pragma omp distribute parallel for simd";
1115 PrintOMPExecutableDirective(Node);
1118void StmtPrinter::VisitOMPDistributeSimdDirective(
1119 OMPDistributeSimdDirective *Node) {
1120 Indent() <<
"#pragma omp distribute simd";
1121 PrintOMPExecutableDirective(Node);
1124void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1125 OMPTargetParallelForSimdDirective *Node) {
1126 Indent() <<
"#pragma omp target parallel for simd";
1127 PrintOMPExecutableDirective(Node);
1130void StmtPrinter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *Node) {
1131 Indent() <<
"#pragma omp target simd";
1132 PrintOMPExecutableDirective(Node);
1135void StmtPrinter::VisitOMPTeamsDistributeDirective(
1136 OMPTeamsDistributeDirective *Node) {
1137 Indent() <<
"#pragma omp teams distribute";
1138 PrintOMPExecutableDirective(Node);
1141void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1142 OMPTeamsDistributeSimdDirective *Node) {
1143 Indent() <<
"#pragma omp teams distribute simd";
1144 PrintOMPExecutableDirective(Node);
1147void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1148 OMPTeamsDistributeParallelForSimdDirective *Node) {
1149 Indent() <<
"#pragma omp teams distribute parallel for simd";
1150 PrintOMPExecutableDirective(Node);
1153void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1154 OMPTeamsDistributeParallelForDirective *Node) {
1155 Indent() <<
"#pragma omp teams distribute parallel for";
1156 PrintOMPExecutableDirective(Node);
1159void StmtPrinter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *Node) {
1160 Indent() <<
"#pragma omp target teams";
1161 PrintOMPExecutableDirective(Node);
1164void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1165 OMPTargetTeamsDistributeDirective *Node) {
1166 Indent() <<
"#pragma omp target teams distribute";
1167 PrintOMPExecutableDirective(Node);
1170void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1171 OMPTargetTeamsDistributeParallelForDirective *Node) {
1172 Indent() <<
"#pragma omp target teams distribute parallel for";
1173 PrintOMPExecutableDirective(Node);
1176void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1177 OMPTargetTeamsDistributeParallelForSimdDirective *Node) {
1178 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1179 PrintOMPExecutableDirective(Node);
1182void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1183 OMPTargetTeamsDistributeSimdDirective *Node) {
1184 Indent() <<
"#pragma omp target teams distribute simd";
1185 PrintOMPExecutableDirective(Node);
1188void StmtPrinter::VisitOMPInteropDirective(OMPInteropDirective *Node) {
1189 Indent() <<
"#pragma omp interop";
1190 PrintOMPExecutableDirective(Node);
1193void StmtPrinter::VisitOMPDispatchDirective(OMPDispatchDirective *Node) {
1194 Indent() <<
"#pragma omp dispatch";
1195 PrintOMPExecutableDirective(Node);
1198void StmtPrinter::VisitOMPMaskedDirective(OMPMaskedDirective *Node) {
1199 Indent() <<
"#pragma omp masked";
1200 PrintOMPExecutableDirective(Node);
1203void StmtPrinter::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *Node) {
1204 Indent() <<
"#pragma omp loop";
1205 PrintOMPExecutableDirective(Node);
1208void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1209 OMPTeamsGenericLoopDirective *Node) {
1210 Indent() <<
"#pragma omp teams loop";
1211 PrintOMPExecutableDirective(Node);
1214void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1215 OMPTargetTeamsGenericLoopDirective *Node) {
1216 Indent() <<
"#pragma omp target teams loop";
1217 PrintOMPExecutableDirective(Node);
1220void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1221 OMPParallelGenericLoopDirective *Node) {
1222 Indent() <<
"#pragma omp parallel loop";
1223 PrintOMPExecutableDirective(Node);
1226void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1227 OMPTargetParallelGenericLoopDirective *Node) {
1228 Indent() <<
"#pragma omp target parallel loop";
1229 PrintOMPExecutableDirective(Node);
1235void StmtPrinter::PrintOpenACCClauseList(OpenACCConstructStmt *S) {
1238 OpenACCClausePrinter Printer(OS, Policy);
1239 Printer.VisitClauseList(S->
clauses());
1242void StmtPrinter::PrintOpenACCConstruct(OpenACCConstructStmt *S) {
1244 PrintOpenACCClauseList(S);
1248 PrintOpenACCConstruct(S);
1249 PrintStmt(S->getStructuredBlock());
1252void StmtPrinter::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {
1253 PrintOpenACCConstruct(S);
1257void StmtPrinter::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {
1258 PrintOpenACCConstruct(S);
1262void StmtPrinter::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {
1263 PrintOpenACCConstruct(S);
1266void StmtPrinter::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {
1267 PrintOpenACCConstruct(S);
1270void StmtPrinter::VisitOpenACCEnterDataConstruct(OpenACCEnterDataConstruct *S) {
1271 PrintOpenACCConstruct(S);
1273void StmtPrinter::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {
1274 PrintOpenACCConstruct(S);
1276void StmtPrinter::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {
1277 PrintOpenACCConstruct(S);
1279void StmtPrinter::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {
1280 PrintOpenACCConstruct(S);
1282void StmtPrinter::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {
1283 PrintOpenACCConstruct(S);
1285void StmtPrinter::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {
1286 PrintOpenACCConstruct(S);
1289void StmtPrinter::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {
1290 Indent() <<
"#pragma acc wait";
1303 E->printPretty(OS, nullptr, Policy);
1309 PrintOpenACCClauseList(S);
1313void StmtPrinter::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {
1314 Indent() <<
"#pragma acc atomic";
1319 PrintOpenACCClauseList(S);
1324void StmtPrinter::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {
1325 Indent() <<
"#pragma acc cache(";
1329 llvm::interleaveComma(S->
getVarList(), OS, [&](
const Expr *E) {
1330 E->printPretty(OS, nullptr, Policy);
1340void StmtPrinter::VisitSourceLocExpr(SourceLocExpr *Node) {
1344void StmtPrinter::VisitEmbedExpr(EmbedExpr *Node) {
1352void StmtPrinter::VisitConstantExpr(ConstantExpr *Node) {
1356void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
1357 ValueDecl *VD = Node->
getDecl();
1358 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(VD)) {
1359 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1362 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(VD)) {
1363 TPOD->printAsExpr(OS, Policy);
1366 bool ForceAnonymous =
1378 DeclarationNameInfo NameInfo = Node->
getNameInfo();
1382 if (CleanUglifiedParameter && ID)
1383 OS <<
ID->deuglifiedName();
1388 case Decl::NonTypeTemplateParm: {
1390 OS <<
"value-parameter-" << TD->getDepth() <<
'-' << TD->getIndex()
1394 case Decl::ParmVar: {
1396 OS <<
"function-parameter-" << PD->getFunctionScopeDepth() <<
'-'
1397 << PD->getFunctionScopeIndex();
1400 case Decl::Decomposition:
1401 OS <<
"decomposition";
1403 OS <<
'-' << I->getName();
1412 const TemplateParameterList *TPL =
nullptr;
1414 if (
auto *TD = dyn_cast<TemplateDecl>(VD))
1415 TPL = TD->getTemplateParameters();
1420void StmtPrinter::VisitDependentScopeDeclRefExpr(
1421 DependentScopeDeclRefExpr *Node) {
1430void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
1440 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
1441 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1443 DRE->getBeginLoc().isInvalid())
1450void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
1461void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
1473 Getter->getSelector().print(OS);
1481void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
1488void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1489 SYCLUniqueStableNameExpr *Node) {
1490 OS <<
"__builtin_sycl_unique_stable_name(";
1495void StmtPrinter::VisitUnresolvedSYCLKernelCallStmt(
1496 UnresolvedSYCLKernelCallStmt *Node) {
1500void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
1504void StmtPrinter::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *Node) {
1508void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
1521 Context->getSourceManager(), Context->getLangOpts(), &
Invalid);
1529void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
1536 OS << (isSigned ?
"wb" :
"uwb");
1541 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1542 default: llvm_unreachable(
"Unexpected type for integer literal!");
1543 case BuiltinType::Char_S:
1544 case BuiltinType::Char_U:
OS <<
"i8";
break;
1545 case BuiltinType::UChar:
OS <<
"Ui8";
break;
1546 case BuiltinType::SChar:
OS <<
"i8";
break;
1547 case BuiltinType::Short:
OS <<
"i16";
break;
1548 case BuiltinType::UShort:
OS <<
"Ui16";
break;
1549 case BuiltinType::Int:
break;
1550 case BuiltinType::UInt:
OS <<
'U';
break;
1551 case BuiltinType::Long:
OS <<
'L';
break;
1552 case BuiltinType::ULong:
OS <<
"UL";
break;
1553 case BuiltinType::LongLong:
OS <<
"LL";
break;
1554 case BuiltinType::ULongLong:
OS <<
"ULL";
break;
1555 case BuiltinType::Int128:
1557 case BuiltinType::UInt128:
1559 case BuiltinType::WChar_S:
1560 case BuiltinType::WChar_U:
1565void StmtPrinter::VisitFixedPointLiteral(FixedPointLiteral *Node) {
1570 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1571 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1572 case BuiltinType::ShortFract:
OS <<
"hr";
break;
1573 case BuiltinType::ShortAccum:
OS <<
"hk";
break;
1574 case BuiltinType::UShortFract:
OS <<
"uhr";
break;
1575 case BuiltinType::UShortAccum:
OS <<
"uhk";
break;
1576 case BuiltinType::Fract:
OS <<
"r";
break;
1577 case BuiltinType::Accum:
OS <<
"k";
break;
1578 case BuiltinType::UFract:
OS <<
"ur";
break;
1579 case BuiltinType::UAccum:
OS <<
"uk";
break;
1580 case BuiltinType::LongFract:
OS <<
"lr";
break;
1581 case BuiltinType::LongAccum:
OS <<
"lk";
break;
1582 case BuiltinType::ULongFract:
OS <<
"ulr";
break;
1583 case BuiltinType::ULongAccum:
OS <<
"ulk";
break;
1592 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1600 default: llvm_unreachable(
"Unexpected type for float literal!");
1601 case BuiltinType::Half:
break;
1602 case BuiltinType::Ibm128:
break;
1603 case BuiltinType::Double:
break;
1604 case BuiltinType::Float16: OS <<
"F16";
break;
1605 case BuiltinType::Float: OS <<
'F';
break;
1606 case BuiltinType::LongDouble: OS <<
'L';
break;
1607 case BuiltinType::Float128: OS <<
'Q';
break;
1611void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
1617void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
1622void StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
1626void StmtPrinter::VisitParenExpr(ParenExpr *Node) {
1632void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
1658void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
1659 OS <<
"__builtin_offsetof(";
1662 bool PrintedSomething =
false;
1670 PrintedSomething =
true;
1683 if (PrintedSomething)
1686 PrintedSomething =
true;
1692void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1693 UnaryExprOrTypeTraitExpr *Node) {
1695 if (Node->
getKind() == UETT_AlignOf) {
1697 Spelling =
"alignof";
1699 Spelling =
"_Alignof";
1701 Spelling =
"__alignof";
1716void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
1725 QualType
T = Assoc.getType();
1729 T.print(OS, Policy);
1731 PrintExpr(Assoc.getAssociationExpr());
1736void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
1737 PrintExpr(Node->
getLHS());
1739 PrintExpr(Node->
getRHS());
1743void StmtPrinter::VisitMatrixSingleSubscriptExpr(
1744 MatrixSingleSubscriptExpr *Node) {
1751void StmtPrinter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *Node) {
1761void StmtPrinter::VisitArraySectionExpr(ArraySectionExpr *Node) {
1779void StmtPrinter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *Node) {
1790void StmtPrinter::VisitOMPIteratorExpr(OMPIteratorExpr *Node) {
1797 PrintExpr(
Range.Begin);
1799 PrintExpr(
Range.End);
1802 PrintExpr(
Range.Step);
1810void StmtPrinter::PrintCallArgs(CallExpr *
Call) {
1811 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1818 PrintExpr(
Call->getArg(i));
1822void StmtPrinter::VisitCallExpr(CallExpr *
Call) {
1823 PrintExpr(
Call->getCallee());
1825 PrintCallArgs(
Call);
1830 if (
const auto *TE = dyn_cast<CXXThisExpr>(E))
1831 return TE->isImplicit();
1835void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
1839 auto *ParentMember = dyn_cast<MemberExpr>(Node->
getBase());
1840 FieldDecl *ParentDecl =
1841 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1849 if (FD->isAnonymousStructOrUnion())
1856 const TemplateParameterList *TPL =
nullptr;
1857 if (
auto *FD = dyn_cast<FunctionDecl>(Node->
getMemberDecl())) {
1859 if (
auto *FTD = FD->getPrimaryTemplate())
1860 TPL = FTD->getTemplateParameters();
1861 }
else if (
auto *VTSD =
1862 dyn_cast<VarTemplateSpecializationDecl>(Node->
getMemberDecl()))
1863 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1868void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
1870 OS << (Node->
isArrow() ?
"->isa" :
".isa");
1873void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
1879void StmtPrinter::VisitMatrixElementExpr(MatrixElementExpr *Node) {
1885void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
1890 const auto *IL = dyn_cast<IntegerLiteral>(Node->
getSubExpr());
1893 llvm::APInt Val = IL->getValue();
1895 llvm::find_if(ED->enumerators(), [&](
const EnumConstantDecl *ECD) {
1896 return llvm::APInt::isSameValue(ECD->getInitVal(), Val);
1898 if (ECD != ED->enumerator_end()) {
1899 ECD->printQualifiedName(OS, Policy);
1910void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
1917void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
1922void StmtPrinter::VisitBinComma(BinaryOperator *Node) {
1923 PrintExpr(Node->
getLHS());
1925 PrintExpr(Node->
getRHS());
1928void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
1929 PrintExpr(Node->
getLHS());
1931 PrintExpr(Node->
getRHS());
1934void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
1935 PrintExpr(Node->
getLHS());
1937 PrintExpr(Node->
getRHS());
1940void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
1943 PrintExpr(Node->
getLHS());
1945 PrintExpr(Node->
getRHS());
1951StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
1957void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
1961void StmtPrinter::VisitStmtExpr(StmtExpr *E) {
1967void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
1968 OS <<
"__builtin_choose_expr(";
1971 PrintExpr(Node->
getLHS());
1973 PrintExpr(Node->
getRHS());
1977void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
1981void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
1982 OS <<
"__builtin_shufflevector(";
1990void StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) {
1991 OS <<
"__builtin_convertvector(";
1998void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
2005 for (
unsigned i = 0, e = Node->
getNumInits(); i != e; ++i) {
2015void StmtPrinter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *Node) {
2023void StmtPrinter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *Node) {
2027void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
2029 for (
unsigned i = 0, e = Node->
getNumExprs(); i != e; ++i) {
2036void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
2037 bool NeedsEquals =
true;
2038 for (
const DesignatedInitExpr::Designator &D : Node->
designators()) {
2039 if (D.isFieldDesignator()) {
2040 if (D.getDotLoc().isInvalid()) {
2041 if (
const IdentifierInfo *II = D.getFieldName()) {
2042 OS << II->getName() <<
":";
2043 NeedsEquals =
false;
2046 OS <<
"." << D.getFieldName()->getName();
2050 if (D.isArrayDesignator()) {
2068void StmtPrinter::VisitDesignatedInitUpdateExpr(
2069 DesignatedInitUpdateExpr *Node) {
2075 OS <<
"/*updater*/";
2080void StmtPrinter::VisitNoInitExpr(NoInitExpr *Node) {
2081 OS <<
"/*no init*/";
2084void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
2086 OS <<
"/*implicit*/";
2090 OS <<
"/*implicit*/(";
2100void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
2101 OS <<
"__builtin_va_arg(";
2108void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
2112void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
2113 const char *Name =
nullptr;
2114 switch (Node->
getOp()) {
2115#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
2116 case AtomicExpr::AO ## ID: \
2119#include "clang/Basic/Builtins.inc"
2124 PrintExpr(Node->
getPtr());
2129 if (Node->
getOp() == AtomicExpr::AO__atomic_exchange ||
2134 if (Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange ||
2135 Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
2139 if (Node->
getOp() != AtomicExpr::AO__c11_atomic_init &&
2140 Node->
getOp() != AtomicExpr::AO__opencl_atomic_init) {
2152void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
2154 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
2157 PrintExpr(Node->
getArg(0));
2159 PrintExpr(Node->
getArg(0));
2162 }
else if (Kind == OO_Arrow) {
2163 PrintExpr(Node->
getArg(0));
2164 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
2165 PrintExpr(Node->
getArg(0));
2166 OS << (
Kind == OO_Call ?
'(' :
'[');
2167 for (
unsigned ArgIdx = 1; ArgIdx < Node->
getNumArgs(); ++ArgIdx) {
2171 PrintExpr(Node->
getArg(ArgIdx));
2173 OS << (
Kind == OO_Call ?
')' :
']');
2176 PrintExpr(Node->
getArg(0));
2178 PrintExpr(Node->
getArg(0));
2180 PrintExpr(Node->
getArg(1));
2182 llvm_unreachable(
"unknown overloaded operator");
2186void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
2189 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
2196void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
2201 PrintCallArgs(Node);
2205void StmtPrinter::VisitCXXRewrittenBinaryOperator(
2206 CXXRewrittenBinaryOperator *Node) {
2207 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2209 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
2211 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
2214void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
2222void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
2223 VisitCXXNamedCastExpr(Node);
2226void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
2227 VisitCXXNamedCastExpr(Node);
2230void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
2231 VisitCXXNamedCastExpr(Node);
2234void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
2235 VisitCXXNamedCastExpr(Node);
2238void StmtPrinter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *Node) {
2239 OS <<
"__builtin_bit_cast(";
2246void StmtPrinter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *Node) {
2247 VisitCXXNamedCastExpr(Node);
2250void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
2260void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
2270void StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) {
2280void StmtPrinter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *Node) {
2283 PrintExpr(Node->
getIdx());
2287void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
2294 const TemplateArgumentList *Args =
2299 const TemplateParameterList *TPL =
nullptr;
2300 if (!DRE->hadMultipleCandidates())
2301 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2302 TPL = TD->getTemplateParameters();
2304 printTemplateArgumentList(OS, Args->
asArray(), Policy, TPL);
2309 const TemplateArgument &Pack = Args->
get(0);
2311 char C = (char)P.getAsIntegral().getZExtValue();
2336void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
2340void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
2344void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
2348void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
2357void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
2361void StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) {
2365void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
2366 auto TargetType = Node->
getType();
2368 bool Bare =
Auto &&
Auto->isDeduced();
2373 TargetType.print(OS, Policy);
2385void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
2389void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
2397 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->
arg_begin(),
2399 Arg != ArgEnd; ++Arg) {
2400 if ((*Arg)->isDefaultArgument())
2414void StmtPrinter::VisitLambdaExpr(
LambdaExpr *Node) {
2416 bool NeedComma =
false;
2435 if (
C->capturesVLAType())
2442 switch (
C->getCaptureKind()) {
2454 OS <<
C->getCapturedVar()->getName();
2458 OS <<
C->getCapturedVar()->getName();
2462 llvm_unreachable(
"VLA type in explicit captures.");
2465 if (
C->isPackExpansion())
2472 llvm::StringRef
Pre;
2473 llvm::StringRef
Post;
2483 PrintExpr(D->getInit());
2499 for (
const auto *P :
Method->parameters()) {
2505 std::string ParamStr =
2507 ? P->getIdentifier()->deuglifiedName().str()
2508 : P->getNameAsString();
2509 P->getOriginalType().print(OS, Policy, ParamStr);
2511 if (
Method->isVariadic()) {
2521 auto *Proto =
Method->getType()->castAs<FunctionProtoType>();
2522 Proto->printExceptionSpecification(OS, Policy);
2529 Proto->getReturnType().print(OS, Policy);
2541void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
2543 TSInfo->getType().print(OS, Policy);
2549void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
2557 for (
unsigned i = 1; i < NumPlace; ++i) {
2569 llvm::raw_string_ostream s(TypeS);
2572 (*Size)->printPretty(s, Helper, Policy);
2580 if (InitStyle != CXXNewInitializationStyle::None) {
2581 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2591void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
2600void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
2610 OS << II->getName();
2615void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
2619 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
2633void StmtPrinter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
2635 OS <<
"<forwarded>";
2638void StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
2642void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
2647void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2648 CXXUnresolvedConstructExpr *Node) {
2652 for (
auto Arg = Node->
arg_begin(), ArgEnd = Node->
arg_end(); Arg != ArgEnd;
2662void StmtPrinter::VisitCXXReflectExpr(CXXReflectExpr *S) {
2664 assert(
false &&
"not implemented yet");
2667void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2668 CXXDependentScopeMemberExpr *Node) {
2681void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
2694void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
2696 for (
unsigned I = 0, N = E->
getNumArgs(); I != N; ++I) {
2704void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
2710void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
2716void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
2722void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
2727void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2728 OS <<
"sizeof...(" << *E->
getPack() <<
")";
2731void StmtPrinter::VisitPackIndexingExpr(PackIndexingExpr *E) {
2738void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2739 SubstNonTypeTemplateParmPackExpr *Node) {
2743void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2744 SubstNonTypeTemplateParmExpr *Node) {
2748void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2752void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
2756void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) {
2770void StmtPrinter::VisitCXXParenListInitExpr(CXXParenListInitExpr *Node) {
2772 [&](Expr *E) { PrintExpr(E); });
2775void StmtPrinter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {
2789 if (!LocalParameters.empty()) {
2791 for (ParmVarDecl *LocalParam : LocalParameters) {
2792 PrintRawDecl(LocalParam);
2793 if (LocalParam != LocalParameters.back())
2801 for (concepts::Requirement *Req : Requirements) {
2802 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2803 if (TypeReq->isSubstitutionFailure())
2804 OS <<
"<<error-type>>";
2806 TypeReq->getType()->getType().print(OS, Policy);
2807 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2808 if (ExprReq->isCompound())
2810 if (ExprReq->isExprSubstitutionFailure())
2811 OS <<
"<<error-expression>>";
2813 PrintExpr(ExprReq->getExpr());
2814 if (ExprReq->isCompound()) {
2816 if (ExprReq->getNoexceptLoc().isValid())
2818 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2819 if (!RetReq.isEmpty()) {
2821 if (RetReq.isSubstitutionFailure())
2822 OS <<
"<<error-type>>";
2823 else if (RetReq.isTypeConstraint())
2824 RetReq.getTypeConstraint()->print(OS, Policy);
2830 if (NestedReq->hasInvalidConstraint())
2831 OS <<
"<<error-expression>>";
2833 PrintExpr(NestedReq->getConstraintExpr());
2842void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
2846void StmtPrinter::VisitCoreturnStmt(CoreturnStmt *S) {
2855void StmtPrinter::VisitCoawaitExpr(CoawaitExpr *S) {
2860void StmtPrinter::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) {
2865void StmtPrinter::VisitCoyieldExpr(CoyieldExpr *S) {
2872void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
2877void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
2882void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
2884 ObjCArrayLiteral::child_range Ch = E->
children();
2885 for (
auto I = Ch.begin(), E = Ch.end(); I != E; ++I) {
2886 if (I != Ch.begin())
2893void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
2902 Visit(Element.
Value);
2909void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
2915void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
2921void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
2925void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
2947 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2949 if (i > 0)
OS <<
' ';
2957 PrintExpr(Mess->
getArg(i));
2963void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
2964 OS << (Node->
getValue() ?
"__objc_yes" :
"__objc_no");
2968StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
2973StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
2980void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
2993 std::string ParamStr = (*AI)->getNameAsString();
2994 (*AI)->getType().print(OS, Policy, ParamStr);
2998 if (FT->isVariadic()) {
3007void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
3011void StmtPrinter::VisitRecoveryExpr(RecoveryExpr *Node) {
3012 OS <<
"<recovery-expr>(";
3013 const char *Sep =
"";
3022void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
3023 OS <<
"__builtin_astype(";
3030void StmtPrinter::VisitHLSLOutArgExpr(HLSLOutArgExpr *Node) {
3044 StringRef NL,
const ASTContext *Context)
const {
3045 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
3046 P.Visit(
const_cast<Stmt *
>(
this));
3051 unsigned Indentation, StringRef NL,
3053 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
3054 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
3060 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,...
The JSON file list parser is used to communicate input to InstallAPI.
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.