47 #include "llvm/ADT/ArrayRef.h"
48 #include "llvm/ADT/SmallString.h"
49 #include "llvm/ADT/SmallVector.h"
50 #include "llvm/ADT/StringExtras.h"
51 #include "llvm/ADT/StringRef.h"
52 #include "llvm/Support/Casting.h"
53 #include "llvm/Support/Compiler.h"
54 #include "llvm/Support/ErrorHandling.h"
55 #include "llvm/Support/raw_ostream.h"
60 using namespace clang;
68 class StmtPrinter :
public StmtVisitor<StmtPrinter> {
79 StringRef NL =
"\n",
const ASTContext *Context =
nullptr)
80 : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy),
81 NL(NL), Context(Context) {}
85 void PrintStmt(
Stmt *S,
int SubIndent) {
86 IndentLevel += SubIndent;
87 if (isa_and_nonnull<Expr>(S)) {
95 Indent() <<
"<<<NULL STATEMENT>>>" << NL;
97 IndentLevel -= SubIndent;
100 void PrintInitStmt(
Stmt *S,
unsigned PrefixWidth) {
102 IndentLevel += (PrefixWidth + 1) / 2;
103 if (
auto *DS = dyn_cast<DeclStmt>(S))
104 PrintRawDeclStmt(DS);
106 PrintExpr(cast<Expr>(S));
108 IndentLevel -= (PrefixWidth + 1) / 2;
111 void PrintControlledStmt(
Stmt *S) {
112 if (
auto *CS = dyn_cast<CompoundStmt>(S)) {
114 PrintRawCompoundStmt(CS);
123 void PrintRawDecl(
Decl *
D);
124 void PrintRawDeclStmt(
const DeclStmt *S);
125 void PrintRawIfStmt(
IfStmt *If);
131 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)
147 void Visit(
Stmt* S) {
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();
201 Indent() <<
"#pragma clang fp exceptions(";
202 switch (FPO.getSpecifiedExceptionModeOverride()) {
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");
247 void StmtPrinter::PrintRawDecl(
Decl *
D) {
248 D->
print(OS, Policy, IndentLevel);
251 void StmtPrinter::PrintRawDeclStmt(
const DeclStmt *S) {
262 PrintRawDeclStmt(
Node);
268 PrintRawCompoundStmt(
Node);
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);
291 PrintStmt(
Node->getSubStmt(), 0);
296 for (
const auto *
Attr : Attrs) {
298 if (
Attr != Attrs.back())
302 PrintStmt(
Node->getSubStmt(), 0);
305 void 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());
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());
358 void StmtPrinter::VisitIfStmt(
IfStmt *If) {
366 PrintInitStmt(
Node->getInit(), 8);
367 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
368 PrintRawDeclStmt(DS);
370 PrintExpr(
Node->getCond());
372 PrintControlledStmt(
Node->getBody());
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() <<
";";
468 PrintExpr(
Node->getTarget());
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);
575 if (
Node->hasBraces())
577 OS <<
Node->getAsmString() << NL;
578 if (
Node->hasBraces())
583 PrintStmt(
Node->getCapturedDecl()->getBody());
588 if (
auto *TS = dyn_cast<CompoundStmt>(
Node->getTryBody())) {
589 PrintRawCompoundStmt(TS);
595 if (
Decl *DS = catchStmt->getCatchParamDecl())
598 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
599 PrintRawCompoundStmt(CS);
606 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
607 PrintRawCompoundStmt(CS);
617 Indent() <<
"@catch (...) { /* todo */ } " << NL;
622 if (
Node->getThrowExpr()) {
624 PrintExpr(
Node->getThrowExpr());
629 void StmtPrinter::VisitObjCAvailabilityCheckExpr(
631 OS <<
"@available(...)";
635 Indent() <<
"@synchronized (";
636 PrintExpr(
Node->getSynchExpr());
638 PrintRawCompoundStmt(
Node->getSynchBody());
643 Indent() <<
"@autoreleasepool";
644 PrintRawCompoundStmt(cast<CompoundStmt>(
Node->getSubStmt()));
650 if (
Decl *ExDecl =
Node->getExceptionDecl())
651 PrintRawDecl(ExDecl);
655 PrintRawCompoundStmt(cast<CompoundStmt>(
Node->getHandlerBlock()));
660 PrintRawCXXCatchStmt(
Node);
666 PrintRawCompoundStmt(
Node->getTryBlock());
667 for (
unsigned i = 0, e =
Node->getNumHandlers(); i < e; ++i) {
669 PrintRawCXXCatchStmt(
Node->getHandler(i));
675 Indent() << (
Node->getIsCXXTry() ?
"try " :
"__try ");
676 PrintRawCompoundStmt(
Node->getTryBlock());
680 PrintRawSEHExceptHandler(
E);
682 assert(F &&
"Must have a finally block...");
683 PrintRawSEHFinallyStmt(F);
690 PrintRawCompoundStmt(
Node->getBlock());
696 VisitExpr(
Node->getFilterExpr());
698 PrintRawCompoundStmt(
Node->getBlock());
704 PrintRawSEHExceptHandler(
Node);
710 PrintRawSEHFinallyStmt(
Node);
724 PrintStmt(
Node->getLoopStmt());
731 for (
auto *Clause : Clauses)
732 if (Clause && !Clause->isImplicit()) {
734 Printer.Visit(Clause);
737 if (!ForceNoStmt && S->hasAssociatedStmt())
738 PrintStmt(S->getRawStmt());
742 Indent() <<
"#pragma omp metadirective";
743 PrintOMPExecutableDirective(
Node);
747 Indent() <<
"#pragma omp parallel";
748 PrintOMPExecutableDirective(
Node);
752 Indent() <<
"#pragma omp simd";
753 PrintOMPExecutableDirective(
Node);
757 Indent() <<
"#pragma omp tile";
758 PrintOMPExecutableDirective(
Node);
762 Indent() <<
"#pragma omp unroll";
763 PrintOMPExecutableDirective(
Node);
767 Indent() <<
"#pragma omp reverse";
768 PrintOMPExecutableDirective(
Node);
772 Indent() <<
"#pragma omp interchange";
773 PrintOMPExecutableDirective(
Node);
777 Indent() <<
"#pragma omp for";
778 PrintOMPExecutableDirective(
Node);
782 Indent() <<
"#pragma omp for simd";
783 PrintOMPExecutableDirective(
Node);
787 Indent() <<
"#pragma omp sections";
788 PrintOMPExecutableDirective(
Node);
792 Indent() <<
"#pragma omp section";
793 PrintOMPExecutableDirective(
Node);
797 Indent() <<
"#pragma omp scope";
798 PrintOMPExecutableDirective(
Node);
802 Indent() <<
"#pragma omp single";
803 PrintOMPExecutableDirective(
Node);
807 Indent() <<
"#pragma omp master";
808 PrintOMPExecutableDirective(
Node);
812 Indent() <<
"#pragma omp critical";
813 if (
Node->getDirectiveName().getName()) {
815 Node->getDirectiveName().printName(OS, Policy);
818 PrintOMPExecutableDirective(
Node);
822 Indent() <<
"#pragma omp parallel for";
823 PrintOMPExecutableDirective(
Node);
826 void StmtPrinter::VisitOMPParallelForSimdDirective(
828 Indent() <<
"#pragma omp parallel for simd";
829 PrintOMPExecutableDirective(
Node);
832 void StmtPrinter::VisitOMPParallelMasterDirective(
834 Indent() <<
"#pragma omp parallel master";
835 PrintOMPExecutableDirective(
Node);
838 void StmtPrinter::VisitOMPParallelMaskedDirective(
840 Indent() <<
"#pragma omp parallel masked";
841 PrintOMPExecutableDirective(
Node);
844 void StmtPrinter::VisitOMPParallelSectionsDirective(
846 Indent() <<
"#pragma omp parallel sections";
847 PrintOMPExecutableDirective(
Node);
851 Indent() <<
"#pragma omp task";
852 PrintOMPExecutableDirective(
Node);
856 Indent() <<
"#pragma omp taskyield";
857 PrintOMPExecutableDirective(
Node);
861 Indent() <<
"#pragma omp barrier";
862 PrintOMPExecutableDirective(
Node);
866 Indent() <<
"#pragma omp taskwait";
867 PrintOMPExecutableDirective(
Node);
871 Indent() <<
"#pragma omp assume";
872 PrintOMPExecutableDirective(
Node);
876 Indent() <<
"#pragma omp error";
877 PrintOMPExecutableDirective(
Node);
881 Indent() <<
"#pragma omp taskgroup";
882 PrintOMPExecutableDirective(
Node);
886 Indent() <<
"#pragma omp flush";
887 PrintOMPExecutableDirective(
Node);
891 Indent() <<
"#pragma omp depobj";
892 PrintOMPExecutableDirective(
Node);
896 Indent() <<
"#pragma omp scan";
897 PrintOMPExecutableDirective(
Node);
901 Indent() <<
"#pragma omp ordered";
906 Indent() <<
"#pragma omp atomic";
907 PrintOMPExecutableDirective(
Node);
911 Indent() <<
"#pragma omp target";
912 PrintOMPExecutableDirective(
Node);
916 Indent() <<
"#pragma omp target data";
917 PrintOMPExecutableDirective(
Node);
920 void StmtPrinter::VisitOMPTargetEnterDataDirective(
922 Indent() <<
"#pragma omp target enter data";
923 PrintOMPExecutableDirective(
Node,
true);
926 void StmtPrinter::VisitOMPTargetExitDataDirective(
928 Indent() <<
"#pragma omp target exit data";
929 PrintOMPExecutableDirective(
Node,
true);
932 void StmtPrinter::VisitOMPTargetParallelDirective(
934 Indent() <<
"#pragma omp target parallel";
935 PrintOMPExecutableDirective(
Node);
938 void StmtPrinter::VisitOMPTargetParallelForDirective(
940 Indent() <<
"#pragma omp target parallel for";
941 PrintOMPExecutableDirective(
Node);
945 Indent() <<
"#pragma omp teams";
946 PrintOMPExecutableDirective(
Node);
949 void StmtPrinter::VisitOMPCancellationPointDirective(
951 Indent() <<
"#pragma omp cancellation point "
952 << getOpenMPDirectiveName(
Node->getCancelRegion());
953 PrintOMPExecutableDirective(
Node);
957 Indent() <<
"#pragma omp cancel "
958 << getOpenMPDirectiveName(
Node->getCancelRegion());
959 PrintOMPExecutableDirective(
Node);
963 Indent() <<
"#pragma omp taskloop";
964 PrintOMPExecutableDirective(
Node);
967 void StmtPrinter::VisitOMPTaskLoopSimdDirective(
969 Indent() <<
"#pragma omp taskloop simd";
970 PrintOMPExecutableDirective(
Node);
973 void StmtPrinter::VisitOMPMasterTaskLoopDirective(
975 Indent() <<
"#pragma omp master taskloop";
976 PrintOMPExecutableDirective(
Node);
979 void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
981 Indent() <<
"#pragma omp masked taskloop";
982 PrintOMPExecutableDirective(
Node);
985 void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
987 Indent() <<
"#pragma omp master taskloop simd";
988 PrintOMPExecutableDirective(
Node);
991 void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
993 Indent() <<
"#pragma omp masked taskloop simd";
994 PrintOMPExecutableDirective(
Node);
997 void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
999 Indent() <<
"#pragma omp parallel master taskloop";
1000 PrintOMPExecutableDirective(
Node);
1003 void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1005 Indent() <<
"#pragma omp parallel masked taskloop";
1006 PrintOMPExecutableDirective(
Node);
1009 void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1011 Indent() <<
"#pragma omp parallel master taskloop simd";
1012 PrintOMPExecutableDirective(
Node);
1015 void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1017 Indent() <<
"#pragma omp parallel masked taskloop simd";
1018 PrintOMPExecutableDirective(
Node);
1022 Indent() <<
"#pragma omp distribute";
1023 PrintOMPExecutableDirective(
Node);
1026 void StmtPrinter::VisitOMPTargetUpdateDirective(
1028 Indent() <<
"#pragma omp target update";
1029 PrintOMPExecutableDirective(
Node,
true);
1032 void StmtPrinter::VisitOMPDistributeParallelForDirective(
1034 Indent() <<
"#pragma omp distribute parallel for";
1035 PrintOMPExecutableDirective(
Node);
1038 void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1040 Indent() <<
"#pragma omp distribute parallel for simd";
1041 PrintOMPExecutableDirective(
Node);
1044 void StmtPrinter::VisitOMPDistributeSimdDirective(
1046 Indent() <<
"#pragma omp distribute simd";
1047 PrintOMPExecutableDirective(
Node);
1050 void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1052 Indent() <<
"#pragma omp target parallel for simd";
1053 PrintOMPExecutableDirective(
Node);
1057 Indent() <<
"#pragma omp target simd";
1058 PrintOMPExecutableDirective(
Node);
1061 void StmtPrinter::VisitOMPTeamsDistributeDirective(
1063 Indent() <<
"#pragma omp teams distribute";
1064 PrintOMPExecutableDirective(
Node);
1067 void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1069 Indent() <<
"#pragma omp teams distribute simd";
1070 PrintOMPExecutableDirective(
Node);
1073 void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1075 Indent() <<
"#pragma omp teams distribute parallel for simd";
1076 PrintOMPExecutableDirective(
Node);
1079 void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1081 Indent() <<
"#pragma omp teams distribute parallel for";
1082 PrintOMPExecutableDirective(
Node);
1086 Indent() <<
"#pragma omp target teams";
1087 PrintOMPExecutableDirective(
Node);
1090 void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1092 Indent() <<
"#pragma omp target teams distribute";
1093 PrintOMPExecutableDirective(
Node);
1096 void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1098 Indent() <<
"#pragma omp target teams distribute parallel for";
1099 PrintOMPExecutableDirective(
Node);
1102 void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1104 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1105 PrintOMPExecutableDirective(
Node);
1108 void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1110 Indent() <<
"#pragma omp target teams distribute simd";
1111 PrintOMPExecutableDirective(
Node);
1115 Indent() <<
"#pragma omp interop";
1116 PrintOMPExecutableDirective(
Node);
1120 Indent() <<
"#pragma omp dispatch";
1121 PrintOMPExecutableDirective(
Node);
1125 Indent() <<
"#pragma omp masked";
1126 PrintOMPExecutableDirective(
Node);
1130 Indent() <<
"#pragma omp loop";
1131 PrintOMPExecutableDirective(
Node);
1134 void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1136 Indent() <<
"#pragma omp teams loop";
1137 PrintOMPExecutableDirective(
Node);
1140 void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1142 Indent() <<
"#pragma omp target teams loop";
1143 PrintOMPExecutableDirective(
Node);
1146 void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1148 Indent() <<
"#pragma omp parallel loop";
1149 PrintOMPExecutableDirective(
Node);
1152 void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1154 Indent() <<
"#pragma omp target parallel loop";
1155 PrintOMPExecutableDirective(
Node);
1162 Indent() <<
"#pragma acc " << S->getDirectiveKind();
1164 if (!S->clauses().empty()) {
1167 Printer.VisitClauseList(S->clauses());
1171 PrintStmt(S->getStructuredBlock());
1175 Indent() <<
"#pragma acc loop";
1177 if (!S->clauses().empty()) {
1180 Printer.VisitClauseList(S->clauses());
1184 PrintStmt(S->getLoop());
1192 OS <<
Node->getBuiltinStr() <<
"()";
1196 llvm::report_fatal_error(
"Not implemented");
1200 PrintExpr(
Node->getSubExpr());
1204 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(
Node->getDecl())) {
1205 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1208 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(
Node->getDecl())) {
1209 TPOD->printAsExpr(OS, Policy);
1214 if (
Node->hasTemplateKeyword())
1217 isa<ParmVarDecl, NonTypeTemplateParmDecl>(
Node->getDecl()) &&
1218 Node->getDecl()->getIdentifier())
1219 OS <<
Node->getDecl()->getIdentifier()->deuglifiedName();
1221 Node->getNameInfo().printName(OS, Policy);
1222 if (
Node->hasExplicitTemplateArgs()) {
1224 if (!
Node->hadMultipleCandidates())
1225 if (
auto *TD = dyn_cast<TemplateDecl>(
Node->getDecl()))
1226 TPL = TD->getTemplateParameters();
1231 void StmtPrinter::VisitDependentScopeDeclRefExpr(
1235 if (
Node->hasTemplateKeyword())
1237 OS <<
Node->getNameInfo();
1238 if (
Node->hasExplicitTemplateArgs())
1243 if (
Node->getQualifier())
1244 Node->getQualifier()->
print(OS, Policy);
1245 if (
Node->hasTemplateKeyword())
1247 OS <<
Node->getNameInfo();
1248 if (
Node->hasExplicitTemplateArgs())
1253 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
1254 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1256 DRE->getBeginLoc().isInvalid())
1264 if (
Node->getBase()) {
1267 PrintExpr(
Node->getBase());
1268 OS << (
Node->isArrow() ?
"->" :
".");
1271 OS << *
Node->getDecl();
1275 if (
Node->isSuperReceiver())
1277 else if (
Node->isObjectReceiver() &&
Node->getBase()) {
1278 PrintExpr(
Node->getBase());
1280 }
else if (
Node->isClassReceiver() &&
Node->getClassReceiver()) {
1281 OS <<
Node->getClassReceiver()->getName() <<
".";
1284 if (
Node->isImplicitProperty()) {
1285 if (
const auto *Getter =
Node->getImplicitPropertyGetter())
1286 Getter->getSelector().
print(OS);
1289 Node->getImplicitPropertySetter()->getSelector());
1291 OS <<
Node->getExplicitProperty()->getName();
1295 PrintExpr(
Node->getBaseExpr());
1297 PrintExpr(
Node->getKeyExpr());
1301 void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1303 OS <<
"__builtin_sycl_unique_stable_name(";
1304 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1309 OS <<
"__builtin_sycl_unique_stable_id(";
1310 PrintExpr(
Node->getExpr());
1328 bool Invalid =
false;
1342 bool isSigned =
Node->getType()->isSignedIntegerType();
1345 if (isa<BitIntType>(
Node->getType())) {
1346 OS << (isSigned ?
"wb" :
"uwb");
1352 default: llvm_unreachable(
"Unexpected type for integer literal!");
1353 case BuiltinType::Char_S:
1354 case BuiltinType::Char_U: OS <<
"i8";
break;
1355 case BuiltinType::UChar: OS <<
"Ui8";
break;
1356 case BuiltinType::SChar: OS <<
"i8";
break;
1357 case BuiltinType::Short: OS <<
"i16";
break;
1358 case BuiltinType::UShort: OS <<
"Ui16";
break;
1359 case BuiltinType::Int:
break;
1360 case BuiltinType::UInt: OS <<
'U';
break;
1361 case BuiltinType::Long: OS <<
'L';
break;
1362 case BuiltinType::ULong: OS <<
"UL";
break;
1363 case BuiltinType::LongLong: OS <<
"LL";
break;
1364 case BuiltinType::ULongLong: OS <<
"ULL";
break;
1365 case BuiltinType::Int128:
1367 case BuiltinType::UInt128:
1369 case BuiltinType::WChar_S:
1370 case BuiltinType::WChar_U:
1378 OS <<
Node->getValueAsString(10);
1381 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1382 case BuiltinType::ShortFract: OS <<
"hr";
break;
1383 case BuiltinType::ShortAccum: OS <<
"hk";
break;
1384 case BuiltinType::UShortFract: OS <<
"uhr";
break;
1385 case BuiltinType::UShortAccum: OS <<
"uhk";
break;
1386 case BuiltinType::Fract: OS <<
"r";
break;
1387 case BuiltinType::Accum: OS <<
"k";
break;
1388 case BuiltinType::UFract: OS <<
"ur";
break;
1389 case BuiltinType::UAccum: OS <<
"uk";
break;
1390 case BuiltinType::LongFract: OS <<
"lr";
break;
1391 case BuiltinType::LongAccum: OS <<
"lk";
break;
1392 case BuiltinType::ULongFract: OS <<
"ulr";
break;
1393 case BuiltinType::ULongAccum: OS <<
"ulk";
break;
1400 Node->getValue().toString(Str);
1402 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1410 default: llvm_unreachable(
"Unexpected type for float literal!");
1411 case BuiltinType::Half:
break;
1412 case BuiltinType::Ibm128:
break;
1413 case BuiltinType::Double:
break;
1414 case BuiltinType::Float16: OS <<
"F16";
break;
1416 case BuiltinType::LongDouble: OS <<
'L';
break;
1417 case BuiltinType::Float128: OS <<
'Q';
break;
1428 PrintExpr(
Node->getSubExpr());
1438 PrintExpr(
Node->getSubExpr());
1443 if (!
Node->isPostfix()) {
1448 switch (
Node->getOpcode()) {
1457 if (isa<UnaryOperator>(
Node->getSubExpr()))
1462 PrintExpr(
Node->getSubExpr());
1464 if (
Node->isPostfix())
1469 OS <<
"__builtin_offsetof(";
1470 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1472 bool PrintedSomething =
false;
1473 for (
unsigned i = 0, n =
Node->getNumComponents(); i < n; ++i) {
1480 PrintedSomething =
true;
1493 if (PrintedSomething)
1496 PrintedSomething =
true;
1497 OS <<
Id->getName();
1502 void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1505 if (
Node->getKind() == UETT_AlignOf) {
1507 Spelling =
"alignof";
1509 Spelling =
"_Alignof";
1511 Spelling =
"__alignof";
1516 if (
Node->isArgumentType()) {
1518 Node->getArgumentType().
print(OS, Policy);
1522 PrintExpr(
Node->getArgumentExpr());
1528 if (
Node->isExprPredicate())
1529 PrintExpr(
Node->getControllingExpr());
1531 Node->getControllingType()->getType().
print(OS, Policy);
1539 T.print(OS, Policy);
1541 PrintExpr(Assoc.getAssociationExpr());
1547 PrintExpr(
Node->getLHS());
1549 PrintExpr(
Node->getRHS());
1554 PrintExpr(
Node->getBase());
1556 PrintExpr(
Node->getRowIdx());
1559 PrintExpr(
Node->getColumnIdx());
1564 PrintExpr(
Node->getBase());
1566 if (
Node->getLowerBound())
1567 PrintExpr(
Node->getLowerBound());
1568 if (
Node->getColonLocFirst().isValid()) {
1570 if (
Node->getLength())
1571 PrintExpr(
Node->getLength());
1573 if (
Node->isOMPArraySection() &&
Node->getColonLocSecond().isValid()) {
1575 if (
Node->getStride())
1576 PrintExpr(
Node->getStride());
1589 PrintExpr(
Node->getBase());
1594 for (
unsigned I = 0,
E =
Node->numOfIterators(); I <
E; ++I) {
1595 auto *VD = cast<ValueDecl>(
Node->getIteratorDecl(I));
1596 VD->getType().print(OS, Policy);
1598 OS <<
" " << VD->getName() <<
" = ";
1599 PrintExpr(
Range.Begin);
1601 PrintExpr(
Range.End);
1604 PrintExpr(
Range.Step);
1612 void StmtPrinter::PrintCallArgs(
CallExpr *Call) {
1613 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1614 if (isa<CXXDefaultArgExpr>(
Call->getArg(i))) {
1620 PrintExpr(
Call->getArg(i));
1624 void StmtPrinter::VisitCallExpr(
CallExpr *Call) {
1625 PrintExpr(
Call->getCallee());
1627 PrintCallArgs(Call);
1632 if (
const auto *TE = dyn_cast<CXXThisExpr>(
E))
1633 return TE->isImplicit();
1639 PrintExpr(
Node->getBase());
1641 auto *ParentMember = dyn_cast<MemberExpr>(
Node->getBase());
1643 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1647 OS << (
Node->isArrow() ?
"->" :
".");
1650 if (
auto *FD = dyn_cast<FieldDecl>(
Node->getMemberDecl()))
1651 if (FD->isAnonymousStructOrUnion())
1656 if (
Node->hasTemplateKeyword())
1658 OS <<
Node->getMemberNameInfo();
1660 if (
auto *FD = dyn_cast<FunctionDecl>(
Node->getMemberDecl())) {
1661 if (!
Node->hadMultipleCandidates())
1662 if (
auto *FTD = FD->getPrimaryTemplate())
1663 TPL = FTD->getTemplateParameters();
1664 }
else if (
auto *VTSD =
1665 dyn_cast<VarTemplateSpecializationDecl>(
Node->getMemberDecl()))
1666 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1667 if (
Node->hasExplicitTemplateArgs())
1672 PrintExpr(
Node->getBase());
1673 OS << (
Node->isArrow() ?
"->isa" :
".isa");
1677 PrintExpr(
Node->getBase());
1679 OS <<
Node->getAccessor().getName();
1684 Node->getTypeAsWritten().
print(OS, Policy);
1686 PrintExpr(
Node->getSubExpr());
1693 PrintExpr(
Node->getInitializer());
1698 PrintExpr(
Node->getSubExpr());
1702 PrintExpr(
Node->getLHS());
1704 PrintExpr(
Node->getRHS());
1708 PrintExpr(
Node->getLHS());
1710 PrintExpr(
Node->getRHS());
1714 PrintExpr(
Node->getCond());
1716 PrintExpr(
Node->getLHS());
1718 PrintExpr(
Node->getRHS());
1725 PrintExpr(
Node->getCommon());
1727 PrintExpr(
Node->getFalseExpr());
1731 OS <<
"&&" <<
Node->getLabel()->getName();
1734 void StmtPrinter::VisitStmtExpr(
StmtExpr *
E) {
1736 PrintRawCompoundStmt(
E->getSubStmt());
1741 OS <<
"__builtin_choose_expr(";
1742 PrintExpr(
Node->getCond());
1744 PrintExpr(
Node->getLHS());
1746 PrintExpr(
Node->getRHS());
1750 void StmtPrinter::VisitGNUNullExpr(
GNUNullExpr *) {
1755 OS <<
"__builtin_shufflevector(";
1756 for (
unsigned i = 0, e =
Node->getNumSubExprs(); i != e; ++i) {
1758 PrintExpr(
Node->getExpr(i));
1764 OS <<
"__builtin_convertvector(";
1765 PrintExpr(
Node->getSrcExpr());
1772 if (
Node->getSyntacticForm()) {
1773 Visit(
Node->getSyntacticForm());
1778 for (
unsigned i = 0, e =
Node->getNumInits(); i != e; ++i) {
1780 if (
Node->getInit(i))
1781 PrintExpr(
Node->getInit(i));
1792 PrintExpr(
Node->getSubExpr());
1802 for (
unsigned i = 0, e =
Node->getNumExprs(); i != e; ++i) {
1804 PrintExpr(
Node->getExpr(i));
1810 bool NeedsEquals =
true;
1812 if (
D.isFieldDesignator()) {
1813 if (
D.getDotLoc().isInvalid()) {
1815 OS << II->getName() <<
":";
1816 NeedsEquals =
false;
1819 OS <<
"." <<
D.getFieldName()->getName();
1823 if (
D.isArrayDesignator()) {
1824 PrintExpr(
Node->getArrayIndex(
D));
1826 PrintExpr(
Node->getArrayRangeStart(
D));
1828 PrintExpr(
Node->getArrayRangeEnd(
D));
1838 PrintExpr(
Node->getInit());
1841 void StmtPrinter::VisitDesignatedInitUpdateExpr(
1845 PrintExpr(
Node->getBase());
1848 OS <<
"/*updater*/";
1849 PrintExpr(
Node->getUpdater());
1854 OS <<
"/*no init*/";
1858 if (
Node->getType()->getAsCXXRecordDecl()) {
1859 OS <<
"/*implicit*/";
1863 OS <<
"/*implicit*/(";
1866 if (
Node->getType()->isRecordType())
1874 OS <<
"__builtin_va_arg(";
1875 PrintExpr(
Node->getSubExpr());
1882 PrintExpr(
Node->getSyntacticForm());
1886 const char *Name =
nullptr;
1887 switch (
Node->getOp()) {
1888 #define BUILTIN(ID, TYPE, ATTRS)
1889 #define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1890 case AtomicExpr::AO ## ID: \
1893 #include "clang/Basic/Builtins.inc"
1898 PrintExpr(
Node->getPtr());
1899 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1900 Node->getOp() != AtomicExpr::AO__atomic_load_n &&
1901 Node->getOp() != AtomicExpr::AO__scoped_atomic_load_n &&
1902 Node->getOp() != AtomicExpr::AO__opencl_atomic_load &&
1903 Node->getOp() != AtomicExpr::AO__hip_atomic_load) {
1905 PrintExpr(
Node->getVal1());
1907 if (
Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1908 Node->isCmpXChg()) {
1910 PrintExpr(
Node->getVal2());
1912 if (
Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1913 Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1915 PrintExpr(
Node->getWeak());
1917 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_init &&
1918 Node->getOp() != AtomicExpr::AO__opencl_atomic_init) {
1920 PrintExpr(
Node->getOrder());
1922 if (
Node->isCmpXChg()) {
1924 PrintExpr(
Node->getOrderFail());
1932 if (
Kind == OO_PlusPlus ||
Kind == OO_MinusMinus) {
1933 if (
Node->getNumArgs() == 1) {
1935 PrintExpr(
Node->getArg(0));
1937 PrintExpr(
Node->getArg(0));
1940 }
else if (
Kind == OO_Arrow) {
1941 PrintExpr(
Node->getArg(0));
1942 }
else if (
Kind == OO_Call ||
Kind == OO_Subscript) {
1943 PrintExpr(
Node->getArg(0));
1944 OS << (
Kind == OO_Call ?
'(' :
'[');
1945 for (
unsigned ArgIdx = 1; ArgIdx <
Node->getNumArgs(); ++ArgIdx) {
1948 if (!isa<CXXDefaultArgExpr>(
Node->getArg(ArgIdx)))
1949 PrintExpr(
Node->getArg(ArgIdx));
1951 OS << (
Kind == OO_Call ?
')' :
']');
1952 }
else if (
Node->getNumArgs() == 1) {
1954 PrintExpr(
Node->getArg(0));
1955 }
else if (
Node->getNumArgs() == 2) {
1956 PrintExpr(
Node->getArg(0));
1958 PrintExpr(
Node->getArg(1));
1960 llvm_unreachable(
"unknown overloaded operator");
1967 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
1968 PrintExpr(
Node->getImplicitObjectArgument());
1971 VisitCallExpr(cast<CallExpr>(
Node));
1975 PrintExpr(
Node->getCallee());
1977 PrintCallArgs(
Node->getConfig());
1979 PrintCallArgs(
Node);
1983 void StmtPrinter::VisitCXXRewrittenBinaryOperator(
1986 Node->getDecomposedForm();
1987 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
1989 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
1993 OS <<
Node->getCastName() <<
'<';
1994 Node->getTypeAsWritten().
print(OS, Policy);
1996 PrintExpr(
Node->getSubExpr());
2001 VisitCXXNamedCastExpr(
Node);
2005 VisitCXXNamedCastExpr(
Node);
2009 VisitCXXNamedCastExpr(
Node);
2013 VisitCXXNamedCastExpr(
Node);
2017 OS <<
"__builtin_bit_cast(";
2018 Node->getTypeInfoAsWritten()->getType().
print(OS, Policy);
2020 PrintExpr(
Node->getSubExpr());
2025 OS <<
"__builtin_num_fields(";
2026 E->getSourceType().print(OS, Policy);
2031 OS <<
"__builtin_field_type(";
2032 E->getSourceType().print(OS, Policy);
2034 PrintExpr(
E->getIndex());
2039 OS <<
"__builtin_num_bases(";
2040 E->getSourceType().print(OS, Policy);
2045 OS <<
"__builtin_base_type(";
2046 E->getSourceType().print(OS, Policy);
2048 PrintExpr(
E->getIndex());
2053 VisitCXXNamedCastExpr(
Node);
2058 if (
Node->isTypeOperand()) {
2059 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
2061 PrintExpr(
Node->getExprOperand());
2068 if (
Node->isTypeOperand()) {
2069 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
2071 PrintExpr(
Node->getExprOperand());
2077 PrintExpr(
Node->getBaseExpr());
2078 if (
Node->isArrow())
2083 Node->getQualifierLoc().getNestedNameSpecifier())
2085 OS <<
Node->getPropertyDecl()->getDeclName();
2089 PrintExpr(
Node->getBase());
2091 PrintExpr(
Node->getIdx());
2096 switch (
Node->getLiteralOperatorKind()) {
2098 OS << cast<StringLiteral>(
Node->getArg(0)->IgnoreImpCasts())->getString();
2101 const auto *DRE = cast<DeclRefExpr>(
Node->getCallee()->IgnoreImpCasts());
2103 cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
2108 if (!DRE->hadMultipleCandidates())
2109 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2110 TPL = TD->getTemplateParameters();
2111 OS <<
"operator\"\"" <<
Node->getUDSuffix()->getName();
2119 char C = (char)
P.getAsIntegral().getZExtValue();
2126 const auto *
Int = cast<IntegerLiteral>(
Node->getCookedLiteral());
2132 auto *
Float = cast<FloatingLiteral>(
Node->getCookedLiteral());
2138 PrintExpr(
Node->getCookedLiteral());
2141 OS <<
Node->getUDSuffix()->getName();
2145 OS << (
Node->getValue() ?
"true" :
"false");
2157 if (!
Node->getSubExpr())
2161 PrintExpr(
Node->getSubExpr());
2174 auto TargetType =
Node->getType();
2175 auto *
Auto = TargetType->getContainedDeducedType();
2176 bool Bare =
Auto &&
Auto->isDeduced();
2181 TargetType.print(OS, Policy);
2186 if (!
Node->isListInitialization())
2188 PrintExpr(
Node->getSubExpr());
2189 if (!
Node->isListInitialization())
2194 PrintExpr(
Node->getSubExpr());
2199 if (
Node->isStdInitListInitialization())
2201 else if (
Node->isListInitialization())
2206 ArgEnd =
Node->arg_end();
2207 Arg != ArgEnd; ++Arg) {
2208 if ((*Arg)->isDefaultArgument())
2210 if (Arg !=
Node->arg_begin())
2214 if (
Node->isStdInitListInitialization())
2216 else if (
Node->isListInitialization())
2224 bool NeedComma =
false;
2225 switch (
Node->getCaptureDefault()) {
2240 CEnd =
Node->explicit_capture_end();
2243 if (
C->capturesVLAType())
2250 switch (
C->getCaptureKind()) {
2262 OS <<
C->getCapturedVar()->getName();
2266 OS <<
C->getCapturedVar()->getName();
2270 llvm_unreachable(
"VLA type in explicit captures.");
2273 if (
C->isPackExpansion())
2276 if (
Node->isInitCapture(C)) {
2278 auto *
D = cast<VarDecl>(
C->getCapturedVar());
2280 llvm::StringRef
Pre;
2281 llvm::StringRef
Post;
2283 !isa<ParenListExpr>(
D->getInit())) {
2291 PrintExpr(
D->getInit());
2297 if (!
Node->getExplicitTemplateParameters().empty()) {
2298 Node->getTemplateParameterList()->
print(
2299 OS,
Node->getLambdaClass()->getASTContext(),
2303 if (
Node->hasExplicitParameters()) {
2313 std::string ParamStr =
2315 ?
P->getIdentifier()->deuglifiedName().str()
2316 :
P->getNameAsString();
2317 P->getOriginalType().print(OS, Policy, ParamStr);
2326 if (
Node->isMutable())
2335 if (
Node->hasExplicitResultType()) {
2337 Proto->getReturnType().print(OS, Policy);
2346 PrintRawCompoundStmt(
Node->getCompoundStmtBody());
2351 TSInfo->getType().print(OS, Policy);
2357 void StmtPrinter::VisitCXXNewExpr(
CXXNewExpr *
E) {
2358 if (
E->isGlobalNew())
2361 unsigned NumPlace =
E->getNumPlacementArgs();
2362 if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(
E->getPlacementArg(0))) {
2364 PrintExpr(
E->getPlacementArg(0));
2365 for (
unsigned i = 1; i < NumPlace; ++i) {
2366 if (isa<CXXDefaultArgExpr>(
E->getPlacementArg(i)))
2369 PrintExpr(
E->getPlacementArg(i));
2373 if (
E->isParenTypeId())
2377 llvm::raw_string_ostream
s(TypeS);
2379 if (std::optional<Expr *> Size =
E->getArraySize())
2380 (*Size)->printPretty(
s, Helper, Policy);
2383 E->getAllocatedType().print(OS, Policy, TypeS);
2384 if (
E->isParenTypeId())
2390 !isa<ParenListExpr>(
E->getInitializer());
2393 PrintExpr(
E->getInitializer());
2400 if (
E->isGlobalDelete())
2403 if (
E->isArrayForm())
2405 PrintExpr(
E->getArgument());
2409 PrintExpr(
E->getBase());
2414 if (
E->getQualifier())
2415 E->getQualifier()->print(OS, Policy);
2419 OS << II->getName();
2421 E->getDestroyedType().print(OS, Policy);
2425 if (
E->isListInitialization() && !
E->isStdInitListInitialization())
2428 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
2429 if (isa<CXXDefaultArgExpr>(
E->getArg(i))) {
2435 PrintExpr(
E->getArg(i));
2438 if (
E->isListInitialization() && !
E->isStdInitListInitialization())
2444 OS <<
"<forwarded>";
2448 PrintExpr(
E->getSubExpr());
2453 PrintExpr(
E->getSubExpr());
2456 void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2458 Node->getTypeAsWritten().
print(OS, Policy);
2459 if (!
Node->isListInitialization())
2461 for (
auto Arg =
Node->arg_begin(), ArgEnd =
Node->arg_end(); Arg != ArgEnd;
2463 if (Arg !=
Node->arg_begin())
2467 if (!
Node->isListInitialization())
2471 void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2473 if (!
Node->isImplicitAccess()) {
2474 PrintExpr(
Node->getBase());
2475 OS << (
Node->isArrow() ?
"->" :
".");
2479 if (
Node->hasTemplateKeyword())
2481 OS <<
Node->getMemberNameInfo();
2482 if (
Node->hasExplicitTemplateArgs())
2487 if (!
Node->isImplicitAccess()) {
2488 PrintExpr(
Node->getBase());
2489 OS << (
Node->isArrow() ?
"->" :
".");
2493 if (
Node->hasTemplateKeyword())
2495 OS <<
Node->getMemberNameInfo();
2496 if (
Node->hasExplicitTemplateArgs())
2502 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I) {
2512 E->getQueriedType().print(OS, Policy);
2518 PrintExpr(
E->getQueriedExpression());
2524 PrintExpr(
E->getOperand());
2529 PrintExpr(
E->getPattern());
2534 OS <<
"sizeof...(" << *
E->getPack() <<
")";
2538 OS <<
E->getPackIdExpression() <<
"...[" <<
E->getIndexExpr() <<
"]";
2541 void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2543 OS << *
Node->getParameterPack();
2546 void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2548 Visit(
Node->getReplacement());
2552 OS << *
E->getParameterPack();
2556 PrintExpr(
Node->getSubExpr());
2562 PrintExpr(
E->getLHS());
2568 PrintExpr(
E->getRHS());
2575 llvm::interleaveComma(
Node->getInitExprs(), OS,
2576 [&](
Expr *
E) { PrintExpr(E); });
2584 if (
E->getTemplateKWLoc().isValid())
2586 OS <<
E->getFoundDecl()->getName();
2589 E->getNamedConcept()->getTemplateParameters());
2594 auto LocalParameters =
E->getLocalParameters();
2595 if (!LocalParameters.empty()) {
2598 PrintRawDecl(LocalParam);
2599 if (LocalParam != LocalParameters.back())
2606 auto Requirements =
E->getRequirements();
2608 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2609 if (TypeReq->isSubstitutionFailure())
2610 OS <<
"<<error-type>>";
2612 TypeReq->getType()->getType().print(OS, Policy);
2613 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2614 if (ExprReq->isCompound())
2616 if (ExprReq->isExprSubstitutionFailure())
2617 OS <<
"<<error-expression>>";
2619 PrintExpr(ExprReq->getExpr());
2620 if (ExprReq->isCompound()) {
2622 if (ExprReq->getNoexceptLoc().isValid())
2624 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2625 if (!RetReq.isEmpty()) {
2627 if (RetReq.isSubstitutionFailure())
2628 OS <<
"<<error-type>>";
2629 else if (RetReq.isTypeConstraint())
2630 RetReq.getTypeConstraint()->print(OS, Policy);
2634 auto *NestedReq = cast<concepts::NestedRequirement>(Req);
2636 if (NestedReq->hasInvalidConstraint())
2637 OS <<
"<<error-expression>>";
2639 PrintExpr(NestedReq->getConstraintExpr());
2649 Visit(S->getBody());
2654 if (S->getOperand()) {
2656 Visit(S->getOperand());
2661 void StmtPrinter::VisitCoawaitExpr(
CoawaitExpr *S) {
2663 PrintExpr(S->getOperand());
2668 PrintExpr(S->getOperand());
2671 void StmtPrinter::VisitCoyieldExpr(
CoyieldExpr *S) {
2673 PrintExpr(S->getOperand());
2680 VisitStringLiteral(
Node->getString());
2685 Visit(
E->getSubExpr());
2691 for (
auto I = Ch.begin(),
E = Ch.end(); I !=
E; ++I) {
2692 if (I != Ch.begin())
2701 for (
unsigned I = 0, N =
E->getNumElements(); I != N; ++I) {
2708 Visit(Element.Value);
2709 if (Element.isPackExpansion())
2717 Node->getEncodedType().
print(OS, Policy);
2728 OS <<
"@protocol(" << *
Node->getProtocol() <<
')';
2753 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2755 if (i > 0) OS <<
' ';
2763 PrintExpr(Mess->
getArg(i));
2770 OS << (
Node->getValue() ?
"__objc_yes" :
"__objc_no");
2775 PrintExpr(
E->getSubExpr());
2780 OS <<
'(' <<
E->getBridgeKindName();
2783 PrintExpr(
E->getSubExpr());
2792 if (isa<FunctionNoProtoType>(AFT)) {
2794 }
else if (!BD->
param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
2799 std::string ParamStr = (*AI)->getNameAsString();
2800 (*AI)->getType().print(OS, Policy, ParamStr);
2803 const auto *FT = cast<FunctionProtoType>(AFT);
2804 if (FT->isVariadic()) {
2814 PrintExpr(
Node->getSourceExpr());
2819 llvm_unreachable(
"Cannot print TypoExpr nodes");
2823 OS <<
"<recovery-expr>(";
2824 const char *Sep =
"";
2825 for (
Expr *
E :
Node->subExpressions()) {
2834 OS <<
"__builtin_astype(";
2835 PrintExpr(
Node->getSrcExpr());
2851 StringRef NL,
const ASTContext *Context)
const {
2852 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2853 P.Visit(
const_cast<Stmt *
>(
this));
2858 unsigned Indentation, StringRef NL,
2860 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2861 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
2867 llvm::raw_string_ostream TempOut(Buf);
Defines the clang::ASTContext interface.
enum clang::sema::@1659::IndirectLocalPathEntry::EntryKind Kind
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.
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.
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.
ExprIterator arg_iterator
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 a value-initialized rvalue of type T, which is a non-class type.
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.
bool isVariadic() const
Whether this function is variadic.
ArrayRef< ParmVarDecl * > parameters() const
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.
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.
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
@ FPE_MayTrap
Transformations do not cause new exceptions but may hide some.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
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.
Selector getSelector() const
Expr * getInstanceReceiver()
Returns the object expression (receiver) for an instance message, or null for a message that is not a...
@ 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.
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
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 class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
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.
Represents a __builtin_base_type expression.
Represents a __builtin_field_type expression.
Represents a __builtin_num_bases expression.
Represents a __builtin_num_fields expression.
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;}).
void 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.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
const TemplateArgument & get(unsigned Idx) const
Retrieve the template argument at a given index.
Represents a template argument.
@ Pack
The template argument is actually a parameter pack.
ArgKind getKind() const
Return the kind of stored template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
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...
bool Call(InterpState &S, CodePtr OpPC, const Function *Func, uint32_t VarArgSize)
std::string toString(const til::SExpr *E)
The JSON file list parser is used to communicate input to InstallAPI.
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
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.
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.
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
const char * getOperatorSpelling(OverloadedOperatorKind Operator)
Retrieve the spelling of the given overloaded operator, without the preceding "operator" keyword.
@ ObjCSelf
Parameter for Objective-C 'self' argument.
CXXNewInitializationStyle
@ Parens
New-expression has a C++98 paren-delimited initializer.
@ None
New-expression has no initializer as written.
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.