13#ifndef LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
14#define LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
49#include "llvm/ADT/PointerIntPair.h"
50#include "llvm/ADT/SmallVector.h"
51#include "llvm/Support/Casting.h"
62#define TRY_TO(CALL_EXPR) \
64 if (!getDerived().CALL_EXPR) \
70template <
typename T,
typename U>
72template <
typename T,
typename U,
typename R,
typename... P>
78template <
typename FirstMethodPtrTy,
typename SecondMethodPtrTy>
79LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_ATTRIBUTE_NODEBUG
auto
81 [[maybe_unused]] SecondMethodPtrTy SecondMethodPtr)
84 SecondMethodPtrTy>::value)
85 return FirstMethodPtr == SecondMethodPtr;
167 Derived &
getDerived() {
return *
static_cast<Derived *
>(
this); }
332#define ATTR_VISITOR_DECLS_ONLY
333#include "clang/AST/AttrVisitor.inc"
334#undef ATTR_VISITOR_DECLS_ONLY
346#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE) \
347 (::clang::detail::has_same_member_pointer_type< \
348 decltype(&RecursiveASTVisitor::Traverse##NAME), \
349 decltype(&Derived::Traverse##NAME)>::value \
350 ? static_cast<std::conditional_t< \
351 ::clang::detail::has_same_member_pointer_type< \
352 decltype(&RecursiveASTVisitor::Traverse##NAME), \
353 decltype(&Derived::Traverse##NAME)>::value, \
354 Derived &, RecursiveASTVisitor &>>(*this) \
355 .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) \
356 : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))
361#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S) \
363 if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) \
369#define ABSTRACT_STMT(STMT)
370#define STMT(CLASS, PARENT) \
371 bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);
372#include "clang/AST/StmtNodes.inc"
378#define STMT(CLASS, PARENT) \
379 bool WalkUpFrom##CLASS(CLASS *S) { \
380 TRY_TO(WalkUpFrom##PARENT(S)); \
381 TRY_TO(Visit##CLASS(S)); \
384 bool Visit##CLASS(CLASS *S) { return true; }
385#include "clang/AST/StmtNodes.inc"
391#define ABSTRACT_TYPE(CLASS, BASE)
392#define TYPE(CLASS, BASE) \
393 bool Traverse##CLASS##Type(CLASS##Type *T, bool TraverseQualifier);
394#include "clang/AST/TypeNodes.inc"
400#define TYPE(CLASS, BASE) \
401 bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \
402 TRY_TO(WalkUpFrom##BASE(T)); \
403 TRY_TO(Visit##CLASS##Type(T)); \
406 bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
407#include "clang/AST/TypeNodes.inc"
413#define ABSTRACT_TYPELOC(CLASS, BASE)
414#define TYPELOC(CLASS, BASE) \
415 bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL, bool TraverseQualifier);
416#include "clang/AST/TypeLocNodes.def"
435#define TYPE(CLASS, BASE) \
436 bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
437 TRY_TO(WalkUpFrom##BASE##Loc(TL)); \
438 TRY_TO(Visit##CLASS##TypeLoc(TL)); \
441 bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
442#include "clang/AST/TypeNodes.inc"
447#define ABSTRACT_DECL(DECL)
448#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
449#include "clang/AST/DeclNodes.inc"
455#define DECL(CLASS, BASE) \
456 bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \
457 TRY_TO(WalkUpFrom##BASE(D)); \
458 TRY_TO(Visit##CLASS##Decl(D)); \
461 bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
462#include "clang/AST/DeclNodes.inc"
466#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND) \
467 bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);
471#undef DEF_TRAVERSE_TMPL_INST
487 template <
typename T>
488 bool TraverseDeclTemplateParameterLists(
T *D);
495 bool TraverseSubstPackTypeHelper(SubstPackType *
T);
502 bool TraverseVarHelper(
VarDecl *D);
506 bool TraverseTagType(TagType *
T,
bool TraverseQualifier);
507 bool TraverseTagTypeLoc(
TagTypeLoc TL,
bool TraverseQualifier);
508#define GEN_CLANG_CLAUSE_CLASS
509#define CLAUSE_CLASS(Enum, Str, Class) bool Visit##Class(Class *C);
510#include "llvm/Frontend/OpenMP/OMP.inc"
512 template <
typename T>
bool VisitOMPClauseList(T *Node);
514 bool VisitOMPClauseWithPreInit(OMPClauseWithPreInit *Node);
515 bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *Node);
517 bool PostVisitStmt(Stmt *S);
522 bool VisitOpenACCClause(
const OpenACCClause *);
525template <
typename Derived>
532 if (
Expr *IDC =
C->getImmediatelyDeclaredConstraint()) {
544template <
typename Derived>
549 return getDerived().TraverseConceptTypeRequirement(
553 return getDerived().TraverseConceptExprRequirement(
556 return getDerived().TraverseConceptNestedRequirement(
559 llvm_unreachable(
"unexpected case");
562template <
typename Derived>
569#define ABSTRACT_STMT(STMT)
570#define STMT(CLASS, PARENT) \
571 case Stmt::CLASS##Class: \
572 return TRAVERSE_STMT_BASE(CLASS, CLASS, S, Queue);
573#include "clang/AST/StmtNodes.inc"
581template <
typename Derived>
589template <
typename Derived>
595 if (RetReq.isTypeConstraint()) {
597 TRY_TO(TraverseTemplateParameterListHelper(
598 RetReq.getTypeConstraintTemplateParameterList()));
607template <
typename Derived>
615template <
typename Derived>
616bool RecursiveASTVisitor<Derived>::PostVisitStmt(
Stmt *S) {
636#define ABSTRACT_STMT(STMT)
637#define STMT(CLASS, PARENT) \
638 case Stmt::CLASS##Class: \
639 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
640 &Derived::Traverse##CLASS)) { \
641 TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); \
644#define INITLISTEXPR(CLASS, PARENT) \
645 case Stmt::CLASS##Class: \
646 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
647 &Derived::Traverse##CLASS)) { \
648 auto ILE = static_cast<CLASS *>(S); \
649 if (auto Syn = ILE->isSemanticForm() ? ILE->getSyntacticForm() : ILE) \
650 TRY_TO(WalkUpFrom##CLASS(Syn)); \
651 if (auto Sem = ILE->isSemanticForm() ? ILE : ILE->getSemanticForm()) \
652 TRY_TO(WalkUpFrom##CLASS(Sem)); \
655#include "clang/AST/StmtNodes.inc"
665template <
typename Derived>
666LLVM_ATTRIBUTE_NOINLINE
bool
672 Queue->push_back({S,
false});
677 LocalQueue.push_back({S,
false});
679 while (!LocalQueue.empty()) {
680 auto &CurrSAndVisited = LocalQueue.back();
681 Stmt *CurrS = CurrSAndVisited.getPointer();
682 bool Visited = CurrSAndVisited.getInt();
684 LocalQueue.pop_back();
687 TRY_TO(PostVisitStmt(CurrS));
693 CurrSAndVisited.setInt(
true);
694 size_t N = LocalQueue.size();
697 std::reverse(LocalQueue.begin() + N, LocalQueue.end());
699 LocalQueue.pop_back();
706template <
typename Derived>
708 bool TraverseQualifier) {
712 switch (
T->getTypeClass()) {
713#define ABSTRACT_TYPE(CLASS, BASE)
714#define TYPE(CLASS, BASE) \
716 return getDerived().Traverse##CLASS##Type( \
717 static_cast<CLASS##Type *>(const_cast<Type *>(T.getTypePtr())), \
719#include "clang/AST/TypeNodes.inc"
725template <
typename Derived>
727 bool TraverseQualifier) {
732#define ABSTRACT_TYPELOC(CLASS, BASE)
733#define TYPELOC(CLASS, BASE) \
734 case TypeLoc::CLASS: \
735 return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>(), \
737#include "clang/AST/TypeLocNodes.def"
744#define VISITORCLASS RecursiveASTVisitor
745#include "clang/AST/AttrVisitor.inc"
748template <
typename Derived>
760 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(D))
761 return TraverseTemplateTypeParamDeclConstraints(TTPD);
772 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
773 if (llvm::isa_and_present<TypeAliasTemplateDecl>(
774 FTD->getDeclName().getCXXDeductionGuideTemplate()))
779#define ABSTRACT_DECL(DECL)
780#define DECL(CLASS, BASE) \
782 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
785#include "clang/AST/DeclNodes.inc"
790template <
typename Derived>
808 llvm_unreachable(
"unhandled kind");
811template <
typename Derived>
834template <
typename Derived>
863template <
typename Derived>
868 Template.getAsQualifiedTemplateName()) {
869 if (QTN->getQualifier()) {
877template <
typename Derived>
908template <
typename Derived>
924 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
947template <
typename Derived>
956template <
typename Derived>
968template <
typename Derived>
973 if (LE->isInitCapture(
C))
983#define DEF_TRAVERSE_TYPE(TYPE, CODE) \
984 template <typename Derived> \
985 bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T, \
986 bool TraverseQualifier) { \
987 if (!getDerived().shouldTraversePostOrder()) \
988 TRY_TO(WalkUpFrom##TYPE(T)); \
992 if (getDerived().shouldTraversePostOrder()) \
993 TRY_TO(WalkUpFrom##TYPE(T)); \
1004 {
TRY_TO(TraverseType(
T->getPointeeType())); })
1007 {
TRY_TO(TraverseType(T->getPointeeType())); })
1010 {
TRY_TO(TraverseType(
T->getPointeeType())); })
1013 NestedNameSpecifier Qualifier =
1016 : T->getQualifier();
1017 TRY_TO(TraverseNestedNameSpecifier(Qualifier));
1026 TRY_TO(TraverseType(
T->getElementType()));
1027 if (
T->getSizeExpr())
1028 TRY_TO(TraverseStmt(
const_cast<Expr*
>(
T->getSizeExpr())));
1032 TRY_TO(TraverseType(T->getElementType()));
1033 if (
T->getSizeExpr())
1034 TRY_TO(TraverseStmt(
const_cast<Expr *
>(
T->getSizeExpr())));
1038 {
TRY_TO(TraverseType(
T->getElementType())); })
1041 TRY_TO(TraverseType(T->getElementType()));
1046 TRY_TO(TraverseType(
T->getElementType()));
1047 if (
T->getSizeExpr())
1048 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1052 TRY_TO(TraverseStmt(T->getAddrSpaceExpr()));
1053 TRY_TO(TraverseType(T->getPointeeType()));
1057 if (
T->getSizeExpr())
1058 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1059 TRY_TO(TraverseType(
T->getElementType()));
1063 if (T->getSizeExpr())
1064 TRY_TO(TraverseStmt(T->getSizeExpr()));
1073 {
TRY_TO(TraverseType(
T->getElementType())); })
1076 if (T->getRowExpr())
1077 TRY_TO(TraverseStmt(T->getRowExpr()));
1078 if (T->getColumnExpr())
1079 TRY_TO(TraverseStmt(T->getColumnExpr()));
1080 TRY_TO(TraverseType(T->getElementType()));
1084 {
TRY_TO(TraverseType(
T->getReturnType())); })
1087 TRY_TO(TraverseType(T->getReturnType()));
1089 for (
const auto &A :
T->param_types()) {
1093 for (
const auto &E :
T->exceptions()) {
1098 TRY_TO(TraverseStmt(NE));
1102 if (TraverseQualifier)
1103 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1106 if (TraverseQualifier)
1107 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1110 if (TraverseQualifier)
1111 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1115 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
1120 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
1123 TRY_TO(TraverseType(
T->getPattern()));
1124 TRY_TO(TraverseStmt(
T->getIndexExpr()));
1128 TRY_TO(TraverseType(T->getBaseType()));
1133 TRY_TO(TraverseType(
T->getDeducedType()));
1134 if (
T->isConstrained()) {
1135 TRY_TO(TraverseTemplateArguments(
T->getTypeConstraintArguments()));
1141 TRY_TO(TraverseType(
T->getReplacementType()));
1144 {
TRY_TO(TraverseSubstPackTypeHelper(
T)); })
1146 {
TRY_TO(TraverseSubstPackTypeHelper(T)); })
1149 {
TRY_TO(TraverseType(
T->getModifiedType())); })
1152 if (T->getCountExpr())
1153 TRY_TO(TraverseStmt(T->getCountExpr()));
1158 {
TRY_TO(TraverseType(
T->getWrappedType())); })
1161 {
TRY_TO(TraverseType(T->getWrappedType())); })
1164 for (
auto &Operand :
T->getOperands()) {
1165 if (Operand.isConstant() || Operand.isType()) {
1166 TRY_TO(TraverseType(Operand.getResultType()));
1174 {
TRY_TO(TraverseType(
T->getUnderlyingType())); })
1176template <typename Derived>
1177bool RecursiveASTVisitor<Derived>::TraverseTagType(TagType *T,
1178 bool TraverseQualifier) {
1179 if (TraverseQualifier)
1180 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1186 {
TRY_TO(TraverseTagType(T, TraverseQualifier)); })
1188 {
TRY_TO(TraverseTagType(
T, TraverseQualifier)); })
1191 if (TraverseQualifier)
1192 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1196 if (TraverseQualifier) {
1197 TRY_TO(TraverseTemplateName(
T->getTemplateName()));
1201 T->getTemplateName().getAsTemplateDecl(
true))));
1203 TRY_TO(TraverseTemplateArguments(
T->template_arguments()));
1207 if (TraverseQualifier) {
1208 TRY_TO(TraverseTemplateName(T->getTemplateName()));
1212 T->getTemplateName().getAsTemplateDecl(
true))));
1214 TRY_TO(TraverseType(
T->getDeducedType()));
1226 if (
T->getBaseType().getTypePtr() !=
T)
1227 TRY_TO(TraverseType(
T->getBaseType()));
1228 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
1229 TRY_TO(TraverseType(typeArg));
1234 {
TRY_TO(TraverseType(
T->getPointeeType())); })
1242 {
TRY_TO(TraverseStmt(
T->getNumBitsExpr())); })
1256 template <
typename Derived> \
1257 bool RecursiveASTVisitor<Derived>::Traverse##
TYPE##Loc( \
1258 TYPE##Loc TL,
bool TraverseQualifier) { \
1259 if (!getDerived().shouldTraversePostOrder()) { \
1260 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1261 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1262 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1267 if (getDerived().shouldTraversePostOrder()) { \
1268 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1269 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1270 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1275template <
typename Derived>
1278 assert(TraverseQualifier &&
1279 "Qualifiers should never occur within NestedNameSpecifiers");
1295 return TraverseTypeLoc(TL.getUnqualifiedLoc());
1302 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1306 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1309 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1312 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1315 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1320 if (NestedNameSpecifierLoc QL = TL.getQualifierLoc())
1323 TRY_TO(TraverseNestedNameSpecifier(TL.getTypePtr()->getQualifier()));
1328 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1331 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1333template <typename Derived>
1334bool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(
ArrayTypeLoc TL) {
1336 TRY_TO(TraverseStmt(TL.getSizeExpr()));
1341 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1342 TRY_TO(TraverseArrayTypeLocHelper(TL));
1346 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1351 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1352 TRY_TO(TraverseArrayTypeLocHelper(TL));
1356 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1357 TRY_TO(TraverseArrayTypeLocHelper(TL));
1361 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1362 TRY_TO(TraverseArrayTypeLocHelper(TL));
1366 TRY_TO(TraverseStmt(TL.getTypePtr()->getAddrSpaceExpr()));
1367 TRY_TO(TraverseType(TL.getTypePtr()->getPointeeType()));
1373 if (TL.getTypePtr()->getSizeExpr())
1374 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1375 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1380 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1384 if (TL.getTypePtr()->getSizeExpr())
1385 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1386 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1392 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1396 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1397 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1398 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1402 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1403 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1404 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1408 {
TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1412 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1416 for (
unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
1417 if (TL.getParam(I)) {
1418 TRY_TO(TraverseDecl(TL.getParam(I)));
1419 }
else if (I < T->getNumParams()) {
1420 TRY_TO(TraverseType(
T->getParamType(I)));
1424 for (
const auto &E : T->exceptions()) {
1428 if (
Expr *NE =
T->getNoexceptExpr())
1429 TRY_TO(TraverseStmt(NE));
1434 TraverseQualifier && QualifierLoc)
1438 if (NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc();
1439 TraverseQualifier && QualifierLoc)
1444 TraverseQualifier && QualifierLoc)
1449 {
TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1452 TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo()->getTypeLoc()));
1457 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
1461 TRY_TO(TraverseType(TL.getPattern()));
1462 TRY_TO(TraverseStmt(TL.getTypePtr()->getIndexExpr()));
1466 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1470 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1471 if (TL.isConstrained()) {
1472 TRY_TO(TraverseConceptReference(TL.getConceptReference()));
1478 TRY_TO(TraverseType(TL.getTypePtr()->getReplacementType()));
1481template <typename Derived>
1482bool RecursiveASTVisitor<Derived>::TraverseSubstPackTypeLocHelper(
1484 TRY_TO(TraverseTemplateArgument(TL.getTypePtr()->getArgumentPack()));
1488template <
typename Derived>
1489bool RecursiveASTVisitor<Derived>::TraverseSubstPackTypeHelper(
1491 TRY_TO(TraverseTemplateArgument(
T->getArgumentPack()));
1496 {
TRY_TO(TraverseSubstPackTypeLocHelper(TL)); })
1499 {
TRY_TO(TraverseSubstPackTypeLocHelper(TL)); })
1504 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1507 {
TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1510 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1513 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1516 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1519 {
TRY_TO(TraverseType(TL.getType())); })
1521template <typename Derived>
1522bool RecursiveASTVisitor<Derived>::TraverseTagTypeLoc(TagTypeLoc TL,
1523 bool TraverseQualifier) {
1524 if (NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc();
1525 TraverseQualifier && QualifierLoc)
1531 {
TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })
1533 {
TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })
1535 {
TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })
1538 if (TraverseQualifier)
1543 if (TraverseQualifier)
1547 TRY_TO(TraverseTemplateName(
1548 TemplateName(TL.getTypePtr()->getTemplateName().getAsTemplateDecl(
1551 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1552 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1557 if (TraverseQualifier)
1560 const auto *T = TL.getTypePtr();
1563 TraverseTemplateName(
TemplateName(
T->getTemplateName().getAsTemplateDecl(
1570 {
TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1573 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1574 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));
1575 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1584 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
1585 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
1586 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
1587 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
1588 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1590 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1595 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1603 TRY_TO(TraverseStmt(TL.getTypePtr()->getNumBitsExpr()));
1617template <typename Derived>
1619 const Decl *Child) {
1625 if (
const CXXRecordDecl* Cls = dyn_cast<CXXRecordDecl>(Child))
1626 return Cls->isLambda();
1630template <
typename Derived>
1631bool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(
DeclContext *DC) {
1635 for (
auto *Child : DC->decls()) {
1636 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1637 TRY_TO(TraverseDecl(Child));
1644#define DEF_TRAVERSE_DECL(DECL, CODE) \
1645 template <typename Derived> \
1646 bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
1647 bool ShouldVisitChildren = true; \
1648 bool ReturnValue = true; \
1649 if (!getDerived().shouldTraversePostOrder()) \
1650 TRY_TO(WalkUpFrom##DECL(D)); \
1652 if (ReturnValue && ShouldVisitChildren) \
1653 TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
1654 if (ReturnValue) { \
1656 for (auto *I : D->attrs()) \
1657 TRY_TO(getDerived().TraverseAttr(I)); \
1659 if (ReturnValue && getDerived().shouldTraversePostOrder()) \
1660 TRY_TO(WalkUpFrom##DECL(D)); \
1661 return ReturnValue; \
1668 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
1669 TRY_TO(TraverseStmt(D->getBody()));
1670 for (
const auto &I : D->captures()) {
1671 if (I.hasCopyExpr()) {
1672 TRY_TO(TraverseStmt(I.getCopyExpr()));
1675 ShouldVisitChildren =
false;
1679 TRY_TO(TraverseStmt(D->getBody()));
1680 ShouldVisitChildren =
false;
1684 TRY_TO(TraverseStmt(D->getBody()));
1685 ShouldVisitChildren =
false;
1695 TRY_TO(TraverseStmt(D->getTemporaryExpr()));
1699 {
TRY_TO(TraverseStmt(D->getAsmStringExpr())); })
1707 if (D->getFriendType()) {
1708 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1711 if (
auto *TT = D->getFriendType()->getType()->getAs<TagType>();
1712 TT && TT->isTagOwned())
1713 TRY_TO(TraverseDecl(TT->getDecl()));
1715 TRY_TO(TraverseDecl(D->getFriendDecl()));
1720 if (D->getFriendType())
1721 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1723 TRY_TO(TraverseDecl(D->getFriendDecl()));
1724 for (
unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
1727 ITPL != ETPL; ++ITPL) {
1728 TRY_TO(TraverseDecl(*ITPL));
1741 TRY_TO(TraverseStmt(D->getAssertExpr()));
1742 TRY_TO(TraverseStmt(D->getMessage()));
1752 auto Scope = D->getASTContext().getTraversalScope();
1753 bool HasLimitedScope =
1755 if (HasLimitedScope) {
1756 ShouldVisitChildren =
false;
1757 for (
auto *Child :
Scope) {
1758 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1759 TRY_TO(TraverseDecl(Child));
1775 ShouldVisitChildren =
false;
1793 for (
auto typeParam : *typeParamList) {
1794 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1797 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1799 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1811 for (
auto typeParam : *typeParamList) {
1812 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1817 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
1819 if (D->isThisDeclarationADefinition()) {
1820 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1822 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1828 if (D->isThisDeclarationADefinition()) {
1829 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1831 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1837 if (D->getReturnTypeSourceInfo()) {
1838 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1843 if (D->isThisDeclarationADefinition()) {
1844 TRY_TO(TraverseStmt(D->getBody()));
1846 ShouldVisitChildren =
false;
1850 if (D->hasExplicitBound()) {
1851 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1859 if (D->getTypeSourceInfo())
1860 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1862 TRY_TO(TraverseType(D->getType()));
1863 ShouldVisitChildren =
false;
1868 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1872 {
TRY_TO(TraverseTypeLoc(D->getEnumTypeLoc())); })
1885 for (
auto *I : D->varlist()) {
1891 for (
auto *I : D->varlist()) {
1897 for (
auto *
C : D->clauselists()) {
1903 TRY_TO(TraverseStmt(D->getCombiner()));
1906 TRY_TO(TraverseType(D->getType()));
1911 for (
auto *
C : D->clauselists())
1913 TRY_TO(TraverseType(D->getType()));
1920 for (
auto *I : D->varlist())
1922 for (
auto *
C : D->clauselists())
1927 {
TRY_TO(VisitOpenACCClauseList(D->clauses())); })
1930 TRY_TO(TraverseStmt(D->getFunctionReference()));
1931 TRY_TO(VisitOpenACCClauseList(D->clauses()));
1935template <typename Derived>
1936bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1942 if (
Expr *RequiresClause = TPL->getRequiresClause()) {
1943 TRY_TO(TraverseStmt(RequiresClause));
1949template <
typename Derived>
1950template <
typename T>
1951bool RecursiveASTVisitor<Derived>::TraverseDeclTemplateParameterLists(
T *D) {
1952 for (
unsigned i = 0; i < D->getNumTemplateParameterLists(); i++) {
1954 TraverseTemplateParameterListHelper(TPL);
1959template <
typename Derived>
1962 for (
auto *SD : D->specializations()) {
1963 for (
auto *RD : SD->redecls()) {
1970 TRY_TO(TraverseDecl(RD));
1987template <
typename Derived>
1990 for (
auto *SD : D->specializations()) {
1991 for (
auto *RD : SD->redecls()) {
1996 TRY_TO(TraverseDecl(RD));
2012template <
typename Derived>
2015 for (
auto *FD : D->specializations()) {
2016 for (
auto *RD : FD->redecls()) {
2017 switch (RD->getTemplateSpecializationKind()) {
2021 TRY_TO(TraverseDecl(RD));
2028 TRY_TO(TraverseDecl(RD));
2042#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND) \
2043 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \
2044 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
2045 TRY_TO(TraverseDecl(D->getTemplatedDecl())); \
2053 if (getDerived().shouldVisitTemplateInstantiations() && \
2054 D == D->getCanonicalDecl()) \
2055 TRY_TO(TraverseTemplateInstantiations(D)); \
2069 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
2070 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2071 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
2072 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2076 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2079template <typename Derived>
2080bool RecursiveASTVisitor<Derived>::TraverseTemplateTypeParamDeclConstraints(
2082 if (
const auto *TC = D->getTypeConstraint())
2083 TRY_TO(TraverseTypeConstraint(TC));
2089 if (D->getTypeForDecl())
2091 TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));
2092 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2093 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
2097 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2104 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2111 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
2112 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2116 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2117 TRY_TO(TraverseStmt(D->getConstraintExpr()));
2132 TRY_TO(TraverseDeclTemplateParameterLists(D));
2135 if (
auto *TSI = D->getIntegerTypeSourceInfo())
2136 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2142template <typename Derived>
2143bool RecursiveASTVisitor<Derived>::TraverseRecordHelper(
RecordDecl *D) {
2147 TRY_TO(TraverseDeclTemplateParameterLists(D));
2152template <
typename Derived>
2155 TRY_TO(TraverseTypeLoc(
Base.getTypeSourceInfo()->getTypeLoc()));
2159template <
typename Derived>
2160bool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(
CXXRecordDecl *D) {
2161 if (!TraverseRecordHelper(D))
2163 if (D->isCompleteDefinition()) {
2164 for (
const auto &I : D->bases()) {
2165 TRY_TO(TraverseCXXBaseSpecifier(I));
2177template <typename Derived>
2178bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
2180 for (
unsigned I = 0; I < Count; ++I) {
2181 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
2186#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2187 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \
2196 if (const auto *ArgsWritten = D->getTemplateArgsAsWritten()) { \
2197 assert(D->getTemplateSpecializationKind() != TSK_ImplicitInstantiation); \
2199 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2200 ArgsWritten->getTemplateArgs(), ArgsWritten->NumTemplateArgs)); \
2203 if (getDerived().shouldVisitTemplateInstantiations() || \
2204 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \
2206 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2208 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); \
2221#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2222 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
2224 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
2226 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2227 D->getTemplateArgsAsWritten()->getTemplateArgs(), \
2228 D->getTemplateArgsAsWritten()->NumTemplateArgs)); \
2233 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2247 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2252template <typename Derived>
2253bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(
DeclaratorDecl *D) {
2254 TRY_TO(TraverseDeclTemplateParameterLists(D));
2256 if (D->getTypeSourceInfo())
2257 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2259 TRY_TO(TraverseType(D->getType()));
2264 TRY_TO(TraverseVarHelper(D));
2265 for (
auto *Binding : D->bindings()) {
2266 TRY_TO(TraverseDecl(Binding));
2271 if (getDerived().shouldVisitImplicitCode()) {
2272 TRY_TO(TraverseStmt(D->getBinding()));
2273 if (
const auto HoldingVar = D->getHoldingVar())
2274 TRY_TO(TraverseDecl(HoldingVar));
2286 TRY_TO(TraverseDeclaratorHelper(D));
2287 if (D->isBitField())
2288 TRY_TO(TraverseStmt(D->getBitWidth()));
2289 if (D->hasInClassInitializer())
2290 TRY_TO(TraverseStmt(D->getInClassInitializer()));
2294 TRY_TO(TraverseDeclaratorHelper(D));
2295 if (D->isBitField())
2296 TRY_TO(TraverseStmt(D->getBitWidth()));
2301 TRY_TO(TraverseDeclaratorHelper(D));
2302 if (D->isBitField())
2303 TRY_TO(TraverseStmt(D->getBitWidth()));
2307template <typename Derived>
2308bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(
FunctionDecl *D) {
2309 TRY_TO(TraverseDeclTemplateParameterLists(D));
2311 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2319 D->getTemplateSpecializationInfo()) {
2325 FTSI->TemplateArgumentsAsWritten) {
2326 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2327 TALI->NumTemplateArgs));
2331 D->getDependentSpecializationInfo()) {
2333 DFSI->TemplateArgumentsAsWritten) {
2334 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2335 TALI->NumTemplateArgs));
2344 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2345 }
else if (getDerived().shouldVisitImplicitCode()) {
2357 D->getTrailingRequiresClause()) {
2359 const_cast<Expr *
>(TrailingRequiresClause.ConstraintExpr)));
2364 for (
auto *I : Ctor->inits()) {
2365 if (I->isWritten() || getDerived().shouldVisitImplicitCode())
2366 TRY_TO(TraverseConstructorInitializer(I));
2371 D->isThisDeclarationADefinition() &&
2374 (!D->isDefaulted() || getDerived().shouldVisitImplicitCode());
2376 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2378 if (RD->isLambda() &&
2380 VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();
2386 TRY_TO(TraverseStmt(D->getBody()));
2389 for (
auto *Child : D->decls()) {
2391 TRY_TO(TraverseDecl(Child));
2400 ShouldVisitChildren =
false;
2407 ShouldVisitChildren =
false;
2414 ShouldVisitChildren =
false;
2421 ShouldVisitChildren =
false;
2430 ShouldVisitChildren =
false;
2437 ShouldVisitChildren =
false;
2441template <typename Derived>
2442bool RecursiveASTVisitor<Derived>::TraverseVarHelper(
VarDecl *D) {
2443 TRY_TO(TraverseDeclaratorHelper(D));
2446 (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))
2447 TRY_TO(TraverseStmt(D->getInit()));
2457 TRY_TO(TraverseDeclaratorHelper(D));
2458 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2459 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
2463 TRY_TO(TraverseVarHelper(D));
2465 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
2466 !D->hasUnparsedDefaultArg())
2467 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
2469 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
2470 !D->hasUnparsedDefaultArg())
2471 TRY_TO(TraverseStmt(D->getDefaultArg()));
2477 TRY_TO(TraverseTemplateArguments(D->getTemplateArguments()));
2493 template <
typename Derived> \
2495 STMT *S, DataRecursionQueue *Queue) { \
2496 bool ShouldVisitChildren =
true; \
2498 if (!getDerived().shouldTraversePostOrder()) \
2499 TRY_TO(WalkUpFrom##
STMT(S)); \
2501 if (ShouldVisitChildren) { \
2502 for (
Stmt * SubStmt : getDerived().getStmtChildren(S)) { \
2503 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
2510 if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \
2511 TRY_TO(WalkUpFrom##
STMT(S)); \
2518 for (
unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
2521 for (
unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
2524 for (
unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
2537 TRY_TO(TraverseDecl(S->getExceptionDecl()));
2542 for (
auto *I : S->decls()) {
2550 ShouldVisitChildren =
false;
2579 if (!getDerived().shouldVisitImplicitCode()) {
2586 ShouldVisitChildren =
false;
2592 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2603 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2604 if (S->hasExplicitTemplateArgs()) {
2605 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2606 S->getNumTemplateArgs()));
2612 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2613 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2614 S->getNumTemplateArgs()));
2619 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2620 if (S->hasExplicitTemplateArgs()) {
2621 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2622 S->getNumTemplateArgs()));
2628 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2629 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2630 S->getNumTemplateArgs()));
2640 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2644 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2648 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2652 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2656 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2660 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2664 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2668 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2671template <typename Derived>
2677 if (!getDerived().shouldTraversePostOrder())
2678 TRY_TO(WalkUpFromInitListExpr(S));
2685 if (!Queue && getDerived().shouldTraversePostOrder())
2686 TRY_TO(WalkUpFromInitListExpr(S));
2691template <
typename Derived>
2697template <
typename Derived>
2700 if (!getDerived().shouldTraversePostOrder())
2701 TRY_TO(VisitConceptReference(CR));
2703 TRY_TO(TraverseDeclarationNameInfo(CR->getConceptNameInfo()));
2704 if (CR->hasExplicitTemplateArgs())
2705 TRY_TO(TraverseTemplateArgumentLocsHelper(
2706 CR->getTemplateArgsAsWritten()->getTemplateArgs(),
2707 CR->getTemplateArgsAsWritten()->NumTemplateArgs));
2708 if (getDerived().shouldTraversePostOrder())
2709 TRY_TO(VisitConceptReference(CR));
2721template <
typename Derived>
2724 if (S->isSemanticForm() && S->isSyntacticForm()) {
2726 TRY_TO(TraverseSynOrSemInitListExpr(S, Queue));
2729 TRY_TO(TraverseSynOrSemInitListExpr(
2730 S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
2731 if (getDerived().shouldVisitImplicitCode()) {
2734 TRY_TO(TraverseSynOrSemInitListExpr(
2735 S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
2744 if (S->isExprPredicate())
2745 TRY_TO(TraverseStmt(S->getControllingExpr()));
2747 TRY_TO(TraverseTypeLoc(S->getControllingType()->getTypeLoc()));
2751 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2754 ShouldVisitChildren =
false;
2762 e = S->semantics_end();
2766 sub = OVE->getSourceExpr();
2769 ShouldVisitChildren =
false;
2775 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2780 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
2788 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2794 if (S->isArgumentType())
2795 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
2801 if (S->isTypeOperand())
2802 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2814 if (S->isTypeOperand())
2815 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2819 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2820 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2824 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
2832 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
2837 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2843 for (
unsigned I = 0, N = S->capture_size(); I != N; ++I) {
2845 if (
C->isExplicit() || getDerived().shouldVisitImplicitCode()) {
2846 TRY_TO(TraverseLambdaCapture(S,
C, S->capture_init_begin()[I]));
2850 if (getDerived().shouldVisitImplicitCode()) {
2852 TRY_TO(TraverseDecl(S->getLambdaClass()));
2855 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2858 TRY_TO(TraverseTemplateParameterListHelper(S->getTemplateParameterList()));
2859 if (S->hasExplicitParameters()) {
2861 for (
unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2862 TRY_TO(TraverseDecl(Proto.getParam(I)));
2865 auto *
T = Proto.getTypePtr();
2866 for (
const auto &E :
T->exceptions())
2869 if (
Expr *NE =
T->getNoexceptExpr())
2872 if (S->hasExplicitResultType())
2873 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2875 const_cast<Expr *
>(S->getTrailingRequiresClause().ConstraintExpr));
2879 ShouldVisitChildren =
false;
2884 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2903 TRY_TO(TraverseDecl(S->getBlockDecl()));
2909 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2915 if (getDerived().shouldVisitImplicitCode())
2916 TRY_TO(TraverseStmt(S->getExpr()));
2920 if (getDerived().shouldVisitImplicitCode())
2921 TRY_TO(TraverseStmt(S->getExpr()));
2933 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2934 if (
TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2935 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
2958 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2966 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2970 if (S->isClassReceiver()) {
2972 QualType Type = IDecl->getASTContext().getObjCInterfaceType(IDecl);
2974 Data.NameLoc = S->getReceiverLocation();
2985 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2992 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
3008 if (S->hasExplicitTemplateArgs()) {
3009 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
3010 S->getNumTemplateArgs()));
3016 if (S->hasExplicitTemplateArgs()) {
3017 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
3018 S->getNumTemplateArgs()));
3029 if (getDerived().shouldVisitImplicitCode()) {
3030 TRY_TO(TraverseStmt(S->getOriginalStmt()));
3031 TRY_TO(TraverseDecl(S->getOutlinedFunctionDecl()));
3032 ShouldVisitChildren =
false;
3038 if (!getDerived().shouldVisitImplicitCode()) {
3040 S->getDecomposedForm();
3041 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.LHS)));
3042 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.RHS)));
3043 ShouldVisitChildren =
false;
3069 if (S->getLifetimeExtendedTemporaryDecl()) {
3070 TRY_TO(TraverseLifetimeExtendedTemporaryDecl(
3071 S->getLifetimeExtendedTemporaryDecl()));
3072 ShouldVisitChildren =
false;
3079 if (!getDerived().shouldVisitImplicitCode()) {
3081 ShouldVisitChildren =
false;
3085 if (!getDerived().shouldVisitImplicitCode()) {
3087 ShouldVisitChildren =
false;
3091 if (!getDerived().shouldVisitImplicitCode()) {
3093 ShouldVisitChildren =
false;
3097 if (!getDerived().shouldVisitImplicitCode()) {
3099 ShouldVisitChildren =
false;
3103 if (!getDerived().shouldVisitImplicitCode()) {
3105 ShouldVisitChildren =
false;
3110 TRY_TO(TraverseConceptReference(S->getConceptReference()));
3114 TRY_TO(TraverseDecl(S->getBody()));
3116 TRY_TO(TraverseDecl(Parm));
3118 TRY_TO(TraverseConceptRequirement(Req));
3137template <typename Derived>
3138bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
3139 OMPExecutableDirective *S) {
3140 for (
auto *
C : S->clauses()) {
3147 if (!getDerived().shouldVisitImplicitCode()) {
3149 TRY_TO(TraverseStmt(S->getLoopStmt()));
3150 ShouldVisitChildren =
false;
3154template <typename Derived>
3156RecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
3157 return TraverseOMPExecutableDirective(S);
3161 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3164 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3167 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3170 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3173 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3176 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3179 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3182 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3185 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3188 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3191 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3194 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3197 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3200 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3203 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3206 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3209 TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
3210 TRY_TO(TraverseOMPExecutableDirective(S));
3214 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3217 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3220 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3223 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3226 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3229 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3232 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3235 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3238 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3241 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3244 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3247 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3250 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3253 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3256 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3259 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3262 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3265 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3268 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3271 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3274 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3277 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3280 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3283 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3286 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3289 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3292 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3295 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3298 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3301 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3304 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3307 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3310 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3313 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3316 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3319 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3322 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3325 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3328 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3331 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3334 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3337 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3340 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3343 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3346 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3349 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3352 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3355 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3358 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3361 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3364 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3367 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3370 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3373 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3376 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3379 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3382 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3385 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3388 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3391 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3394template <typename Derived>
3395bool RecursiveASTVisitor<Derived>::TraverseOMPClause(
OMPClause *
C) {
3398 switch (
C->getClauseKind()) {
3399#define GEN_CLANG_CLAUSE_CLASS
3400#define CLAUSE_CLASS(Enum, Str, Class) \
3401 case llvm::omp::Clause::Enum: \
3402 TRY_TO(Visit##Class(static_cast<Class *>(C))); \
3404#define CLAUSE_NO_CLASS(Enum, Str) \
3405 case llvm::omp::Clause::Enum: \
3407#include "llvm/Frontend/OpenMP/OMP.inc"
3412template <
typename Derived>
3413bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
3415 TRY_TO(TraverseStmt(Node->getPreInitStmt()));
3419template <
typename Derived>
3420bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
3422 TRY_TO(VisitOMPClauseWithPreInit(Node));
3423 TRY_TO(TraverseStmt(Node->getPostUpdateExpr()));
3427template <
typename Derived>
3430 TRY_TO(TraverseStmt(
C->getAllocator()));
3434template <
typename Derived>
3436 TRY_TO(TraverseStmt(
C->getAllocator()));
3437 TRY_TO(VisitOMPClauseList(
C));
3441template <
typename Derived>
3443 TRY_TO(VisitOMPClauseWithPreInit(
C));
3444 TRY_TO(TraverseStmt(
C->getCondition()));
3448template <
typename Derived>
3450 TRY_TO(VisitOMPClauseWithPreInit(
C));
3451 TRY_TO(TraverseStmt(
C->getCondition()));
3455template <
typename Derived>
3458 TRY_TO(VisitOMPClauseWithPreInit(
C));
3459 TRY_TO(TraverseStmt(
C->getNumThreads()));
3463template <
typename Derived>
3465 TRY_TO(TraverseStmt(
C->getAlignment()));
3469template <
typename Derived>
3471 TRY_TO(TraverseStmt(
C->getSafelen()));
3475template <
typename Derived>
3477 TRY_TO(TraverseStmt(
C->getSimdlen()));
3481template <
typename Derived>
3483 for (
Expr *E :
C->getSizesRefs())
3488template <
typename Derived>
3491 for (
Expr *E :
C->getArgsRefs())
3496template <
typename Derived>
3501template <
typename Derived>
3504 TRY_TO(TraverseStmt(
C->getFirst()));
3505 TRY_TO(TraverseStmt(
C->getCount()));
3509template <
typename Derived>
3511 TRY_TO(TraverseStmt(
C->getFactor()));
3515template <
typename Derived>
3518 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3522template <
typename Derived>
3527template <
typename Derived>
3533template <
typename Derived>
3538template <
typename Derived>
3544template <
typename Derived>
3550template <
typename Derived>
3556template <
typename Derived>
3562template <
typename Derived>
3568template <
typename Derived>
3573template <
typename Derived>
3578template <
typename Derived>
3583template <
typename Derived>
3585 TRY_TO(TraverseStmt(
C->getMessageString()));
3589template <
typename Derived>
3592 TRY_TO(VisitOMPClauseWithPreInit(
C));
3593 TRY_TO(TraverseStmt(
C->getChunkSize()));
3597template <
typename Derived>
3599 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3603template <
typename Derived>
3605 TRY_TO(TraverseStmt(
C->getCondition()));
3609template <
typename Derived>
3614template <
typename Derived>
3620template <
typename Derived>
3625template <
typename Derived>
3630template <
typename Derived>
3635template <
typename Derived>
3640template <
typename Derived>
3645template <
typename Derived>
3650template <
typename Derived>
3655template <
typename Derived>
3660template <
typename Derived>
3665template <
typename Derived>
3670template <
typename Derived>
3675template <
typename Derived>
3680template <
typename Derived>
3686template <
typename Derived>
3692template <
typename Derived>
3698template <
typename Derived>
3703template <
typename Derived>
3708template <
typename Derived>
3713template <
typename Derived>
3718template <
typename Derived>
3723template <
typename Derived>
3728template <
typename Derived>
3733template <
typename Derived>
3735 TRY_TO(VisitOMPClauseList(
C));
3739template <
typename Derived>
3741 TRY_TO(TraverseStmt(
C->getInteropVar()));
3745template <
typename Derived>
3747 TRY_TO(TraverseStmt(
C->getInteropVar()));
3751template <
typename Derived>
3754 TRY_TO(VisitOMPClauseWithPreInit(
C));
3755 TRY_TO(TraverseStmt(
C->getCondition()));
3759template <
typename Derived>
3762 TRY_TO(VisitOMPClauseWithPreInit(
C));
3763 TRY_TO(TraverseStmt(
C->getCondition()));
3767template <
typename Derived>
3768template <
typename T>
3769bool RecursiveASTVisitor<Derived>::VisitOMPClauseList(
T *Node) {
3770 for (
auto *E : Node->varlist()) {
3776template <
typename Derived>
3779 TRY_TO(VisitOMPClauseList(
C));
3783template <
typename Derived>
3786 TRY_TO(VisitOMPClauseList(
C));
3790template <
typename Derived>
3792 TRY_TO(VisitOMPClauseList(
C));
3793 for (
auto *E :
C->private_copies()) {
3799template <
typename Derived>
3802 TRY_TO(VisitOMPClauseList(
C));
3803 TRY_TO(VisitOMPClauseWithPreInit(
C));
3804 for (
auto *E :
C->private_copies()) {
3807 for (
auto *E :
C->inits()) {
3813template <
typename Derived>
3816 TRY_TO(VisitOMPClauseList(
C));
3817 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3818 for (
auto *E :
C->private_copies()) {
3821 for (
auto *E :
C->source_exprs()) {
3824 for (
auto *E :
C->destination_exprs()) {
3827 for (
auto *E :
C->assignment_ops()) {
3833template <
typename Derived>
3835 TRY_TO(VisitOMPClauseList(
C));
3839template <
typename Derived>
3841 TRY_TO(TraverseStmt(
C->getStep()));
3842 TRY_TO(TraverseStmt(
C->getCalcStep()));
3843 TRY_TO(VisitOMPClauseList(
C));
3844 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3845 for (
auto *E :
C->privates()) {
3848 for (
auto *E :
C->inits()) {
3851 for (
auto *E :
C->updates()) {
3854 for (
auto *E :
C->finals()) {
3860template <
typename Derived>
3862 TRY_TO(TraverseStmt(
C->getAlignment()));
3863 TRY_TO(VisitOMPClauseList(
C));
3867template <
typename Derived>
3869 TRY_TO(VisitOMPClauseList(
C));
3870 for (
auto *E :
C->source_exprs()) {
3873 for (
auto *E :
C->destination_exprs()) {
3876 for (
auto *E :
C->assignment_ops()) {
3882template <
typename Derived>
3885 TRY_TO(VisitOMPClauseList(
C));
3886 for (
auto *E :
C->source_exprs()) {
3889 for (
auto *E :
C->destination_exprs()) {
3892 for (
auto *E :
C->assignment_ops()) {
3898template <
typename Derived>
3902 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3903 TRY_TO(VisitOMPClauseList(
C));
3904 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3905 for (
auto *E :
C->privates()) {
3908 for (
auto *E :
C->lhs_exprs()) {
3911 for (
auto *E :
C->rhs_exprs()) {
3914 for (
auto *E :
C->reduction_ops()) {
3917 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
3918 for (
auto *E :
C->copy_ops()) {
3921 for (
auto *E :
C->copy_array_temps()) {
3924 for (
auto *E :
C->copy_array_elems()) {
3931template <
typename Derived>
3935 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3936 TRY_TO(VisitOMPClauseList(
C));
3937 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3938 for (
auto *E :
C->privates()) {
3941 for (
auto *E :
C->lhs_exprs()) {
3944 for (
auto *E :
C->rhs_exprs()) {
3947 for (
auto *E :
C->reduction_ops()) {
3953template <
typename Derived>
3957 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3958 TRY_TO(VisitOMPClauseList(
C));
3959 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3960 for (
auto *E :
C->privates()) {
3963 for (
auto *E :
C->lhs_exprs()) {
3966 for (
auto *E :
C->rhs_exprs()) {
3969 for (
auto *E :
C->reduction_ops()) {
3972 for (
auto *E :
C->taskgroup_descriptors())
3977template <
typename Derived>
3979 TRY_TO(VisitOMPClauseList(
C));
3983template <
typename Derived>
3985 TRY_TO(TraverseStmt(
C->getDepobj()));
3989template <
typename Derived>
3991 TRY_TO(VisitOMPClauseList(
C));
3995template <
typename Derived>
3997 TRY_TO(VisitOMPClauseWithPreInit(
C));
3998 TRY_TO(TraverseStmt(
C->getDevice()));
4002template <
typename Derived>
4004 TRY_TO(VisitOMPClauseList(
C));
4008template <
typename Derived>
4011 TRY_TO(VisitOMPClauseList(
C));
4012 TRY_TO(VisitOMPClauseWithPreInit(
C));
4016template <
typename Derived>
4019 TRY_TO(VisitOMPClauseList(
C));
4020 TRY_TO(VisitOMPClauseWithPreInit(
C));
4024template <
typename Derived>
4027 TRY_TO(VisitOMPClauseWithPreInit(
C));
4028 TRY_TO(TraverseStmt(
C->getPriority()));
4032template <
typename Derived>
4035 TRY_TO(VisitOMPClauseWithPreInit(
C));
4036 TRY_TO(TraverseStmt(
C->getGrainsize()));
4040template <
typename Derived>
4043 TRY_TO(VisitOMPClauseWithPreInit(
C));
4044 TRY_TO(TraverseStmt(
C->getNumTasks()));
4048template <
typename Derived>
4050 TRY_TO(TraverseStmt(
C->getHint()));
4054template <
typename Derived>
4057 TRY_TO(VisitOMPClauseWithPreInit(
C));
4058 TRY_TO(TraverseStmt(
C->getChunkSize()));
4062template <
typename Derived>
4068template <
typename Derived>
4070 TRY_TO(VisitOMPClauseList(
C));
4074template <
typename Derived>
4076 TRY_TO(VisitOMPClauseList(
C));
4080template <
typename Derived>
4083 TRY_TO(VisitOMPClauseList(
C));
4087template <
typename Derived>
4090 TRY_TO(VisitOMPClauseList(
C));
4094template <
typename Derived>
4097 TRY_TO(VisitOMPClauseList(
C));
4101template <
typename Derived>
4104 TRY_TO(VisitOMPClauseList(
C));
4108template <
typename Derived>
4111 TRY_TO(VisitOMPClauseList(
C));
4112 for (
auto *E :
C->private_refs()) {
4118template <
typename Derived>
4123template <
typename Derived>
4125 TRY_TO(TraverseStmt(
C->getEventHandler()));
4129template <
typename Derived>
4132 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
4140template <
typename Derived>
4143 TRY_TO(TraverseStmt(
C->getModifier()));
4144 for (
Expr *E :
C->varlist())
4149template <
typename Derived>
4151 TRY_TO(VisitOMPClauseWithPreInit(
C));
4152 TRY_TO(TraverseStmt(
C->getThreadID()));
4156template <
typename Derived>
4161template <
typename Derived>
4164 TRY_TO(VisitOMPClauseWithPreInit(
C));
4165 TRY_TO(TraverseStmt(
C->getSize()));
4169template <
typename Derived>
4172 TRY_TO(VisitOMPClauseWithPreInit(
C));
4173 TRY_TO(TraverseStmt(
C->getSize()));
4177template <
typename Derived>
4180 TRY_TO(VisitOMPClauseList(
C));
4184template <
typename Derived>
4190template <
typename Derived>
4195template <
typename Derived>
4196bool RecursiveASTVisitor<Derived>::TraverseOpenACCConstructStmt(
4198 TRY_TO(VisitOpenACCClauseList(
C->clauses()));
4202template <
typename Derived>
4203bool RecursiveASTVisitor<Derived>::TraverseOpenACCAssociatedStmtConstruct(
4205 TRY_TO(TraverseOpenACCConstructStmt(S));
4206 TRY_TO(TraverseStmt(S->getAssociatedStmt()));
4210template <
typename Derived>
4211bool RecursiveASTVisitor<Derived>::VisitOpenACCClause(
const OpenACCClause *
C) {
4212 for (
const Stmt *Child :
C->children())
4213 TRY_TO(TraverseStmt(
const_cast<Stmt *
>(Child)));
4217template <
typename Derived>
4218bool RecursiveASTVisitor<Derived>::VisitOpenACCClauseList(
4221 for (
const auto *
C : Clauses)
4222 TRY_TO(VisitOpenACCClause(
C));
4227 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4229 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4231 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4233 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4235 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4237 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4239 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4241 if (S->hasDevNumExpr())
4242 TRY_TO(TraverseStmt(S->getDevNumExpr()));
4243 for (
auto *E : S->getQueueIdExprs())
4245 TRY_TO(VisitOpenACCClauseList(S->clauses()));
4248 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4250 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4252 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4254 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4256 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4258 for (
auto *E : S->getVarList())
This file provides AST data structures related to concepts.
#define STMT(DERIVED, BASE)
#define TYPE(DERIVED, BASE)
bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc QualifierLoc)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenACC nodes for declarative directives.
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
#define DEF_TRAVERSE_TMPL_INST(kind)
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Defines the LambdaCapture class.
This file defines OpenMP AST classes for clauses.
Defines some OpenMP-specific enums and functions.
#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND)
#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE)
#define DEF_TRAVERSE_TYPE(TYPE, CODE)
#define DEF_TRAVERSE_TYPELOC(TYPE, CODE)
#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S)
#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND, DECLKIND)
#define DEF_TRAVERSE_DECL(DECL, CODE)
#define DEF_TRAVERSE_STMT(STMT, CODE)
#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND)
#define TRY_TO(CALL_EXPR)
Defines various enumerations that describe declaration and type specifiers.
Defines the Objective-C statement AST node classes.
This file defines OpenACC AST classes for statement-level contructs.
This file defines OpenMP AST classes for executable directives and clauses.
This file defines SYCL AST classes used to represent calls to SYCL kernels.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
Represents an access specifier followed by colon ':'.
AddrLabelExpr - The GNU address of label extension, representing &&label.
Represents a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
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.
Wrapper for source info for arrays.
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.
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".
A binding in a decomposition declaration.
A fixed int type of a specified bitwidth.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
BreakStmt - This represents a break.
Represents a C++2a __builtin_bit_cast(T, v) expression.
Represents the builtin template declaration which is used to implement __make_integer_seq and other b...
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 a base class of a C++ class.
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.
Represents a C++ constructor within a class.
Represents a C++ conversion function within a class.
Represents a C++ base or member initializer.
Represents a C++ deduction guide declaration.
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...
Represents a C++ destructor within a class.
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.
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]).
Represents a C++ struct/union/class.
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
A rewritten comparison expression that was originally written using operator syntax.
An expression "T()" which creates an rvalue of a non-class type T.
A C++ static_cast expression (C++ [expr.static.cast]).
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Represents a C++ functional cast expression that builds a temporary object.
Represents the this expression in C++.
A C++ throw-expression (C++ [except.throw]).
CXXTryStmt - A C++ try block, including all handlers.
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Describes an explicit type conversion that uses functional notion but could not be resolved because o...
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Represents the body of a CapturedStmt, and serves as its DeclContext.
This captures a statement into a function.
CaseStmt - Represent a case statement.
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Declaration of a class template.
Represents a 'co_await' expression.
Complex values, per C99 6.2.5p11.
CompoundAssignOperator - For compound assignments (e.g.
CompoundLiteralExpr - [C99 6.5.2.5].
CompoundStmt - This represents a group of statements like { stmt stmt }.
Declaration of a C++20 concept.
A reference to a concept and its template args, as it appears in the code.
Represents the specialization of a concept - evaluates to a prvalue of type bool.
ConditionalOperator - The ?
Represents the canonical version of C arrays with a specified constant size.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Represents a concrete matrix type with constant number of rows and columns.
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
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.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
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.
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
TemplateDecl * getCXXDeductionGuideTemplate() const
If this name is the name of a C++ deduction guide, return the template associated with that name.
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
Represents a ValueDecl that came out of a declarator.
A decomposition declaration.
DeferStmt - This represents a deferred statement.
Represents a 'co_await' expression while the type of the promise is dependent.
Provides information about a dependent function-template specialization declaration.
A qualified reference to a name whose declaration cannot yet be resolved.
Represents an array type in C++ whose size is a value-dependent expression.
Represents an extended vector type where either the type or size is dependent.
Represents a vector type where either the type or size is dependent.
Represents a C99 designated initializer expression.
DoStmt - This represents a 'do/while' stmt.
Represents a reference to emded data.
Represents an empty-declaration.
An instance of this object exists for each enum constant that is defined.
Represents a standard C++ module export declaration.
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 ...
Declaration context for names declared as extern "C" in C++.
Represents a member of a struct/union/class.
ForStmt - This represents a 'for (init;cond;inc)' stmt.
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Declaration of a friend template.
Represents a function declaration or definition.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a reference to a function parameter pack, init-capture pack, or binding pack that has been...
Represents a prototype with parameter type info, e.g.
Declaration of a template function.
Provides information about a function template specialization, which is a FunctionDecl that has been ...
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.
HLSLBufferDecl - Represent a cbuffer or tbuffer declaration.
This class represents temporary values used to represent inout and out arguments in HLSL.
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.
Describes a module import declaration, which makes the contents of the named module visible in the cu...
Represents a C array with an unspecified size.
Represents a field injected from an anonymous union/struct into the parent scope.
IndirectGotoStmt - This represents an indirect goto.
Describes an C or C++ initializer list.
Represents the declaration of a label.
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...
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
Represents a linkage specification.
This represents a Microsoft inline-assembly statement extension.
Representation of a Microsoft __if_exists or __if_not_exists statement with a dependent name.
An instance of this class represents the declaration of a property member.
A member reference to an MSPropertyDecl.
MS property subscript expression.
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
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.
This represents a decl that may have a name.
Represents a C++ namespace alias.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
NestedNameSpecifier getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
NamespaceAndPrefixLoc castAsNamespaceAndPrefix() const
For a nested-name-specifier that refers to a namespace, retrieve the namespace and its prefix.
TypeLoc castAsTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NamespaceAndPrefix getAsNamespaceAndPrefix() const
const Type * getAsType() const
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Type
A type, stored as a Type*.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
Represents a place-holder for an object not to be initialized by anything.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
NullStmt - This is the null statement ";": C99 6.8.3p3.
This represents the 'absent' clause in the 'pragma omp assume' directive.
This represents 'acq_rel' clause in the 'pragma omp atomic|flush' directives.
This represents 'acquire' clause in the 'pragma omp atomic|flush' directives.
This represents clause 'affinity' in the 'pragma omp task'-based directives.
This represents the 'align' clause in the 'pragma omp allocate' directive.
This represents clause 'aligned' in the 'pragma omp ...' directives.
This represents clause 'allocate' in the 'pragma omp ...' directives.
This represents 'pragma omp allocate ...' directive.
This represents 'allocator' clause in the 'pragma omp ...' directive.
An explicit cast in C or a C-style cast in C++, which uses the syntax ([s1][s2]......
This represents 'at' clause in the 'pragma omp error' directive.
This represents 'atomic_default_mem_order' clause in the 'pragma omp requires' directive.
This represents 'bind' clause in the 'pragma omp ...' directives.
This represents 'capture' clause in the 'pragma omp atomic' directive.
Pseudo declaration for capturing expressions.
Class that handles post-update expression for some clauses, like 'lastprivate', 'reduction' etc.
Class that handles pre-initialization statement for some clauses, like 'schedule',...
This is a basic class for representing single OpenMP clause.
This represents 'collapse' clause in the 'pragma omp ...' directive.
This represents 'compare' clause in the 'pragma omp atomic' directive.
This represents the 'contains' clause in the 'pragma omp assume' directive.
This represents clause 'copyin' in the 'pragma omp ...' directives.
This represents clause 'copyprivate' in the 'pragma omp ...' directives.
This represents 'pragma omp declare mapper ...' directive.
This represents 'pragma omp declare reduction ...' directive.
This represents 'default' clause in the 'pragma omp ...' directive.
This represents 'defaultmap' clause in the 'pragma omp ...' directive.
This represents implicit clause 'depend' for the 'pragma omp task' directive.
This represents implicit clause 'depobj' for the 'pragma omp depobj' directive.
This represents 'destroy' clause in the 'pragma omp depobj' directive or the 'pragma omp interop' dir...
This represents 'detach' clause in the 'pragma omp task' directive.
This represents 'device' clause in the 'pragma omp ...' directive.
This represents 'dist_schedule' clause in the 'pragma omp ...' directive.
This represents the 'doacross' clause for the 'pragma omp ordered' directive.
This represents 'dyn_groupprivate' clause in 'pragma omp target ...' and 'pragma omp teams ....
This represents 'dynamic_allocators' clause in the 'pragma omp requires' directive.
This represents clause 'exclusive' in the 'pragma omp scan' directive.
This represents 'fail' clause in the 'pragma omp atomic' directive.
This represents 'filter' clause in the 'pragma omp ...' directive.
This represents 'final' clause in the 'pragma omp ...' directive.
This represents clause 'firstprivate' in the 'pragma omp ...' directives.
This represents implicit clause 'flush' for the 'pragma omp flush' directive.
This represents clause 'from' in the 'pragma omp ...' directives.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
This represents 'grainsize' clause in the 'pragma omp ...' directive.
This represents 'pragma omp groupprivate ...' directive.
This represents clause 'has_device_ptr' in the 'pragma omp ...' directives.
This represents 'hint' clause in the 'pragma omp ...' directive.
This represents the 'holds' clause in the 'pragma omp assume' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
This represents clause 'in_reduction' in the 'pragma omp task' directives.
This represents clause 'inclusive' in the 'pragma omp scan' directive.
This represents the 'init' clause in 'pragma omp ...' directives.
This represents clause 'is_device_ptr' in the 'pragma omp ...' directives.
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
This represents clause 'lastprivate' in the 'pragma omp ...' directives.
This represents clause 'linear' in the 'pragma omp ...' directives.
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents clause 'map' in the 'pragma omp ...' directives.
This represents 'mergeable' clause in the 'pragma omp ...' directive.
This represents the 'message' clause in the 'pragma omp error' and the 'pragma omp parallel' directiv...
This represents the 'no_openmp' clause in the 'pragma omp assume' directive.
This represents the 'no_openmp_constructs' clause in the.
This represents the 'no_openmp_routines' clause in the 'pragma omp assume' directive.
This represents the 'no_parallelism' clause in the 'pragma omp assume' directive.
This represents 'nocontext' clause in the 'pragma omp ...' directive.
This represents 'nogroup' clause in the 'pragma omp ...' directive.
This represents clause 'nontemporal' in the 'pragma omp ...' directives.
This represents 'novariants' clause in the 'pragma omp ...' directive.
This represents 'nowait' clause in the 'pragma omp ...' directive.
This represents 'num_tasks' clause in the 'pragma omp ...' directive.
This represents 'num_teams' clause in the 'pragma omp ...' directive.
This represents 'num_threads' clause in the 'pragma omp ...' directive.
This represents 'order' clause in the 'pragma omp ...' directive.
This represents 'ordered' clause in the 'pragma omp ...' directive.
Representation of the 'partial' clause of the 'pragma omp unroll' directive.
This class represents the 'permutation' clause in the 'pragma omp interchange' directive.
This represents 'priority' clause in the 'pragma omp ...' directive.
This represents clause 'private' in the 'pragma omp ...' directives.
This represents 'proc_bind' clause in the 'pragma omp ...' directive.
This represents 'read' clause in the 'pragma omp atomic' directive.
This represents clause 'reduction' in the 'pragma omp ...' directives.
This represents 'relaxed' clause in the 'pragma omp atomic' directives.
This represents 'release' clause in the 'pragma omp atomic|flush' directives.
This represents 'pragma omp requires...' directive.
This represents 'reverse_offload' clause in the 'pragma omp requires' directive.
This represents 'simd' clause in the 'pragma omp ...' directive.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'schedule' clause in the 'pragma omp ...' directive.
This represents 'self_maps' clause in the 'pragma omp requires' directive.
This represents 'seq_cst' clause in the 'pragma omp atomic|flush' directives.
This represents the 'severity' clause in the 'pragma omp error' and the 'pragma omp parallel' directi...
This represents clause 'shared' in the 'pragma omp ...' directives.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
This represents clause 'task_reduction' in the 'pragma omp taskgroup' directives.
This represents 'thread_limit' clause in the 'pragma omp ...' directive.
This represents 'pragma omp threadprivate ...' directive.
This represents 'threads' clause in the 'pragma omp ...' directive.
This represents 'threadset' clause in the 'pragma omp task ...' directive.
This represents clause 'to' in the 'pragma omp ...' directives.
This represents 'unified_address' clause in the 'pragma omp requires' directive.
This represents 'unified_shared_memory' clause in the 'pragma omp requires' directive.
This represents 'untied' clause in the 'pragma omp ...' directive.
This represents 'update' clause in the 'pragma omp atomic' directive.
This represents the 'use' clause in 'pragma omp ...' directives.
This represents clause 'use_device_addr' in the 'pragma omp ...' directives.
This represents clause 'use_device_ptr' in the 'pragma omp ...' directives.
This represents clause 'uses_allocators' in the 'pragma omp target'-based directives.
This represents 'weak' clause in the 'pragma omp atomic' directives.
This represents 'write' clause in the 'pragma omp atomic' directive.
This represents 'ompx_attribute' clause in a directive that might generate an outlined function.
This represents 'ompx_bare' clause in the 'pragma omp target teams ...' directive.
This represents 'ompx_dyn_cgroup_mem' clause in the 'pragma omp target ...' directive.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Represents Objective-C's @catch statement.
Represents a field declaration created by an @defs(...).
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,...
ObjCCategoryDecl - Represents a category declaration.
ObjCCategoryImplDecl - An object of this class encapsulates a category @implementation declaration.
ObjCCompatibleAliasDecl - Represents alias of a class.
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.
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
Represents an ObjC class declaration.
Represents typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
ObjCIsaExpr - Represent X->isa and X.isa when X is an ObjC 'id' type.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
ObjCMethodDecl - Represents an instance or class method declaration.
Represents a pointer to an Objective C object.
Represents one property declaration in an Objective-C interface.
ObjCPropertyImplDecl - Represents implementation declaration of a property in a class or category imp...
ObjCPropertyRefExpr - A dot-syntax expression to access an ObjC property.
Represents an Objective-C protocol declaration.
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.
Represents the declaration of an Objective-C type parameter.
Stores a list of Objective-C type parameters for a parameterized class or a category/extension thereo...
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
This is a base class for any OpenACC statement-level constructs that have an associated statement.
This expression type represents an asterisk in an OpenACC Size-Expr, used in the 'tile' and 'gang' cl...
This is the base type for all OpenACC Clauses.
This is the base class for an OpenACC statement-level construct, other construct types are expected t...
Represents a partial function definition.
Represents a C++11 pack expansion that produces a sequence of expressions.
ParenExpr - This represents a parenthesized expression, e.g.
Sugar for parentheses used when specifying types.
Represents a parameter to a function.
Represents a #pragma detect_mismatch line.
[C99 6.4.2.2] - A predefined identifier such as func.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Expr *const * semantics_iterator
A (possibly-)qualified type.
Represents a template name as written in source code.
Wrapper of type source information for a type with non-trivial direct qualifiers.
UnqualTypeLoc getUnqualifiedLoc() const
An rvalue reference type, per C++11 [dcl.ref].
Represents a struct/union/class.
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
bool TraverseStmt(Stmt *S, DataRecursionQueue *Queue=nullptr)
Recursively visit a statement or expression, by dispatching to Traverse*() based on the argument's dy...
bool TraverseTemplateArgument(const TemplateArgument &Arg)
Recursively visit a template argument and dispatch to the appropriate method for the argument type.
bool WalkUpFromDecl(Decl *D)
bool TraverseConceptRequirement(concepts::Requirement *R)
bool dataTraverseStmtPre(Stmt *S)
Invoked before visiting a statement or expression via data recursion.
bool TraverseObjCProtocolLoc(ObjCProtocolLoc ProtocolLoc)
Recursively visit an Objective-C protocol reference with location information.
bool VisitUnqualTypeLoc(UnqualTypeLoc TL)
bool TraverseConceptExprRequirement(concepts::ExprRequirement *R)
bool TraverseNestedNameSpecifier(NestedNameSpecifier NNS)
Recursively visit a C++ nested-name-specifier.
bool TraverseAST(ASTContext &AST)
Recursively visits an entire AST, starting from the TranslationUnitDecl.
bool shouldVisitTemplateInstantiations() const
Return whether this visitor should recurse into template instantiations.
bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc)
Recursively visit a template argument location and dispatch to the appropriate method for the argumen...
bool canIgnoreChildDeclWhileTraversingDeclContext(const Decl *Child)
bool WalkUpFromType(Type *T)
bool dataTraverseStmtPost(Stmt *S)
Invoked after visiting a statement or expression via data recursion.
bool WalkUpFromTypeLoc(TypeLoc TL)
bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
Recursively visit a C++ nested-name-specifier with location information.
bool TraverseTemplateName(TemplateName Template)
Recursively visit a template name and dispatch to the appropriate method.
Stmt::child_range getStmtChildren(Stmt *S)
bool shouldVisitImplicitCode() const
Return whether this visitor should recurse into implicit code, e.g., implicit constructors and destru...
bool TraverseConceptReference(ConceptReference *CR)
Recursively visit concept reference with location information.
bool TraverseTemplateArguments(ArrayRef< TemplateArgument > Args)
Recursively visit a set of template arguments.
bool TraverseTypeLoc(TypeLoc TL, bool TraverseQualifier=true)
Recursively visit a type with location, by dispatching to Traverse*TypeLoc() based on the argument ty...
bool WalkUpFromUnqualTypeLoc(UnqualTypeLoc TL)
bool dataTraverseNode(Stmt *S, DataRecursionQueue *Queue)
bool TraverseDecl(Decl *D)
Recursively visit a declaration, by dispatching to Traverse*Decl() based on the argument's dynamic ty...
bool WalkUpFromStmt(Stmt *S)
bool TraverseTypeConstraint(const TypeConstraint *C)
bool WalkUpFromQualifiedTypeLoc(QualifiedTypeLoc TL)
bool VisitTypeLoc(TypeLoc TL)
bool TraverseLambdaCapture(LambdaExpr *LE, const LambdaCapture *C, Expr *Init)
Recursively visit a lambda capture.
bool VisitConceptReference(ConceptReference *CR)
bool shouldTraversePostOrder() const
Return whether this visitor should traverse post-order.
SmallVectorImpl< llvm::PointerIntPair< Stmt *, 1, bool > > DataRecursionQueue
A queue used for performing data recursion over statements.
bool shouldVisitLambdaBody() const
Return whether this visitor should recurse into lambda body.
bool TraverseSynOrSemInitListExpr(InitListExpr *S, DataRecursionQueue *Queue=nullptr)
Recursively visit the syntactic or semantic form of an initialization list.
bool TraverseAttr(Attr *At)
Recursively visit an attribute, by dispatching to Traverse*Attr() based on the argument's dynamic typ...
bool TraverseType(QualType T, bool TraverseQualifier=true)
Recursively visit a type, by dispatching to Traverse*Type() based on the argument's getTypeClass() pr...
bool TraverseConceptNestedRequirement(concepts::NestedRequirement *R)
bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL)
bool shouldWalkTypesOfTypeLocs() const
Return whether this visitor should recurse into the types of TypeLocs.
bool TraverseDeclarationNameInfo(DeclarationNameInfo NameInfo)
Recursively visit a name with its location information.
bool TraverseCXXBaseSpecifier(const CXXBaseSpecifier &Base)
Recursively visit a base specifier.
Derived & getDerived()
Return a reference to the derived class.
bool TraverseConceptTypeRequirement(concepts::TypeRequirement *R)
bool TraverseConstructorInitializer(CXXCtorInitializer *Init)
Recursively visit a constructor initializer.
Represents the body of a requires-expression.
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Represents a __leave statement.
SYCLKernelCallStmt represents the transformation that is applied to the body of a function declared w...
Scope - A scope is a transient data structure that is used while parsing the program.
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(),...
Represents a C++11 static_assert declaration.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Stmt - This represents one statement.
StmtClass getStmtClass() const
llvm::iterator_range< child_iterator > child_range
StringLiteral - This represents a string literal expression, e.g.
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...
Abstract type representing delayed type pack expansions.
SwitchStmt - This represents a 'switch' stmt.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
Expr * getSourceExpression() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Represents a template argument.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
QualType getAsType() const
Retrieve the type for a type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
Represents a C++ template name within the type system.
A template parameter object.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl ** iterator
Iterates through the template parameters in this list.
TemplateTemplateParmDecl - Declares a template template parameter, e.g., "T" in.
Declaration of a template type parameter.
A declaration that models statements at global scope.
The top declaration context.
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Declaration of an alias template.
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Base wrapper for a particular "section" of type source info.
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
NestedNameSpecifierLoc getPrefix() const
If this type represents a qualified-id, this returns it's nested name specifier.
TypeLocClass getTypeLocClass() const
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
The base class of the type hierarchy.
Represents the declaration of a typedef-name via the 'typedef' type specifier.
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
An artificial decl, representing a global anonymous constant value which is uniquified by value withi...
Wrapper of type source information for a type with no direct qualifiers.
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.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Represents a dependent using declaration which was marked with typename.
Represents a dependent using declaration which was not marked with typename.
A call to a literal operator (C++11 [over.literal]) written as a user-defined literal (C++11 [lit....
Represents a C++ using-declaration.
Represents C++ using-directive.
Represents a C++ using-enum-declaration.
Represents a pack of using declarations that a single using-declarator pack-expanded into.
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Represents a call to the builtin function __builtin_va_arg.
Represents a variable declaration or definition.
Declaration of a variable template.
Represents a GCC generic vector type.
WhileStmt - This represents a 'while' stmt.
A requires-expression requirement which queries the validity and properties of an expression ('simple...
bool isExprSubstitutionFailure() const
const ReturnTypeRequirement & getReturnTypeRequirement() const
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
bool hasInvalidConstraint() const
Expr * getConstraintExpr() const
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
A requires-expression requirement which queries the existence of a type name or type template special...
bool isSubstitutionFailure() const
TypeSourceInfo * getType() const
LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_ATTRIBUTE_NODEBUG auto isSameMethod(FirstMethodPtrTy FirstMethodPtr, SecondMethodPtrTy SecondMethodPtr) -> bool
Returns true if and only if FirstMethodPtr and SecondMethodPtr are pointers to the same non-static me...
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
TRY_TO(TraverseNestedNameSpecifier(Qualifier))
DEF_TRAVERSE_TYPELOC(ComplexType, { TRY_TO(TraverseType(TL.getTypePtr() ->getElementType()));}) DEF_TRAVERSE_TYPELOC(PointerType
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
OpenACCComputeConstruct(OpenACCDirectiveKind K, SourceLocation Start, SourceLocation DirectiveLoc, SourceLocation End, ArrayRef< const OpenACCClause * > Clauses, Stmt *StructuredBlock)
@ Parameter
The parameter type of a method or function.
const FunctionProtoType * T
@ Template
We are parsing a template declaration.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
U cast(CodeGen::Address addr)
@ Class
The "class" keyword introduces the elaborated-type-specifier.
DEF_TRAVERSE_TYPE(ComplexType, { TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(PointerType
Represents an explicit template argument list in C++, e.g., the "<int>" in "sort<int>".
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
TypeSourceInfo * getNamedTypeInfo() const
getNamedTypeInfo - Returns the source type info associated to the name.
NestedNameSpecifierLoc Prefix
NestedNameSpecifier Prefix
Data for list of allocators.