47#include "llvm/ADT/ArrayRef.h"
48#include "llvm/ADT/SmallVector.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> {
77 StringRef NL =
"\n",
const ASTContext *Context =
nullptr)
78 : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy),
79 NL(NL), Context(Context) {}
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);
104 PrintExpr(cast<Expr>(S));
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);
129 bool ForceNoStmt =
false);
134 void PrintExpr(
Expr *
E) {
141 raw_ostream &Indent(
int Delta = 0) {
142 for (
int i = 0, e = IndentLevel+Delta; i < e; ++i)
153 void VisitStmt(
Stmt *
Node) LLVM_ATTRIBUTE_UNUSED {
154 Indent() <<
"<<unknown stmt type>>" << NL;
157 void VisitExpr(
Expr *
Node) LLVM_ATTRIBUTE_UNUSED {
158 OS <<
"<<unknown expr type>>";
163#define ABSTRACT_STMT(CLASS)
164#define STMT(CLASS, PARENT) \
165 void Visit##CLASS(CLASS *Node);
166#include "clang/AST/StmtNodes.inc"
178 assert(
Node &&
"Compound statement cannot be null");
180 PrintFPPragmas(
Node);
181 for (
auto *I :
Node->body())
188 if (!S->hasStoredFPFeatures())
191 bool FEnvAccess =
false;
192 if (FPO.hasAllowFEnvAccessOverride()) {
193 FEnvAccess = FPO.getAllowFEnvAccessOverride();
194 Indent() <<
"#pragma STDC FENV_ACCESS " << (FEnvAccess ?
"ON" :
"OFF")
197 if (FPO.hasSpecifiedExceptionModeOverride()) {
199 FPO.getSpecifiedExceptionModeOverride();
200 if (!FEnvAccess || EM != LangOptions::FPE_Strict) {
201 Indent() <<
"#pragma clang fp exceptions(";
202 switch (FPO.getSpecifiedExceptionModeOverride()) {
205 case LangOptions::FPE_Ignore:
208 case LangOptions::FPE_MayTrap:
211 case LangOptions::FPE_Strict:
218 if (FPO.hasConstRoundingModeOverride()) {
220 Indent() <<
"#pragma STDC FENV_ROUND ";
222 case llvm::RoundingMode::TowardZero:
223 OS <<
"FE_TOWARDZERO";
225 case llvm::RoundingMode::NearestTiesToEven:
226 OS <<
"FE_TONEAREST";
228 case llvm::RoundingMode::TowardPositive:
231 case llvm::RoundingMode::TowardNegative:
234 case llvm::RoundingMode::NearestTiesToAway:
235 OS <<
"FE_TONEARESTFROMZERO";
237 case llvm::RoundingMode::Dynamic:
241 llvm_unreachable(
"Invalid rounding mode");
247void StmtPrinter::PrintRawDecl(
Decl *
D) {
248 D->
print(OS, Policy, IndentLevel);
251void StmtPrinter::PrintRawDeclStmt(
const DeclStmt *S) {
257 Indent() <<
";" << NL;
262 PrintRawDeclStmt(
Node);
268 PrintRawCompoundStmt(
Node);
273 Indent(-1) <<
"case ";
274 PrintExpr(
Node->getLHS());
275 if (
Node->getRHS()) {
277 PrintExpr(
Node->getRHS());
281 PrintStmt(
Node->getSubStmt(), 0);
285 Indent(-1) <<
"default:" << NL;
286 PrintStmt(
Node->getSubStmt(), 0);
290 Indent(-1) <<
Node->getName() <<
":" << NL;
291 PrintStmt(
Node->getSubStmt(), 0);
296 for (
const auto *
Attr : Attrs) {
298 if (
Attr != Attrs.back())
302 PrintStmt(
Node->getSubStmt(), 0);
305void StmtPrinter::PrintRawIfStmt(
IfStmt *
If) {
306 if (
If->isConsteval()) {
308 if (
If->isNegatedConsteval())
312 PrintStmt(
If->getThen());
313 if (
Stmt *Else =
If->getElse()) {
324 PrintInitStmt(
If->getInit(), 4);
325 if (
const DeclStmt *DS =
If->getConditionVariableDeclStmt())
326 PrintRawDeclStmt(DS);
328 PrintExpr(
If->getCond());
331 if (
auto *CS = dyn_cast<CompoundStmt>(
If->getThen())) {
333 PrintRawCompoundStmt(CS);
334 OS << (
If->getElse() ?
" " : NL);
337 PrintStmt(
If->getThen());
338 if (
If->getElse()) Indent();
341 if (
Stmt *Else =
If->getElse()) {
344 if (
auto *CS = dyn_cast<CompoundStmt>(Else)) {
346 PrintRawCompoundStmt(CS);
348 }
else if (
auto *ElseIf = dyn_cast<IfStmt>(Else)) {
350 PrintRawIfStmt(ElseIf);
353 PrintStmt(
If->getElse());
358void StmtPrinter::VisitIfStmt(
IfStmt *
If) {
364 Indent() <<
"switch (";
366 PrintInitStmt(
Node->getInit(), 8);
367 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
368 PrintRawDeclStmt(DS);
370 PrintExpr(
Node->getCond());
372 PrintControlledStmt(
Node->getBody());
376 Indent() <<
"while (";
377 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
378 PrintRawDeclStmt(DS);
380 PrintExpr(
Node->getCond());
382 PrintStmt(
Node->getBody());
387 if (
auto *CS = dyn_cast<CompoundStmt>(
Node->getBody())) {
388 PrintRawCompoundStmt(CS);
392 PrintStmt(
Node->getBody());
397 PrintExpr(
Node->getCond());
404 PrintInitStmt(
Node->getInit(), 5);
406 OS << (
Node->getCond() ?
"; " :
";");
407 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
408 PrintRawDeclStmt(DS);
409 else if (
Node->getCond())
410 PrintExpr(
Node->getCond());
412 if (
Node->getInc()) {
414 PrintExpr(
Node->getInc());
417 PrintControlledStmt(
Node->getBody());
422 if (
auto *DS = dyn_cast<DeclStmt>(
Node->getElement()))
423 PrintRawDeclStmt(DS);
425 PrintExpr(cast<Expr>(
Node->getElement()));
427 PrintExpr(
Node->getCollection());
429 PrintControlledStmt(
Node->getBody());
435 PrintInitStmt(
Node->getInit(), 5);
437 SubPolicy.SuppressInitializers =
true;
438 Node->getLoopVariable()->
print(OS, SubPolicy, IndentLevel);
440 PrintExpr(
Node->getRangeInit());
442 PrintControlledStmt(
Node->getBody());
447 if (
Node->isIfExists())
448 OS <<
"__if_exists (";
450 OS <<
"__if_not_exists (";
453 =
Node->getQualifierLoc().getNestedNameSpecifier())
456 OS <<
Node->getNameInfo() <<
") ";
458 PrintRawCompoundStmt(
Node->getSubStmt());
462 Indent() <<
"goto " <<
Node->getLabel()->getName() <<
";";
467 Indent() <<
"goto *";
468 PrintExpr(
Node->getTarget());
474 Indent() <<
"continue;";
479 Indent() <<
"break;";
484 Indent() <<
"return";
485 if (
Node->getRetValue()) {
487 PrintExpr(
Node->getRetValue());
496 if (
Node->isVolatile())
499 if (
Node->isAsmGoto())
503 VisitStringLiteral(
Node->getAsmString());
506 if (
Node->getNumOutputs() != 0 ||
Node->getNumInputs() != 0 ||
507 Node->getNumClobbers() != 0 ||
Node->getNumLabels() != 0)
510 for (
unsigned i = 0, e =
Node->getNumOutputs(); i != e; ++i) {
514 if (!
Node->getOutputName(i).empty()) {
516 OS <<
Node->getOutputName(i);
520 VisitStringLiteral(
Node->getOutputConstraintLiteral(i));
522 Visit(
Node->getOutputExpr(i));
527 if (
Node->getNumInputs() != 0 ||
Node->getNumClobbers() != 0 ||
528 Node->getNumLabels() != 0)
531 for (
unsigned i = 0, e =
Node->getNumInputs(); i != e; ++i) {
535 if (!
Node->getInputName(i).empty()) {
537 OS <<
Node->getInputName(i);
541 VisitStringLiteral(
Node->getInputConstraintLiteral(i));
543 Visit(
Node->getInputExpr(i));
548 if (
Node->getNumClobbers() != 0 ||
Node->getNumLabels())
551 for (
unsigned i = 0, e =
Node->getNumClobbers(); i != e; ++i) {
555 VisitStringLiteral(
Node->getClobberStringLiteral(i));
559 if (
Node->getNumLabels() != 0)
562 for (
unsigned i = 0, e =
Node->getNumLabels(); i != e; ++i) {
565 OS <<
Node->getLabelName(i);
574 Indent() <<
"__asm ";
575 if (
Node->hasBraces())
577 OS <<
Node->getAsmString() << NL;
578 if (
Node->hasBraces())
579 Indent() <<
"}" << NL;
583 PrintStmt(
Node->getCapturedDecl()->getBody());
587 PrintStmt(
Node->getOutlinedFunctionDecl()->getBody());
592 if (
auto *TS = dyn_cast<CompoundStmt>(
Node->getTryBody())) {
593 PrintRawCompoundStmt(TS);
598 Indent() <<
"@catch(";
599 if (
Decl *DS = catchStmt->getCatchParamDecl())
602 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
603 PrintRawCompoundStmt(CS);
609 Indent() <<
"@finally";
610 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
611 PrintRawCompoundStmt(CS);
621 Indent() <<
"@catch (...) { /* todo */ } " << NL;
625 Indent() <<
"@throw";
626 if (
Node->getThrowExpr()) {
628 PrintExpr(
Node->getThrowExpr());
633void StmtPrinter::VisitObjCAvailabilityCheckExpr(
635 OS <<
"@available(...)";
639 Indent() <<
"@synchronized (";
640 PrintExpr(
Node->getSynchExpr());
642 PrintRawCompoundStmt(
Node->getSynchBody());
647 Indent() <<
"@autoreleasepool";
648 PrintRawCompoundStmt(cast<CompoundStmt>(
Node->getSubStmt()));
654 if (
Decl *ExDecl =
Node->getExceptionDecl())
655 PrintRawDecl(ExDecl);
659 PrintRawCompoundStmt(cast<CompoundStmt>(
Node->getHandlerBlock()));
664 PrintRawCXXCatchStmt(
Node);
670 PrintRawCompoundStmt(
Node->getTryBlock());
671 for (
unsigned i = 0, e =
Node->getNumHandlers(); i < e; ++i) {
673 PrintRawCXXCatchStmt(
Node->getHandler(i));
679 Indent() << (
Node->getIsCXXTry() ?
"try " :
"__try ");
680 PrintRawCompoundStmt(
Node->getTryBlock());
684 PrintRawSEHExceptHandler(
E);
686 assert(F &&
"Must have a finally block...");
687 PrintRawSEHFinallyStmt(F);
694 PrintRawCompoundStmt(
Node->getBlock());
700 VisitExpr(
Node->getFilterExpr());
702 PrintRawCompoundStmt(
Node->getBlock());
708 PrintRawSEHExceptHandler(
Node);
714 PrintRawSEHFinallyStmt(
Node);
719 Indent() <<
"__leave;";
728 PrintStmt(
Node->getLoopStmt());
735 for (
auto *Clause : Clauses)
736 if (Clause && !Clause->isImplicit()) {
738 Printer.Visit(Clause);
741 if (!ForceNoStmt && S->hasAssociatedStmt())
742 PrintStmt(S->getRawStmt());
746 Indent() <<
"#pragma omp metadirective";
747 PrintOMPExecutableDirective(
Node);
751 Indent() <<
"#pragma omp parallel";
752 PrintOMPExecutableDirective(
Node);
756 Indent() <<
"#pragma omp simd";
757 PrintOMPExecutableDirective(
Node);
761 Indent() <<
"#pragma omp tile";
762 PrintOMPExecutableDirective(
Node);
766 Indent() <<
"#pragma omp unroll";
767 PrintOMPExecutableDirective(
Node);
771 Indent() <<
"#pragma omp reverse";
772 PrintOMPExecutableDirective(
Node);
776 Indent() <<
"#pragma omp interchange";
777 PrintOMPExecutableDirective(
Node);
781 Indent() <<
"#pragma omp for";
782 PrintOMPExecutableDirective(
Node);
786 Indent() <<
"#pragma omp for simd";
787 PrintOMPExecutableDirective(
Node);
791 Indent() <<
"#pragma omp sections";
792 PrintOMPExecutableDirective(
Node);
796 Indent() <<
"#pragma omp section";
797 PrintOMPExecutableDirective(
Node);
801 Indent() <<
"#pragma omp scope";
802 PrintOMPExecutableDirective(
Node);
806 Indent() <<
"#pragma omp single";
807 PrintOMPExecutableDirective(
Node);
811 Indent() <<
"#pragma omp master";
812 PrintOMPExecutableDirective(
Node);
816 Indent() <<
"#pragma omp critical";
817 if (
Node->getDirectiveName().getName()) {
819 Node->getDirectiveName().printName(OS, Policy);
822 PrintOMPExecutableDirective(
Node);
826 Indent() <<
"#pragma omp parallel for";
827 PrintOMPExecutableDirective(
Node);
830void StmtPrinter::VisitOMPParallelForSimdDirective(
832 Indent() <<
"#pragma omp parallel for simd";
833 PrintOMPExecutableDirective(
Node);
836void StmtPrinter::VisitOMPParallelMasterDirective(
838 Indent() <<
"#pragma omp parallel master";
839 PrintOMPExecutableDirective(
Node);
842void StmtPrinter::VisitOMPParallelMaskedDirective(
844 Indent() <<
"#pragma omp parallel masked";
845 PrintOMPExecutableDirective(
Node);
848void StmtPrinter::VisitOMPParallelSectionsDirective(
850 Indent() <<
"#pragma omp parallel sections";
851 PrintOMPExecutableDirective(
Node);
855 Indent() <<
"#pragma omp task";
856 PrintOMPExecutableDirective(
Node);
860 Indent() <<
"#pragma omp taskyield";
861 PrintOMPExecutableDirective(
Node);
865 Indent() <<
"#pragma omp barrier";
866 PrintOMPExecutableDirective(
Node);
870 Indent() <<
"#pragma omp taskwait";
871 PrintOMPExecutableDirective(
Node);
875 Indent() <<
"#pragma omp assume";
876 PrintOMPExecutableDirective(
Node);
880 Indent() <<
"#pragma omp error";
881 PrintOMPExecutableDirective(
Node);
885 Indent() <<
"#pragma omp taskgroup";
886 PrintOMPExecutableDirective(
Node);
890 Indent() <<
"#pragma omp flush";
891 PrintOMPExecutableDirective(
Node);
895 Indent() <<
"#pragma omp depobj";
896 PrintOMPExecutableDirective(
Node);
900 Indent() <<
"#pragma omp scan";
901 PrintOMPExecutableDirective(
Node);
905 Indent() <<
"#pragma omp ordered";
910 Indent() <<
"#pragma omp atomic";
911 PrintOMPExecutableDirective(
Node);
915 Indent() <<
"#pragma omp target";
916 PrintOMPExecutableDirective(
Node);
920 Indent() <<
"#pragma omp target data";
921 PrintOMPExecutableDirective(
Node);
924void StmtPrinter::VisitOMPTargetEnterDataDirective(
926 Indent() <<
"#pragma omp target enter data";
927 PrintOMPExecutableDirective(
Node,
true);
930void StmtPrinter::VisitOMPTargetExitDataDirective(
932 Indent() <<
"#pragma omp target exit data";
933 PrintOMPExecutableDirective(
Node,
true);
936void StmtPrinter::VisitOMPTargetParallelDirective(
938 Indent() <<
"#pragma omp target parallel";
939 PrintOMPExecutableDirective(
Node);
942void StmtPrinter::VisitOMPTargetParallelForDirective(
944 Indent() <<
"#pragma omp target parallel for";
945 PrintOMPExecutableDirective(
Node);
949 Indent() <<
"#pragma omp teams";
950 PrintOMPExecutableDirective(
Node);
953void StmtPrinter::VisitOMPCancellationPointDirective(
955 Indent() <<
"#pragma omp cancellation point "
956 << getOpenMPDirectiveName(
Node->getCancelRegion());
957 PrintOMPExecutableDirective(
Node);
961 Indent() <<
"#pragma omp cancel "
962 << getOpenMPDirectiveName(
Node->getCancelRegion());
963 PrintOMPExecutableDirective(
Node);
967 Indent() <<
"#pragma omp taskloop";
968 PrintOMPExecutableDirective(
Node);
971void StmtPrinter::VisitOMPTaskLoopSimdDirective(
973 Indent() <<
"#pragma omp taskloop simd";
974 PrintOMPExecutableDirective(
Node);
977void StmtPrinter::VisitOMPMasterTaskLoopDirective(
979 Indent() <<
"#pragma omp master taskloop";
980 PrintOMPExecutableDirective(
Node);
983void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
985 Indent() <<
"#pragma omp masked taskloop";
986 PrintOMPExecutableDirective(
Node);
989void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
991 Indent() <<
"#pragma omp master taskloop simd";
992 PrintOMPExecutableDirective(
Node);
995void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
997 Indent() <<
"#pragma omp masked taskloop simd";
998 PrintOMPExecutableDirective(
Node);
1001void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
1003 Indent() <<
"#pragma omp parallel master taskloop";
1004 PrintOMPExecutableDirective(
Node);
1007void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1009 Indent() <<
"#pragma omp parallel masked taskloop";
1010 PrintOMPExecutableDirective(
Node);
1013void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1015 Indent() <<
"#pragma omp parallel master taskloop simd";
1016 PrintOMPExecutableDirective(
Node);
1019void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1021 Indent() <<
"#pragma omp parallel masked taskloop simd";
1022 PrintOMPExecutableDirective(
Node);
1026 Indent() <<
"#pragma omp distribute";
1027 PrintOMPExecutableDirective(
Node);
1030void StmtPrinter::VisitOMPTargetUpdateDirective(
1032 Indent() <<
"#pragma omp target update";
1033 PrintOMPExecutableDirective(
Node,
true);
1036void StmtPrinter::VisitOMPDistributeParallelForDirective(
1038 Indent() <<
"#pragma omp distribute parallel for";
1039 PrintOMPExecutableDirective(
Node);
1042void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1044 Indent() <<
"#pragma omp distribute parallel for simd";
1045 PrintOMPExecutableDirective(
Node);
1048void StmtPrinter::VisitOMPDistributeSimdDirective(
1050 Indent() <<
"#pragma omp distribute simd";
1051 PrintOMPExecutableDirective(
Node);
1054void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1056 Indent() <<
"#pragma omp target parallel for simd";
1057 PrintOMPExecutableDirective(
Node);
1061 Indent() <<
"#pragma omp target simd";
1062 PrintOMPExecutableDirective(
Node);
1065void StmtPrinter::VisitOMPTeamsDistributeDirective(
1067 Indent() <<
"#pragma omp teams distribute";
1068 PrintOMPExecutableDirective(
Node);
1071void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1073 Indent() <<
"#pragma omp teams distribute simd";
1074 PrintOMPExecutableDirective(
Node);
1077void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1079 Indent() <<
"#pragma omp teams distribute parallel for simd";
1080 PrintOMPExecutableDirective(
Node);
1083void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1085 Indent() <<
"#pragma omp teams distribute parallel for";
1086 PrintOMPExecutableDirective(
Node);
1090 Indent() <<
"#pragma omp target teams";
1091 PrintOMPExecutableDirective(
Node);
1094void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1096 Indent() <<
"#pragma omp target teams distribute";
1097 PrintOMPExecutableDirective(
Node);
1100void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1102 Indent() <<
"#pragma omp target teams distribute parallel for";
1103 PrintOMPExecutableDirective(
Node);
1106void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1108 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1109 PrintOMPExecutableDirective(
Node);
1112void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1114 Indent() <<
"#pragma omp target teams distribute simd";
1115 PrintOMPExecutableDirective(
Node);
1119 Indent() <<
"#pragma omp interop";
1120 PrintOMPExecutableDirective(
Node);
1124 Indent() <<
"#pragma omp dispatch";
1125 PrintOMPExecutableDirective(
Node);
1129 Indent() <<
"#pragma omp masked";
1130 PrintOMPExecutableDirective(
Node);
1134 Indent() <<
"#pragma omp loop";
1135 PrintOMPExecutableDirective(
Node);
1138void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1140 Indent() <<
"#pragma omp teams loop";
1141 PrintOMPExecutableDirective(
Node);
1144void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1146 Indent() <<
"#pragma omp target teams loop";
1147 PrintOMPExecutableDirective(
Node);
1150void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1152 Indent() <<
"#pragma omp parallel loop";
1153 PrintOMPExecutableDirective(
Node);
1156void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1158 Indent() <<
"#pragma omp target parallel loop";
1159 PrintOMPExecutableDirective(
Node);
1166 if (!S->clauses().empty()) {
1169 Printer.VisitClauseList(S->clauses());
1173 Indent() <<
"#pragma acc " << S->getDirectiveKind();
1174 PrintOpenACCClauseList(S);
1178 PrintOpenACCConstruct(S);
1179 PrintStmt(S->getStructuredBlock());
1183 PrintOpenACCConstruct(S);
1184 PrintStmt(S->getLoop());
1188 PrintOpenACCConstruct(S);
1189 PrintStmt(S->getLoop());
1193 PrintOpenACCConstruct(S);
1194 PrintStmt(S->getStructuredBlock());
1197 PrintOpenACCConstruct(S);
1198 PrintStmt(S->getStructuredBlock());
1201 PrintOpenACCConstruct(S);
1204 PrintOpenACCConstruct(S);
1207 PrintOpenACCConstruct(S);
1210 PrintOpenACCConstruct(S);
1213 PrintOpenACCConstruct(S);
1216 PrintOpenACCConstruct(S);
1220 Indent() <<
"#pragma acc wait";
1221 if (!S->getLParenLoc().isInvalid()) {
1223 if (S->hasDevNumExpr()) {
1225 S->getDevNumExpr()->printPretty(OS,
nullptr, Policy);
1229 if (S->hasQueuesTag())
1232 llvm::interleaveComma(S->getQueueIdExprs(), OS, [&](
const Expr *
E) {
1233 E->printPretty(OS, nullptr, Policy);
1239 PrintOpenACCClauseList(S);
1248 OS <<
Node->getBuiltinStr() <<
"()";
1252 llvm::report_fatal_error(
"Not implemented");
1256 PrintExpr(
Node->getSubExpr());
1260 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(
Node->getDecl())) {
1261 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1264 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(
Node->getDecl())) {
1265 TPOD->printAsExpr(OS, Policy);
1270 if (
Node->hasTemplateKeyword())
1273 isa<ParmVarDecl, NonTypeTemplateParmDecl>(
Node->getDecl()) &&
1274 Node->getDecl()->getIdentifier())
1275 OS <<
Node->getDecl()->getIdentifier()->deuglifiedName();
1277 Node->getNameInfo().printName(OS, Policy);
1278 if (
Node->hasExplicitTemplateArgs()) {
1280 if (!
Node->hadMultipleCandidates())
1281 if (
auto *TD = dyn_cast<TemplateDecl>(
Node->getDecl()))
1282 TPL = TD->getTemplateParameters();
1287void StmtPrinter::VisitDependentScopeDeclRefExpr(
1291 if (
Node->hasTemplateKeyword())
1293 OS <<
Node->getNameInfo();
1294 if (
Node->hasExplicitTemplateArgs())
1299 if (
Node->getQualifier())
1300 Node->getQualifier()->
print(OS, Policy);
1301 if (
Node->hasTemplateKeyword())
1303 OS <<
Node->getNameInfo();
1304 if (
Node->hasExplicitTemplateArgs())
1309 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
1310 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1311 if (PD->getParameterKind() == ImplicitParamKind::ObjCSelf &&
1312 DRE->getBeginLoc().isInvalid())
1320 if (
Node->getBase()) {
1323 PrintExpr(
Node->getBase());
1324 OS << (
Node->isArrow() ?
"->" :
".");
1327 OS << *
Node->getDecl();
1331 if (
Node->isSuperReceiver())
1333 else if (
Node->isObjectReceiver() &&
Node->getBase()) {
1334 PrintExpr(
Node->getBase());
1336 }
else if (
Node->isClassReceiver() &&
Node->getClassReceiver()) {
1337 OS <<
Node->getClassReceiver()->getName() <<
".";
1340 if (
Node->isImplicitProperty()) {
1341 if (
const auto *Getter =
Node->getImplicitPropertyGetter())
1342 Getter->getSelector().
print(OS);
1345 Node->getImplicitPropertySetter()->getSelector());
1347 OS <<
Node->getExplicitProperty()->getName();
1351 PrintExpr(
Node->getBaseExpr());
1353 PrintExpr(
Node->getKeyExpr());
1357void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1359 OS <<
"__builtin_sycl_unique_stable_name(";
1360 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1396 bool isSigned =
Node->getType()->isSignedIntegerType();
1399 if (isa<BitIntType>(
Node->getType())) {
1400 OS << (isSigned ?
"wb" :
"uwb");
1406 default: llvm_unreachable(
"Unexpected type for integer literal!");
1407 case BuiltinType::Char_S:
1408 case BuiltinType::Char_U: OS <<
"i8";
break;
1409 case BuiltinType::UChar: OS <<
"Ui8";
break;
1410 case BuiltinType::SChar: OS <<
"i8";
break;
1411 case BuiltinType::Short: OS <<
"i16";
break;
1412 case BuiltinType::UShort: OS <<
"Ui16";
break;
1413 case BuiltinType::Int:
break;
1414 case BuiltinType::UInt: OS <<
'U';
break;
1415 case BuiltinType::Long: OS <<
'L';
break;
1416 case BuiltinType::ULong: OS <<
"UL";
break;
1417 case BuiltinType::LongLong: OS <<
"LL";
break;
1418 case BuiltinType::ULongLong: OS <<
"ULL";
break;
1419 case BuiltinType::Int128:
1421 case BuiltinType::UInt128:
1423 case BuiltinType::WChar_S:
1424 case BuiltinType::WChar_U:
1432 OS <<
Node->getValueAsString(10);
1435 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1436 case BuiltinType::ShortFract: OS <<
"hr";
break;
1437 case BuiltinType::ShortAccum: OS <<
"hk";
break;
1438 case BuiltinType::UShortFract: OS <<
"uhr";
break;
1439 case BuiltinType::UShortAccum: OS <<
"uhk";
break;
1440 case BuiltinType::Fract: OS <<
"r";
break;
1441 case BuiltinType::Accum: OS <<
"k";
break;
1442 case BuiltinType::UFract: OS <<
"ur";
break;
1443 case BuiltinType::UAccum: OS <<
"uk";
break;
1444 case BuiltinType::LongFract: OS <<
"lr";
break;
1445 case BuiltinType::LongAccum: OS <<
"lk";
break;
1446 case BuiltinType::ULongFract: OS <<
"ulr";
break;
1447 case BuiltinType::ULongAccum: OS <<
"ulk";
break;
1454 Node->getValue().toString(Str);
1456 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1464 default: llvm_unreachable(
"Unexpected type for float literal!");
1465 case BuiltinType::Half:
break;
1466 case BuiltinType::Ibm128:
break;
1467 case BuiltinType::Double:
break;
1468 case BuiltinType::Float16: OS <<
"F16";
break;
1469 case BuiltinType::Float: OS <<
'F';
break;
1470 case BuiltinType::LongDouble: OS <<
'L';
break;
1471 case BuiltinType::Float128: OS <<
'Q';
break;
1482 PrintExpr(
Node->getSubExpr());
1492 PrintExpr(
Node->getSubExpr());
1497 if (!
Node->isPostfix()) {
1502 switch (
Node->getOpcode()) {
1511 if (isa<UnaryOperator>(
Node->getSubExpr()))
1516 PrintExpr(
Node->getSubExpr());
1518 if (
Node->isPostfix())
1523 OS <<
"__builtin_offsetof(";
1524 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1526 bool PrintedSomething =
false;
1527 for (
unsigned i = 0, n =
Node->getNumComponents(); i < n; ++i) {
1534 PrintedSomething =
true;
1547 if (PrintedSomething)
1550 PrintedSomething =
true;
1551 OS <<
Id->getName();
1556void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1559 if (
Node->getKind() == UETT_AlignOf) {
1561 Spelling =
"alignof";
1563 Spelling =
"_Alignof";
1565 Spelling =
"__alignof";
1570 if (
Node->isArgumentType()) {
1572 Node->getArgumentType().
print(OS, Policy);
1576 PrintExpr(
Node->getArgumentExpr());
1582 if (
Node->isExprPredicate())
1583 PrintExpr(
Node->getControllingExpr());
1585 Node->getControllingType()->getType().
print(OS, Policy);
1593 T.print(OS, Policy);
1595 PrintExpr(Assoc.getAssociationExpr());
1601 PrintExpr(
Node->getLHS());
1603 PrintExpr(
Node->getRHS());
1608 PrintExpr(
Node->getBase());
1610 PrintExpr(
Node->getRowIdx());
1613 PrintExpr(
Node->getColumnIdx());
1618 PrintExpr(
Node->getBase());
1620 if (
Node->getLowerBound())
1621 PrintExpr(
Node->getLowerBound());
1622 if (
Node->getColonLocFirst().isValid()) {
1624 if (
Node->getLength())
1625 PrintExpr(
Node->getLength());
1627 if (
Node->isOMPArraySection() &&
Node->getColonLocSecond().isValid()) {
1629 if (
Node->getStride())
1630 PrintExpr(
Node->getStride());
1643 PrintExpr(
Node->getBase());
1648 for (
unsigned I = 0,
E =
Node->numOfIterators(); I <
E; ++I) {
1649 auto *VD = cast<ValueDecl>(
Node->getIteratorDecl(I));
1650 VD->getType().print(OS, Policy);
1652 OS <<
" " << VD->getName() <<
" = ";
1653 PrintExpr(
Range.Begin);
1655 PrintExpr(
Range.End);
1658 PrintExpr(
Range.Step);
1667 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1668 if (isa<CXXDefaultArgExpr>(
Call->getArg(i))) {
1674 PrintExpr(
Call->getArg(i));
1679 PrintExpr(
Call->getCallee());
1681 PrintCallArgs(
Call);
1686 if (
const auto *TE = dyn_cast<CXXThisExpr>(
E))
1687 return TE->isImplicit();
1693 PrintExpr(
Node->getBase());
1695 auto *ParentMember = dyn_cast<MemberExpr>(
Node->getBase());
1697 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1701 OS << (
Node->isArrow() ?
"->" :
".");
1704 if (
auto *FD = dyn_cast<FieldDecl>(
Node->getMemberDecl()))
1705 if (FD->isAnonymousStructOrUnion())
1710 if (
Node->hasTemplateKeyword())
1712 OS <<
Node->getMemberNameInfo();
1714 if (
auto *FD = dyn_cast<FunctionDecl>(
Node->getMemberDecl())) {
1715 if (!
Node->hadMultipleCandidates())
1716 if (
auto *FTD = FD->getPrimaryTemplate())
1717 TPL = FTD->getTemplateParameters();
1718 }
else if (
auto *VTSD =
1719 dyn_cast<VarTemplateSpecializationDecl>(
Node->getMemberDecl()))
1720 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1721 if (
Node->hasExplicitTemplateArgs())
1726 PrintExpr(
Node->getBase());
1727 OS << (
Node->isArrow() ?
"->isa" :
".isa");
1731 PrintExpr(
Node->getBase());
1733 OS <<
Node->getAccessor().getName();
1738 Node->getTypeAsWritten().
print(OS, Policy);
1740 PrintExpr(
Node->getSubExpr());
1747 PrintExpr(
Node->getInitializer());
1752 PrintExpr(
Node->getSubExpr());
1756 PrintExpr(
Node->getLHS());
1758 PrintExpr(
Node->getRHS());
1762 PrintExpr(
Node->getLHS());
1764 PrintExpr(
Node->getRHS());
1768 PrintExpr(
Node->getCond());
1770 PrintExpr(
Node->getLHS());
1772 PrintExpr(
Node->getRHS());
1779 PrintExpr(
Node->getCommon());
1781 PrintExpr(
Node->getFalseExpr());
1785 OS <<
"&&" <<
Node->getLabel()->getName();
1788void StmtPrinter::VisitStmtExpr(
StmtExpr *
E) {
1790 PrintRawCompoundStmt(
E->getSubStmt());
1795 OS <<
"__builtin_choose_expr(";
1796 PrintExpr(
Node->getCond());
1798 PrintExpr(
Node->getLHS());
1800 PrintExpr(
Node->getRHS());
1804void StmtPrinter::VisitGNUNullExpr(
GNUNullExpr *) {
1809 OS <<
"__builtin_shufflevector(";
1810 for (
unsigned i = 0, e =
Node->getNumSubExprs(); i != e; ++i) {
1812 PrintExpr(
Node->getExpr(i));
1818 OS <<
"__builtin_convertvector(";
1819 PrintExpr(
Node->getSrcExpr());
1826 if (
Node->getSyntacticForm()) {
1827 Visit(
Node->getSyntacticForm());
1832 for (
unsigned i = 0, e =
Node->getNumInits(); i != e; ++i) {
1834 if (
Node->getInit(i))
1835 PrintExpr(
Node->getInit(i));
1846 PrintExpr(
Node->getSubExpr());
1856 for (
unsigned i = 0, e =
Node->getNumExprs(); i != e; ++i) {
1858 PrintExpr(
Node->getExpr(i));
1864 bool NeedsEquals =
true;
1866 if (
D.isFieldDesignator()) {
1867 if (
D.getDotLoc().isInvalid()) {
1869 OS << II->getName() <<
":";
1870 NeedsEquals =
false;
1873 OS <<
"." <<
D.getFieldName()->getName();
1877 if (
D.isArrayDesignator()) {
1878 PrintExpr(
Node->getArrayIndex(
D));
1880 PrintExpr(
Node->getArrayRangeStart(
D));
1882 PrintExpr(
Node->getArrayRangeEnd(
D));
1892 PrintExpr(
Node->getInit());
1895void StmtPrinter::VisitDesignatedInitUpdateExpr(
1899 PrintExpr(
Node->getBase());
1902 OS <<
"/*updater*/";
1903 PrintExpr(
Node->getUpdater());
1908 OS <<
"/*no init*/";
1912 if (
Node->getType()->getAsCXXRecordDecl()) {
1913 OS <<
"/*implicit*/";
1917 OS <<
"/*implicit*/(";
1920 if (
Node->getType()->isRecordType())
1928 OS <<
"__builtin_va_arg(";
1929 PrintExpr(
Node->getSubExpr());
1936 PrintExpr(
Node->getSyntacticForm());
1940 const char *Name =
nullptr;
1941 switch (
Node->getOp()) {
1942#define BUILTIN(ID, TYPE, ATTRS)
1943#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1944 case AtomicExpr::AO ## ID: \
1947#include "clang/Basic/Builtins.inc"
1952 PrintExpr(
Node->getPtr());
1953 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1954 Node->getOp() != AtomicExpr::AO__atomic_load_n &&
1955 Node->getOp() != AtomicExpr::AO__scoped_atomic_load_n &&
1956 Node->getOp() != AtomicExpr::AO__opencl_atomic_load &&
1957 Node->getOp() != AtomicExpr::AO__hip_atomic_load) {
1959 PrintExpr(
Node->getVal1());
1961 if (
Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1962 Node->isCmpXChg()) {
1964 PrintExpr(
Node->getVal2());
1966 if (
Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1967 Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1969 PrintExpr(
Node->getWeak());
1971 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_init &&
1972 Node->getOp() != AtomicExpr::AO__opencl_atomic_init) {
1974 PrintExpr(
Node->getOrder());
1976 if (
Node->isCmpXChg()) {
1978 PrintExpr(
Node->getOrderFail());
1986 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
1987 if (
Node->getNumArgs() == 1) {
1989 PrintExpr(
Node->getArg(0));
1991 PrintExpr(
Node->getArg(0));
1994 }
else if (Kind == OO_Arrow) {
1995 PrintExpr(
Node->getArg(0));
1996 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
1997 PrintExpr(
Node->getArg(0));
1998 OS << (
Kind == OO_Call ?
'(' :
'[');
1999 for (
unsigned ArgIdx = 1; ArgIdx <
Node->getNumArgs(); ++ArgIdx) {
2002 if (!isa<CXXDefaultArgExpr>(
Node->getArg(ArgIdx)))
2003 PrintExpr(
Node->getArg(ArgIdx));
2005 OS << (
Kind == OO_Call ?
')' :
']');
2006 }
else if (
Node->getNumArgs() == 1) {
2008 PrintExpr(
Node->getArg(0));
2009 }
else if (
Node->getNumArgs() == 2) {
2010 PrintExpr(
Node->getArg(0));
2012 PrintExpr(
Node->getArg(1));
2014 llvm_unreachable(
"unknown overloaded operator");
2021 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
2022 PrintExpr(
Node->getImplicitObjectArgument());
2025 VisitCallExpr(cast<CallExpr>(
Node));
2029 PrintExpr(
Node->getCallee());
2031 PrintCallArgs(
Node->getConfig());
2033 PrintCallArgs(
Node);
2037void StmtPrinter::VisitCXXRewrittenBinaryOperator(
2040 Node->getDecomposedForm();
2041 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
2043 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
2047 OS <<
Node->getCastName() <<
'<';
2048 Node->getTypeAsWritten().
print(OS, Policy);
2050 PrintExpr(
Node->getSubExpr());
2055 VisitCXXNamedCastExpr(
Node);
2059 VisitCXXNamedCastExpr(
Node);
2063 VisitCXXNamedCastExpr(
Node);
2067 VisitCXXNamedCastExpr(
Node);
2071 OS <<
"__builtin_bit_cast(";
2072 Node->getTypeInfoAsWritten()->getType().
print(OS, Policy);
2074 PrintExpr(
Node->getSubExpr());
2079 VisitCXXNamedCastExpr(
Node);
2084 if (
Node->isTypeOperand()) {
2085 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
2087 PrintExpr(
Node->getExprOperand());
2094 if (
Node->isTypeOperand()) {
2095 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
2097 PrintExpr(
Node->getExprOperand());
2103 PrintExpr(
Node->getBaseExpr());
2104 if (
Node->isArrow())
2109 Node->getQualifierLoc().getNestedNameSpecifier())
2111 OS <<
Node->getPropertyDecl()->getDeclName();
2115 PrintExpr(
Node->getBase());
2117 PrintExpr(
Node->getIdx());
2122 switch (
Node->getLiteralOperatorKind()) {
2124 OS << cast<StringLiteral>(
Node->getArg(0)->IgnoreImpCasts())->getString();
2127 const auto *DRE = cast<DeclRefExpr>(
Node->getCallee()->IgnoreImpCasts());
2129 cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
2134 if (!DRE->hadMultipleCandidates())
2135 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2136 TPL = TD->getTemplateParameters();
2137 OS <<
"operator\"\"" <<
Node->getUDSuffix()->getName();
2145 char C = (char)
P.getAsIntegral().getZExtValue();
2152 const auto *
Int = cast<IntegerLiteral>(
Node->getCookedLiteral());
2158 auto *
Float = cast<FloatingLiteral>(
Node->getCookedLiteral());
2164 PrintExpr(
Node->getCookedLiteral());
2167 OS <<
Node->getUDSuffix()->getName();
2171 OS << (
Node->getValue() ?
"true" :
"false");
2183 if (!
Node->getSubExpr())
2187 PrintExpr(
Node->getSubExpr());
2200 auto TargetType =
Node->getType();
2201 auto *
Auto = TargetType->getContainedDeducedType();
2202 bool Bare =
Auto &&
Auto->isDeduced();
2207 TargetType.print(OS, Policy);
2212 if (!
Node->isListInitialization())
2214 PrintExpr(
Node->getSubExpr());
2215 if (!
Node->isListInitialization())
2220 PrintExpr(
Node->getSubExpr());
2225 if (
Node->isStdInitListInitialization())
2227 else if (
Node->isListInitialization())
2232 ArgEnd =
Node->arg_end();
2233 Arg != ArgEnd; ++Arg) {
2234 if ((*Arg)->isDefaultArgument())
2236 if (Arg !=
Node->arg_begin())
2240 if (
Node->isStdInitListInitialization())
2242 else if (
Node->isListInitialization())
2250 bool NeedComma =
false;
2251 switch (
Node->getCaptureDefault()) {
2266 CEnd =
Node->explicit_capture_end();
2269 if (
C->capturesVLAType())
2276 switch (
C->getCaptureKind()) {
2288 OS <<
C->getCapturedVar()->getName();
2292 OS <<
C->getCapturedVar()->getName();
2296 llvm_unreachable(
"VLA type in explicit captures.");
2299 if (
C->isPackExpansion())
2302 if (
Node->isInitCapture(
C)) {
2304 auto *
D = cast<VarDecl>(
C->getCapturedVar());
2306 llvm::StringRef
Pre;
2307 llvm::StringRef
Post;
2309 !isa<ParenListExpr>(
D->getInit())) {
2317 PrintExpr(
D->getInit());
2323 if (!
Node->getExplicitTemplateParameters().empty()) {
2324 Node->getTemplateParameterList()->
print(
2325 OS,
Node->getLambdaClass()->getASTContext(),
2329 if (
Node->hasExplicitParameters()) {
2339 std::string ParamStr =
2341 ?
P->getIdentifier()->deuglifiedName().str()
2342 :
P->getNameAsString();
2343 P->getOriginalType().print(OS, Policy, ParamStr);
2352 if (
Node->isMutable())
2361 if (
Node->hasExplicitResultType()) {
2363 Proto->getReturnType().print(OS, Policy);
2372 PrintRawCompoundStmt(
Node->getCompoundStmtBody());
2377 TSInfo->getType().print(OS, Policy);
2384 if (
E->isGlobalNew())
2387 unsigned NumPlace =
E->getNumPlacementArgs();
2388 if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(
E->getPlacementArg(0))) {
2390 PrintExpr(
E->getPlacementArg(0));
2391 for (
unsigned i = 1; i < NumPlace; ++i) {
2392 if (isa<CXXDefaultArgExpr>(
E->getPlacementArg(i)))
2395 PrintExpr(
E->getPlacementArg(i));
2399 if (
E->isParenTypeId())
2403 llvm::raw_string_ostream
s(TypeS);
2405 if (std::optional<Expr *> Size =
E->getArraySize())
2406 (*Size)->printPretty(
s, Helper, Policy);
2409 E->getAllocatedType().print(OS, Policy, TypeS);
2410 if (
E->isParenTypeId())
2414 if (InitStyle != CXXNewInitializationStyle::None) {
2415 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2416 !isa<ParenListExpr>(
E->getInitializer());
2419 PrintExpr(
E->getInitializer());
2426 if (
E->isGlobalDelete())
2429 if (
E->isArrayForm())
2431 PrintExpr(
E->getArgument());
2435 PrintExpr(
E->getBase());
2440 if (
E->getQualifier())
2441 E->getQualifier()->print(OS, Policy);
2445 OS << II->getName();
2447 E->getDestroyedType().print(OS, Policy);
2451 if (
E->isListInitialization() && !
E->isStdInitListInitialization())
2454 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
2455 if (isa<CXXDefaultArgExpr>(
E->getArg(i))) {
2461 PrintExpr(
E->getArg(i));
2464 if (
E->isListInitialization() && !
E->isStdInitListInitialization())
2470 OS <<
"<forwarded>";
2474 PrintExpr(
E->getSubExpr());
2479 PrintExpr(
E->getSubExpr());
2482void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2484 Node->getTypeAsWritten().
print(OS, Policy);
2485 if (!
Node->isListInitialization())
2487 for (
auto Arg =
Node->arg_begin(), ArgEnd =
Node->arg_end(); Arg != ArgEnd;
2489 if (Arg !=
Node->arg_begin())
2493 if (!
Node->isListInitialization())
2497void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2499 if (!
Node->isImplicitAccess()) {
2500 PrintExpr(
Node->getBase());
2501 OS << (
Node->isArrow() ?
"->" :
".");
2505 if (
Node->hasTemplateKeyword())
2507 OS <<
Node->getMemberNameInfo();
2508 if (
Node->hasExplicitTemplateArgs())
2513 if (!
Node->isImplicitAccess()) {
2514 PrintExpr(
Node->getBase());
2515 OS << (
Node->isArrow() ?
"->" :
".");
2519 if (
Node->hasTemplateKeyword())
2521 OS <<
Node->getMemberNameInfo();
2522 if (
Node->hasExplicitTemplateArgs())
2528 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I) {
2538 E->getQueriedType().print(OS, Policy);
2544 PrintExpr(
E->getQueriedExpression());
2550 PrintExpr(
E->getOperand());
2555 PrintExpr(
E->getPattern());
2560 OS <<
"sizeof...(" << *
E->getPack() <<
")";
2564 PrintExpr(
E->getPackIdExpression());
2566 PrintExpr(
E->getIndexExpr());
2570void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2572 OS << *
Node->getParameterPack();
2575void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2577 Visit(
Node->getReplacement());
2581 OS << *
E->getParameterPack();
2585 PrintExpr(
Node->getSubExpr());
2591 PrintExpr(
E->getLHS());
2597 PrintExpr(
E->getRHS());
2604 llvm::interleaveComma(
Node->getInitExprs(), OS,
2605 [&](
Expr *
E) { PrintExpr(E); });
2613 if (
E->getTemplateKWLoc().isValid())
2615 OS <<
E->getFoundDecl()->getName();
2618 E->getNamedConcept()->getTemplateParameters());
2623 auto LocalParameters =
E->getLocalParameters();
2624 if (!LocalParameters.empty()) {
2627 PrintRawDecl(LocalParam);
2628 if (LocalParam != LocalParameters.back())
2635 auto Requirements =
E->getRequirements();
2637 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2638 if (TypeReq->isSubstitutionFailure())
2639 OS <<
"<<error-type>>";
2641 TypeReq->getType()->getType().print(OS, Policy);
2642 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2643 if (ExprReq->isCompound())
2645 if (ExprReq->isExprSubstitutionFailure())
2646 OS <<
"<<error-expression>>";
2648 PrintExpr(ExprReq->getExpr());
2649 if (ExprReq->isCompound()) {
2651 if (ExprReq->getNoexceptLoc().isValid())
2653 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2654 if (!RetReq.isEmpty()) {
2656 if (RetReq.isSubstitutionFailure())
2657 OS <<
"<<error-type>>";
2658 else if (RetReq.isTypeConstraint())
2659 RetReq.getTypeConstraint()->print(OS, Policy);
2663 auto *NestedReq = cast<concepts::NestedRequirement>(Req);
2665 if (NestedReq->hasInvalidConstraint())
2666 OS <<
"<<error-expression>>";
2668 PrintExpr(NestedReq->getConstraintExpr());
2678 Visit(S->getBody());
2683 if (S->getOperand()) {
2685 Visit(S->getOperand());
2690void StmtPrinter::VisitCoawaitExpr(
CoawaitExpr *S) {
2692 PrintExpr(S->getOperand());
2697 PrintExpr(S->getOperand());
2700void StmtPrinter::VisitCoyieldExpr(
CoyieldExpr *S) {
2702 PrintExpr(S->getOperand());
2709 VisitStringLiteral(
Node->getString());
2714 Visit(
E->getSubExpr());
2720 for (
auto I = Ch.begin(),
E = Ch.end(); I !=
E; ++I) {
2721 if (I != Ch.begin())
2730 for (
unsigned I = 0, N =
E->getNumElements(); I != N; ++I) {
2737 Visit(Element.Value);
2738 if (Element.isPackExpansion())
2746 Node->getEncodedType().
print(OS, Policy);
2757 OS <<
"@protocol(" << *
Node->getProtocol() <<
')';
2782 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2784 if (i > 0) OS <<
' ';
2792 PrintExpr(Mess->
getArg(i));
2799 OS << (
Node->getValue() ?
"__objc_yes" :
"__objc_no");
2804 PrintExpr(
E->getSubExpr());
2809 OS <<
'(' <<
E->getBridgeKindName();
2812 PrintExpr(
E->getSubExpr());
2821 if (isa<FunctionNoProtoType>(AFT)) {
2823 }
else if (!BD->
param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
2828 std::string ParamStr = (*AI)->getNameAsString();
2829 (*AI)->getType().print(OS, Policy, ParamStr);
2832 const auto *FT = cast<FunctionProtoType>(AFT);
2833 if (FT->isVariadic()) {
2843 PrintExpr(
Node->getSourceExpr());
2848 llvm_unreachable(
"Cannot print TypoExpr nodes");
2852 OS <<
"<recovery-expr>(";
2853 const char *Sep =
"";
2854 for (
Expr *
E :
Node->subExpressions()) {
2863 OS <<
"__builtin_astype(";
2864 PrintExpr(
Node->getSrcExpr());
2871 PrintExpr(
Node->getArgLValue());
2884 StringRef NL,
const ASTContext *Context)
const {
2885 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2886 P.Visit(
const_cast<Stmt *
>(
this));
2891 unsigned Indentation, StringRef NL,
2893 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2894 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
2900 llvm::raw_string_ostream TempOut(Buf);
Defines the clang::ASTContext interface.
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
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.
__device__ __2f16 float __ockl_bool s
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
const LangOptions & getLangOpts() const
AddrLabelExpr - The GNU address of label extension, representing &&label.
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Represents a loop initializing the elements of an array.
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
AsTypeExpr - Clang builtin function __builtin_astype [OpenCL 6.2.4.2] This AST node provides support ...
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
Attr - This represents one attribute.
void printPretty(raw_ostream &OS, const PrintingPolicy &Policy) const
Represents an attribute applied to a statement.
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
A builtin binary operation expression such as "x + y" or "x <= y".
StringRef getOpcodeStr() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
param_iterator param_end()
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
param_iterator param_begin()
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
BreakStmt - This represents a break.
Represents a C++2a __builtin_bit_cast(T, v) expression.
This class is used for builtin types like 'int'.
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
Represents a call to a CUDA kernel function.
A C++ addrspace_cast expression (currently only enabled for OpenCL).
Represents binding an expression to a temporary.
A boolean literal, per ([C++ lex.bool] Boolean literals).
CXXCatchStmt - This represents a C++ catch block.
A C++ const_cast expression (C++ [expr.const.cast]).
Represents a call to a C++ constructor.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Represents a delete expression for memory deallocation and destructor calls, e.g.
Represents a C++ member access expression where the actual member referenced could not be resolved be...
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Represents a folding of a pack over an operator.
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a call to a member function that may be written either with member call syntax (e....
Represents a static or instance method of a struct/union/class.
Abstract class common to all of the C++ "named"/"keyword" casts.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
The null pointer literal (C++11 [lex.nullptr])
A call to an overloaded operator written using operator syntax.
Represents a list-initialization with parenthesis.
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
A rewritten comparison expression that was originally written using operator syntax.
An expression "T()" which creates an rvalue of a non-class type T.
A C++ static_cast expression (C++ [expr.static.cast]).
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Represents a C++ functional cast expression that builds a temporary object.
Represents the this expression in C++.
A C++ throw-expression (C++ [except.throw]).
CXXTryStmt - A C++ try block, including all handlers.
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
This captures a statement into a function.
CaseStmt - Represent a case statement.
static CharSourceRange getTokenRange(SourceRange R)
static void print(unsigned val, CharacterLiteralKind Kind, raw_ostream &OS)
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Represents a 'co_await' expression.
CompoundAssignOperator - For compound assignments (e.g.
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
Represents the specialization of a concept - evaluates to a prvalue of type bool.
ConditionalOperator - The ?: ternary operator.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
ContinueStmt - This represents a continue.
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Represents a 'co_return' statement in the C++ Coroutines TS.
Represents the body of a coroutine.
Represents a 'co_yield' expression.
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Decl - This represents one declaration (or definition), e.g.
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
Represents a 'co_await' expression while the type of the promise is dependent.
A qualified reference to a name whose declaration cannot yet be resolved.
Represents a single C99 designator.
Represents a C99 designated initializer expression.
DoStmt - This represents a 'do/while' stmt.
void print(llvm::raw_ostream &OS, const PrintingPolicy &PP) const
Prints the node to the given output stream.
Represents a reference to #emded data.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
An expression trait intrinsic.
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
ForStmt - This represents a 'for (init;cond;inc)' stmt.
ArrayRef< ParmVarDecl * > parameters() const
bool isVariadic() const
Whether this function is variadic.
Represents a reference to a function parameter pack or init-capture pack that has been substituted bu...
Represents a prototype with parameter type info, e.g.
void printExceptionSpecification(raw_ostream &OS, const PrintingPolicy &Policy) const
FunctionType - C99 6.7.5.3 - Function Declarators.
This represents a GCC inline-assembly statement extension.
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
Represents a C11 generic selection.
AssociationTy< false > Association
GotoStmt - This represents a direct goto.
This class represents temporary values used to represent inout and out arguments in HLSL.
One of these records is kept for each identifier that is lexed.
StringRef getName() const
Return the actual identifier string.
IfStmt - This represents an if/then/else.
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Represents an implicitly-generated value initialization of an object of a given type.
IndirectGotoStmt - This represents an indirect goto.
Describes an C or C++ initializer list.
LabelStmt - Represents a label, which has a substatement.
Describes the capture of a variable or of this, or of a C++1y init-capture.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
llvm::RoundingMode RoundingMode
FPExceptionModeKind
Possible floating point exception behavior.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
This represents a Microsoft inline-assembly statement extension.
Representation of a Microsoft __if_exists or __if_not_exists statement with a dependent name.
A member reference to an MSPropertyDecl.
MS property subscript expression.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
A C++ nested-name-specifier augmented with source location information.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
void print(raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false) const
Print this nested name specifier to the given output stream.
Represents a place-holder for an object not to be initialized by anything.
NullStmt - This is the null statement ";": C99 6.8.3p3.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
This represents '#pragma omp atomic' directive.
This represents '#pragma omp barrier' directive.
This represents '#pragma omp cancel' directive.
This represents '#pragma omp cancellation point' directive.
Representation of an OpenMP canonical loop.
This represents '#pragma omp critical' directive.
This represents implicit clause 'depend' for the '#pragma omp task' directive.
This represents '#pragma omp depobj' directive.
This represents '#pragma omp dispatch' directive.
This represents '#pragma omp distribute' directive.
This represents '#pragma omp distribute parallel for' composite directive.
This represents '#pragma omp distribute parallel for simd' composite directive.
This represents '#pragma omp distribute simd' composite directive.
This represents '#pragma omp error' directive.
This is a basic class for representing single OpenMP executable directive.
This represents '#pragma omp flush' directive.
This represents '#pragma omp for' directive.
This represents '#pragma omp for simd' directive.
This represents '#pragma omp loop' directive.
Represents the '#pragma omp interchange' loop transformation directive.
This represents '#pragma omp interop' directive.
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
This represents '#pragma omp masked' directive.
This represents '#pragma omp masked taskloop' directive.
This represents '#pragma omp masked taskloop simd' directive.
This represents '#pragma omp master' directive.
This represents '#pragma omp master taskloop' directive.
This represents '#pragma omp master taskloop simd' directive.
This represents '#pragma omp ordered' directive.
This represents '#pragma omp parallel' directive.
This represents '#pragma omp parallel for' directive.
This represents '#pragma omp parallel for simd' directive.
This represents '#pragma omp parallel loop' directive.
This represents '#pragma omp parallel masked' directive.
This represents '#pragma omp parallel masked taskloop' directive.
This represents '#pragma omp parallel masked taskloop simd' directive.
This represents '#pragma omp parallel master' directive.
This represents '#pragma omp parallel master taskloop' directive.
This represents '#pragma omp parallel master taskloop simd' directive.
This represents '#pragma omp parallel sections' directive.
Represents the '#pragma omp reverse' loop transformation directive.
This represents '#pragma omp scan' directive.
This represents '#pragma omp scope' directive.
This represents '#pragma omp section' directive.
This represents '#pragma omp sections' directive.
This represents '#pragma omp simd' directive.
This represents '#pragma omp single' directive.
This represents '#pragma omp target data' directive.
This represents '#pragma omp target' directive.
This represents '#pragma omp target enter data' directive.
This represents '#pragma omp target exit data' directive.
This represents '#pragma omp target parallel' directive.
This represents '#pragma omp target parallel for' directive.
This represents '#pragma omp target parallel for simd' directive.
This represents '#pragma omp target parallel loop' directive.
This represents '#pragma omp target simd' directive.
This represents '#pragma omp target teams' directive.
This represents '#pragma omp target teams distribute' combined directive.
This represents '#pragma omp target teams distribute parallel for' combined directive.
This represents '#pragma omp target teams distribute parallel for simd' combined directive.
This represents '#pragma omp target teams distribute simd' combined directive.
This represents '#pragma omp target teams loop' directive.
This represents '#pragma omp target update' directive.
This represents '#pragma omp task' directive.
This represents '#pragma omp taskloop' directive.
This represents '#pragma omp taskloop simd' directive.
This represents '#pragma omp taskgroup' directive.
This represents '#pragma omp taskwait' directive.
This represents '#pragma omp taskyield' directive.
This represents '#pragma omp teams' directive.
This represents '#pragma omp teams distribute' directive.
This represents '#pragma omp teams distribute parallel for' composite directive.
This represents '#pragma omp teams distribute parallel for simd' composite directive.
This represents '#pragma omp teams distribute simd' combined directive.
This represents '#pragma omp teams loop' directive.
This represents the '#pragma omp tile' loop transformation directive.
This represents the '#pragma omp unroll' loop transformation directive.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Represents Objective-C's @catch statement.
Represents Objective-C's @finally statement.
Represents Objective-C's @synchronized statement.
Represents Objective-C's @throw statement.
Represents Objective-C's @try ... @catch ... @finally statement.
Represents Objective-C's @autoreleasepool Statement.
A runtime availability query.
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
ObjCBoxedExpr - used for generalized expression boxing.
An Objective-C "bridged" cast expression, which casts between Objective-C pointers and C pointers,...
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
ObjCEncodeExpr, used for @encode in Objective-C.
Represents Objective-C's collection statement.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
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.
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
ObjCProtocolExpr used for protocol expression in Objective-C.
ObjCSelectorExpr used for @selector in Objective-C.
ObjCStringLiteral, used for Objective-C string literals i.e.
ObjCSubscriptRefExpr - used for array and dictionary subscripting.
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Helper class for OffsetOfExpr.
unsigned getArrayExprIndex() const
For an array element node, returns the index into the array of expressions.
IdentifierInfo * getFieldName() const
For a field or identifier offsetof node, returns the name of the field.
@ 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.
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
This class represents a 'loop' construct.
Represents a C++11 pack expansion that produces a sequence of expressions.
ParenExpr - This represents a parenthesized expression, e.g.
Represents a parameter to a function.
[C99 6.4.2.2] - A predefined identifier such as func.
StringRef getIdentKindName() const
virtual bool handledStmt(Stmt *E, raw_ostream &OS)=0
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
A (possibly-)qualified type.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Represents a __leave statement.
SYCLKernelCallStmt represents the transformation that is applied to the body of a function declared w...
static std::string getPropertyNameFromSetterSelector(Selector Sel)
Return the property name for the given setter selector.
Smart pointer class that efficiently represents Objective-C method names.
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.
bool isUnarySelector() const
unsigned getNumArgs() const
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Represents an expression that computes the length of a parameter pack.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
RetTy Visit(PTR(Stmt) S, ParamTys... P)
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
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
llvm::iterator_range< child_iterator > child_range
void dumpPretty(const ASTContext &Context) const
dumpPretty/printPretty - These two methods do a "pretty print" of the AST back to its original source...
StringLiteral - This represents a string literal expression, e.g.
void outputString(raw_ostream &OS) const
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Represents a reference to a non-type template parameter pack that has been substituted with a non-tem...
SwitchStmt - This represents a 'switch' stmt.
A template argument list.
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.
Represents a template argument.
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.
Stores a list of template parameters for a TemplateDecl and its derived classes.
A container of type source information.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
const T * castAs() const
Member-template castAs<specific type>.
TypoExpr - Internal placeholder for expressions where typo correction still needs to be performed and...
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
static StringRef getOpcodeStr(Opcode Op)
getOpcodeStr - Turn an Opcode enum value into the punctuation char it corresponds to,...
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
Represents a C++ member access expression for which lookup produced a set of overloaded functions.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
@ 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)
Represents a call to the builtin function __builtin_va_arg.
@ CInit
C-style initialization with assignment.
@ CallInit
Call-style initialization (C++98)
WhileStmt - This represents a 'while' stmt.
A static requirement that can be used in a requires-expression to check properties of types and expre...
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ 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,...
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 FunctionProtoType * T
void printTemplateArgumentList(raw_ostream &OS, ArrayRef< TemplateArgument > Args, const PrintingPolicy &Policy, const TemplateParameterList *TPL=nullptr)
Print a template argument list, including the '<' and '>' enclosing the template arguments.
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
CXXNewInitializationStyle
Iterator range representation begin:end[:step].
An element in an Objective-C dictionary literal.
Describes how types, statements, expressions, and declarations should be printed.
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 Indentation
The number of spaces to use to indent each line.
unsigned TerseOutput
Provide a 'terse' output.
unsigned UnderscoreAlignof
Whether we can use '_Alignof' rather than '__alignof'.
unsigned SuppressImplicitBase
When true, don't print the implicit 'self' or 'this' expressions.
Iterator for iterating over Stmt * arrays that contain only T *.