48#include "llvm/ADT/ArrayRef.h"
49#include "llvm/ADT/STLExtras.h"
50#include "llvm/ADT/StringExtras.h"
51#include "llvm/ADT/StringRef.h"
52#include "llvm/Support/Compiler.h"
53#include "llvm/Support/ErrorHandling.h"
54#include "llvm/Support/raw_ostream.h"
67 class StmtPrinter :
public StmtVisitor<StmtPrinter> {
70 PrinterHelper* Helper;
71 PrintingPolicy Policy;
73 const ASTContext *Context;
76 StmtPrinter(raw_ostream &os, PrinterHelper *helper,
77 const PrintingPolicy &Policy,
unsigned Indentation = 0,
78 StringRef NL =
"\n",
const ASTContext *Context =
nullptr)
79 : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy),
80 NL(NL), Context(Context) {}
82 void PrintStmt(Stmt *S) { PrintStmt(S, Policy.Indentation); }
84 void PrintStmt(Stmt *S,
int SubIndent) {
85 IndentLevel += SubIndent;
86 if (isa_and_nonnull<Expr>(S)) {
94 Indent() <<
"<<<NULL STATEMENT>>>" << NL;
96 IndentLevel -= SubIndent;
99 void PrintInitStmt(Stmt *S,
unsigned PrefixWidth) {
101 IndentLevel += (PrefixWidth + 1) / 2;
102 if (
auto *DS = dyn_cast<DeclStmt>(S))
103 PrintRawDeclStmt(DS);
107 IndentLevel -= (PrefixWidth + 1) / 2;
110 void PrintControlledStmt(Stmt *S) {
111 if (
auto *CS = dyn_cast<CompoundStmt>(S)) {
113 PrintRawCompoundStmt(CS);
122 void PrintRawDecl(Decl *D);
123 void PrintRawDeclStmt(
const DeclStmt *S);
124 void PrintRawIfStmt(IfStmt *
If);
125 void PrintRawCXXCatchStmt(CXXCatchStmt *Catch);
126 void PrintCallArgs(CallExpr *E);
127 void PrintRawSEHExceptHandler(SEHExceptStmt *S);
128 void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
129 void PrintOMPExecutableDirective(OMPExecutableDirective *S,
130 bool ForceNoStmt =
false);
132 void PrintOpenACCClauseList(OpenACCConstructStmt *S);
133 void PrintOpenACCConstruct(OpenACCConstructStmt *S);
135 void PrintExpr(Expr *E) {
142 raw_ostream &
Indent(
int Delta = 0) {
143 for (
int i = 0, e = IndentLevel+Delta; i < e; ++i)
148 void Visit(Stmt* S) {
149 if (Helper && Helper->handledStmt(S,OS))
151 else StmtVisitor<StmtPrinter>::Visit(S);
154 [[maybe_unused]]
void VisitStmt(Stmt *Node) {
155 Indent() <<
"<<unknown stmt type>>" << NL;
158 [[maybe_unused]]
void VisitExpr(Expr *Node) {
159 OS <<
"<<unknown expr type>>";
162 void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
164#define ABSTRACT_STMT(CLASS)
165#define STMT(CLASS, PARENT) \
166 void Visit##CLASS(CLASS *Node);
167#include "clang/AST/StmtNodes.inc"
178void StmtPrinter::PrintRawCompoundStmt(
CompoundStmt *Node) {
179 assert(Node &&
"Compound statement cannot be null");
181 PrintFPPragmas(Node);
182 for (
auto *I : Node->
body())
192 bool FEnvAccess =
false;
193 if (FPO.hasAllowFEnvAccessOverride()) {
194 FEnvAccess = FPO.getAllowFEnvAccessOverride();
195 Indent() <<
"#pragma STDC FENV_ACCESS " << (FEnvAccess ?
"ON" :
"OFF")
198 if (FPO.hasSpecifiedExceptionModeOverride()) {
199 LangOptions::FPExceptionModeKind EM =
200 FPO.getSpecifiedExceptionModeOverride();
201 if (!FEnvAccess || EM != LangOptions::FPE_Strict) {
202 Indent() <<
"#pragma clang fp exceptions(";
203 switch (FPO.getSpecifiedExceptionModeOverride()) {
206 case LangOptions::FPE_Ignore:
209 case LangOptions::FPE_MayTrap:
212 case LangOptions::FPE_Strict:
219 if (FPO.hasConstRoundingModeOverride()) {
220 LangOptions::RoundingMode RM = FPO.getConstRoundingModeOverride();
221 Indent() <<
"#pragma STDC FENV_ROUND ";
223 case llvm::RoundingMode::TowardZero:
224 OS <<
"FE_TOWARDZERO";
226 case llvm::RoundingMode::NearestTiesToEven:
227 OS <<
"FE_TONEAREST";
229 case llvm::RoundingMode::TowardPositive:
232 case llvm::RoundingMode::TowardNegative:
235 case llvm::RoundingMode::NearestTiesToAway:
236 OS <<
"FE_TONEARESTFROMZERO";
238 case llvm::RoundingMode::Dynamic:
242 llvm_unreachable(
"Invalid rounding mode");
248void StmtPrinter::PrintRawDecl(Decl *D) {
252void StmtPrinter::PrintRawDeclStmt(
const DeclStmt *S) {
253 SmallVector<Decl *, 2> Decls(S->
decls());
257void StmtPrinter::VisitNullStmt(NullStmt *Node) {
261void StmtPrinter::VisitDeclStmt(DeclStmt *Node) {
263 PrintRawDeclStmt(Node);
272void StmtPrinter::VisitCompoundStmt(
CompoundStmt *Node) {
274 PrintRawCompoundStmt(Node);
278void StmtPrinter::VisitCaseStmt(CaseStmt *Node) {
280 PrintExpr(Node->
getLHS());
283 PrintExpr(Node->
getRHS());
290void StmtPrinter::VisitDefaultStmt(DefaultStmt *Node) {
291 Indent(-1) <<
"default:" << NL;
295void StmtPrinter::VisitLabelStmt(LabelStmt *Node) {
300void StmtPrinter::VisitAttributedStmt(AttributedStmt *Node) {
301 ArrayRef<const Attr *> Attrs = Node->
getAttrs();
302 for (
const auto *Attr : Attrs) {
303 Attr->printPretty(OS, Policy);
304 if (Attr != Attrs.back())
311void StmtPrinter::PrintRawIfStmt(IfStmt *
If) {
312 if (
If->isConsteval()) {
314 if (
If->isNegatedConsteval())
318 PrintStmt(
If->getThen());
319 if (Stmt *Else =
If->getElse()) {
330 PrintInitStmt(
If->getInit(), 4);
331 if (
const DeclStmt *DS =
If->getConditionVariableDeclStmt())
332 PrintRawDeclStmt(DS);
334 PrintExpr(
If->getCond());
337 if (
auto *CS = dyn_cast<CompoundStmt>(
If->getThen())) {
339 PrintRawCompoundStmt(CS);
340 OS << (
If->getElse() ?
" " : NL);
343 PrintStmt(
If->getThen());
347 if (Stmt *Else =
If->getElse()) {
350 if (
auto *CS = dyn_cast<CompoundStmt>(Else)) {
352 PrintRawCompoundStmt(CS);
354 }
else if (
auto *ElseIf = dyn_cast<IfStmt>(Else)) {
356 PrintRawIfStmt(ElseIf);
359 PrintStmt(
If->getElse());
364void StmtPrinter::VisitIfStmt(IfStmt *
If) {
369void StmtPrinter::VisitSwitchStmt(SwitchStmt *Node) {
372 PrintInitStmt(Node->
getInit(), 8);
374 PrintRawDeclStmt(DS);
378 PrintControlledStmt(Node->
getBody());
381void StmtPrinter::VisitWhileStmt(WhileStmt *Node) {
384 PrintRawDeclStmt(DS);
391void StmtPrinter::VisitDoStmt(DoStmt *Node) {
393 if (
auto *CS = dyn_cast<CompoundStmt>(Node->
getBody())) {
394 PrintRawCompoundStmt(CS);
407void StmtPrinter::VisitForStmt(ForStmt *Node) {
410 PrintInitStmt(Node->
getInit(), 5);
414 PrintRawDeclStmt(DS);
420 PrintExpr(Node->
getInc());
423 PrintControlledStmt(Node->
getBody());
426void StmtPrinter::VisitObjCForCollectionStmt(ObjCForCollectionStmt *Node) {
428 if (
auto *DS = dyn_cast<DeclStmt>(Node->
getElement()))
429 PrintRawDeclStmt(DS);
435 PrintControlledStmt(Node->
getBody());
438void StmtPrinter::VisitCXXForRangeStmt(CXXForRangeStmt *Node) {
441 PrintInitStmt(Node->
getInit(), 5);
442 PrintingPolicy SubPolicy(Policy);
443 SubPolicy.SuppressInitializers =
true;
448 PrintControlledStmt(Node->
getBody());
451void StmtPrinter::VisitCXXExpansionStmtPattern(CXXExpansionStmtPattern *Node) {
452 OS <<
"template for (";
454 PrintInitStmt(Node->
getInit(), 14);
455 PrintingPolicy SubPolicy(Policy);
456 SubPolicy.SuppressInitializers =
true;
470 PrintControlledStmt(Node->
getBody());
473void StmtPrinter::VisitCXXExpansionStmtInstantiation(
474 CXXExpansionStmtInstantiation *) {
475 llvm_unreachable(
"should never be printed");
478void StmtPrinter::VisitCXXExpansionSelectExpr(CXXExpansionSelectExpr *Node) {
482void StmtPrinter::VisitMSDependentExistsStmt(MSDependentExistsStmt *Node) {
485 OS <<
"__if_exists (";
487 OS <<
"__if_not_exists (";
495void StmtPrinter::VisitGotoStmt(GotoStmt *Node) {
500void StmtPrinter::VisitIndirectGotoStmt(IndirectGotoStmt *Node) {
507void StmtPrinter::VisitContinueStmt(ContinueStmt *Node) {
517void StmtPrinter::VisitBreakStmt(BreakStmt *Node) {
526void StmtPrinter::VisitDeferStmt(DeferStmt *Node) {
528 PrintControlledStmt(Node->
getBody());
531void StmtPrinter::VisitReturnStmt(ReturnStmt *Node) {
541void StmtPrinter::VisitGCCAsmStmt(GCCAsmStmt *Node) {
558 for (
unsigned i = 0, e = Node->
getNumOutputs(); i != e; ++i) {
579 for (
unsigned i = 0, e = Node->
getNumInputs(); i != e; ++i) {
610 for (
unsigned i = 0, e = Node->
getNumLabels(); i != e; ++i) {
620void StmtPrinter::VisitMSAsmStmt(MSAsmStmt *Node) {
630void StmtPrinter::VisitCapturedStmt(CapturedStmt *Node) {
634void StmtPrinter::VisitSYCLKernelCallStmt(SYCLKernelCallStmt *Node) {
638void StmtPrinter::VisitObjCAtTryStmt(ObjCAtTryStmt *Node) {
640 if (
auto *TS = dyn_cast<CompoundStmt>(Node->
getTryBody())) {
641 PrintRawCompoundStmt(TS);
645 for (ObjCAtCatchStmt *catchStmt : Node->
catch_stmts()) {
647 if (Decl *DS = catchStmt->getCatchParamDecl())
650 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
651 PrintRawCompoundStmt(CS);
658 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
659 PrintRawCompoundStmt(CS);
665void StmtPrinter::VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Node) {
668void StmtPrinter::VisitObjCAtCatchStmt (ObjCAtCatchStmt *Node) {
669 Indent() <<
"@catch (...) { /* todo */ } " << NL;
672void StmtPrinter::VisitObjCAtThrowStmt(ObjCAtThrowStmt *Node) {
681void StmtPrinter::VisitObjCAvailabilityCheckExpr(
682 ObjCAvailabilityCheckExpr *Node) {
683 OS <<
"@available(...)";
686void StmtPrinter::VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Node) {
687 Indent() <<
"@synchronized (";
694void StmtPrinter::VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *Node) {
695 Indent() <<
"@autoreleasepool";
700void StmtPrinter::PrintRawCXXCatchStmt(CXXCatchStmt *Node) {
703 PrintRawDecl(ExDecl);
710void StmtPrinter::VisitCXXCatchStmt(CXXCatchStmt *Node) {
712 PrintRawCXXCatchStmt(Node);
716void StmtPrinter::VisitCXXTryStmt(CXXTryStmt *Node) {
726void StmtPrinter::VisitSEHTryStmt(SEHTryStmt *Node) {
732 PrintRawSEHExceptHandler(E);
734 assert(F &&
"Must have a finally block...");
735 PrintRawSEHFinallyStmt(F);
740void StmtPrinter::PrintRawSEHFinallyStmt(SEHFinallyStmt *Node) {
742 PrintRawCompoundStmt(Node->
getBlock());
746void StmtPrinter::PrintRawSEHExceptHandler(SEHExceptStmt *Node) {
750 PrintRawCompoundStmt(Node->
getBlock());
754void StmtPrinter::VisitSEHExceptStmt(SEHExceptStmt *Node) {
756 PrintRawSEHExceptHandler(Node);
760void StmtPrinter::VisitSEHFinallyStmt(SEHFinallyStmt *Node) {
762 PrintRawSEHFinallyStmt(Node);
766void StmtPrinter::VisitSEHLeaveStmt(SEHLeaveStmt *Node) {
775void StmtPrinter::VisitOMPCanonicalLoop(OMPCanonicalLoop *Node) {
776 PrintStmt(Node->getLoopStmt());
779void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S,
781 unsigned OpenMPVersion =
782 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
783 OMPClausePrinter Printer(OS, Policy, OpenMPVersion);
784 ArrayRef<OMPClause *> Clauses = S->clauses();
785 for (
auto *Clause : Clauses)
786 if (Clause && !Clause->isImplicit()) {
788 Printer.Visit(Clause);
791 if (!ForceNoStmt && S->hasAssociatedStmt())
792 PrintStmt(S->getRawStmt());
795void StmtPrinter::VisitOMPMetaDirective(OMPMetaDirective *Node) {
796 Indent() <<
"#pragma omp metadirective";
797 PrintOMPExecutableDirective(Node);
800void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
801 Indent() <<
"#pragma omp parallel";
802 PrintOMPExecutableDirective(Node);
805void StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) {
806 Indent() <<
"#pragma omp simd";
807 PrintOMPExecutableDirective(Node);
810void StmtPrinter::VisitOMPTileDirective(OMPTileDirective *Node) {
811 Indent() <<
"#pragma omp tile";
812 PrintOMPExecutableDirective(Node);
815void StmtPrinter::VisitOMPStripeDirective(OMPStripeDirective *Node) {
816 Indent() <<
"#pragma omp stripe";
817 PrintOMPExecutableDirective(Node);
820void StmtPrinter::VisitOMPUnrollDirective(OMPUnrollDirective *Node) {
821 Indent() <<
"#pragma omp unroll";
822 PrintOMPExecutableDirective(Node);
825void StmtPrinter::VisitOMPReverseDirective(OMPReverseDirective *Node) {
826 Indent() <<
"#pragma omp reverse";
827 PrintOMPExecutableDirective(Node);
830void StmtPrinter::VisitOMPInterchangeDirective(OMPInterchangeDirective *Node) {
831 Indent() <<
"#pragma omp interchange";
832 PrintOMPExecutableDirective(Node);
835void StmtPrinter::VisitOMPSplitDirective(OMPSplitDirective *Node) {
836 Indent() <<
"#pragma omp split";
837 PrintOMPExecutableDirective(Node);
840void StmtPrinter::VisitOMPFuseDirective(OMPFuseDirective *Node) {
841 Indent() <<
"#pragma omp fuse";
842 PrintOMPExecutableDirective(Node);
845void StmtPrinter::VisitOMPForDirective(OMPForDirective *Node) {
846 Indent() <<
"#pragma omp for";
847 PrintOMPExecutableDirective(Node);
850void StmtPrinter::VisitOMPForSimdDirective(OMPForSimdDirective *Node) {
851 Indent() <<
"#pragma omp for simd";
852 PrintOMPExecutableDirective(Node);
855void StmtPrinter::VisitOMPSectionsDirective(OMPSectionsDirective *Node) {
856 Indent() <<
"#pragma omp sections";
857 PrintOMPExecutableDirective(Node);
860void StmtPrinter::VisitOMPSectionDirective(OMPSectionDirective *Node) {
861 Indent() <<
"#pragma omp section";
862 PrintOMPExecutableDirective(Node);
865void StmtPrinter::VisitOMPScopeDirective(OMPScopeDirective *Node) {
866 Indent() <<
"#pragma omp scope";
867 PrintOMPExecutableDirective(Node);
870void StmtPrinter::VisitOMPSingleDirective(OMPSingleDirective *Node) {
871 Indent() <<
"#pragma omp single";
872 PrintOMPExecutableDirective(Node);
875void StmtPrinter::VisitOMPMasterDirective(OMPMasterDirective *Node) {
876 Indent() <<
"#pragma omp master";
877 PrintOMPExecutableDirective(Node);
880void StmtPrinter::VisitOMPCriticalDirective(OMPCriticalDirective *Node) {
881 Indent() <<
"#pragma omp critical";
882 if (Node->getDirectiveName().getName()) {
884 Node->getDirectiveName().printName(OS, Policy);
887 PrintOMPExecutableDirective(Node);
890void StmtPrinter::VisitOMPParallelForDirective(OMPParallelForDirective *Node) {
891 Indent() <<
"#pragma omp parallel for";
892 PrintOMPExecutableDirective(Node);
895void StmtPrinter::VisitOMPParallelForSimdDirective(
896 OMPParallelForSimdDirective *Node) {
897 Indent() <<
"#pragma omp parallel for simd";
898 PrintOMPExecutableDirective(Node);
901void StmtPrinter::VisitOMPParallelMasterDirective(
902 OMPParallelMasterDirective *Node) {
903 Indent() <<
"#pragma omp parallel master";
904 PrintOMPExecutableDirective(Node);
907void StmtPrinter::VisitOMPParallelMaskedDirective(
908 OMPParallelMaskedDirective *Node) {
909 Indent() <<
"#pragma omp parallel masked";
910 PrintOMPExecutableDirective(Node);
913void StmtPrinter::VisitOMPParallelSectionsDirective(
914 OMPParallelSectionsDirective *Node) {
915 Indent() <<
"#pragma omp parallel sections";
916 PrintOMPExecutableDirective(Node);
919void StmtPrinter::VisitOMPTaskDirective(OMPTaskDirective *Node) {
920 Indent() <<
"#pragma omp task";
921 PrintOMPExecutableDirective(Node);
924void StmtPrinter::VisitOMPTaskyieldDirective(OMPTaskyieldDirective *Node) {
925 Indent() <<
"#pragma omp taskyield";
926 PrintOMPExecutableDirective(Node);
929void StmtPrinter::VisitOMPBarrierDirective(OMPBarrierDirective *Node) {
930 Indent() <<
"#pragma omp barrier";
931 PrintOMPExecutableDirective(Node);
934void StmtPrinter::VisitOMPTaskwaitDirective(OMPTaskwaitDirective *Node) {
935 Indent() <<
"#pragma omp taskwait";
936 PrintOMPExecutableDirective(Node);
939void StmtPrinter::VisitOMPAssumeDirective(OMPAssumeDirective *Node) {
940 Indent() <<
"#pragma omp assume";
941 PrintOMPExecutableDirective(Node);
944void StmtPrinter::VisitOMPErrorDirective(OMPErrorDirective *Node) {
945 Indent() <<
"#pragma omp error";
946 PrintOMPExecutableDirective(Node);
949void StmtPrinter::VisitOMPTaskgroupDirective(OMPTaskgroupDirective *Node) {
950 Indent() <<
"#pragma omp taskgroup";
951 PrintOMPExecutableDirective(Node);
954void StmtPrinter::VisitOMPFlushDirective(OMPFlushDirective *Node) {
955 Indent() <<
"#pragma omp flush";
956 PrintOMPExecutableDirective(Node);
959void StmtPrinter::VisitOMPDepobjDirective(OMPDepobjDirective *Node) {
960 Indent() <<
"#pragma omp depobj";
961 PrintOMPExecutableDirective(Node);
964void StmtPrinter::VisitOMPScanDirective(OMPScanDirective *Node) {
965 Indent() <<
"#pragma omp scan";
966 PrintOMPExecutableDirective(Node);
969void StmtPrinter::VisitOMPOrderedDirective(OMPOrderedDirective *Node) {
970 Indent() <<
"#pragma omp ordered";
971 PrintOMPExecutableDirective(Node, Node->hasClausesOfKind<OMPDependClause>());
974void StmtPrinter::VisitOMPAtomicDirective(OMPAtomicDirective *Node) {
975 Indent() <<
"#pragma omp atomic";
976 PrintOMPExecutableDirective(Node);
979void StmtPrinter::VisitOMPTargetDirective(OMPTargetDirective *Node) {
980 Indent() <<
"#pragma omp target";
981 PrintOMPExecutableDirective(Node);
984void StmtPrinter::VisitOMPTargetDataDirective(OMPTargetDataDirective *Node) {
985 Indent() <<
"#pragma omp target data";
986 PrintOMPExecutableDirective(Node);
989void StmtPrinter::VisitOMPTargetEnterDataDirective(
990 OMPTargetEnterDataDirective *Node) {
991 Indent() <<
"#pragma omp target enter data";
992 PrintOMPExecutableDirective(Node,
true);
995void StmtPrinter::VisitOMPTargetExitDataDirective(
996 OMPTargetExitDataDirective *Node) {
997 Indent() <<
"#pragma omp target exit data";
998 PrintOMPExecutableDirective(Node,
true);
1001void StmtPrinter::VisitOMPTargetParallelDirective(
1002 OMPTargetParallelDirective *Node) {
1003 Indent() <<
"#pragma omp target parallel";
1004 PrintOMPExecutableDirective(Node);
1007void StmtPrinter::VisitOMPTargetParallelForDirective(
1008 OMPTargetParallelForDirective *Node) {
1009 Indent() <<
"#pragma omp target parallel for";
1010 PrintOMPExecutableDirective(Node);
1013void StmtPrinter::VisitOMPTeamsDirective(OMPTeamsDirective *Node) {
1014 Indent() <<
"#pragma omp teams";
1015 PrintOMPExecutableDirective(Node);
1018void StmtPrinter::VisitOMPCancellationPointDirective(
1019 OMPCancellationPointDirective *Node) {
1020 unsigned OpenMPVersion =
1021 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
1022 Indent() <<
"#pragma omp cancellation point "
1024 PrintOMPExecutableDirective(Node);
1027void StmtPrinter::VisitOMPCancelDirective(OMPCancelDirective *Node) {
1028 unsigned OpenMPVersion =
1029 Context ? Context->
getLangOpts().OpenMP : llvm::omp::FallbackVersion;
1030 Indent() <<
"#pragma omp cancel "
1032 PrintOMPExecutableDirective(Node);
1035void StmtPrinter::VisitOMPTaskLoopDirective(OMPTaskLoopDirective *Node) {
1036 Indent() <<
"#pragma omp taskloop";
1037 PrintOMPExecutableDirective(Node);
1040void StmtPrinter::VisitOMPTaskLoopSimdDirective(
1041 OMPTaskLoopSimdDirective *Node) {
1042 Indent() <<
"#pragma omp taskloop simd";
1043 PrintOMPExecutableDirective(Node);
1046void StmtPrinter::VisitOMPMasterTaskLoopDirective(
1047 OMPMasterTaskLoopDirective *Node) {
1048 Indent() <<
"#pragma omp master taskloop";
1049 PrintOMPExecutableDirective(Node);
1052void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
1053 OMPMaskedTaskLoopDirective *Node) {
1054 Indent() <<
"#pragma omp masked taskloop";
1055 PrintOMPExecutableDirective(Node);
1058void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
1059 OMPMasterTaskLoopSimdDirective *Node) {
1060 Indent() <<
"#pragma omp master taskloop simd";
1061 PrintOMPExecutableDirective(Node);
1064void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
1065 OMPMaskedTaskLoopSimdDirective *Node) {
1066 Indent() <<
"#pragma omp masked taskloop simd";
1067 PrintOMPExecutableDirective(Node);
1070void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
1071 OMPParallelMasterTaskLoopDirective *Node) {
1072 Indent() <<
"#pragma omp parallel master taskloop";
1073 PrintOMPExecutableDirective(Node);
1076void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1077 OMPParallelMaskedTaskLoopDirective *Node) {
1078 Indent() <<
"#pragma omp parallel masked taskloop";
1079 PrintOMPExecutableDirective(Node);
1082void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1083 OMPParallelMasterTaskLoopSimdDirective *Node) {
1084 Indent() <<
"#pragma omp parallel master taskloop simd";
1085 PrintOMPExecutableDirective(Node);
1088void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1089 OMPParallelMaskedTaskLoopSimdDirective *Node) {
1090 Indent() <<
"#pragma omp parallel masked taskloop simd";
1091 PrintOMPExecutableDirective(Node);
1094void StmtPrinter::VisitOMPDistributeDirective(OMPDistributeDirective *Node) {
1095 Indent() <<
"#pragma omp distribute";
1096 PrintOMPExecutableDirective(Node);
1099void StmtPrinter::VisitOMPTargetUpdateDirective(
1100 OMPTargetUpdateDirective *Node) {
1101 Indent() <<
"#pragma omp target update";
1102 PrintOMPExecutableDirective(Node,
true);
1105void StmtPrinter::VisitOMPDistributeParallelForDirective(
1106 OMPDistributeParallelForDirective *Node) {
1107 Indent() <<
"#pragma omp distribute parallel for";
1108 PrintOMPExecutableDirective(Node);
1111void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1112 OMPDistributeParallelForSimdDirective *Node) {
1113 Indent() <<
"#pragma omp distribute parallel for simd";
1114 PrintOMPExecutableDirective(Node);
1117void StmtPrinter::VisitOMPDistributeSimdDirective(
1118 OMPDistributeSimdDirective *Node) {
1119 Indent() <<
"#pragma omp distribute simd";
1120 PrintOMPExecutableDirective(Node);
1123void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1124 OMPTargetParallelForSimdDirective *Node) {
1125 Indent() <<
"#pragma omp target parallel for simd";
1126 PrintOMPExecutableDirective(Node);
1129void StmtPrinter::VisitOMPTargetSimdDirective(OMPTargetSimdDirective *Node) {
1130 Indent() <<
"#pragma omp target simd";
1131 PrintOMPExecutableDirective(Node);
1134void StmtPrinter::VisitOMPTeamsDistributeDirective(
1135 OMPTeamsDistributeDirective *Node) {
1136 Indent() <<
"#pragma omp teams distribute";
1137 PrintOMPExecutableDirective(Node);
1140void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1141 OMPTeamsDistributeSimdDirective *Node) {
1142 Indent() <<
"#pragma omp teams distribute simd";
1143 PrintOMPExecutableDirective(Node);
1146void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1147 OMPTeamsDistributeParallelForSimdDirective *Node) {
1148 Indent() <<
"#pragma omp teams distribute parallel for simd";
1149 PrintOMPExecutableDirective(Node);
1152void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1153 OMPTeamsDistributeParallelForDirective *Node) {
1154 Indent() <<
"#pragma omp teams distribute parallel for";
1155 PrintOMPExecutableDirective(Node);
1158void StmtPrinter::VisitOMPTargetTeamsDirective(OMPTargetTeamsDirective *Node) {
1159 Indent() <<
"#pragma omp target teams";
1160 PrintOMPExecutableDirective(Node);
1163void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1164 OMPTargetTeamsDistributeDirective *Node) {
1165 Indent() <<
"#pragma omp target teams distribute";
1166 PrintOMPExecutableDirective(Node);
1169void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1170 OMPTargetTeamsDistributeParallelForDirective *Node) {
1171 Indent() <<
"#pragma omp target teams distribute parallel for";
1172 PrintOMPExecutableDirective(Node);
1175void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1176 OMPTargetTeamsDistributeParallelForSimdDirective *Node) {
1177 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1178 PrintOMPExecutableDirective(Node);
1181void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1182 OMPTargetTeamsDistributeSimdDirective *Node) {
1183 Indent() <<
"#pragma omp target teams distribute simd";
1184 PrintOMPExecutableDirective(Node);
1187void StmtPrinter::VisitOMPInteropDirective(OMPInteropDirective *Node) {
1188 Indent() <<
"#pragma omp interop";
1189 PrintOMPExecutableDirective(Node);
1192void StmtPrinter::VisitOMPDispatchDirective(OMPDispatchDirective *Node) {
1193 Indent() <<
"#pragma omp dispatch";
1194 PrintOMPExecutableDirective(Node);
1197void StmtPrinter::VisitOMPMaskedDirective(OMPMaskedDirective *Node) {
1198 Indent() <<
"#pragma omp masked";
1199 PrintOMPExecutableDirective(Node);
1202void StmtPrinter::VisitOMPGenericLoopDirective(OMPGenericLoopDirective *Node) {
1203 Indent() <<
"#pragma omp loop";
1204 PrintOMPExecutableDirective(Node);
1207void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1208 OMPTeamsGenericLoopDirective *Node) {
1209 Indent() <<
"#pragma omp teams loop";
1210 PrintOMPExecutableDirective(Node);
1213void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1214 OMPTargetTeamsGenericLoopDirective *Node) {
1215 Indent() <<
"#pragma omp target teams loop";
1216 PrintOMPExecutableDirective(Node);
1219void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1220 OMPParallelGenericLoopDirective *Node) {
1221 Indent() <<
"#pragma omp parallel loop";
1222 PrintOMPExecutableDirective(Node);
1225void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1226 OMPTargetParallelGenericLoopDirective *Node) {
1227 Indent() <<
"#pragma omp target parallel loop";
1228 PrintOMPExecutableDirective(Node);
1234void StmtPrinter::PrintOpenACCClauseList(OpenACCConstructStmt *S) {
1237 OpenACCClausePrinter Printer(OS, Policy);
1238 Printer.VisitClauseList(S->
clauses());
1241void StmtPrinter::PrintOpenACCConstruct(OpenACCConstructStmt *S) {
1243 PrintOpenACCClauseList(S);
1247 PrintOpenACCConstruct(S);
1248 PrintStmt(S->getStructuredBlock());
1251void StmtPrinter::VisitOpenACCLoopConstruct(OpenACCLoopConstruct *S) {
1252 PrintOpenACCConstruct(S);
1256void StmtPrinter::VisitOpenACCCombinedConstruct(OpenACCCombinedConstruct *S) {
1257 PrintOpenACCConstruct(S);
1261void StmtPrinter::VisitOpenACCDataConstruct(OpenACCDataConstruct *S) {
1262 PrintOpenACCConstruct(S);
1265void StmtPrinter::VisitOpenACCHostDataConstruct(OpenACCHostDataConstruct *S) {
1266 PrintOpenACCConstruct(S);
1269void StmtPrinter::VisitOpenACCEnterDataConstruct(OpenACCEnterDataConstruct *S) {
1270 PrintOpenACCConstruct(S);
1272void StmtPrinter::VisitOpenACCExitDataConstruct(OpenACCExitDataConstruct *S) {
1273 PrintOpenACCConstruct(S);
1275void StmtPrinter::VisitOpenACCInitConstruct(OpenACCInitConstruct *S) {
1276 PrintOpenACCConstruct(S);
1278void StmtPrinter::VisitOpenACCShutdownConstruct(OpenACCShutdownConstruct *S) {
1279 PrintOpenACCConstruct(S);
1281void StmtPrinter::VisitOpenACCSetConstruct(OpenACCSetConstruct *S) {
1282 PrintOpenACCConstruct(S);
1284void StmtPrinter::VisitOpenACCUpdateConstruct(OpenACCUpdateConstruct *S) {
1285 PrintOpenACCConstruct(S);
1288void StmtPrinter::VisitOpenACCWaitConstruct(OpenACCWaitConstruct *S) {
1289 Indent() <<
"#pragma acc wait";
1302 E->printPretty(OS, nullptr, Policy);
1308 PrintOpenACCClauseList(S);
1312void StmtPrinter::VisitOpenACCAtomicConstruct(OpenACCAtomicConstruct *S) {
1313 Indent() <<
"#pragma acc atomic";
1318 PrintOpenACCClauseList(S);
1323void StmtPrinter::VisitOpenACCCacheConstruct(OpenACCCacheConstruct *S) {
1324 Indent() <<
"#pragma acc cache(";
1328 llvm::interleaveComma(S->
getVarList(), OS, [&](
const Expr *E) {
1329 E->printPretty(OS, nullptr, Policy);
1339void StmtPrinter::VisitSourceLocExpr(SourceLocExpr *Node) {
1343void StmtPrinter::VisitEmbedExpr(EmbedExpr *Node) {
1351void StmtPrinter::VisitConstantExpr(ConstantExpr *Node) {
1355void StmtPrinter::VisitDeclRefExpr(DeclRefExpr *Node) {
1356 ValueDecl *VD = Node->
getDecl();
1357 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(VD)) {
1358 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1361 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(VD)) {
1362 TPOD->printAsExpr(OS, Policy);
1365 bool ForceAnonymous =
1377 DeclarationNameInfo NameInfo = Node->
getNameInfo();
1381 if (CleanUglifiedParameter && ID)
1382 OS <<
ID->deuglifiedName();
1387 case Decl::NonTypeTemplateParm: {
1389 OS <<
"value-parameter-" << TD->getDepth() <<
'-' << TD->getIndex()
1393 case Decl::ParmVar: {
1395 OS <<
"function-parameter-" << PD->getFunctionScopeDepth() <<
'-'
1396 << PD->getFunctionScopeIndex();
1399 case Decl::Decomposition:
1400 OS <<
"decomposition";
1402 OS <<
'-' << I->getName();
1411 const TemplateParameterList *TPL =
nullptr;
1413 if (
auto *TD = dyn_cast<TemplateDecl>(VD))
1414 TPL = TD->getTemplateParameters();
1419void StmtPrinter::VisitDependentScopeDeclRefExpr(
1420 DependentScopeDeclRefExpr *Node) {
1429void StmtPrinter::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
1439 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
1440 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1442 DRE->getBeginLoc().isInvalid())
1449void StmtPrinter::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
1460void StmtPrinter::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
1472 Getter->getSelector().print(OS);
1480void StmtPrinter::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
1487void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1488 SYCLUniqueStableNameExpr *Node) {
1489 OS <<
"__builtin_sycl_unique_stable_name(";
1494void StmtPrinter::VisitUnresolvedSYCLKernelCallStmt(
1495 UnresolvedSYCLKernelCallStmt *Node) {
1499void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
1503void StmtPrinter::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *Node) {
1507void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
1520 Context->getSourceManager(), Context->getLangOpts(), &
Invalid);
1528void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) {
1535 OS << (isSigned ?
"wb" :
"uwb");
1540 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1541 default: llvm_unreachable(
"Unexpected type for integer literal!");
1542 case BuiltinType::Char_S:
1543 case BuiltinType::Char_U:
OS <<
"i8";
break;
1544 case BuiltinType::UChar:
OS <<
"Ui8";
break;
1545 case BuiltinType::SChar:
OS <<
"i8";
break;
1546 case BuiltinType::Short:
OS <<
"i16";
break;
1547 case BuiltinType::UShort:
OS <<
"Ui16";
break;
1548 case BuiltinType::Int:
break;
1549 case BuiltinType::UInt:
OS <<
'U';
break;
1550 case BuiltinType::Long:
OS <<
'L';
break;
1551 case BuiltinType::ULong:
OS <<
"UL";
break;
1552 case BuiltinType::LongLong:
OS <<
"LL";
break;
1553 case BuiltinType::ULongLong:
OS <<
"ULL";
break;
1554 case BuiltinType::Int128:
1556 case BuiltinType::UInt128:
1558 case BuiltinType::WChar_S:
1559 case BuiltinType::WChar_U:
1564void StmtPrinter::VisitFixedPointLiteral(FixedPointLiteral *Node) {
1569 switch (Node->
getType()->
castAs<BuiltinType>()->getKind()) {
1570 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1571 case BuiltinType::ShortFract:
OS <<
"hr";
break;
1572 case BuiltinType::ShortAccum:
OS <<
"hk";
break;
1573 case BuiltinType::UShortFract:
OS <<
"uhr";
break;
1574 case BuiltinType::UShortAccum:
OS <<
"uhk";
break;
1575 case BuiltinType::Fract:
OS <<
"r";
break;
1576 case BuiltinType::Accum:
OS <<
"k";
break;
1577 case BuiltinType::UFract:
OS <<
"ur";
break;
1578 case BuiltinType::UAccum:
OS <<
"uk";
break;
1579 case BuiltinType::LongFract:
OS <<
"lr";
break;
1580 case BuiltinType::LongAccum:
OS <<
"lk";
break;
1581 case BuiltinType::ULongFract:
OS <<
"ulr";
break;
1582 case BuiltinType::ULongAccum:
OS <<
"ulk";
break;
1591 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1599 default: llvm_unreachable(
"Unexpected type for float literal!");
1600 case BuiltinType::Half:
break;
1601 case BuiltinType::Ibm128:
break;
1602 case BuiltinType::Double:
break;
1603 case BuiltinType::Float16: OS <<
"F16";
break;
1604 case BuiltinType::Float: OS <<
'F';
break;
1605 case BuiltinType::LongDouble: OS <<
'L';
break;
1606 case BuiltinType::Float128: OS <<
'Q';
break;
1610void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) {
1616void StmtPrinter::VisitImaginaryLiteral(ImaginaryLiteral *Node) {
1621void StmtPrinter::VisitStringLiteral(StringLiteral *Str) {
1625void StmtPrinter::VisitParenExpr(ParenExpr *Node) {
1631void StmtPrinter::VisitUnaryOperator(UnaryOperator *Node) {
1657void StmtPrinter::VisitOffsetOfExpr(OffsetOfExpr *Node) {
1658 OS <<
"__builtin_offsetof(";
1661 bool PrintedSomething =
false;
1669 PrintedSomething =
true;
1682 if (PrintedSomething)
1685 PrintedSomething =
true;
1691void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1692 UnaryExprOrTypeTraitExpr *Node) {
1694 if (Node->
getKind() == UETT_AlignOf) {
1696 Spelling =
"alignof";
1698 Spelling =
"_Alignof";
1700 Spelling =
"__alignof";
1715void StmtPrinter::VisitGenericSelectionExpr(GenericSelectionExpr *Node) {
1724 QualType T = Assoc.getType();
1728 T.
print(OS, Policy);
1730 PrintExpr(Assoc.getAssociationExpr());
1735void StmtPrinter::VisitArraySubscriptExpr(ArraySubscriptExpr *Node) {
1736 PrintExpr(Node->
getLHS());
1738 PrintExpr(Node->
getRHS());
1742void StmtPrinter::VisitMatrixSingleSubscriptExpr(
1743 MatrixSingleSubscriptExpr *Node) {
1750void StmtPrinter::VisitMatrixSubscriptExpr(MatrixSubscriptExpr *Node) {
1760void StmtPrinter::VisitArraySectionExpr(ArraySectionExpr *Node) {
1778void StmtPrinter::VisitOMPArrayShapingExpr(OMPArrayShapingExpr *Node) {
1789void StmtPrinter::VisitOMPIteratorExpr(OMPIteratorExpr *Node) {
1796 PrintExpr(
Range.Begin);
1798 PrintExpr(
Range.End);
1801 PrintExpr(
Range.Step);
1809void StmtPrinter::PrintCallArgs(CallExpr *
Call) {
1810 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1817 PrintExpr(
Call->getArg(i));
1821void StmtPrinter::VisitCallExpr(CallExpr *
Call) {
1822 PrintExpr(
Call->getCallee());
1824 PrintCallArgs(
Call);
1829 if (
const auto *TE = dyn_cast<CXXThisExpr>(E))
1830 return TE->isImplicit();
1834void StmtPrinter::VisitMemberExpr(MemberExpr *Node) {
1838 auto *ParentMember = dyn_cast<MemberExpr>(Node->
getBase());
1839 FieldDecl *ParentDecl =
1840 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1848 if (FD->isAnonymousStructOrUnion())
1855 const TemplateParameterList *TPL =
nullptr;
1856 if (
auto *FD = dyn_cast<FunctionDecl>(Node->
getMemberDecl())) {
1858 if (
auto *FTD = FD->getPrimaryTemplate())
1859 TPL = FTD->getTemplateParameters();
1860 }
else if (
auto *VTSD =
1861 dyn_cast<VarTemplateSpecializationDecl>(Node->
getMemberDecl()))
1862 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1867void StmtPrinter::VisitObjCIsaExpr(ObjCIsaExpr *Node) {
1869 OS << (Node->
isArrow() ?
"->isa" :
".isa");
1872void StmtPrinter::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
1878void StmtPrinter::VisitMatrixElementExpr(MatrixElementExpr *Node) {
1884void StmtPrinter::VisitCStyleCastExpr(CStyleCastExpr *Node) {
1891void StmtPrinter::VisitCompoundLiteralExpr(CompoundLiteralExpr *Node) {
1898void StmtPrinter::VisitImplicitCastExpr(ImplicitCastExpr *Node) {
1903void StmtPrinter::VisitBinaryOperator(BinaryOperator *Node) {
1904 PrintExpr(Node->
getLHS());
1906 PrintExpr(Node->
getRHS());
1909void StmtPrinter::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
1910 PrintExpr(Node->
getLHS());
1912 PrintExpr(Node->
getRHS());
1915void StmtPrinter::VisitConditionalOperator(ConditionalOperator *Node) {
1918 PrintExpr(Node->
getLHS());
1920 PrintExpr(Node->
getRHS());
1926StmtPrinter::VisitBinaryConditionalOperator(BinaryConditionalOperator *Node) {
1932void StmtPrinter::VisitAddrLabelExpr(AddrLabelExpr *Node) {
1936void StmtPrinter::VisitStmtExpr(StmtExpr *E) {
1942void StmtPrinter::VisitChooseExpr(ChooseExpr *Node) {
1943 OS <<
"__builtin_choose_expr(";
1946 PrintExpr(Node->
getLHS());
1948 PrintExpr(Node->
getRHS());
1952void StmtPrinter::VisitGNUNullExpr(GNUNullExpr *) {
1956void StmtPrinter::VisitShuffleVectorExpr(ShuffleVectorExpr *Node) {
1957 OS <<
"__builtin_shufflevector(";
1965void StmtPrinter::VisitConvertVectorExpr(ConvertVectorExpr *Node) {
1966 OS <<
"__builtin_convertvector(";
1973void StmtPrinter::VisitInitListExpr(InitListExpr* Node) {
1980 for (
unsigned i = 0, e = Node->
getNumInits(); i != e; ++i) {
1990void StmtPrinter::VisitArrayInitLoopExpr(ArrayInitLoopExpr *Node) {
1998void StmtPrinter::VisitArrayInitIndexExpr(ArrayInitIndexExpr *Node) {
2002void StmtPrinter::VisitParenListExpr(ParenListExpr* Node) {
2004 for (
unsigned i = 0, e = Node->
getNumExprs(); i != e; ++i) {
2011void StmtPrinter::VisitDesignatedInitExpr(DesignatedInitExpr *Node) {
2012 bool NeedsEquals =
true;
2013 for (
const DesignatedInitExpr::Designator &D : Node->
designators()) {
2014 if (D.isFieldDesignator()) {
2015 if (D.getDotLoc().isInvalid()) {
2016 if (
const IdentifierInfo *II = D.getFieldName()) {
2017 OS << II->getName() <<
":";
2018 NeedsEquals =
false;
2021 OS <<
"." << D.getFieldName()->getName();
2025 if (D.isArrayDesignator()) {
2043void StmtPrinter::VisitDesignatedInitUpdateExpr(
2044 DesignatedInitUpdateExpr *Node) {
2050 OS <<
"/*updater*/";
2055void StmtPrinter::VisitNoInitExpr(NoInitExpr *Node) {
2056 OS <<
"/*no init*/";
2059void StmtPrinter::VisitImplicitValueInitExpr(ImplicitValueInitExpr *Node) {
2061 OS <<
"/*implicit*/";
2065 OS <<
"/*implicit*/(";
2075void StmtPrinter::VisitVAArgExpr(VAArgExpr *Node) {
2076 OS <<
"__builtin_va_arg(";
2083void StmtPrinter::VisitPseudoObjectExpr(PseudoObjectExpr *Node) {
2087void StmtPrinter::VisitAtomicExpr(AtomicExpr *Node) {
2088 const char *Name =
nullptr;
2089 switch (Node->
getOp()) {
2090#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
2091 case AtomicExpr::AO ## ID: \
2094#include "clang/Basic/Builtins.inc"
2099 PrintExpr(Node->
getPtr());
2104 if (Node->
getOp() == AtomicExpr::AO__atomic_exchange ||
2109 if (Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange ||
2110 Node->
getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
2114 if (Node->
getOp() != AtomicExpr::AO__c11_atomic_init &&
2115 Node->
getOp() != AtomicExpr::AO__opencl_atomic_init) {
2127void StmtPrinter::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
2129 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
2132 PrintExpr(Node->
getArg(0));
2134 PrintExpr(Node->
getArg(0));
2137 }
else if (Kind == OO_Arrow) {
2138 PrintExpr(Node->
getArg(0));
2139 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
2140 PrintExpr(Node->
getArg(0));
2141 OS << (
Kind == OO_Call ?
'(' :
'[');
2142 for (
unsigned ArgIdx = 1; ArgIdx < Node->
getNumArgs(); ++ArgIdx) {
2146 PrintExpr(Node->
getArg(ArgIdx));
2148 OS << (
Kind == OO_Call ?
')' :
']');
2151 PrintExpr(Node->
getArg(0));
2153 PrintExpr(Node->
getArg(0));
2155 PrintExpr(Node->
getArg(1));
2157 llvm_unreachable(
"unknown overloaded operator");
2161void StmtPrinter::VisitCXXMemberCallExpr(CXXMemberCallExpr *Node) {
2164 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
2171void StmtPrinter::VisitCUDAKernelCallExpr(CUDAKernelCallExpr *Node) {
2176 PrintCallArgs(Node);
2180void StmtPrinter::VisitCXXRewrittenBinaryOperator(
2181 CXXRewrittenBinaryOperator *Node) {
2182 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2184 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
2186 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
2189void StmtPrinter::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
2197void StmtPrinter::VisitCXXStaticCastExpr(CXXStaticCastExpr *Node) {
2198 VisitCXXNamedCastExpr(Node);
2201void StmtPrinter::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *Node) {
2202 VisitCXXNamedCastExpr(Node);
2205void StmtPrinter::VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *Node) {
2206 VisitCXXNamedCastExpr(Node);
2209void StmtPrinter::VisitCXXConstCastExpr(CXXConstCastExpr *Node) {
2210 VisitCXXNamedCastExpr(Node);
2213void StmtPrinter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *Node) {
2214 OS <<
"__builtin_bit_cast(";
2221void StmtPrinter::VisitCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *Node) {
2222 VisitCXXNamedCastExpr(Node);
2225void StmtPrinter::VisitCXXTypeidExpr(CXXTypeidExpr *Node) {
2235void StmtPrinter::VisitCXXUuidofExpr(CXXUuidofExpr *Node) {
2245void StmtPrinter::VisitMSPropertyRefExpr(MSPropertyRefExpr *Node) {
2255void StmtPrinter::VisitMSPropertySubscriptExpr(MSPropertySubscriptExpr *Node) {
2258 PrintExpr(Node->
getIdx());
2262void StmtPrinter::VisitUserDefinedLiteral(UserDefinedLiteral *Node) {
2269 const TemplateArgumentList *Args =
2274 const TemplateParameterList *TPL =
nullptr;
2275 if (!DRE->hadMultipleCandidates())
2276 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2277 TPL = TD->getTemplateParameters();
2279 printTemplateArgumentList(OS, Args->
asArray(), Policy, TPL);
2284 const TemplateArgument &Pack = Args->
get(0);
2286 char C = (char)P.getAsIntegral().getZExtValue();
2311void StmtPrinter::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
2315void StmtPrinter::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *Node) {
2319void StmtPrinter::VisitCXXThisExpr(CXXThisExpr *Node) {
2323void StmtPrinter::VisitCXXThrowExpr(CXXThrowExpr *Node) {
2332void StmtPrinter::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *Node) {
2336void StmtPrinter::VisitCXXDefaultInitExpr(CXXDefaultInitExpr *Node) {
2340void StmtPrinter::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
2341 auto TargetType = Node->
getType();
2343 bool Bare =
Auto &&
Auto->isDeduced();
2348 TargetType.print(OS, Policy);
2360void StmtPrinter::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
2364void StmtPrinter::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *Node) {
2372 for (CXXTemporaryObjectExpr::arg_iterator Arg = Node->
arg_begin(),
2374 Arg != ArgEnd; ++Arg) {
2375 if ((*Arg)->isDefaultArgument())
2389void StmtPrinter::VisitLambdaExpr(
LambdaExpr *Node) {
2391 bool NeedComma =
false;
2410 if (
C->capturesVLAType())
2417 switch (
C->getCaptureKind()) {
2429 OS <<
C->getCapturedVar()->getName();
2433 OS <<
C->getCapturedVar()->getName();
2437 llvm_unreachable(
"VLA type in explicit captures.");
2440 if (
C->isPackExpansion())
2447 llvm::StringRef
Pre;
2448 llvm::StringRef
Post;
2458 PrintExpr(D->getInit());
2474 for (
const auto *P :
Method->parameters()) {
2480 std::string ParamStr =
2482 ? P->getIdentifier()->deuglifiedName().str()
2483 : P->getNameAsString();
2484 P->getOriginalType().print(OS, Policy, ParamStr);
2486 if (
Method->isVariadic()) {
2496 auto *Proto =
Method->getType()->castAs<FunctionProtoType>();
2497 Proto->printExceptionSpecification(OS, Policy);
2504 Proto->getReturnType().print(OS, Policy);
2516void StmtPrinter::VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *Node) {
2518 TSInfo->getType().print(OS, Policy);
2524void StmtPrinter::VisitCXXNewExpr(CXXNewExpr *E) {
2532 for (
unsigned i = 1; i < NumPlace; ++i) {
2544 llvm::raw_string_ostream s(TypeS);
2547 (*Size)->printPretty(s, Helper, Policy);
2555 if (InitStyle != CXXNewInitializationStyle::None) {
2556 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2566void StmtPrinter::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
2575void StmtPrinter::VisitCXXPseudoDestructorExpr(CXXPseudoDestructorExpr *E) {
2585 OS << II->getName();
2590void StmtPrinter::VisitCXXConstructExpr(CXXConstructExpr *E) {
2594 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
2608void StmtPrinter::VisitCXXInheritedCtorInitExpr(CXXInheritedCtorInitExpr *E) {
2610 OS <<
"<forwarded>";
2613void StmtPrinter::VisitCXXStdInitializerListExpr(CXXStdInitializerListExpr *E) {
2617void StmtPrinter::VisitExprWithCleanups(ExprWithCleanups *E) {
2622void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2623 CXXUnresolvedConstructExpr *Node) {
2627 for (
auto Arg = Node->
arg_begin(), ArgEnd = Node->
arg_end(); Arg != ArgEnd;
2637void StmtPrinter::VisitCXXReflectExpr(CXXReflectExpr *S) {
2639 assert(
false &&
"not implemented yet");
2642void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2643 CXXDependentScopeMemberExpr *Node) {
2656void StmtPrinter::VisitUnresolvedMemberExpr(UnresolvedMemberExpr *Node) {
2669void StmtPrinter::VisitTypeTraitExpr(TypeTraitExpr *E) {
2671 for (
unsigned I = 0, N = E->
getNumArgs(); I != N; ++I) {
2679void StmtPrinter::VisitArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
2685void StmtPrinter::VisitExpressionTraitExpr(ExpressionTraitExpr *E) {
2691void StmtPrinter::VisitCXXNoexceptExpr(CXXNoexceptExpr *E) {
2697void StmtPrinter::VisitPackExpansionExpr(PackExpansionExpr *E) {
2702void StmtPrinter::VisitSizeOfPackExpr(SizeOfPackExpr *E) {
2703 OS <<
"sizeof...(" << *E->
getPack() <<
")";
2706void StmtPrinter::VisitPackIndexingExpr(PackIndexingExpr *E) {
2713void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2714 SubstNonTypeTemplateParmPackExpr *Node) {
2718void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2719 SubstNonTypeTemplateParmExpr *Node) {
2723void StmtPrinter::VisitFunctionParmPackExpr(FunctionParmPackExpr *E) {
2727void StmtPrinter::VisitMaterializeTemporaryExpr(MaterializeTemporaryExpr *Node){
2731void StmtPrinter::VisitCXXFoldExpr(CXXFoldExpr *E) {
2745void StmtPrinter::VisitCXXParenListInitExpr(CXXParenListInitExpr *Node) {
2747 [&](Expr *E) { PrintExpr(E); });
2750void StmtPrinter::VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) {
2764 if (!LocalParameters.empty()) {
2766 for (ParmVarDecl *LocalParam : LocalParameters) {
2767 PrintRawDecl(LocalParam);
2768 if (LocalParam != LocalParameters.back())
2776 for (concepts::Requirement *Req : Requirements) {
2777 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2778 if (TypeReq->isSubstitutionFailure())
2779 OS <<
"<<error-type>>";
2781 TypeReq->getType()->getType().print(OS, Policy);
2782 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2783 if (ExprReq->isCompound())
2785 if (ExprReq->isExprSubstitutionFailure())
2786 OS <<
"<<error-expression>>";
2788 PrintExpr(ExprReq->getExpr());
2789 if (ExprReq->isCompound()) {
2791 if (ExprReq->getNoexceptLoc().isValid())
2793 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2794 if (!RetReq.isEmpty()) {
2796 if (RetReq.isSubstitutionFailure())
2797 OS <<
"<<error-type>>";
2798 else if (RetReq.isTypeConstraint())
2799 RetReq.getTypeConstraint()->print(OS, Policy);
2805 if (NestedReq->hasInvalidConstraint())
2806 OS <<
"<<error-expression>>";
2808 PrintExpr(NestedReq->getConstraintExpr());
2817void StmtPrinter::VisitCoroutineBodyStmt(CoroutineBodyStmt *S) {
2821void StmtPrinter::VisitCoreturnStmt(CoreturnStmt *S) {
2830void StmtPrinter::VisitCoawaitExpr(CoawaitExpr *S) {
2835void StmtPrinter::VisitDependentCoawaitExpr(DependentCoawaitExpr *S) {
2840void StmtPrinter::VisitCoyieldExpr(CoyieldExpr *S) {
2847void StmtPrinter::VisitObjCStringLiteral(ObjCStringLiteral *Node) {
2852void StmtPrinter::VisitObjCBoxedExpr(ObjCBoxedExpr *E) {
2857void StmtPrinter::VisitObjCArrayLiteral(ObjCArrayLiteral *E) {
2859 ObjCArrayLiteral::child_range Ch = E->
children();
2860 for (
auto I = Ch.begin(), E = Ch.end(); I != E; ++I) {
2861 if (I != Ch.begin())
2868void StmtPrinter::VisitObjCDictionaryLiteral(ObjCDictionaryLiteral *E) {
2877 Visit(Element.
Value);
2884void StmtPrinter::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
2890void StmtPrinter::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
2896void StmtPrinter::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
2900void StmtPrinter::VisitObjCMessageExpr(ObjCMessageExpr *Mess) {
2922 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2924 if (i > 0)
OS <<
' ';
2932 PrintExpr(Mess->
getArg(i));
2938void StmtPrinter::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
2939 OS << (Node->
getValue() ?
"__objc_yes" :
"__objc_no");
2943StmtPrinter::VisitObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
2948StmtPrinter::VisitObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
2955void StmtPrinter::VisitBlockExpr(BlockExpr *Node) {
2968 std::string ParamStr = (*AI)->getNameAsString();
2969 (*AI)->getType().print(OS, Policy, ParamStr);
2973 if (FT->isVariadic()) {
2982void StmtPrinter::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
2986void StmtPrinter::VisitRecoveryExpr(RecoveryExpr *Node) {
2987 OS <<
"<recovery-expr>(";
2988 const char *Sep =
"";
2997void StmtPrinter::VisitAsTypeExpr(AsTypeExpr *Node) {
2998 OS <<
"__builtin_astype(";
3005void StmtPrinter::VisitHLSLOutArgExpr(HLSLOutArgExpr *Node) {
3019 StringRef NL,
const ASTContext *Context)
const {
3020 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
3021 P.Visit(
const_cast<Stmt *
>(
this));
3026 unsigned Indentation, StringRef NL,
3028 StmtPrinter P(Out, Helper, Policy, Indentation, NL, Context);
3029 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
3035 llvm::raw_string_ostream TempOut(Buf);
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenACC nodes for declarative directives.
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines enumerations for expression traits intrinsics.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines several types used to describe C++ lambda expressions that are shared between the parser and ...
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
Defines an enumeration for C++ overloaded operators.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Defines the clang::SourceLocation class and associated facilities.
Defines the Objective-C statement AST node classes.
This file defines OpenMP AST classes for executable directives and clauses.
static bool isImplicitThis(const Expr *E)
static bool isImplicitSelf(const Expr *E)
static void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node, bool PrintSuffix)
static bool printExprAsWritten(raw_ostream &OS, Expr *E, const ASTContext *Context)
Prints the given expression using the original source text.
This file defines SYCL AST classes used to represent calls to SYCL kernels.
Defines enumerations for the type traits support.
C Language Family Type Representation.
OpenMPDirectiveKind getCancelRegion() const
Get cancellation region for the current cancellation point.
OpenMPDirectiveKind getCancelRegion() const
Get cancellation region for the current cancellation point.
const Stmt * getAssociatedStmt() const
OpenACCAtomicKind getAtomicKind() const
ArrayRef< Expr * > getVarList() const
Stmt * getStructuredBlock()
Stmt * getStructuredBlock()
bool hasQueuesTag() const
bool hasDevNumExpr() const
ArrayRef< Expr * > getQueueIdExprs() const
SourceLocation getLParenLoc() const
Expr * getDevNumExpr() const
llvm::APInt getValue() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const LangOptions & getLangOpts() const
LabelDecl * getLabel() const
Expr * getSubExpr() const
Get the initializer to use for each array element.
Expr * getBase()
Get base of the array section.
Expr * getLength()
Get length of array section.
bool isOMPArraySection() const
Expr * getStride()
Get stride of array section.
SourceLocation getColonLocSecond() const
Expr * getLowerBound()
Get lower bound of array section.
SourceLocation getColonLocFirst() const
Expr * getLHS()
An array access can be written A[4] or 4[A] (both are equivalent).
ArrayTypeTrait getTrait() const
QualType getQueriedType() const
Expr * getSrcExpr() const
getSrcExpr - Return the Expr to be converted.
unsigned getNumClobbers() const
unsigned getNumOutputs() const
unsigned getNumInputs() const
Expr * getOrderFail() const
bool hasVal1Operand() const
ArrayRef< const Attr * > getAttrs() const
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Expr * getCommon() const
getCommon - Return the common expression, written to the left of the condition.
StringRef getOpcodeStr() const
param_iterator param_end()
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
param_iterator param_begin()
const FunctionProtoType * getFunctionType() const
getFunctionType - Return the underlying function type for this block.
const BlockDecl * getBlockDecl() const
This class is used for builtin types like 'int'.
const CallExpr * getConfig() const
const Expr * getSubExpr() const
Stmt * getHandlerBlock() const
VarDecl * getExceptionDecl() const
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
bool isGlobalDelete() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the member name.
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the name of the member that this expression refers to.
bool hasExplicitTemplateArgs() const
Determines whether this member expression actually had a C++ template argument list explicitly specif...
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
ArrayRef< TemplateArgumentLoc > template_arguments() const
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.
ArrayRef< Expr * > getUserSpecifiedInitExprs() const
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
QualType getDestroyedType() const
Retrieve the type being destroyed.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
const IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
DecomposedForm getDecomposedForm() const LLVM_READONLY
Decompose this operator into its syntactic form.
TypeSourceInfo * getTypeSourceInfo() const
const Expr * getSubExpr() const
CXXCatchStmt * getHandler(unsigned i)
unsigned getNumHandlers() const
CompoundStmt * getTryBlock()
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getExprOperand() const
bool isListInitialization() const
Determine whether this expression models list-initialization.
QualType getTypeAsWritten() const
Retrieve the type that is being constructed, as specified in the source code.
Expr * getExprOperand() const
bool isTypeOperand() const
TypeSourceInfo * getTypeOperandSourceInfo() const
Retrieve source information for the type operand.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Stmt * getBody() const override
getBody - If this Decl represents a declaration for a body of code, such as a function or method defi...
CapturedDecl * getCapturedDecl()
Retrieve the outlined function declaration.
static CharSourceRange getTokenRange(SourceRange R)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
unsigned getValue() const
CharacterLiteralKind getKind() const
const Expr * getInitializer() const
CompoundStmt - This represents a group of statements like { stmt stmt }.
FPOptionsOverride getStoredFPFeatures() const
Get FPOptionsOverride from trailing storage.
bool hasStoredFPFeatures() const
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
SourceLocation getTemplateKWLoc() const
ConceptDecl * getNamedConcept() const
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Expr * getSrcExpr() const
getSrcExpr - Return the Expr to be converted.
Expr * getOperand() const
Retrieve the operand of the 'co_return' statement.
CompoundStmt * getBody() const
Retrieve the body of the coroutine as written.
Expr * getOperand() const
bool hasExplicitTemplateArgs() const
Determines whether this declaration reference was followed by an explicit template argument list.
NestedNameSpecifier getQualifier() const
If the name was qualified, retrieves the nested-name-specifier that precedes the name.
DeclarationNameInfo getNameInfo() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
bool hadMultipleCandidates() const
Returns true if this expression refers to a function that was resolved from an overloaded set having ...
bool hasTemplateKeyword() const
Determines whether the name in this declaration reference was preceded by the template keyword.
bool isSingleDecl() const
isSingleDecl - This method returns true if this DeclStmt refers to a single Decl.
const Decl * getSingleDecl() const
ASTContext & getASTContext() const LLVM_READONLY
const char * getDeclKindName() const
static void printGroup(Decl **Begin, unsigned NumDecls, raw_ostream &Out, const PrintingPolicy &Policy, unsigned Indentation=0)
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
NameKind getNameKind() const
Determine what kind of name this is.
Expr * getOperand() const
ArrayRef< TemplateArgumentLoc > template_arguments() const
bool hasExplicitTemplateArgs() const
Determines whether this lookup had explicit template arguments.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
const DeclarationNameInfo & getNameInfo() const
Retrieve the name that this expression refers to.
Expr * getArrayRangeEnd(const Designator &D) const
Expr * getArrayRangeStart(const Designator &D) const
MutableArrayRef< Designator > designators()
Expr * getArrayIndex(const Designator &D) const
Expr * getInit() const
Retrieve the initializer value.
InitListExpr * getUpdater() const
IdentifierInfo & getAccessor() const
const Expr * getBase() const
StringRef getFileName() const
TypeSourceInfo * getTypeInfoAsWritten() const
getTypeInfoAsWritten - Returns the type source info for the type that this expression is casting to.
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
This represents one expression.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
std::string getValueAsString(unsigned Radix) const
llvm::APFloat getValue() const
DeclStmt * getConditionVariableDeclStmt()
If this ForStmt has a condition variable, return the faux DeclStmt associated with the creation of th...
const Expr * getSubExpr() const
ValueDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
unsigned getNumLabels() const
const Expr * getOutputConstraintExpr(unsigned i) const
StringRef getLabelName(unsigned i) const
StringRef getInputName(unsigned i) const
StringRef getOutputName(unsigned i) const
const Expr * getInputConstraintExpr(unsigned i) const
const Expr * getAsmStringExpr() const
Expr * getOutputExpr(unsigned i)
Expr * getClobberExpr(unsigned i)
Expr * getInputExpr(unsigned i)
AssociationTy< false > Association
TypeSourceInfo * getControllingType()
Return the controlling type of this generic selection expression.
bool isExprPredicate() const
Whether this generic selection uses an expression as its controlling argument.
association_range associations()
Expr * getControllingExpr()
Return the controlling expression of this generic selection expression.
LabelDecl * getLabel() const
const Expr * getArgLValue() const
Return the l-value expression that was written as the argument in source.
StringRef getName() const
Return the actual identifier string.
const Expr * getSubExpr() const
unsigned getNumInits() const
InitListExpr * getSyntacticForm() const
const Expr * getInit(unsigned Init) const
const char * getName() const
bool hasExplicitParameters() const
Determine whether this lambda has an explicit parameter list vs.
bool isMutable() const
Determine whether the lambda is mutable, meaning that any captures values can be modified.
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
CXXMethodDecl * getCallOperator() const
Retrieve the function call operator associated with this lambda expression.
const CompoundStmt * getCompoundStmtBody() const
Retrieve the CompoundStmt representing the body of the lambda.
bool hasExplicitResultType() const
Whether this lambda had its result type explicitly specified.
TemplateParameterList * getTemplateParameterList() const
If this is a generic lambda expression, retrieve the template parameter list associated with it,...
ArrayRef< NamedDecl * > getExplicitTemplateParameters() const
Get the template parameters were explicitly specified (as opposed to being invented by use of an auto...
capture_iterator explicit_capture_end() const
Retrieve an iterator pointing past the end of the sequence of explicit lambda captures.
const LambdaCapture * capture_iterator
An iterator that walks over the captures of the lambda, both implicit and explicit.
capture_iterator explicit_capture_begin() const
Retrieve an iterator pointing to the first explicit lambda capture.
LambdaCaptureDefault getCaptureDefault() const
Determine the default capture kind for this lambda.
CXXRecordDecl * getLambdaClass() const
Retrieve the class that corresponds to the lambda.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
LabelDecl * getLabelDecl()
bool hasLabelTarget() const
StringRef getAsmString() const
bool isIfExists() const
Determine whether this is an __if_exists statement.
DeclarationNameInfo getNameInfo() const
Retrieve the name of the entity we're testing for, along with location information.
NestedNameSpecifierLoc getQualifierLoc() const
Retrieve the nested-name-specifier that qualifies this name, if any.
CompoundStmt * getSubStmt() const
Retrieve the compound statement that will be included in the program only if the existence of the sym...
NestedNameSpecifierLoc getQualifierLoc() const
MSPropertyDecl * getPropertyDecl() const
Expr * getBaseExpr() const
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
ArrayRef< TemplateArgumentLoc > template_arguments() const
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
bool hasExplicitTemplateArgs() const
Determines whether the member name was followed by an explicit template argument list.
bool hadMultipleCandidates() const
Returns true if this member expression refers to a method that was resolved from an overloaded set ha...
bool hasTemplateKeyword() const
Determines whether the member name was preceded by the template keyword.
DeclarationNameInfo getMemberNameInfo() const
Retrieve the member declaration name info.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
void printQualifiedName(raw_ostream &OS) const
Returns a human-readable qualified name for this declaration, like A::B::i, for i being member of nam...
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false, bool PrintFinalScopeResOp=true) const
Print this nested name specifier to the given output stream.
Expr * getBase()
Fetches base expression of array shaping expression.
ArrayRef< Expr * > getDimensions() const
Fetches the dimensions for array shaping expression.
IteratorRange getIteratorRange(unsigned I)
Gets the iterator range for the given iterator.
unsigned numOfIterators() const
Returns number of iterator definitions.
Decl * getIteratorDecl(unsigned I)
Gets the iterator declaration for the given iterator.
const Expr * getSynchExpr() const
const CompoundStmt * getSynchBody() const
const Expr * getThrowExpr() const
const ObjCAtFinallyStmt * getFinallyStmt() const
Retrieve the @finally statement, if any.
const Stmt * getTryBody() const
Retrieve the @try body.
catch_range catch_stmts()
const Stmt * getSubStmt() const
StringRef getBridgeKindName() const
Retrieve the kind of bridge being performed as a string.
unsigned getNumElements() const
getNumElements - Return number of elements of objective-c dictionary literal.
ObjCDictionaryElement getKeyValueElement(unsigned Index) const
QualType getEncodedType() const
const Expr * getBase() const
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Expr * getInstanceReceiver()
Returns the object expression (receiver) for an instance message, or null for a message that is not a...
Selector getSelector() const
@ SuperInstance
The receiver is the instance of the superclass object.
@ Instance
The receiver is an object instance.
@ SuperClass
The receiver is a superclass.
@ Class
The receiver is a class.
QualType getClassReceiver() const
Returns the type of a class message send, or NULL if the message is not a class message.
ReceiverKind getReceiverKind() const
Determine the kind of receiver that this message is being sent to.
unsigned getNumArgs() const
Return the number of actual arguments in this message, not counting the receiver.
Selector getSelector() const
ObjCPropertyDecl * getExplicitProperty() const
ObjCMethodDecl * getImplicitPropertyGetter() const
const Expr * getBase() const
bool isObjectReceiver() const
bool isImplicitProperty() const
ObjCMethodDecl * getImplicitPropertySetter() const
ObjCInterfaceDecl * getClassReceiver() const
bool isClassReceiver() const
bool isSuperReceiver() const
ObjCProtocolDecl * getProtocol() const
Selector getSelector() const
StringLiteral * getString()
Expr * getKeyExpr() const
Expr * getBaseExpr() const
Expr * getIndexExpr(unsigned Idx)
const OffsetOfNode & getComponent(unsigned Idx) const
TypeSourceInfo * getTypeSourceInfo() const
unsigned getNumComponents() const
const IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
unsigned getArrayExprIndex() const
For an array element node, returns the index into the array of expressions.
@ Array
An index into an array.
@ Base
An implicit indirection through a C++ base class, when the field found is in a base class.
Kind getKind() const
Determine what kind of offsetof node this is.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
OpenACCDirectiveKind getDirectiveKind() const
ArrayRef< const OpenACCClause * > clauses() const
bool hasExplicitTemplateArgs() const
Determines whether this expression had explicit template arguments.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
const DeclarationNameInfo & getNameInfo() const
Gets the full name info.
bool hasTemplateKeyword() const
Determines whether the name was preceded by the template keyword.
ArrayRef< TemplateArgumentLoc > template_arguments() const
Expr * getPattern()
Retrieve the pattern of the pack expansion.
Expr * getIndexExpr() const
Expr * getPackIdExpression() const
const Expr * getSubExpr() const
Expr * getExpr(unsigned Init)
unsigned getNumExprs() const
Return the number of expressions in this paren list.
StringRef getIdentKindName() const
PredefinedIdentKind getIdentKind() const
Expr * getSyntacticForm()
Return the syntactic form of this expression, i.e.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
ArrayRef< Expr * > subExpressions()
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
CompoundStmt * getBlock() const
Expr * getFilterExpr() const
CompoundStmt * getBlock() const
CompoundStmt * getTryBlock() const
SEHFinallyStmt * getFinallyHandler() const
SEHExceptStmt * getExceptHandler() const
Returns 0 if not defined.
CompoundStmt * getOriginalStmt()
TypeSourceInfo * getTypeSourceInfo()
static std::string getPropertyNameFromSetterSelector(Selector Sel)
Return the property name for the given setter selector.
StringRef getNameForSlot(unsigned argIndex) const
Retrieve the name at a given position in the selector.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
void print(llvm::raw_ostream &OS) const
Prints the full selector name (e.g. "foo:bar:").
bool isUnarySelector() const
unsigned getNumArgs() const
unsigned getNumSubExprs() const
getNumSubExprs - Return the size of the SubExprs array.
Expr * getExpr(unsigned Index)
getExpr - Return the Expr at the specified index.
NamedDecl * getPack() const
Retrieve the parameter pack.
StringRef getBuiltinStr() const
Return a string representing the name of the specific builtin function.
bool isValid() const
Return true if this is a valid SourceLocation object.
CompoundStmt * getSubStmt()
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
void printJson(raw_ostream &Out, PrinterHelper *Helper, const PrintingPolicy &Policy, bool AddQuotes) const
Pretty-prints in JSON format.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
void printPrettyControlled(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
Stmt(StmtClass SC, EmptyShell)
Construct an empty statement.
void dumpPretty(const ASTContext &Context) const
dumpPretty/printPretty - These two methods do a "pretty print" of the AST back to its original source...
void outputString(raw_ostream &OS) const
Expr * getReplacement() const
NonTypeTemplateParmDecl * getParameterPack() const
Retrieve the non-type template parameter pack being substituted.
DeclStmt * getConditionVariableDeclStmt()
If this SwitchStmt has a condition variable, return the faux DeclStmt associated with the creation of...
unsigned size() const
Retrieve the number of template arguments in this template argument list.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
void print(raw_ostream &Out, const ASTContext &Context, bool OmitTemplateKW=false) const
QualType getType() const
Return the type wrapped by this type source info.
TypeSourceInfo * getArg(unsigned I) const
Retrieve the Ith argument.
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
TypeTrait getTrait() const
Determine which type trait this expression uses.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
const T * castAs() const
Member-template castAs<specific type>.
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
bool isRecordType() const
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTrait getKind() const
static bool isPostfix(Opcode Op)
isPostfix - Return true if this is a postfix operation, like x++.
Expr * getSubExpr() const
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
const DeclarationNameInfo & getMemberNameInfo() const
Retrieve the full name info for the member that this expression refers to.
CompoundStmt * getOriginalStmt()
LiteralOperatorKind getLiteralOperatorKind() const
Returns the kind of literal operator invocation which this expression represents.
const IdentifierInfo * getUDSuffix() const
Returns the ud-suffix specified for this literal.
Expr * getCookedLiteral()
If this is not a raw user-defined literal, get the underlying cooked literal (representing the litera...
@ LOK_String
operator "" X (const CharT *, size_t)
@ LOK_Raw
Raw form: operator "" X (const char *)
@ LOK_Floating
operator "" X (long double)
@ LOK_Integer
operator "" X (unsigned long long)
@ LOK_Template
Raw form: operator "" X<cs...> ()
@ LOK_Character
operator "" X (CharT)
const Expr * getSubExpr() const
@ CInit
C-style initialization with assignment.
@ CallInit
Call-style initialization (C++98)
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.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
bool isa(CodeGen::Address addr)
@ LCK_ByCopy
Capturing by copy (a.k.a., by value)
@ LCK_ByRef
Capturing by reference.
@ LCK_VLAType
Capturing variable-length array type.
@ LCK_StarThis
Capturing the *this object by copy.
@ LCK_This
Capturing the *this object by reference.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
std::string JsonFormat(StringRef RawSR, bool AddQuotes)
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
U cast(CodeGen::Address addr)
@ ObjCSelf
Parameter for Objective-C 'self' argument.
CXXNewInitializationStyle
ArrayRef< TemplateArgumentLoc > arguments() const
DeclarationName getName() const
getName - Returns the embedded declaration name.
void printName(raw_ostream &OS, PrintingPolicy Policy) const
printName - Print the human-readable name to a stream.
Expr * Value
The value of the dictionary element.
bool isPackExpansion() const
Determines whether this dictionary element is a pack expansion.
Expr * Key
The key for the dictionary element.
Describes how types, statements, expressions, and declarations should be printed.
unsigned FullyQualifiedName
When true, print the fully qualified name of function declarations.
unsigned Alignof
Whether we can use 'alignof' rather than '__alignof'.
unsigned CleanUglifiedParameters
Whether to strip underscores when printing reserved parameter names.
unsigned ConstantsAsWritten
Whether we should print the constant expressions as written in the sources.
unsigned IncludeNewlines
When true, include newlines after statements like "break", etc.
unsigned TerseOutput
Provide a 'terse' output.
unsigned PrintAsCanonical
Whether to print entities as written or canonically.
unsigned SuppressLambdaBody
Whether to suppress printing the body of a lambda.
unsigned UnderscoreAlignof
Whether we can use '_Alignof' rather than '__alignof'.
unsigned SuppressImplicitBase
When true, don't print the implicit 'self' or 'this' expressions.