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 (S && isa<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);
295 for (
const auto *
Attr :
Node->getAttrs()) {
299 PrintStmt(
Node->getSubStmt(), 0);
302void StmtPrinter::PrintRawIfStmt(
IfStmt *
If) {
303 if (
If->isConsteval()) {
305 if (
If->isNegatedConsteval())
309 PrintStmt(
If->getThen());
310 if (
Stmt *Else =
If->getElse()) {
321 PrintInitStmt(
If->getInit(), 4);
322 if (
const DeclStmt *DS =
If->getConditionVariableDeclStmt())
323 PrintRawDeclStmt(DS);
325 PrintExpr(
If->getCond());
328 if (
auto *CS = dyn_cast<CompoundStmt>(
If->getThen())) {
330 PrintRawCompoundStmt(CS);
331 OS << (
If->getElse() ?
" " : NL);
334 PrintStmt(
If->getThen());
335 if (
If->getElse()) Indent();
338 if (
Stmt *Else =
If->getElse()) {
341 if (
auto *CS = dyn_cast<CompoundStmt>(Else)) {
343 PrintRawCompoundStmt(CS);
345 }
else if (
auto *ElseIf = dyn_cast<IfStmt>(Else)) {
347 PrintRawIfStmt(ElseIf);
350 PrintStmt(
If->getElse());
355void StmtPrinter::VisitIfStmt(
IfStmt *
If) {
361 Indent() <<
"switch (";
363 PrintInitStmt(
Node->getInit(), 8);
364 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
365 PrintRawDeclStmt(DS);
367 PrintExpr(
Node->getCond());
369 PrintControlledStmt(
Node->getBody());
373 Indent() <<
"while (";
374 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
375 PrintRawDeclStmt(DS);
377 PrintExpr(
Node->getCond());
379 PrintStmt(
Node->getBody());
384 if (
auto *CS = dyn_cast<CompoundStmt>(
Node->getBody())) {
385 PrintRawCompoundStmt(CS);
389 PrintStmt(
Node->getBody());
394 PrintExpr(
Node->getCond());
401 PrintInitStmt(
Node->getInit(), 5);
403 OS << (
Node->getCond() ?
"; " :
";");
404 if (
const DeclStmt *DS =
Node->getConditionVariableDeclStmt())
405 PrintRawDeclStmt(DS);
406 else if (
Node->getCond())
407 PrintExpr(
Node->getCond());
409 if (
Node->getInc()) {
411 PrintExpr(
Node->getInc());
414 PrintControlledStmt(
Node->getBody());
419 if (
auto *DS = dyn_cast<DeclStmt>(
Node->getElement()))
420 PrintRawDeclStmt(DS);
422 PrintExpr(cast<Expr>(
Node->getElement()));
424 PrintExpr(
Node->getCollection());
426 PrintControlledStmt(
Node->getBody());
432 PrintInitStmt(
Node->getInit(), 5);
434 SubPolicy.SuppressInitializers =
true;
435 Node->getLoopVariable()->
print(OS, SubPolicy, IndentLevel);
437 PrintExpr(
Node->getRangeInit());
439 PrintControlledStmt(
Node->getBody());
444 if (
Node->isIfExists())
445 OS <<
"__if_exists (";
447 OS <<
"__if_not_exists (";
450 =
Node->getQualifierLoc().getNestedNameSpecifier())
453 OS <<
Node->getNameInfo() <<
") ";
455 PrintRawCompoundStmt(
Node->getSubStmt());
459 Indent() <<
"goto " <<
Node->getLabel()->getName() <<
";";
464 Indent() <<
"goto *";
465 PrintExpr(
Node->getTarget());
471 Indent() <<
"continue;";
476 Indent() <<
"break;";
481 Indent() <<
"return";
482 if (
Node->getRetValue()) {
484 PrintExpr(
Node->getRetValue());
493 if (
Node->isVolatile())
496 if (
Node->isAsmGoto())
500 VisitStringLiteral(
Node->getAsmString());
503 if (
Node->getNumOutputs() != 0 ||
Node->getNumInputs() != 0 ||
504 Node->getNumClobbers() != 0 ||
Node->getNumLabels() != 0)
507 for (
unsigned i = 0, e =
Node->getNumOutputs(); i != e; ++i) {
511 if (!
Node->getOutputName(i).empty()) {
513 OS <<
Node->getOutputName(i);
517 VisitStringLiteral(
Node->getOutputConstraintLiteral(i));
519 Visit(
Node->getOutputExpr(i));
524 if (
Node->getNumInputs() != 0 ||
Node->getNumClobbers() != 0 ||
525 Node->getNumLabels() != 0)
528 for (
unsigned i = 0, e =
Node->getNumInputs(); i != e; ++i) {
532 if (!
Node->getInputName(i).empty()) {
534 OS <<
Node->getInputName(i);
538 VisitStringLiteral(
Node->getInputConstraintLiteral(i));
540 Visit(
Node->getInputExpr(i));
545 if (
Node->getNumClobbers() != 0 ||
Node->getNumLabels())
548 for (
unsigned i = 0, e =
Node->getNumClobbers(); i != e; ++i) {
552 VisitStringLiteral(
Node->getClobberStringLiteral(i));
556 if (
Node->getNumLabels() != 0)
559 for (
unsigned i = 0, e =
Node->getNumLabels(); i != e; ++i) {
562 OS <<
Node->getLabelName(i);
571 Indent() <<
"__asm ";
572 if (
Node->hasBraces())
574 OS <<
Node->getAsmString() << NL;
575 if (
Node->hasBraces())
576 Indent() <<
"}" << NL;
580 PrintStmt(
Node->getCapturedDecl()->getBody());
585 if (
auto *TS = dyn_cast<CompoundStmt>(
Node->getTryBody())) {
586 PrintRawCompoundStmt(TS);
591 Indent() <<
"@catch(";
592 if (
Decl *DS = catchStmt->getCatchParamDecl())
595 if (
auto *CS = dyn_cast<CompoundStmt>(catchStmt->getCatchBody())) {
596 PrintRawCompoundStmt(CS);
602 Indent() <<
"@finally";
603 if (
auto *CS = dyn_cast<CompoundStmt>(FS->getFinallyBody())) {
604 PrintRawCompoundStmt(CS);
614 Indent() <<
"@catch (...) { /* todo */ } " << NL;
618 Indent() <<
"@throw";
619 if (
Node->getThrowExpr()) {
621 PrintExpr(
Node->getThrowExpr());
626void StmtPrinter::VisitObjCAvailabilityCheckExpr(
628 OS <<
"@available(...)";
632 Indent() <<
"@synchronized (";
633 PrintExpr(
Node->getSynchExpr());
635 PrintRawCompoundStmt(
Node->getSynchBody());
640 Indent() <<
"@autoreleasepool";
641 PrintRawCompoundStmt(cast<CompoundStmt>(
Node->getSubStmt()));
647 if (
Decl *ExDecl =
Node->getExceptionDecl())
648 PrintRawDecl(ExDecl);
652 PrintRawCompoundStmt(cast<CompoundStmt>(
Node->getHandlerBlock()));
657 PrintRawCXXCatchStmt(
Node);
663 PrintRawCompoundStmt(
Node->getTryBlock());
664 for (
unsigned i = 0, e =
Node->getNumHandlers(); i < e; ++i) {
666 PrintRawCXXCatchStmt(
Node->getHandler(i));
672 Indent() << (
Node->getIsCXXTry() ?
"try " :
"__try ");
673 PrintRawCompoundStmt(
Node->getTryBlock());
677 PrintRawSEHExceptHandler(E);
679 assert(F &&
"Must have a finally block...");
680 PrintRawSEHFinallyStmt(F);
687 PrintRawCompoundStmt(
Node->getBlock());
693 VisitExpr(
Node->getFilterExpr());
695 PrintRawCompoundStmt(
Node->getBlock());
701 PrintRawSEHExceptHandler(
Node);
707 PrintRawSEHFinallyStmt(
Node);
712 Indent() <<
"__leave;";
721 PrintStmt(
Node->getLoopStmt());
728 for (
auto *Clause : Clauses)
729 if (Clause && !Clause->isImplicit()) {
731 Printer.Visit(Clause);
734 if (!ForceNoStmt && S->hasAssociatedStmt())
735 PrintStmt(S->getRawStmt());
739 Indent() <<
"#pragma omp metadirective";
740 PrintOMPExecutableDirective(
Node);
744 Indent() <<
"#pragma omp parallel";
745 PrintOMPExecutableDirective(
Node);
749 Indent() <<
"#pragma omp simd";
750 PrintOMPExecutableDirective(
Node);
754 Indent() <<
"#pragma omp tile";
755 PrintOMPExecutableDirective(
Node);
759 Indent() <<
"#pragma omp unroll";
760 PrintOMPExecutableDirective(
Node);
764 Indent() <<
"#pragma omp for";
765 PrintOMPExecutableDirective(
Node);
769 Indent() <<
"#pragma omp for simd";
770 PrintOMPExecutableDirective(
Node);
774 Indent() <<
"#pragma omp sections";
775 PrintOMPExecutableDirective(
Node);
779 Indent() <<
"#pragma omp section";
780 PrintOMPExecutableDirective(
Node);
784 Indent() <<
"#pragma omp scope";
785 PrintOMPExecutableDirective(
Node);
789 Indent() <<
"#pragma omp single";
790 PrintOMPExecutableDirective(
Node);
794 Indent() <<
"#pragma omp master";
795 PrintOMPExecutableDirective(
Node);
799 Indent() <<
"#pragma omp critical";
800 if (
Node->getDirectiveName().getName()) {
802 Node->getDirectiveName().printName(OS, Policy);
805 PrintOMPExecutableDirective(
Node);
809 Indent() <<
"#pragma omp parallel for";
810 PrintOMPExecutableDirective(
Node);
813void StmtPrinter::VisitOMPParallelForSimdDirective(
815 Indent() <<
"#pragma omp parallel for simd";
816 PrintOMPExecutableDirective(
Node);
819void StmtPrinter::VisitOMPParallelMasterDirective(
821 Indent() <<
"#pragma omp parallel master";
822 PrintOMPExecutableDirective(
Node);
825void StmtPrinter::VisitOMPParallelMaskedDirective(
827 Indent() <<
"#pragma omp parallel masked";
828 PrintOMPExecutableDirective(
Node);
831void StmtPrinter::VisitOMPParallelSectionsDirective(
833 Indent() <<
"#pragma omp parallel sections";
834 PrintOMPExecutableDirective(
Node);
838 Indent() <<
"#pragma omp task";
839 PrintOMPExecutableDirective(
Node);
843 Indent() <<
"#pragma omp taskyield";
844 PrintOMPExecutableDirective(
Node);
848 Indent() <<
"#pragma omp barrier";
849 PrintOMPExecutableDirective(
Node);
853 Indent() <<
"#pragma omp taskwait";
854 PrintOMPExecutableDirective(
Node);
858 Indent() <<
"#pragma omp error";
859 PrintOMPExecutableDirective(
Node);
863 Indent() <<
"#pragma omp taskgroup";
864 PrintOMPExecutableDirective(
Node);
868 Indent() <<
"#pragma omp flush";
869 PrintOMPExecutableDirective(
Node);
873 Indent() <<
"#pragma omp depobj";
874 PrintOMPExecutableDirective(
Node);
878 Indent() <<
"#pragma omp scan";
879 PrintOMPExecutableDirective(
Node);
883 Indent() <<
"#pragma omp ordered";
888 Indent() <<
"#pragma omp atomic";
889 PrintOMPExecutableDirective(
Node);
893 Indent() <<
"#pragma omp target";
894 PrintOMPExecutableDirective(
Node);
898 Indent() <<
"#pragma omp target data";
899 PrintOMPExecutableDirective(
Node);
902void StmtPrinter::VisitOMPTargetEnterDataDirective(
904 Indent() <<
"#pragma omp target enter data";
905 PrintOMPExecutableDirective(
Node,
true);
908void StmtPrinter::VisitOMPTargetExitDataDirective(
910 Indent() <<
"#pragma omp target exit data";
911 PrintOMPExecutableDirective(
Node,
true);
914void StmtPrinter::VisitOMPTargetParallelDirective(
916 Indent() <<
"#pragma omp target parallel";
917 PrintOMPExecutableDirective(
Node);
920void StmtPrinter::VisitOMPTargetParallelForDirective(
922 Indent() <<
"#pragma omp target parallel for";
923 PrintOMPExecutableDirective(
Node);
927 Indent() <<
"#pragma omp teams";
928 PrintOMPExecutableDirective(
Node);
931void StmtPrinter::VisitOMPCancellationPointDirective(
933 Indent() <<
"#pragma omp cancellation point "
934 << getOpenMPDirectiveName(
Node->getCancelRegion());
935 PrintOMPExecutableDirective(
Node);
939 Indent() <<
"#pragma omp cancel "
940 << getOpenMPDirectiveName(
Node->getCancelRegion());
941 PrintOMPExecutableDirective(
Node);
945 Indent() <<
"#pragma omp taskloop";
946 PrintOMPExecutableDirective(
Node);
949void StmtPrinter::VisitOMPTaskLoopSimdDirective(
951 Indent() <<
"#pragma omp taskloop simd";
952 PrintOMPExecutableDirective(
Node);
955void StmtPrinter::VisitOMPMasterTaskLoopDirective(
957 Indent() <<
"#pragma omp master taskloop";
958 PrintOMPExecutableDirective(
Node);
961void StmtPrinter::VisitOMPMaskedTaskLoopDirective(
963 Indent() <<
"#pragma omp masked taskloop";
964 PrintOMPExecutableDirective(
Node);
967void StmtPrinter::VisitOMPMasterTaskLoopSimdDirective(
969 Indent() <<
"#pragma omp master taskloop simd";
970 PrintOMPExecutableDirective(
Node);
973void StmtPrinter::VisitOMPMaskedTaskLoopSimdDirective(
975 Indent() <<
"#pragma omp masked taskloop simd";
976 PrintOMPExecutableDirective(
Node);
979void StmtPrinter::VisitOMPParallelMasterTaskLoopDirective(
981 Indent() <<
"#pragma omp parallel master taskloop";
982 PrintOMPExecutableDirective(
Node);
985void StmtPrinter::VisitOMPParallelMaskedTaskLoopDirective(
987 Indent() <<
"#pragma omp parallel masked taskloop";
988 PrintOMPExecutableDirective(
Node);
991void StmtPrinter::VisitOMPParallelMasterTaskLoopSimdDirective(
993 Indent() <<
"#pragma omp parallel master taskloop simd";
994 PrintOMPExecutableDirective(
Node);
997void StmtPrinter::VisitOMPParallelMaskedTaskLoopSimdDirective(
999 Indent() <<
"#pragma omp parallel masked taskloop simd";
1000 PrintOMPExecutableDirective(
Node);
1004 Indent() <<
"#pragma omp distribute";
1005 PrintOMPExecutableDirective(
Node);
1008void StmtPrinter::VisitOMPTargetUpdateDirective(
1010 Indent() <<
"#pragma omp target update";
1011 PrintOMPExecutableDirective(
Node,
true);
1014void StmtPrinter::VisitOMPDistributeParallelForDirective(
1016 Indent() <<
"#pragma omp distribute parallel for";
1017 PrintOMPExecutableDirective(
Node);
1020void StmtPrinter::VisitOMPDistributeParallelForSimdDirective(
1022 Indent() <<
"#pragma omp distribute parallel for simd";
1023 PrintOMPExecutableDirective(
Node);
1026void StmtPrinter::VisitOMPDistributeSimdDirective(
1028 Indent() <<
"#pragma omp distribute simd";
1029 PrintOMPExecutableDirective(
Node);
1032void StmtPrinter::VisitOMPTargetParallelForSimdDirective(
1034 Indent() <<
"#pragma omp target parallel for simd";
1035 PrintOMPExecutableDirective(
Node);
1039 Indent() <<
"#pragma omp target simd";
1040 PrintOMPExecutableDirective(
Node);
1043void StmtPrinter::VisitOMPTeamsDistributeDirective(
1045 Indent() <<
"#pragma omp teams distribute";
1046 PrintOMPExecutableDirective(
Node);
1049void StmtPrinter::VisitOMPTeamsDistributeSimdDirective(
1051 Indent() <<
"#pragma omp teams distribute simd";
1052 PrintOMPExecutableDirective(
Node);
1055void StmtPrinter::VisitOMPTeamsDistributeParallelForSimdDirective(
1057 Indent() <<
"#pragma omp teams distribute parallel for simd";
1058 PrintOMPExecutableDirective(
Node);
1061void StmtPrinter::VisitOMPTeamsDistributeParallelForDirective(
1063 Indent() <<
"#pragma omp teams distribute parallel for";
1064 PrintOMPExecutableDirective(
Node);
1068 Indent() <<
"#pragma omp target teams";
1069 PrintOMPExecutableDirective(
Node);
1072void StmtPrinter::VisitOMPTargetTeamsDistributeDirective(
1074 Indent() <<
"#pragma omp target teams distribute";
1075 PrintOMPExecutableDirective(
Node);
1078void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForDirective(
1080 Indent() <<
"#pragma omp target teams distribute parallel for";
1081 PrintOMPExecutableDirective(
Node);
1084void StmtPrinter::VisitOMPTargetTeamsDistributeParallelForSimdDirective(
1086 Indent() <<
"#pragma omp target teams distribute parallel for simd";
1087 PrintOMPExecutableDirective(
Node);
1090void StmtPrinter::VisitOMPTargetTeamsDistributeSimdDirective(
1092 Indent() <<
"#pragma omp target teams distribute simd";
1093 PrintOMPExecutableDirective(
Node);
1097 Indent() <<
"#pragma omp interop";
1098 PrintOMPExecutableDirective(
Node);
1102 Indent() <<
"#pragma omp dispatch";
1103 PrintOMPExecutableDirective(
Node);
1107 Indent() <<
"#pragma omp masked";
1108 PrintOMPExecutableDirective(
Node);
1112 Indent() <<
"#pragma omp loop";
1113 PrintOMPExecutableDirective(
Node);
1116void StmtPrinter::VisitOMPTeamsGenericLoopDirective(
1118 Indent() <<
"#pragma omp teams loop";
1119 PrintOMPExecutableDirective(
Node);
1122void StmtPrinter::VisitOMPTargetTeamsGenericLoopDirective(
1124 Indent() <<
"#pragma omp target teams loop";
1125 PrintOMPExecutableDirective(
Node);
1128void StmtPrinter::VisitOMPParallelGenericLoopDirective(
1130 Indent() <<
"#pragma omp parallel loop";
1131 PrintOMPExecutableDirective(
Node);
1134void StmtPrinter::VisitOMPTargetParallelGenericLoopDirective(
1136 Indent() <<
"#pragma omp target parallel loop";
1137 PrintOMPExecutableDirective(
Node);
1144 Indent() <<
"#pragma acc " << S->getDirectiveKind();
1146 PrintStmt(S->getStructuredBlock());
1154 OS <<
Node->getBuiltinStr() <<
"()";
1158 PrintExpr(
Node->getSubExpr());
1162 if (
const auto *OCED = dyn_cast<OMPCapturedExprDecl>(
Node->getDecl())) {
1163 OCED->getInit()->IgnoreImpCasts()->printPretty(OS,
nullptr, Policy);
1166 if (
const auto *TPOD = dyn_cast<TemplateParamObjectDecl>(
Node->getDecl())) {
1167 TPOD->printAsExpr(OS, Policy);
1172 if (
Node->hasTemplateKeyword())
1175 isa<ParmVarDecl, NonTypeTemplateParmDecl>(
Node->getDecl()) &&
1176 Node->getDecl()->getIdentifier())
1177 OS <<
Node->getDecl()->getIdentifier()->deuglifiedName();
1179 Node->getNameInfo().printName(OS, Policy);
1180 if (
Node->hasExplicitTemplateArgs()) {
1182 if (!
Node->hadMultipleCandidates())
1183 if (
auto *TD = dyn_cast<TemplateDecl>(
Node->getDecl()))
1184 TPL = TD->getTemplateParameters();
1189void StmtPrinter::VisitDependentScopeDeclRefExpr(
1193 if (
Node->hasTemplateKeyword())
1195 OS <<
Node->getNameInfo();
1196 if (
Node->hasExplicitTemplateArgs())
1201 if (
Node->getQualifier())
1202 Node->getQualifier()->
print(OS, Policy);
1203 if (
Node->hasTemplateKeyword())
1205 OS <<
Node->getNameInfo();
1206 if (
Node->hasExplicitTemplateArgs())
1211 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
1212 if (
const auto *PD = dyn_cast<ImplicitParamDecl>(DRE->getDecl())) {
1213 if (PD->getParameterKind() == ImplicitParamKind::ObjCSelf &&
1214 DRE->getBeginLoc().isInvalid())
1222 if (
Node->getBase()) {
1225 PrintExpr(
Node->getBase());
1226 OS << (
Node->isArrow() ?
"->" :
".");
1229 OS << *
Node->getDecl();
1233 if (
Node->isSuperReceiver())
1235 else if (
Node->isObjectReceiver() &&
Node->getBase()) {
1236 PrintExpr(
Node->getBase());
1238 }
else if (
Node->isClassReceiver() &&
Node->getClassReceiver()) {
1239 OS <<
Node->getClassReceiver()->getName() <<
".";
1242 if (
Node->isImplicitProperty()) {
1243 if (
const auto *Getter =
Node->getImplicitPropertyGetter())
1244 Getter->getSelector().
print(OS);
1247 Node->getImplicitPropertySetter()->getSelector());
1249 OS <<
Node->getExplicitProperty()->getName();
1253 PrintExpr(
Node->getBaseExpr());
1255 PrintExpr(
Node->getKeyExpr());
1259void StmtPrinter::VisitSYCLUniqueStableNameExpr(
1261 OS <<
"__builtin_sycl_unique_stable_name(";
1262 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1294 bool isSigned =
Node->getType()->isSignedIntegerType();
1297 if (isa<BitIntType>(
Node->getType())) {
1298 OS << (isSigned ?
"wb" :
"uwb");
1304 default: llvm_unreachable(
"Unexpected type for integer literal!");
1305 case BuiltinType::Char_S:
1306 case BuiltinType::Char_U: OS <<
"i8";
break;
1307 case BuiltinType::UChar: OS <<
"Ui8";
break;
1308 case BuiltinType::SChar: OS <<
"i8";
break;
1309 case BuiltinType::Short: OS <<
"i16";
break;
1310 case BuiltinType::UShort: OS <<
"Ui16";
break;
1311 case BuiltinType::Int:
break;
1312 case BuiltinType::UInt: OS <<
'U';
break;
1313 case BuiltinType::Long: OS <<
'L';
break;
1314 case BuiltinType::ULong: OS <<
"UL";
break;
1315 case BuiltinType::LongLong: OS <<
"LL";
break;
1316 case BuiltinType::ULongLong: OS <<
"ULL";
break;
1317 case BuiltinType::Int128:
1319 case BuiltinType::UInt128:
1321 case BuiltinType::WChar_S:
1322 case BuiltinType::WChar_U:
1330 OS <<
Node->getValueAsString(10);
1333 default: llvm_unreachable(
"Unexpected type for fixed point literal!");
1334 case BuiltinType::ShortFract: OS <<
"hr";
break;
1335 case BuiltinType::ShortAccum: OS <<
"hk";
break;
1336 case BuiltinType::UShortFract: OS <<
"uhr";
break;
1337 case BuiltinType::UShortAccum: OS <<
"uhk";
break;
1338 case BuiltinType::Fract: OS <<
"r";
break;
1339 case BuiltinType::Accum: OS <<
"k";
break;
1340 case BuiltinType::UFract: OS <<
"ur";
break;
1341 case BuiltinType::UAccum: OS <<
"uk";
break;
1342 case BuiltinType::LongFract: OS <<
"lr";
break;
1343 case BuiltinType::LongAccum: OS <<
"lk";
break;
1344 case BuiltinType::ULongFract: OS <<
"ulr";
break;
1345 case BuiltinType::ULongAccum: OS <<
"ulk";
break;
1352 Node->getValue().toString(Str);
1354 if (Str.find_first_not_of(
"-0123456789") == StringRef::npos)
1362 default: llvm_unreachable(
"Unexpected type for float literal!");
1363 case BuiltinType::Half:
break;
1364 case BuiltinType::Ibm128:
break;
1365 case BuiltinType::Double:
break;
1366 case BuiltinType::Float16: OS <<
"F16";
break;
1367 case BuiltinType::Float: OS <<
'F';
break;
1368 case BuiltinType::LongDouble: OS <<
'L';
break;
1369 case BuiltinType::Float128: OS <<
'Q';
break;
1380 PrintExpr(
Node->getSubExpr());
1390 PrintExpr(
Node->getSubExpr());
1395 if (!
Node->isPostfix()) {
1400 switch (
Node->getOpcode()) {
1409 if (isa<UnaryOperator>(
Node->getSubExpr()))
1414 PrintExpr(
Node->getSubExpr());
1416 if (
Node->isPostfix())
1421 OS <<
"__builtin_offsetof(";
1422 Node->getTypeSourceInfo()->getType().
print(OS, Policy);
1424 bool PrintedSomething =
false;
1425 for (
unsigned i = 0, n =
Node->getNumComponents(); i < n; ++i) {
1432 PrintedSomething =
true;
1445 if (PrintedSomething)
1448 PrintedSomething =
true;
1449 OS <<
Id->getName();
1454void StmtPrinter::VisitUnaryExprOrTypeTraitExpr(
1457 if (
Node->getKind() == UETT_AlignOf) {
1459 Spelling =
"alignof";
1461 Spelling =
"_Alignof";
1463 Spelling =
"__alignof";
1468 if (
Node->isArgumentType()) {
1470 Node->getArgumentType().
print(OS, Policy);
1474 PrintExpr(
Node->getArgumentExpr());
1480 if (
Node->isExprPredicate())
1481 PrintExpr(
Node->getControllingExpr());
1483 Node->getControllingType()->getType().
print(OS, Policy);
1491 T.
print(OS, Policy);
1493 PrintExpr(Assoc.getAssociationExpr());
1499 PrintExpr(
Node->getLHS());
1501 PrintExpr(
Node->getRHS());
1506 PrintExpr(
Node->getBase());
1508 PrintExpr(
Node->getRowIdx());
1511 PrintExpr(
Node->getColumnIdx());
1516 PrintExpr(
Node->getBase());
1518 if (
Node->getLowerBound())
1519 PrintExpr(
Node->getLowerBound());
1520 if (
Node->getColonLocFirst().isValid()) {
1522 if (
Node->getLength())
1523 PrintExpr(
Node->getLength());
1525 if (
Node->getColonLocSecond().isValid()) {
1527 if (
Node->getStride())
1528 PrintExpr(
Node->getStride());
1535 for (
Expr *E :
Node->getDimensions()) {
1541 PrintExpr(
Node->getBase());
1546 for (
unsigned I = 0, E =
Node->numOfIterators(); I < E; ++I) {
1547 auto *VD = cast<ValueDecl>(
Node->getIteratorDecl(I));
1548 VD->getType().print(OS, Policy);
1550 OS <<
" " << VD->getName() <<
" = ";
1551 PrintExpr(
Range.Begin);
1553 PrintExpr(
Range.End);
1556 PrintExpr(
Range.Step);
1565 for (
unsigned i = 0, e =
Call->getNumArgs(); i != e; ++i) {
1566 if (isa<CXXDefaultArgExpr>(
Call->getArg(i))) {
1572 PrintExpr(
Call->getArg(i));
1577 PrintExpr(
Call->getCallee());
1579 PrintCallArgs(
Call);
1584 if (
const auto *TE = dyn_cast<CXXThisExpr>(E))
1585 return TE->isImplicit();
1591 PrintExpr(
Node->getBase());
1593 auto *ParentMember = dyn_cast<MemberExpr>(
Node->getBase());
1595 ParentMember ? dyn_cast<FieldDecl>(ParentMember->getMemberDecl())
1599 OS << (
Node->isArrow() ?
"->" :
".");
1602 if (
auto *FD = dyn_cast<FieldDecl>(
Node->getMemberDecl()))
1603 if (FD->isAnonymousStructOrUnion())
1608 if (
Node->hasTemplateKeyword())
1610 OS <<
Node->getMemberNameInfo();
1612 if (
auto *FD = dyn_cast<FunctionDecl>(
Node->getMemberDecl())) {
1613 if (!
Node->hadMultipleCandidates())
1614 if (
auto *FTD = FD->getPrimaryTemplate())
1615 TPL = FTD->getTemplateParameters();
1616 }
else if (
auto *VTSD =
1617 dyn_cast<VarTemplateSpecializationDecl>(
Node->getMemberDecl()))
1618 TPL = VTSD->getSpecializedTemplate()->getTemplateParameters();
1619 if (
Node->hasExplicitTemplateArgs())
1624 PrintExpr(
Node->getBase());
1625 OS << (
Node->isArrow() ?
"->isa" :
".isa");
1629 PrintExpr(
Node->getBase());
1631 OS <<
Node->getAccessor().getName();
1636 Node->getTypeAsWritten().
print(OS, Policy);
1638 PrintExpr(
Node->getSubExpr());
1645 PrintExpr(
Node->getInitializer());
1650 PrintExpr(
Node->getSubExpr());
1654 PrintExpr(
Node->getLHS());
1656 PrintExpr(
Node->getRHS());
1660 PrintExpr(
Node->getLHS());
1662 PrintExpr(
Node->getRHS());
1666 PrintExpr(
Node->getCond());
1668 PrintExpr(
Node->getLHS());
1670 PrintExpr(
Node->getRHS());
1677 PrintExpr(
Node->getCommon());
1679 PrintExpr(
Node->getFalseExpr());
1683 OS <<
"&&" <<
Node->getLabel()->getName();
1686void StmtPrinter::VisitStmtExpr(
StmtExpr *E) {
1693 OS <<
"__builtin_choose_expr(";
1694 PrintExpr(
Node->getCond());
1696 PrintExpr(
Node->getLHS());
1698 PrintExpr(
Node->getRHS());
1702void StmtPrinter::VisitGNUNullExpr(
GNUNullExpr *) {
1707 OS <<
"__builtin_shufflevector(";
1708 for (
unsigned i = 0, e =
Node->getNumSubExprs(); i != e; ++i) {
1710 PrintExpr(
Node->getExpr(i));
1716 OS <<
"__builtin_convertvector(";
1717 PrintExpr(
Node->getSrcExpr());
1724 if (
Node->getSyntacticForm()) {
1725 Visit(
Node->getSyntacticForm());
1730 for (
unsigned i = 0, e =
Node->getNumInits(); i != e; ++i) {
1732 if (
Node->getInit(i))
1733 PrintExpr(
Node->getInit(i));
1744 PrintExpr(
Node->getSubExpr());
1754 for (
unsigned i = 0, e =
Node->getNumExprs(); i != e; ++i) {
1756 PrintExpr(
Node->getExpr(i));
1762 bool NeedsEquals =
true;
1764 if (D.isFieldDesignator()) {
1765 if (D.getDotLoc().isInvalid()) {
1767 OS << II->getName() <<
":";
1768 NeedsEquals =
false;
1771 OS <<
"." << D.getFieldName()->getName();
1775 if (D.isArrayDesignator()) {
1776 PrintExpr(
Node->getArrayIndex(D));
1778 PrintExpr(
Node->getArrayRangeStart(D));
1780 PrintExpr(
Node->getArrayRangeEnd(D));
1790 PrintExpr(
Node->getInit());
1793void StmtPrinter::VisitDesignatedInitUpdateExpr(
1797 PrintExpr(
Node->getBase());
1800 OS <<
"/*updater*/";
1801 PrintExpr(
Node->getUpdater());
1806 OS <<
"/*no init*/";
1810 if (
Node->getType()->getAsCXXRecordDecl()) {
1811 OS <<
"/*implicit*/";
1815 OS <<
"/*implicit*/(";
1818 if (
Node->getType()->isRecordType())
1826 OS <<
"__builtin_va_arg(";
1827 PrintExpr(
Node->getSubExpr());
1834 PrintExpr(
Node->getSyntacticForm());
1838 const char *Name =
nullptr;
1839 switch (
Node->getOp()) {
1840#define BUILTIN(ID, TYPE, ATTRS)
1841#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
1842 case AtomicExpr::AO ## ID: \
1845#include "clang/Basic/Builtins.inc"
1850 PrintExpr(
Node->getPtr());
1851 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_load &&
1852 Node->getOp() != AtomicExpr::AO__atomic_load_n &&
1853 Node->getOp() != AtomicExpr::AO__scoped_atomic_load_n &&
1854 Node->getOp() != AtomicExpr::AO__opencl_atomic_load &&
1855 Node->getOp() != AtomicExpr::AO__hip_atomic_load) {
1857 PrintExpr(
Node->getVal1());
1859 if (
Node->getOp() == AtomicExpr::AO__atomic_exchange ||
1860 Node->isCmpXChg()) {
1862 PrintExpr(
Node->getVal2());
1864 if (
Node->getOp() == AtomicExpr::AO__atomic_compare_exchange ||
1865 Node->getOp() == AtomicExpr::AO__atomic_compare_exchange_n) {
1867 PrintExpr(
Node->getWeak());
1869 if (
Node->getOp() != AtomicExpr::AO__c11_atomic_init &&
1870 Node->getOp() != AtomicExpr::AO__opencl_atomic_init) {
1872 PrintExpr(
Node->getOrder());
1874 if (
Node->isCmpXChg()) {
1876 PrintExpr(
Node->getOrderFail());
1884 if (Kind == OO_PlusPlus || Kind == OO_MinusMinus) {
1885 if (
Node->getNumArgs() == 1) {
1887 PrintExpr(
Node->getArg(0));
1889 PrintExpr(
Node->getArg(0));
1892 }
else if (Kind == OO_Arrow) {
1893 PrintExpr(
Node->getArg(0));
1894 }
else if (Kind == OO_Call || Kind == OO_Subscript) {
1895 PrintExpr(
Node->getArg(0));
1896 OS << (
Kind == OO_Call ?
'(' :
'[');
1897 for (
unsigned ArgIdx = 1; ArgIdx <
Node->getNumArgs(); ++ArgIdx) {
1900 if (!isa<CXXDefaultArgExpr>(
Node->getArg(ArgIdx)))
1901 PrintExpr(
Node->getArg(ArgIdx));
1903 OS << (
Kind == OO_Call ?
')' :
']');
1904 }
else if (
Node->getNumArgs() == 1) {
1906 PrintExpr(
Node->getArg(0));
1907 }
else if (
Node->getNumArgs() == 2) {
1908 PrintExpr(
Node->getArg(0));
1910 PrintExpr(
Node->getArg(1));
1912 llvm_unreachable(
"unknown overloaded operator");
1919 if (MD && isa<CXXConversionDecl>(MD)) {
1920 PrintExpr(
Node->getImplicitObjectArgument());
1923 VisitCallExpr(cast<CallExpr>(
Node));
1927 PrintExpr(
Node->getCallee());
1929 PrintCallArgs(
Node->getConfig());
1931 PrintCallArgs(
Node);
1935void StmtPrinter::VisitCXXRewrittenBinaryOperator(
1938 Node->getDecomposedForm();
1939 PrintExpr(
const_cast<Expr*
>(Decomposed.
LHS));
1941 PrintExpr(
const_cast<Expr*
>(Decomposed.
RHS));
1945 OS <<
Node->getCastName() <<
'<';
1946 Node->getTypeAsWritten().
print(OS, Policy);
1948 PrintExpr(
Node->getSubExpr());
1953 VisitCXXNamedCastExpr(
Node);
1957 VisitCXXNamedCastExpr(
Node);
1961 VisitCXXNamedCastExpr(
Node);
1965 VisitCXXNamedCastExpr(
Node);
1969 OS <<
"__builtin_bit_cast(";
1970 Node->getTypeInfoAsWritten()->getType().
print(OS, Policy);
1972 PrintExpr(
Node->getSubExpr());
1977 VisitCXXNamedCastExpr(
Node);
1982 if (
Node->isTypeOperand()) {
1983 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
1985 PrintExpr(
Node->getExprOperand());
1992 if (
Node->isTypeOperand()) {
1993 Node->getTypeOperandSourceInfo()->getType().
print(OS, Policy);
1995 PrintExpr(
Node->getExprOperand());
2001 PrintExpr(
Node->getBaseExpr());
2002 if (
Node->isArrow())
2007 Node->getQualifierLoc().getNestedNameSpecifier())
2009 OS <<
Node->getPropertyDecl()->getDeclName();
2013 PrintExpr(
Node->getBase());
2015 PrintExpr(
Node->getIdx());
2020 switch (
Node->getLiteralOperatorKind()) {
2022 OS << cast<StringLiteral>(
Node->getArg(0)->IgnoreImpCasts())->getString();
2025 const auto *DRE = cast<DeclRefExpr>(
Node->getCallee()->IgnoreImpCasts());
2027 cast<FunctionDecl>(DRE->getDecl())->getTemplateSpecializationArgs();
2032 if (!DRE->hadMultipleCandidates())
2033 if (
const auto *TD = dyn_cast<TemplateDecl>(DRE->getDecl()))
2034 TPL = TD->getTemplateParameters();
2035 OS <<
"operator\"\"" <<
Node->getUDSuffix()->getName();
2043 char C = (char)
P.getAsIntegral().getZExtValue();
2050 const auto *Int = cast<IntegerLiteral>(
Node->getCookedLiteral());
2051 OS <<
toString(Int->getValue(), 10,
false);
2056 auto *
Float = cast<FloatingLiteral>(
Node->getCookedLiteral());
2062 PrintExpr(
Node->getCookedLiteral());
2065 OS <<
Node->getUDSuffix()->getName();
2069 OS << (
Node->getValue() ?
"true" :
"false");
2081 if (!
Node->getSubExpr())
2085 PrintExpr(
Node->getSubExpr());
2098 auto TargetType =
Node->getType();
2099 auto *
Auto = TargetType->getContainedDeducedType();
2100 bool Bare =
Auto &&
Auto->isDeduced();
2105 TargetType.print(OS, Policy);
2110 if (!
Node->isListInitialization())
2112 PrintExpr(
Node->getSubExpr());
2113 if (!
Node->isListInitialization())
2118 PrintExpr(
Node->getSubExpr());
2123 if (
Node->isStdInitListInitialization())
2125 else if (
Node->isListInitialization())
2130 ArgEnd =
Node->arg_end();
2131 Arg != ArgEnd; ++Arg) {
2132 if ((*Arg)->isDefaultArgument())
2134 if (Arg !=
Node->arg_begin())
2138 if (
Node->isStdInitListInitialization())
2140 else if (
Node->isListInitialization())
2148 bool NeedComma =
false;
2149 switch (
Node->getCaptureDefault()) {
2164 CEnd =
Node->explicit_capture_end();
2167 if (
C->capturesVLAType())
2174 switch (
C->getCaptureKind()) {
2186 OS <<
C->getCapturedVar()->getName();
2190 OS <<
C->getCapturedVar()->getName();
2194 llvm_unreachable(
"VLA type in explicit captures.");
2197 if (
C->isPackExpansion())
2200 if (
Node->isInitCapture(
C)) {
2202 auto *D = cast<VarDecl>(
C->getCapturedVar());
2204 llvm::StringRef
Pre;
2205 llvm::StringRef
Post;
2207 !isa<ParenListExpr>(D->getInit())) {
2215 PrintExpr(D->getInit());
2221 if (!
Node->getExplicitTemplateParameters().empty()) {
2222 Node->getTemplateParameterList()->
print(
2223 OS,
Node->getLambdaClass()->getASTContext(),
2227 if (
Node->hasExplicitParameters()) {
2237 std::string ParamStr =
2239 ?
P->getIdentifier()->deuglifiedName().str()
2240 :
P->getNameAsString();
2241 P->getOriginalType().print(OS, Policy, ParamStr);
2250 if (
Node->isMutable())
2259 if (
Node->hasExplicitResultType()) {
2261 Proto->getReturnType().print(OS, Policy);
2270 PrintRawCompoundStmt(
Node->getCompoundStmtBody());
2275 TSInfo->getType().print(OS, Policy);
2281void StmtPrinter::VisitCXXNewExpr(
CXXNewExpr *E) {
2289 for (
unsigned i = 1; i < NumPlace; ++i) {
2301 llvm::raw_string_ostream
s(TypeS);
2304 (*Size)->printPretty(
s, Helper, Policy);
2312 if (InitStyle != CXXNewInitializationStyle::None) {
2313 bool Bare = InitStyle == CXXNewInitializationStyle::Parens &&
2343 OS << II->getName();
2352 for (
unsigned i = 0, e = E->
getNumArgs(); i != e; ++i) {
2353 if (isa<CXXDefaultArgExpr>(E->
getArg(i))) {
2368 OS <<
"<forwarded>";
2380void StmtPrinter::VisitCXXUnresolvedConstructExpr(
2382 Node->getTypeAsWritten().
print(OS, Policy);
2383 if (!
Node->isListInitialization())
2385 for (
auto Arg =
Node->arg_begin(), ArgEnd =
Node->arg_end(); Arg != ArgEnd;
2387 if (Arg !=
Node->arg_begin())
2391 if (!
Node->isListInitialization())
2395void StmtPrinter::VisitCXXDependentScopeMemberExpr(
2397 if (!
Node->isImplicitAccess()) {
2398 PrintExpr(
Node->getBase());
2399 OS << (
Node->isArrow() ?
"->" :
".");
2403 if (
Node->hasTemplateKeyword())
2405 OS <<
Node->getMemberNameInfo();
2406 if (
Node->hasExplicitTemplateArgs())
2411 if (!
Node->isImplicitAccess()) {
2412 PrintExpr(
Node->getBase());
2413 OS << (
Node->isArrow() ?
"->" :
".");
2417 if (
Node->hasTemplateKeyword())
2419 OS <<
Node->getMemberNameInfo();
2420 if (
Node->hasExplicitTemplateArgs())
2426 for (
unsigned I = 0, N = E->
getNumArgs(); I != N; ++I) {
2458 OS <<
"sizeof...(" << *E->
getPack() <<
")";
2465void StmtPrinter::VisitSubstNonTypeTemplateParmPackExpr(
2467 OS << *
Node->getParameterPack();
2470void StmtPrinter::VisitSubstNonTypeTemplateParmExpr(
2472 Visit(
Node->getReplacement());
2480 PrintExpr(
Node->getSubExpr());
2483void StmtPrinter::VisitCXXFoldExpr(
CXXFoldExpr *E) {
2499 llvm::interleaveComma(
Node->getInitExprs(), OS,
2500 [&](
Expr *E) { PrintExpr(E); });
2519 if (!LocalParameters.empty()) {
2522 PrintRawDecl(LocalParam);
2523 if (LocalParam != LocalParameters.back())
2532 if (
auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) {
2533 if (TypeReq->isSubstitutionFailure())
2534 OS <<
"<<error-type>>";
2536 TypeReq->getType()->getType().print(OS, Policy);
2537 }
else if (
auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) {
2538 if (ExprReq->isCompound())
2540 if (ExprReq->isExprSubstitutionFailure())
2541 OS <<
"<<error-expression>>";
2543 PrintExpr(ExprReq->getExpr());
2544 if (ExprReq->isCompound()) {
2546 if (ExprReq->getNoexceptLoc().isValid())
2548 const auto &RetReq = ExprReq->getReturnTypeRequirement();
2549 if (!RetReq.isEmpty()) {
2551 if (RetReq.isSubstitutionFailure())
2552 OS <<
"<<error-type>>";
2553 else if (RetReq.isTypeConstraint())
2554 RetReq.getTypeConstraint()->print(OS, Policy);
2558 auto *NestedReq = cast<concepts::NestedRequirement>(Req);
2560 if (NestedReq->hasInvalidConstraint())
2561 OS <<
"<<error-expression>>";
2563 PrintExpr(NestedReq->getConstraintExpr());
2573 Visit(S->getBody());
2578 if (S->getOperand()) {
2580 Visit(S->getOperand());
2585void StmtPrinter::VisitCoawaitExpr(
CoawaitExpr *S) {
2587 PrintExpr(S->getOperand());
2592 PrintExpr(S->getOperand());
2595void StmtPrinter::VisitCoyieldExpr(
CoyieldExpr *S) {
2597 PrintExpr(S->getOperand());
2604 VisitStringLiteral(
Node->getString());
2615 for (
auto I = Ch.begin(), E = Ch.end(); I != E; ++I) {
2616 if (I != Ch.begin())
2632 Visit(Element.Value);
2633 if (Element.isPackExpansion())
2641 Node->getEncodedType().
print(OS, Policy);
2652 OS <<
"@protocol(" << *
Node->getProtocol() <<
')';
2677 for (
unsigned i = 0, e = Mess->
getNumArgs(); i != e; ++i) {
2679 if (i > 0) OS <<
' ';
2687 PrintExpr(Mess->
getArg(i));
2694 OS << (
Node->getValue() ?
"__objc_yes" :
"__objc_no");
2716 if (isa<FunctionNoProtoType>(AFT)) {
2718 }
else if (!BD->
param_empty() || cast<FunctionProtoType>(AFT)->isVariadic()) {
2723 std::string ParamStr = (*AI)->getNameAsString();
2724 (*AI)->getType().print(OS, Policy, ParamStr);
2727 const auto *FT = cast<FunctionProtoType>(AFT);
2728 if (FT->isVariadic()) {
2738 PrintExpr(
Node->getSourceExpr());
2743 llvm_unreachable(
"Cannot print TypoExpr nodes");
2747 OS <<
"<recovery-expr>(";
2748 const char *Sep =
"";
2749 for (
Expr *E :
Node->subExpressions()) {
2758 OS <<
"__builtin_astype(";
2759 PrintExpr(
Node->getSrcExpr());
2775 StringRef NL,
const ASTContext *Context)
const {
2776 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2777 P.Visit(
const_cast<Stmt *
>(
this));
2782 unsigned Indentation, StringRef NL,
2784 StmtPrinter
P(Out, Helper, Policy, Indentation, NL, Context);
2785 P.PrintControlledStmt(
const_cast<Stmt *
>(
this));
2791 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.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
ArrayTypeTrait getTrait() const
QualType getQueriedType() const
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.
Expr * getArg(unsigned Arg)
Return the specified argument.
bool isStdInitListInitialization() const
Whether this constructor call was written as list-initialization, but was interpreted as forming a st...
bool isListInitialization() const
Whether this constructor call was written as list-initialization.
unsigned getNumArgs() const
Return the number of arguments to the constructor call.
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.
bool isGlobalDelete() const
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.
BinaryOperatorKind getOperator() const
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)".
QualType getAllocatedType() const
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
CXXNewInitializationStyle getInitializationStyle() const
The kind of initializer this new-expression has.
Expr * getPlacementArg(unsigned I)
unsigned getNumPlacementArgs() const
bool isParenTypeId() const
Expr * getInitializer()
The initializer of this new-expression.
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
Expr * getOperand() const
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]).
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
IdentifierInfo * getDestroyedTypeIdentifier() const
In a dependent pseudo-destructor expression for which we do not have full type information on the des...
QualType getDestroyedType() const
Retrieve the type being destroyed.
NestedNameSpecifier * getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
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.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
const NestedNameSpecifierLoc & getNestedNameSpecifierLoc() const
NamedDecl * getFoundDecl() const
SourceLocation getTemplateKWLoc() const
ConceptDecl * getNamedConcept() const
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 an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
An expression trait intrinsic.
Expr * getQueriedExpression() const
ExpressionTrait getTrait() const
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.
const Expr * getSubExpr() const
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...
VarDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
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.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
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.
OpenMP 5.0 [2.1.5, Array Sections].
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.
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.
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,...
StringRef getBridgeKindName() const
Retrieve the kind of bridge being performed as a string.
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
unsigned getNumElements() const
getNumElements - Return number of elements of objective-c dictionary literal.
ObjCDictionaryElement getKeyValueElement(unsigned Index) const
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',...
Represents a C++11 pack expansion that produces a sequence of expressions.
Expr * getPattern()
Retrieve the pattern of the pack expansion.
Expr * getIndexExpr() const
Expr * getPackIdExpression() const
ParenExpr - This represents a parethesized 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.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
void print(raw_ostream &OS, const PrintingPolicy &Policy, const Twine &PlaceHolder=Twine(), unsigned Indentation=0) const
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...
ArrayRef< concepts::Requirement * > getRequirements() const
ArrayRef< ParmVarDecl * > getLocalParameters() const
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.
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.
NamedDecl * getPack() const
Retrieve the parameter pack.
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
bool isValid() const
Return true if this is a valid SourceLocation object.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
CompoundStmt * getSubStmt()
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.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Stores a list of template parameters for a TemplateDecl and its derived classes.
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
TypeSourceInfo * getArg(unsigned I) const
Retrieve the Ith argument.
unsigned getNumArgs() const
Determine the number of arguments to this type trait.
TypeTrait getTrait() const
Determine which type trait this expression uses.
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.
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
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
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 *.