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"
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);
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)
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());
588 if (
auto *TS = dyn_cast<CompoundStmt>(
Node->getTryBody())) {
589 PrintRawCompoundStmt(TS);
594 Indent() <<
"@catch(";
595 if (
Decl *DS = catchStmt->getCatchParamDecl())
598 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
599 PrintRawCompoundStmt(CS);
605 Indent() <<
"@finally";
606 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
607 PrintRawCompoundStmt(CS);
617 Indent() <<
"@catch (...) { /* todo */ } " << NL;
621 Indent() <<
"@throw";
622 if (
Node->getThrowExpr()) {
624 PrintExpr(
Node->getThrowExpr());
629void 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);
715 Indent() <<
"__leave;";
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);
826void StmtPrinter::VisitOMPParallelForSimdDirective(
828 Indent() <<
"#pragma omp parallel for simd";
829 PrintOMPExecutableDirective(
Node);
832void StmtPrinter::VisitOMPParallelMasterDirective(
834 Indent() <<
"#pragma omp parallel master";
835 PrintOMPExecutableDirective(
Node);
838void StmtPrinter::VisitOMPParallelMaskedDirective(
840 Indent() <<
"#pragma omp parallel masked";
841 PrintOMPExecutableDirective(
Node);
844void 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 error";
872 PrintOMPExecutableDirective(
Node);
876 Indent() <<
"#pragma omp taskgroup";
877 PrintOMPExecutableDirective(
Node);
881 Indent() <<
"#pragma omp flush";
882 PrintOMPExecutableDirective(
Node);
886 Indent() <<
"#pragma omp depobj";
887 PrintOMPExecutableDirective(
Node);
891 Indent() <<
"#pragma omp scan";
892 PrintOMPExecutableDirective(
Node);
896 Indent() <<
"#pragma omp ordered";
901 Indent() <<
"#pragma omp atomic";
902 PrintOMPExecutableDirective(
Node);
906 Indent() <<
"#pragma omp target";
907 PrintOMPExecutableDirective(
Node);
911 Indent() <<
"#pragma omp target data";
912 PrintOMPExecutableDirective(
Node);
915void StmtPrinter::VisitOMPTargetEnterDataDirective(
917 Indent() <<
"#pragma omp target enter data";
918 PrintOMPExecutableDirective(
Node,
true);
921void StmtPrinter::VisitOMPTargetExitDataDirective(
923 Indent() <<
"#pragma omp target exit data";
924 PrintOMPExecutableDirective(
Node,
true);
927void StmtPrinter::VisitOMPTargetParallelDirective(
929 Indent() <<
"#pragma omp target parallel";
930 PrintOMPExecutableDirective(
Node);
933void StmtPrinter::VisitOMPTargetParallelForDirective(
935 Indent() <<
"#pragma omp target parallel for";
936 PrintOMPExecutableDirective(
Node);
940 Indent() <<
"#pragma omp teams";
941 PrintOMPExecutableDirective(
Node);
944void StmtPrinter::VisitOMPCancellationPointDirective(
946 Indent() <<
"#pragma omp cancellation point "
947 << getOpenMPDirectiveName(
Node->getCancelRegion());
948 PrintOMPExecutableDirective(
Node);
952 Indent() <<
"#pragma omp cancel "
953 << getOpenMPDirectiveName(
Node->getCancelRegion());
954 PrintOMPExecutableDirective(
Node);
958 Indent() <<
"#pragma omp taskloop";
959 PrintOMPExecutableDirective(
Node);
962void StmtPrinter::VisitOMPTaskLoopSimdDirective(
964 Indent() <<
"#pragma omp taskloop simd";
965 PrintOMPExecutableDirective(
Node);
968void StmtPrinter::VisitOMPMasterTaskLoopDirective(
970 Indent() <<
"#pragma omp master taskloop";
971 PrintOMPExecutableDirective(
Node);
974void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
976 Indent() <<
"#pragma omp masked taskloop";
977 PrintOMPExecutableDirective(
Node);
980void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
982 Indent() <<
"#pragma omp master taskloop simd";
983 PrintOMPExecutableDirective(
Node);
986void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
988 Indent() <<
"#pragma omp masked taskloop simd";
989 PrintOMPExecutableDirective(
Node);
992void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
994 Indent() <<
"#pragma omp parallel master taskloop";
995 PrintOMPExecutableDirective(
Node);
998void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
1000 Indent() <<
"#pragma omp parallel masked taskloop";
1001 PrintOMPExecutableDirective(
Node);
1004void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
1006 Indent() <<
"#pragma omp parallel master taskloop simd";
1007 PrintOMPExecutableDirective(
Node);
1010void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
1012 Indent() <<
"#pragma omp parallel masked taskloop simd";
1013 PrintOMPExecutableDirective(
Node);
1017 Indent() <<
"#pragma omp distribute";
1018 PrintOMPExecutableDirective(
Node);
1021void StmtPrinter::VisitOMPTargetUpdateDirective(
1023 Indent() <<
"#pragma omp target update";
1024 PrintOMPExecutableDirective(
Node,
true);
1027void StmtPrinter::VisitOMPDistributeParallelForDirective(
1029 Indent() <<
"#pragma omp distribute parallel for";
1030 PrintOMPExecutableDirective(
Node);
1033void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1035 Indent() <<
"#pragma omp distribute parallel for simd";
1036 PrintOMPExecutableDirective(
Node);
1039void StmtPrinter::VisitOMPDistributeSimdDirective(
1041 Indent() <<
"#pragma omp distribute simd";
1042 PrintOMPExecutableDirective(
Node);
1045void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1047 Indent() <<
"#pragma omp target parallel for simd";
1048 PrintOMPExecutableDirective(
Node);
1052 Indent() <<
"#pragma omp target simd";
1053 PrintOMPExecutableDirective(
Node);
1056void StmtPrinter::VisitOMPTeamsDistributeDirective(
1058 Indent() <<
"#pragma omp teams distribute";
1059 PrintOMPExecutableDirective(
Node);
1062void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1064 Indent() <<
"#pragma omp teams distribute simd";
1065 PrintOMPExecutableDirective(
Node);
1068void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1070 Indent() <<
"#pragma omp teams distribute parallel for simd";
1071 PrintOMPExecutableDirective(
Node);
1074void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1076 Indent() <<
"#pragma omp teams distribute parallel for";
1077 PrintOMPExecutableDirective(
Node);
1081 Indent() <<
"#pragma omp target teams";
1082 PrintOMPExecutableDirective(
Node);
1085void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1087 Indent() <<
"#pragma omp target teams distribute";
1088 PrintOMPExecutableDirective(
Node);
1091void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1093 Indent() <<
"#pragma omp target teams distribute parallel for";
1094 PrintOMPExecutableDirective(
Node);
1097void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1099 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1100 PrintOMPExecutableDirective(
Node);
1103void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1105 Indent() <<
"#pragma omp target teams distribute simd";
1106 PrintOMPExecutableDirective(
Node);
1110 Indent() <<
"#pragma omp interop";
1111 PrintOMPExecutableDirective(
Node);
1115 Indent() <<
"#pragma omp dispatch";
1116 PrintOMPExecutableDirective(
Node);
1120 Indent() <<
"#pragma omp masked";
1121 PrintOMPExecutableDirective(
Node);
1125 Indent() <<
"#pragma omp loop";
1126 PrintOMPExecutableDirective(
Node);
1129void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1131 Indent() <<
"#pragma omp teams loop";
1132 PrintOMPExecutableDirective(
Node);
1135void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1137 Indent() <<
"#pragma omp target teams loop";
1138 PrintOMPExecutableDirective(
Node);
1141void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1143 Indent() <<
"#pragma omp parallel loop";
1144 PrintOMPExecutableDirective(
Node);
1147void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1149 Indent() <<
"#pragma omp target parallel loop";
1150 PrintOMPExecutableDirective(
Node);
1157 Indent() <<
"#pragma acc " << S->getDirectiveKind();
1159 if (!S->clauses().empty()) {
1162 Printer.VisitClauseList(S->clauses());
1166 PrintStmt(S->getStructuredBlock());
1170 Indent() <<
"#pragma acc loop";
1172 if (!S->clauses().empty()) {
1175 Printer.VisitClauseList(S->clauses());
1179 PrintStmt(S->getLoop());
1187 OS <<
Node->getBuiltinStr() <<
"()";
1191 llvm::report_fatal_error(
"Not implemented");
1195 PrintExpr(
Node->getSubExpr());
1199 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(
Node->getDecl())) {
1200 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1203 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(
Node->getDecl())) {
1204 TPOD->printAsExpr(OS, Policy);
1209 if (
Node->hasTemplateKeyword())
1212 isa<ParmVarDecl, NonTypeTemplateParmDecl>(
Node->getDecl()) &&
1213 Node->getDecl()->getIdentifier())
1214 OS <<
Node->getDecl()->getIdentifier()->deuglifiedName();
1216 Node->getNameInfo().printName(OS, Policy);
1217 if (
Node->hasExplicitTemplateArgs()) {
1219 if (!
Node->hadMultipleCandidates())
1220 if (
auto *TD = dyn_cast<TemplateDecl>(
Node->getDecl()))
1221 TPL = TD->getTemplateParameters();
1226void StmtPrinter::VisitDependentScopeDeclRefExpr(
1230 if (
Node->hasTemplateKeyword())
1232 OS <<
Node->getNameInfo();
1233 if (
Node->hasExplicitTemplateArgs())
1238 if (
Node->getQualifier())
1239 Node->getQualifier()->
print(OS, Policy);
1240 if (
Node->hasTemplateKeyword())
1242 OS <<
Node->getNameInfo();
1243 if (
Node->hasExplicitTemplateArgs())
1248 if (
const auto *DRE = dyn_cast<DeclRefExpr>(
E)) {
1249 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1250 if (PD->getParameterKind() == ImplicitParamKind::ObjCSelf &&
1251 DRE->getBeginLoc().isInvalid())
1259 if (
Node->getBase()) {
1262 PrintExpr(
Node->getBase());
1263 OS << (
Node->isArrow() ?
"->" :
".");
1266 OS << *
Node->getDecl();
1270 if (
Node->isSuperReceiver())
1272 else if (
Node->isObjectReceiver() &&
Node->getBase()) {
1273 PrintExpr(
Node->getBase());
1275 }
else if (
Node->isClassReceiver() &&
Node->getClassReceiver()) {
1276 OS <<
Node->getClassReceiver()->getName() <<
".";
1279 if (
Node->isImplicitProperty()) {
1280 if (
const auto *Getter =
Node->getImplicitPropertyGetter())
1281 Getter->getSelector().
print(OS);
1284 Node->getImplicitPropertySetter()->getSelector());
1286 OS <<
Node->getExplicitProperty()->getName();
1290 PrintExpr(
Node->getBaseExpr());
1292 PrintExpr(
Node->getKeyExpr());
1296void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1298 OS <<
"__builtin_sycl_unique_stable_name(";
1299 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1331 bool isSigned =
Node->getType()->isSignedIntegerType();
1334 if (isa<BitIntType>(
Node->getType())) {
1335 OS << (isSigned ?
"wb" :
"uwb");
1341 default: llvm_unreachable(
"Unexpected type for integer literal!");
1342 case BuiltinType::Char_S:
1343 case BuiltinType::Char_U: OS <<
"i8";
break;
1344 case BuiltinType::UChar: OS <<
"Ui8";
break;
1345 case BuiltinType::SChar: OS <<
"i8";
break;
1346 case BuiltinType::Short: OS <<
"i16";
break;
1347 case BuiltinType::UShort: OS <<
"Ui16";
break;
1348 case BuiltinType::Int:
break;
1349 case BuiltinType::UInt: OS <<
'U';
break;
1350 case BuiltinType::Long: OS <<
'L';
break;
1351 case BuiltinType::ULong: OS <<
"UL";
break;
1352 case BuiltinType::LongLong: OS <<
"LL";
break;
1353 case BuiltinType::ULongLong: OS <<
"ULL";
break;
1354 case BuiltinType::Int128:
1356 case BuiltinType::UInt128:
1358 case BuiltinType::WChar_S:
1359 case BuiltinType::WChar_U:
1367 OS <<
Node->getValueAsString(10);
1370 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1371 case BuiltinType::ShortFract: OS <<
"hr";
break;
1372 case BuiltinType::ShortAccum: OS <<
"hk";
break;
1373 case BuiltinType::UShortFract: OS <<
"uhr";
break;
1374 case BuiltinType::UShortAccum: OS <<
"uhk";
break;
1375 case BuiltinType::Fract: OS <<
"r";
break;
1376 case BuiltinType::Accum: OS <<
"k";
break;
1377 case BuiltinType::UFract: OS <<
"ur";
break;
1378 case BuiltinType::UAccum: OS <<
"uk";
break;
1379 case BuiltinType::LongFract: OS <<
"lr";
break;
1380 case BuiltinType::LongAccum: OS <<
"lk";
break;
1381 case BuiltinType::ULongFract: OS <<
"ulr";
break;
1382 case BuiltinType::ULongAccum: OS <<
"ulk";
break;
1389 Node->getValue().toString(Str);
1391 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1399 default: llvm_unreachable(
"Unexpected type for float literal!");
1400 case BuiltinType::Half:
break;
1401 case BuiltinType::Ibm128:
break;
1402 case BuiltinType::Double:
break;
1403 case BuiltinType::Float16: OS <<
"F16";
break;
1404 case BuiltinType::Float: OS <<
'F';
break;
1405 case BuiltinType::LongDouble: OS <<
'L';
break;
1406 case BuiltinType::Float128: OS <<
'Q';
break;
1417 PrintExpr(
Node->getSubExpr());
1427 PrintExpr(
Node->getSubExpr());
1432 if (!
Node->isPostfix()) {
1437 switch (
Node->getOpcode()) {
1446 if (isa<UnaryOperator>(
Node->getSubExpr()))
1451 PrintExpr(
Node->getSubExpr());
1453 if (
Node->isPostfix())
1458 OS <<
"__builtin_offsetof(";
1459 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1461 bool PrintedSomething =
false;
1462 for (
unsigned i = 0, n =
Node->getNumComponents(); i < n; ++i) {
1469 PrintedSomething =
true;
1482 if (PrintedSomething)
1485 PrintedSomething =
true;
1486 OS <<
Id->getName();
1491void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1494 if (
Node->getKind() == UETT_AlignOf) {
1496 Spelling =
"alignof";
1498 Spelling =
"_Alignof";
1500 Spelling =
"__alignof";
1505 if (
Node->isArgumentType()) {
1507 Node->getArgumentType().
print(OS, Policy);
1511 PrintExpr(
Node->getArgumentExpr());
1517 if (
Node->isExprPredicate())
1518 PrintExpr(
Node->getControllingExpr());
1520 Node->getControllingType()->getType().
print(OS, Policy);
1528 T.print(OS, Policy);
1530 PrintExpr(Assoc.getAssociationExpr());
1536 PrintExpr(
Node->getLHS());
1538 PrintExpr(
Node->getRHS());
1543 PrintExpr(
Node->getBase());
1545 PrintExpr(
Node->getRowIdx());
1548 PrintExpr(
Node->getColumnIdx());
1553 PrintExpr(
Node->getBase());
1555 if (
Node->getLowerBound())
1556 PrintExpr(
Node->getLowerBound());
1557 if (
Node->getColonLocFirst().isValid()) {
1559 if (
Node->getLength())
1560 PrintExpr(
Node->getLength());
1562 if (
Node->isOMPArraySection() &&
Node->getColonLocSecond().isValid()) {
1564 if (
Node->getStride())
1565 PrintExpr(
Node->getStride());
1578 PrintExpr(
Node->getBase());
1583 for (
unsigned I = 0,
E =
Node->numOfIterators(); I <
E; ++I) {
1584 auto *VD = cast<ValueDecl>(
Node->getIteratorDecl(I));
1585 VD->getType().print(OS, Policy);
1587 OS <<
" " << VD->getName() <<
" = ";
1588 PrintExpr(
Range.Begin);
1590 PrintExpr(
Range.End);
1593 PrintExpr(
Range.Step);
1602 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1603 if (isa<CXXDefaultArgExpr>(
Call->getArg(i))) {
1609 PrintExpr(
Call->getArg(i));
1614 PrintExpr(
Call->getCallee());
1616 PrintCallArgs(
Call);
1621 if (
const auto *TE = dyn_cast<CXXThisExpr>(
E))
1622 return TE->isImplicit();
1628 PrintExpr(
Node->getBase());
1630 auto *ParentMember = dyn_cast<MemberExpr>(
Node->getBase());
1632 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1636 OS << (
Node->isArrow() ?
"->" :
".");
1639 if (
auto *FD = dyn_cast<FieldDecl>(
Node->getMemberDecl()))
1640 if (FD->isAnonymousStructOrUnion())
1645 if (
Node->hasTemplateKeyword())
1647 OS <<
Node->getMemberNameInfo();
1649 if (
auto *FD = dyn_cast<FunctionDecl>(
Node->getMemberDecl())) {
1650 if (!
Node->hadMultipleCandidates())
1651 if (
auto *FTD = FD->getPrimaryTemplate())
1652 TPL = FTD->getTemplateParameters();
1653 }
else if (
auto *VTSD =
1654 dyn_cast<VarTemplateSpecializationDecl>(
Node->getMemberDecl()))
1655 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1656 if (
Node->hasExplicitTemplateArgs())
1661 PrintExpr(
Node->getBase());
1662 OS << (
Node->isArrow() ?
"->isa" :
".isa");
1666 PrintExpr(
Node->getBase());
1668 OS <<
Node->getAccessor().getName();
1673 Node->getTypeAsWritten().
print(OS, Policy);
1675 PrintExpr(
Node->getSubExpr());
1682 PrintExpr(
Node->getInitializer());
1687 PrintExpr(
Node->getSubExpr());
1691 PrintExpr(
Node->getLHS());
1693 PrintExpr(
Node->getRHS());
1697 PrintExpr(
Node->getLHS());
1699 PrintExpr(
Node->getRHS());
1703 PrintExpr(
Node->getCond());
1705 PrintExpr(
Node->getLHS());
1707 PrintExpr(
Node->getRHS());
1714 PrintExpr(
Node->getCommon());
1716 PrintExpr(
Node->getFalseExpr());
1720 OS <<
"&&" <<
Node->getLabel()->getName();
1723void StmtPrinter::VisitStmtExpr(
StmtExpr *
E) {
1725 PrintRawCompoundStmt(
E->getSubStmt());
1730 OS <<
"__builtin_choose_expr(";
1731 PrintExpr(
Node->getCond());
1733 PrintExpr(
Node->getLHS());
1735 PrintExpr(
Node->getRHS());
1739void StmtPrinter::VisitGNUNullExpr(
GNUNullExpr *) {
1744 OS <<
"__builtin_shufflevector(";
1745 for (
unsigned i = 0, e =
Node->getNumSubExprs(); i != e; ++i) {
1747 PrintExpr(
Node->getExpr(i));
1753 OS <<
"__builtin_convertvector(";
1754 PrintExpr(
Node->getSrcExpr());
1761 if (
Node->getSyntacticForm()) {
1762 Visit(
Node->getSyntacticForm());
1767 for (
unsigned i = 0, e =
Node->getNumInits(); i != e; ++i) {
1769 if (
Node->getInit(i))
1770 PrintExpr(
Node->getInit(i));
1781 PrintExpr(
Node->getSubExpr());
1791 for (
unsigned i = 0, e =
Node->getNumExprs(); i != e; ++i) {
1793 PrintExpr(
Node->getExpr(i));
1799 bool NeedsEquals =
true;
1801 if (
D.isFieldDesignator()) {
1802 if (
D.getDotLoc().isInvalid()) {
1804 OS << II->getName() <<
":";
1805 NeedsEquals =
false;
1808 OS <<
"." <<
D.getFieldName()->getName();
1812 if (
D.isArrayDesignator()) {
1813 PrintExpr(
Node->getArrayIndex(
D));
1815 PrintExpr(
Node->getArrayRangeStart(
D));
1817 PrintExpr(
Node->getArrayRangeEnd(
D));
1827 PrintExpr(
Node->getInit());
1830void StmtPrinter::VisitDesignatedInitUpdateExpr(
1834 PrintExpr(
Node->getBase());
1837 OS <<
"/*updater*/";
1838 PrintExpr(
Node->getUpdater());
1843 OS <<
"/*no init*/";
1847 if (
Node->getType()->getAsCXXRecordDecl()) {
1848 OS <<
"/*implicit*/";
1852 OS <<
"/*implicit*/(";
1855 if (
Node->getType()->isRecordType())
1863 OS <<
"__builtin_va_arg(";
1864 PrintExpr(
Node->getSubExpr());
1871 PrintExpr(
Node->getSyntacticForm());
1875 const char *Name =
nullptr;
1876 switch (
Node->getOp()) {
1877#define BUILTIN(ID, TYPE, ATTRS)
1878#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1879 case AtomicExpr::AO ## ID: \
1882#include "clang/Basic/Builtins.inc"
1887 PrintExpr(
Node->getPtr());
1888 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1889 Node->getOp() != AtomicExpr::AO__atomic_load_n &&
1890 Node->getOp() != AtomicExpr::AO__scoped_atomic_load_n &&
1891 Node->getOp() != AtomicExpr::AO__opencl_atomic_load &&
1892 Node->getOp() != AtomicExpr::AO__hip_atomic_load) {
1894 PrintExpr(
Node->getVal1());
1896 if (
Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1897 Node->isCmpXChg()) {
1899 PrintExpr(
Node->getVal2());
1901 if (
Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1902 Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1904 PrintExpr(
Node->getWeak());
1906 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_init &&
1907 Node->getOp() != AtomicExpr::AO__opencl_atomic_init) {
1909 PrintExpr(
Node->getOrder());
1911 if (
Node->isCmpXChg()) {
1913 PrintExpr(
Node->getOrderFail());
1921 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
1922 if (
Node->getNumArgs() == 1) {
1924 PrintExpr(
Node->getArg(0));
1926 PrintExpr(
Node->getArg(0));
1929 }
else if (Kind == OO_Arrow) {
1930 PrintExpr(
Node->getArg(0));
1931 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
1932 PrintExpr(
Node->getArg(0));
1933 OS << (
Kind == OO_Call ?
'(' :
'[');
1934 for (
unsigned ArgIdx = 1; ArgIdx <
Node->getNumArgs(); ++ArgIdx) {
1937 if (!isa<CXXDefaultArgExpr>(
Node->getArg(ArgIdx)))
1938 PrintExpr(
Node->getArg(ArgIdx));
1940 OS << (
Kind == OO_Call ?
')' :
']');
1941 }
else if (
Node->getNumArgs() == 1) {
1943 PrintExpr(
Node->getArg(0));
1944 }
else if (
Node->getNumArgs() == 2) {
1945 PrintExpr(
Node->getArg(0));
1947 PrintExpr(
Node->getArg(1));
1949 llvm_unreachable(
"unknown overloaded operator");
1956 if (isa_and_nonnull<CXXConversionDecl>(MD)) {
1957 PrintExpr(
Node->getImplicitObjectArgument());
1960 VisitCallExpr(cast<CallExpr>(
Node));
1964 PrintExpr(
Node->getCallee());
1966 PrintCallArgs(
Node->getConfig());
1968 PrintCallArgs(
Node);
1972void StmtPrinter::VisitCXXRewrittenBinaryOperator(
1975 Node->getDecomposedForm();
1976 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
1978 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
1982 OS <<
Node->getCastName() <<
'<';
1983 Node->getTypeAsWritten().
print(OS, Policy);
1985 PrintExpr(
Node->getSubExpr());
1990 VisitCXXNamedCastExpr(
Node);
1994 VisitCXXNamedCastExpr(
Node);
1998 VisitCXXNamedCastExpr(
Node);
2002 VisitCXXNamedCastExpr(
Node);
2006 OS <<
"__builtin_bit_cast(";
2007 Node->getTypeInfoAsWritten()->getType().
print(OS, Policy);
2009 PrintExpr(
Node->getSubExpr());
2014 VisitCXXNamedCastExpr(
Node);
2019 if (
Node->isTypeOperand()) {
2020 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
2022 PrintExpr(
Node->getExprOperand());
2029 if (
Node->isTypeOperand()) {
2030 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
2032 PrintExpr(
Node->getExprOperand());
2038 PrintExpr(
Node->getBaseExpr());
2039 if (
Node->isArrow())
2044 Node->getQualifierLoc().getNestedNameSpecifier())
2046 OS <<
Node->getPropertyDecl()->getDeclName();
2050 PrintExpr(
Node->getBase());
2052 PrintExpr(
Node->getIdx());
2057 switch (
Node->getLiteralOperatorKind()) {
2059 OS << cast<StringLiteral>(
Node->getArg(0)->IgnoreImpCasts())->getString();
2062 const auto *DRE = cast<DeclRefExpr>(
Node->getCallee()->IgnoreImpCasts());
2064 cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
2069 if (!DRE->hadMultipleCandidates())
2070 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2071 TPL = TD->getTemplateParameters();
2072 OS <<
"operator\"\"" <<
Node->getUDSuffix()->getName();
2080 char C = (char)
P.getAsIntegral().getZExtValue();
2087 const auto *
Int = cast<IntegerLiteral>(
Node->getCookedLiteral());
2093 auto *
Float = cast<FloatingLiteral>(
Node->getCookedLiteral());
2099 PrintExpr(
Node->getCookedLiteral());
2102 OS <<
Node->getUDSuffix()->getName();
2106 OS << (
Node->getValue() ?
"true" :
"false");
2118 if (!
Node->getSubExpr())
2122 PrintExpr(
Node->getSubExpr());
2135 auto TargetType =
Node->getType();
2136 auto *
Auto = TargetType->getContainedDeducedType();
2137 bool Bare =
Auto &&
Auto->isDeduced();
2142 TargetType.print(OS, Policy);
2147 if (!
Node->isListInitialization())
2149 PrintExpr(
Node->getSubExpr());
2150 if (!
Node->isListInitialization())
2155 PrintExpr(
Node->getSubExpr());
2160 if (
Node->isStdInitListInitialization())
2162 else if (
Node->isListInitialization())
2167 ArgEnd =
Node->arg_end();
2168 Arg != ArgEnd; ++Arg) {
2169 if ((*Arg)->isDefaultArgument())
2171 if (Arg !=
Node->arg_begin())
2175 if (
Node->isStdInitListInitialization())
2177 else if (
Node->isListInitialization())
2185 bool NeedComma =
false;
2186 switch (
Node->getCaptureDefault()) {
2201 CEnd =
Node->explicit_capture_end();
2204 if (
C->capturesVLAType())
2211 switch (
C->getCaptureKind()) {
2223 OS <<
C->getCapturedVar()->getName();
2227 OS <<
C->getCapturedVar()->getName();
2231 llvm_unreachable(
"VLA type in explicit captures.");
2234 if (
C->isPackExpansion())
2237 if (
Node->isInitCapture(
C)) {
2239 auto *
D = cast<VarDecl>(
C->getCapturedVar());
2241 llvm::StringRef
Pre;
2242 llvm::StringRef
Post;
2244 !isa<ParenListExpr>(
D->getInit())) {
2252 PrintExpr(
D->getInit());
2258 if (!
Node->getExplicitTemplateParameters().empty()) {
2259 Node->getTemplateParameterList()->
print(
2260 OS,
Node->getLambdaClass()->getASTContext(),
2264 if (
Node->hasExplicitParameters()) {
2274 std::string ParamStr =
2276 ?
P->getIdentifier()->deuglifiedName().str()
2277 :
P->getNameAsString();
2278 P->getOriginalType().print(OS, Policy, ParamStr);
2287 if (
Node->isMutable())
2296 if (
Node->hasExplicitResultType()) {
2298 Proto->getReturnType().print(OS, Policy);
2307 PrintRawCompoundStmt(
Node->getCompoundStmtBody());
2312 TSInfo->getType().print(OS, Policy);
2319 if (
E->isGlobalNew())
2322 unsigned NumPlace =
E->getNumPlacementArgs();
2323 if (NumPlace > 0 && !isa<CXXDefaultArgExpr>(
E->getPlacementArg(0))) {
2325 PrintExpr(
E->getPlacementArg(0));
2326 for (
unsigned i = 1; i < NumPlace; ++i) {
2327 if (isa<CXXDefaultArgExpr>(
E->getPlacementArg(i)))
2330 PrintExpr(
E->getPlacementArg(i));
2334 if (
E->isParenTypeId())
2338 llvm::raw_string_ostream
s(TypeS);
2340 if (std::optional<Expr *> Size =
E->getArraySize())
2341 (*Size)->printPretty(
s, Helper, Policy);
2344 E->getAllocatedType().print(OS, Policy, TypeS);
2345 if (
E->isParenTypeId())
2349 if (InitStyle != CXXNewInitializationStyle::None) {
2350 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2351 !isa<ParenListExpr>(
E->getInitializer());
2354 PrintExpr(
E->getInitializer());
2361 if (
E->isGlobalDelete())
2364 if (
E->isArrayForm())
2366 PrintExpr(
E->getArgument());
2370 PrintExpr(
E->getBase());
2375 if (
E->getQualifier())
2376 E->getQualifier()->print(OS, Policy);
2380 OS << II->getName();
2382 E->getDestroyedType().print(OS, Policy);
2386 if (
E->isListInitialization() && !
E->isStdInitListInitialization())
2389 for (
unsigned i = 0, e =
E->getNumArgs(); i != e; ++i) {
2390 if (isa<CXXDefaultArgExpr>(
E->getArg(i))) {
2396 PrintExpr(
E->getArg(i));
2399 if (
E->isListInitialization() && !
E->isStdInitListInitialization())
2405 OS <<
"<forwarded>";
2409 PrintExpr(
E->getSubExpr());
2414 PrintExpr(
E->getSubExpr());
2417void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2419 Node->getTypeAsWritten().
print(OS, Policy);
2420 if (!
Node->isListInitialization())
2422 for (
auto Arg =
Node->arg_begin(), ArgEnd =
Node->arg_end(); Arg != ArgEnd;
2424 if (Arg !=
Node->arg_begin())
2428 if (!
Node->isListInitialization())
2432void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2434 if (!
Node->isImplicitAccess()) {
2435 PrintExpr(
Node->getBase());
2436 OS << (
Node->isArrow() ?
"->" :
".");
2440 if (
Node->hasTemplateKeyword())
2442 OS <<
Node->getMemberNameInfo();
2443 if (
Node->hasExplicitTemplateArgs())
2448 if (!
Node->isImplicitAccess()) {
2449 PrintExpr(
Node->getBase());
2450 OS << (
Node->isArrow() ?
"->" :
".");
2454 if (
Node->hasTemplateKeyword())
2456 OS <<
Node->getMemberNameInfo();
2457 if (
Node->hasExplicitTemplateArgs())
2463 for (
unsigned I = 0, N =
E->getNumArgs(); I != N; ++I) {
2473 E->getQueriedType().print(OS, Policy);
2479 PrintExpr(
E->getQueriedExpression());
2485 PrintExpr(
E->getOperand());
2490 PrintExpr(
E->getPattern());
2495 OS <<
"sizeof...(" << *
E->getPack() <<
")";
2499 OS <<
E->getPackIdExpression() <<
"...[" <<
E->getIndexExpr() <<
"]";
2502void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2504 OS << *
Node->getParameterPack();
2507void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2509 Visit(
Node->getReplacement());
2513 OS << *
E->getParameterPack();
2517 PrintExpr(
Node->getSubExpr());
2523 PrintExpr(
E->getLHS());
2529 PrintExpr(
E->getRHS());
2536 llvm::interleaveComma(
Node->getInitExprs(), OS,
2537 [&](
Expr *
E) { PrintExpr(E); });
2545 if (
E->getTemplateKWLoc().isValid())
2547 OS <<
E->getFoundDecl()->getName();
2550 E->getNamedConcept()->getTemplateParameters());
2555 auto LocalParameters =
E->getLocalParameters();
2556 if (!LocalParameters.empty()) {
2559 PrintRawDecl(LocalParam);
2560 if (LocalParam != LocalParameters.back())
2567 auto Requirements =
E->getRequirements();
2569 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2570 if (TypeReq->isSubstitutionFailure())
2571 OS <<
"<<error-type>>";
2573 TypeReq->getType()->getType().print(OS, Policy);
2574 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2575 if (ExprReq->isCompound())
2577 if (ExprReq->isExprSubstitutionFailure())
2578 OS <<
"<<error-expression>>";
2580 PrintExpr(ExprReq->getExpr());
2581 if (ExprReq->isCompound()) {
2583 if (ExprReq->getNoexceptLoc().isValid())
2585 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2586 if (!RetReq.isEmpty()) {
2588 if (RetReq.isSubstitutionFailure())
2589 OS <<
"<<error-type>>";
2590 else if (RetReq.isTypeConstraint())
2591 RetReq.getTypeConstraint()->print(OS, Policy);
2595 auto *NestedReq = cast<concepts::NestedRequirement>(Req);
2597 if (NestedReq->hasInvalidConstraint())
2598 OS <<
"<<error-expression>>";
2600 PrintExpr(NestedReq->getConstraintExpr());
2610 Visit(S->getBody());
2615 if (S->getOperand()) {
2617 Visit(S->getOperand());
2622void StmtPrinter::VisitCoawaitExpr(
CoawaitExpr *S) {
2624 PrintExpr(S->getOperand());
2629 PrintExpr(S->getOperand());
2632void StmtPrinter::VisitCoyieldExpr(
CoyieldExpr *S) {
2634 PrintExpr(S->getOperand());
2641 VisitStringLiteral(
Node->getString());
2646 Visit(
E->getSubExpr());
2652 for (
auto I = Ch.begin(),
E = Ch.end(); I !=
E; ++I) {
2653 if (I != Ch.begin())
2662 for (
unsigned I = 0, N =
E->getNumElements(); I != N; ++I) {
2669 Visit(Element.Value);
2670 if (Element.isPackExpansion())
2678 Node->getEncodedType().
print(OS, Policy);
2689 OS <<
"@protocol(" << *
Node->getProtocol() <<
')';
2714 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2716 if (i > 0) OS <<
' ';
2724 PrintExpr(Mess->
getArg(i));
2731 OS << (
Node->getValue() ?
"__objc_yes" :
"__objc_no");
2736 PrintExpr(
E->getSubExpr());
2741 OS <<
'(' <<
E->getBridgeKindName();
2744 PrintExpr(
E->getSubExpr());
2753 if (isa<FunctionNoProtoType>(AFT)) {
2755 }
else if (!BD->
param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
2760 std::string ParamStr = (*AI)->getNameAsString();
2761 (*AI)->getType().print(OS, Policy, ParamStr);
2764 const auto *FT = cast<FunctionProtoType>(AFT);
2765 if (FT->isVariadic()) {
2775 PrintExpr(
Node->getSourceExpr());
2780 llvm_unreachable(
"Cannot print TypoExpr nodes");
2784 OS <<
"<recovery-expr>(";
2785 const char *Sep =
"";
2786 for (
Expr *
E :
Node->subExpressions()) {
2795 OS <<
"__builtin_astype(";
2796 PrintExpr(
Node->getSrcExpr());
2812 StringRef NL,
const ASTContext *Context)
const {
2813 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2814 P.Visit(
const_cast<Stmt *
>(
this));
2819 unsigned Indentation, StringRef NL,
2821 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2822 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
2828 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.
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 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.
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.
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 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.
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.
@ 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.
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 *.