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); }
263 bool TraverseQualifier =
true);
343#define ATTR_VISITOR_DECLS_ONLY
344#include "clang/AST/AttrVisitor.inc"
345#undef ATTR_VISITOR_DECLS_ONLY
357#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE) \
358 (::clang::detail::has_same_member_pointer_type< \
359 decltype(&RecursiveASTVisitor::Traverse##NAME), \
360 decltype(&Derived::Traverse##NAME)>::value \
361 ? static_cast<std::conditional_t< \
362 ::clang::detail::has_same_member_pointer_type< \
363 decltype(&RecursiveASTVisitor::Traverse##NAME), \
364 decltype(&Derived::Traverse##NAME)>::value, \
365 Derived &, RecursiveASTVisitor &>>(*this) \
366 .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) \
367 : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))
372#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S) \
374 if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) \
380#define ABSTRACT_STMT(STMT)
381#define STMT(CLASS, PARENT) \
382 bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);
383#include "clang/AST/StmtNodes.inc"
389#define STMT(CLASS, PARENT) \
390 bool WalkUpFrom##CLASS(CLASS *S) { \
391 TRY_TO(WalkUpFrom##PARENT(S)); \
392 TRY_TO(Visit##CLASS(S)); \
395 bool Visit##CLASS(CLASS *S) { return true; }
396#include "clang/AST/StmtNodes.inc"
402#define ABSTRACT_TYPE(CLASS, BASE)
403#define TYPE(CLASS, BASE) \
404 bool Traverse##CLASS##Type(CLASS##Type *T, bool TraverseQualifier);
405#include "clang/AST/TypeNodes.inc"
411#define TYPE(CLASS, BASE) \
412 bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \
413 TRY_TO(WalkUpFrom##BASE(T)); \
414 TRY_TO(Visit##CLASS##Type(T)); \
417 bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
418#include "clang/AST/TypeNodes.inc"
424#define ABSTRACT_TYPELOC(CLASS, BASE)
425#define TYPELOC(CLASS, BASE) \
426 bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL, bool TraverseQualifier);
427#include "clang/AST/TypeLocNodes.def"
446#define TYPE(CLASS, BASE) \
447 bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
448 TRY_TO(WalkUpFrom##BASE##Loc(TL)); \
449 TRY_TO(Visit##CLASS##TypeLoc(TL)); \
452 bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
453#include "clang/AST/TypeNodes.inc"
458#define ABSTRACT_DECL(DECL)
459#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
460#include "clang/AST/DeclNodes.inc"
466#define DECL(CLASS, BASE) \
467 bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \
468 TRY_TO(WalkUpFrom##BASE(D)); \
469 TRY_TO(Visit##CLASS##Decl(D)); \
472 bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
473#include "clang/AST/DeclNodes.inc"
477#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND) \
478 bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);
482#undef DEF_TRAVERSE_TMPL_INST
498 template <
typename T>
499 bool TraverseDeclTemplateParameterLists(
T *D);
506 bool TraverseSubstPackTypeHelper(SubstPackType *
T);
513 bool TraverseVarHelper(
VarDecl *D);
517 bool TraverseTagType(TagType *
T,
bool TraverseQualifier);
518 bool TraverseTagTypeLoc(
TagTypeLoc TL,
bool TraverseQualifier);
519#define GEN_CLANG_CLAUSE_CLASS
520#define CLAUSE_CLASS(Enum, Str, Class) bool Visit##Class(Class *C);
521#include "llvm/Frontend/OpenMP/OMP.inc"
523 template <
typename T>
bool VisitOMPClauseList(T *Node);
526 bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *Node);
528 bool PostVisitStmt(Stmt *S);
533 bool VisitOpenACCClause(
const OpenACCClause *);
536template <
typename Derived>
543 if (
Expr *IDC =
C->getImmediatelyDeclaredConstraint()) {
555template <
typename Derived>
558 switch (R->getKind()) {
560 return getDerived().TraverseConceptTypeRequirement(
564 return getDerived().TraverseConceptExprRequirement(
567 return getDerived().TraverseConceptNestedRequirement(
570 llvm_unreachable(
"unexpected case");
573template <
typename Derived>
580#define ABSTRACT_STMT(STMT)
581#define STMT(CLASS, PARENT) \
582 case Stmt::CLASS##Class: \
583 return TRAVERSE_STMT_BASE(CLASS, CLASS, S, Queue);
584#include "clang/AST/StmtNodes.inc"
592template <
typename Derived>
595 if (R->isSubstitutionFailure())
597 return getDerived().TraverseTypeLoc(R->getType()->getTypeLoc());
600template <
typename Derived>
603 if (!R->isExprSubstitutionFailure())
605 auto &RetReq = R->getReturnTypeRequirement();
606 if (RetReq.isTypeConstraint()) {
608 TRY_TO(TraverseTemplateParameterListHelper(
609 RetReq.getTypeConstraintTemplateParameterList()));
618template <
typename Derived>
621 if (!R->hasInvalidConstraint())
622 return getDerived().TraverseStmt(R->getConstraintExpr());
626template <
typename Derived>
627bool RecursiveASTVisitor<Derived>::PostVisitStmt(
Stmt *S) {
647#define ABSTRACT_STMT(STMT)
648#define STMT(CLASS, PARENT) \
649 case Stmt::CLASS##Class: \
650 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
651 &Derived::Traverse##CLASS)) { \
652 TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); \
655#define INITLISTEXPR(CLASS, PARENT) \
656 case Stmt::CLASS##Class: \
657 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
658 &Derived::Traverse##CLASS)) { \
659 auto ILE = static_cast<CLASS *>(S); \
660 if (auto Syn = ILE->isSemanticForm() ? ILE->getSyntacticForm() : ILE) \
661 TRY_TO(WalkUpFrom##CLASS(Syn)); \
662 if (auto Sem = ILE->isSemanticForm() ? ILE : ILE->getSemanticForm()) \
663 TRY_TO(WalkUpFrom##CLASS(Sem)); \
666#include "clang/AST/StmtNodes.inc"
676template <
typename Derived>
677LLVM_ATTRIBUTE_NOINLINE
bool
683 Queue->push_back({S,
false});
688 LocalQueue.push_back({S,
false});
690 while (!LocalQueue.empty()) {
691 auto &CurrSAndVisited = LocalQueue.back();
692 Stmt *CurrS = CurrSAndVisited.getPointer();
693 bool Visited = CurrSAndVisited.getInt();
695 LocalQueue.pop_back();
698 TRY_TO(PostVisitStmt(CurrS));
704 CurrSAndVisited.setInt(
true);
705 size_t N = LocalQueue.size();
708 std::reverse(LocalQueue.begin() + N, LocalQueue.end());
710 LocalQueue.pop_back();
717template <
typename Derived>
719 bool TraverseQualifier) {
723 switch (
T->getTypeClass()) {
724#define ABSTRACT_TYPE(CLASS, BASE)
725#define TYPE(CLASS, BASE) \
727 return getDerived().Traverse##CLASS##Type( \
728 static_cast<CLASS##Type *>(const_cast<Type *>(T.getTypePtr())), \
730#include "clang/AST/TypeNodes.inc"
736template <
typename Derived>
738 bool TraverseQualifier) {
743#define ABSTRACT_TYPELOC(CLASS, BASE)
744#define TYPELOC(CLASS, BASE) \
745 case TypeLoc::CLASS: \
746 return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>(), \
748#include "clang/AST/TypeLocNodes.def"
755#define VISITORCLASS RecursiveASTVisitor
756#include "clang/AST/AttrVisitor.inc"
759template <
typename Derived>
771 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(D))
772 return TraverseTemplateTypeParamDeclConstraints(TTPD);
783 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
784 if (llvm::isa_and_present<TypeAliasTemplateDecl>(
785 FTD->getDeclName().getCXXDeductionGuideTemplate()))
790#define ABSTRACT_DECL(DECL)
791#define DECL(CLASS, BASE) \
793 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
796#include "clang/AST/DeclNodes.inc"
801template <
typename Derived>
819 llvm_unreachable(
"unhandled kind");
822template <
typename Derived>
845template <
typename Derived>
874template <
typename Derived>
878 if (TraverseQualifier)
881 Template.getAsQualifiedTemplateName()) {
882 if (TraverseQualifier && QTN->getQualifier()) {
886 Template.getAsPackIndexingTemplate()) {
894template <
typename Derived>
925template <
typename Derived>
941 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
964template <
typename Derived>
973template <
typename Derived>
985template <
typename Derived>
990 if (LE->isInitCapture(
C))
1000#define DEF_TRAVERSE_TYPE(TYPE, CODE) \
1001 template <typename Derived> \
1002 bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T, \
1003 bool TraverseQualifier) { \
1004 if (!getDerived().shouldTraversePostOrder()) \
1005 TRY_TO(WalkUpFrom##TYPE(T)); \
1009 if (getDerived().shouldTraversePostOrder()) \
1010 TRY_TO(WalkUpFrom##TYPE(T)); \
1021 {
TRY_TO(TraverseType(
T->getPointeeType())); })
1024 {
TRY_TO(TraverseType(T->getPointeeType())); })
1027 {
TRY_TO(TraverseType(
T->getPointeeType())); })
1030 NestedNameSpecifier Qualifier =
1033 : T->getQualifier();
1034 TRY_TO(TraverseNestedNameSpecifier(Qualifier));
1043 TRY_TO(TraverseType(
T->getElementType()));
1044 if (
T->getSizeExpr())
1045 TRY_TO(TraverseStmt(
const_cast<Expr*
>(
T->getSizeExpr())));
1049 TRY_TO(TraverseType(T->getElementType()));
1050 if (
T->getSizeExpr())
1051 TRY_TO(TraverseStmt(
const_cast<Expr *
>(
T->getSizeExpr())));
1055 {
TRY_TO(TraverseType(
T->getElementType())); })
1058 TRY_TO(TraverseType(T->getElementType()));
1063 TRY_TO(TraverseType(
T->getElementType()));
1064 if (
T->getSizeExpr())
1065 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1069 TRY_TO(TraverseStmt(T->getAddrSpaceExpr()));
1070 TRY_TO(TraverseType(T->getPointeeType()));
1074 if (
T->getSizeExpr())
1075 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1076 TRY_TO(TraverseType(
T->getElementType()));
1080 if (T->getSizeExpr())
1081 TRY_TO(TraverseStmt(T->getSizeExpr()));
1090 {
TRY_TO(TraverseType(
T->getElementType())); })
1093 if (T->getRowExpr())
1094 TRY_TO(TraverseStmt(T->getRowExpr()));
1095 if (T->getColumnExpr())
1096 TRY_TO(TraverseStmt(T->getColumnExpr()));
1097 TRY_TO(TraverseType(T->getElementType()));
1101 {
TRY_TO(TraverseType(
T->getReturnType())); })
1104 TRY_TO(TraverseType(T->getReturnType()));
1106 for (
const auto &A :
T->param_types()) {
1110 for (
const auto &E :
T->exceptions()) {
1115 TRY_TO(TraverseStmt(NE));
1119 if (TraverseQualifier)
1120 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1123 if (TraverseQualifier)
1124 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1127 if (TraverseQualifier)
1128 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1132 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
1137 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
1140 TRY_TO(TraverseType(
T->getPattern()));
1141 TRY_TO(TraverseStmt(
T->getIndexExpr()));
1145 TRY_TO(TraverseType(T->getBaseType()));
1150 TRY_TO(TraverseType(
T->getDeducedType()));
1151 if (
T->isConstrained()) {
1152 TRY_TO(TraverseTemplateArguments(
T->getTypeConstraintArguments()));
1158 TRY_TO(TraverseType(
T->getReplacementType()));
1161 {
TRY_TO(TraverseSubstPackTypeHelper(
T)); })
1163 {
TRY_TO(TraverseSubstPackTypeHelper(T)); })
1166 {
TRY_TO(TraverseType(
T->getModifiedType())); })
1169 if (T->getCountExpr())
1170 TRY_TO(TraverseStmt(T->getCountExpr()));
1175 {
TRY_TO(TraverseType(
T->getWrappedType())); })
1178 {
TRY_TO(TraverseType(T->getWrappedType())); })
1181 {
TRY_TO(TraverseType(
T->getUnderlyingType())); })
1184 {
TRY_TO(TraverseType(T->getWrappedType())); })
1187 for (
auto &Operand :
T->getOperands()) {
1188 if (Operand.isConstant() || Operand.isType()) {
1189 TRY_TO(TraverseType(Operand.getResultType()));
1197 {
TRY_TO(TraverseType(
T->getUnderlyingType())); })
1199template <typename Derived>
1200bool RecursiveASTVisitor<Derived>::TraverseTagType(TagType *T,
1201 bool TraverseQualifier) {
1202 if (TraverseQualifier)
1203 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1209 {
TRY_TO(TraverseTagType(T, TraverseQualifier)); })
1211 {
TRY_TO(TraverseTagType(
T, TraverseQualifier)); })
1214 if (TraverseQualifier)
1215 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1219 TRY_TO(TraverseTemplateName(
T->getTemplateName(), TraverseQualifier));
1220 TRY_TO(TraverseTemplateArguments(
T->template_arguments()));
1224 TRY_TO(TraverseTemplateName(T->getTemplateName(), TraverseQualifier));
1237 if (
T->getBaseType().getTypePtr() !=
T)
1238 TRY_TO(TraverseType(
T->getBaseType()));
1239 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
1240 TRY_TO(TraverseType(typeArg));
1245 {
TRY_TO(TraverseType(
T->getPointeeType())); })
1253 {
TRY_TO(TraverseStmt(
T->getNumBitsExpr())); })
1267 template <
typename Derived> \
1268 bool RecursiveASTVisitor<Derived>::Traverse##
TYPE##Loc( \
1269 TYPE##Loc TL,
bool TraverseQualifier) { \
1270 if (!getDerived().shouldTraversePostOrder()) { \
1271 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1272 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1273 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1278 if (getDerived().shouldTraversePostOrder()) { \
1279 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1280 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1281 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1286template <
typename Derived>
1289 assert(TraverseQualifier &&
1290 "Qualifiers should never occur within NestedNameSpecifiers");
1306 return TraverseTypeLoc(TL.getUnqualifiedLoc());
1313 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1317 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1320 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1323 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1326 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1331 if (NestedNameSpecifierLoc QL = TL.getQualifierLoc())
1334 TRY_TO(TraverseNestedNameSpecifier(TL.getTypePtr()->getQualifier()));
1339 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1342 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1344template <typename Derived>
1345bool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(
ArrayTypeLoc TL) {
1347 TRY_TO(TraverseStmt(TL.getSizeExpr()));
1352 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1353 TRY_TO(TraverseArrayTypeLocHelper(TL));
1357 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1362 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1363 TRY_TO(TraverseArrayTypeLocHelper(TL));
1367 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1368 TRY_TO(TraverseArrayTypeLocHelper(TL));
1372 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1373 TRY_TO(TraverseArrayTypeLocHelper(TL));
1377 TRY_TO(TraverseStmt(TL.getTypePtr()->getAddrSpaceExpr()));
1378 TRY_TO(TraverseType(TL.getTypePtr()->getPointeeType()));
1384 if (TL.getTypePtr()->getSizeExpr())
1385 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1386 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1391 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1395 if (TL.getTypePtr()->getSizeExpr())
1396 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1397 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1403 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1407 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1408 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1409 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1413 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1414 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1415 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1419 {
TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1423 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1427 for (
unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
1428 if (TL.getParam(I)) {
1429 TRY_TO(TraverseDecl(TL.getParam(I)));
1430 }
else if (I < T->getNumParams()) {
1431 TRY_TO(TraverseType(
T->getParamType(I)));
1435 for (
const auto &E : T->exceptions()) {
1439 if (
Expr *NE =
T->getNoexceptExpr())
1440 TRY_TO(TraverseStmt(NE));
1445 TraverseQualifier && QualifierLoc)
1449 if (NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc();
1450 TraverseQualifier && QualifierLoc)
1455 TraverseQualifier && QualifierLoc)
1460 {
TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1463 TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo()->getTypeLoc()));
1468 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
1472 TRY_TO(TraverseType(TL.getPattern()));
1473 TRY_TO(TraverseStmt(TL.getTypePtr()->getIndexExpr()));
1477 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1481 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1482 if (TL.isConstrained()) {
1483 TRY_TO(TraverseConceptReference(TL.getConceptReference()));
1489 TRY_TO(TraverseType(TL.getTypePtr()->getReplacementType()));
1492template <typename Derived>
1493bool RecursiveASTVisitor<Derived>::TraverseSubstPackTypeLocHelper(
1495 TRY_TO(TraverseTemplateArgument(TL.getTypePtr()->getArgumentPack()));
1499template <
typename Derived>
1500bool RecursiveASTVisitor<Derived>::TraverseSubstPackTypeHelper(
1502 TRY_TO(TraverseTemplateArgument(
T->getArgumentPack()));
1507 {
TRY_TO(TraverseSubstPackTypeLocHelper(TL)); })
1510 {
TRY_TO(TraverseSubstPackTypeLocHelper(TL)); })
1515 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1518 {
TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1521 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1524 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1527 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1530 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1533 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1536 {
TRY_TO(TraverseType(TL.getType())); })
1538template <typename Derived>
1539bool RecursiveASTVisitor<Derived>::TraverseTagTypeLoc(TagTypeLoc TL,
1540 bool TraverseQualifier) {
1541 if (NestedNameSpecifierLoc QualifierLoc = TL.getQualifierLoc();
1542 TraverseQualifier && QualifierLoc)
1548 {
TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })
1550 {
TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })
1552 {
TRY_TO(TraverseTagTypeLoc(TL, TraverseQualifier)); })
1555 if (TraverseQualifier)
1560 if (TraverseQualifier)
1563 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName(),
1566 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1567 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1572 if (TraverseQualifier)
1575 const auto *T = TL.getTypePtr();
1579 TRY_TO(TraverseType(
T->getDeducedType()));
1583 {
TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1586 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1587 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));
1588 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1597 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
1598 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
1599 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
1600 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
1601 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1603 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1608 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1616 TRY_TO(TraverseStmt(TL.getTypePtr()->getNumBitsExpr()));
1630template <typename Derived>
1632 const Decl *Child) {
1638 if (
const CXXRecordDecl* Cls = dyn_cast<CXXRecordDecl>(Child))
1639 return Cls->isLambda();
1643template <
typename Derived>
1644bool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(
DeclContext *DC) {
1648 for (
auto *Child : DC->decls()) {
1649 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1650 TRY_TO(TraverseDecl(Child));
1657#define DEF_TRAVERSE_DECL(DECL, CODE) \
1658 template <typename Derived> \
1659 bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
1660 bool ShouldVisitChildren = true; \
1661 bool ReturnValue = true; \
1662 if (!getDerived().shouldTraversePostOrder()) \
1663 TRY_TO(WalkUpFrom##DECL(D)); \
1665 if (ReturnValue && ShouldVisitChildren) \
1666 TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
1667 if (ReturnValue) { \
1669 for (auto *I : D->attrs()) \
1670 TRY_TO(getDerived().TraverseAttr(I)); \
1672 if (ReturnValue && getDerived().shouldTraversePostOrder()) \
1673 TRY_TO(WalkUpFrom##DECL(D)); \
1674 return ReturnValue; \
1681 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
1682 TRY_TO(TraverseStmt(D->getBody()));
1683 for (
const auto &I : D->captures()) {
1684 if (I.hasCopyExpr()) {
1685 TRY_TO(TraverseStmt(I.getCopyExpr()));
1688 ShouldVisitChildren =
false;
1692 TRY_TO(TraverseStmt(D->getBody()));
1693 ShouldVisitChildren =
false;
1697 TRY_TO(TraverseStmt(D->getBody()));
1698 ShouldVisitChildren =
false;
1708 TRY_TO(TraverseStmt(D->getTemporaryExpr()));
1712 {
TRY_TO(TraverseStmt(D->getAsmStringExpr())); })
1720 if (D->getFriendType()) {
1721 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1724 if (
auto *TT = D->getFriendType()->getType()->getAs<TagType>();
1725 TT && TT->isTagOwned())
1726 TRY_TO(TraverseDecl(TT->getDecl()));
1728 TRY_TO(TraverseDecl(D->getFriendDecl()));
1734 if (D->getFriendType())
1735 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1739 TRY_TO(TraverseDecl(D->getFriendDecl()));
1741 TRY_TO(TraverseTemplateParameterListHelper(TPL));
1752 TRY_TO(TraverseStmt(D->getAssertExpr()));
1753 TRY_TO(TraverseStmt(D->getMessage()));
1759 if (D->getQualifierLoc())
1762 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1763 if (
auto NumArgs = D->getNumTemplateArgs())
1764 for (
unsigned I = 0; I != *NumArgs; ++I)
1765 TRY_TO(TraverseTemplateArgumentLoc(D->getTemplateArg(I)));
1775 auto Scope = D->getASTContext().getTraversalScope();
1776 bool HasLimitedScope =
1778 if (HasLimitedScope) {
1779 ShouldVisitChildren =
false;
1780 for (
auto *Child :
Scope) {
1781 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1782 TRY_TO(TraverseDecl(Child));
1798 ShouldVisitChildren =
false;
1816 for (
auto typeParam : *typeParamList) {
1817 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1820 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1822 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1834 for (
auto typeParam : *typeParamList) {
1835 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1840 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
1842 if (D->isThisDeclarationADefinition()) {
1843 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1845 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1851 if (D->isThisDeclarationADefinition()) {
1852 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1854 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1860 if (D->getReturnTypeSourceInfo()) {
1861 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1866 if (D->isThisDeclarationADefinition()) {
1867 TRY_TO(TraverseStmt(D->getBody()));
1869 ShouldVisitChildren =
false;
1873 if (D->hasExplicitBound()) {
1874 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1882 if (D->getTypeSourceInfo())
1883 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1885 TRY_TO(TraverseType(D->getType()));
1886 ShouldVisitChildren =
false;
1891 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1895 {
TRY_TO(TraverseTypeLoc(D->getEnumTypeLoc())); })
1908 if (D->getInstantiations() &&
1909 getDerived().shouldVisitTemplateInstantiations())
1910 TRY_TO(TraverseStmt(D->getInstantiations()));
1912 TRY_TO(TraverseStmt(D->getExpansionPattern()));
1916 for (
auto *I : D->varlist()) {
1922 for (
auto *I : D->varlist()) {
1928 for (
auto *
C : D->clauselists()) {
1934 TRY_TO(TraverseStmt(D->getCombiner()));
1937 TRY_TO(TraverseType(D->getType()));
1942 for (
auto *
C : D->clauselists())
1944 TRY_TO(TraverseType(D->getType()));
1951 for (
auto *I : D->varlist())
1953 for (
auto *
C : D->clauselists())
1958 {
TRY_TO(VisitOpenACCClauseList(D->clauses())); })
1961 TRY_TO(TraverseStmt(D->getFunctionReference()));
1962 TRY_TO(VisitOpenACCClauseList(D->clauses()));
1966template <typename Derived>
1967bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1973 if (
Expr *RequiresClause = TPL->getRequiresClause()) {
1974 TRY_TO(TraverseStmt(RequiresClause));
1980template <
typename Derived>
1981template <
typename T>
1982bool RecursiveASTVisitor<Derived>::TraverseDeclTemplateParameterLists(
T *D) {
1984 TraverseTemplateParameterListHelper(TPL);
1988template <
typename Derived>
1991 for (
auto *SD : D->specializations()) {
1992 for (
auto *RD : SD->redecls()) {
1999 TRY_TO(TraverseDecl(RD));
2016template <
typename Derived>
2019 for (
auto *SD : D->specializations()) {
2020 for (
auto *RD : SD->redecls()) {
2025 TRY_TO(TraverseDecl(RD));
2041template <
typename Derived>
2044 for (
auto *FD : D->specializations()) {
2045 for (
auto *RD : FD->redecls()) {
2046 switch (RD->getTemplateSpecializationKind()) {
2050 TRY_TO(TraverseDecl(RD));
2059 TRY_TO(TraverseDecl(RD));
2073#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND) \
2074 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \
2075 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
2076 TRY_TO(TraverseDecl(D->getTemplatedDecl())); \
2084 if (getDerived().shouldVisitTemplateInstantiations() && \
2085 D == D->getCanonicalDecl()) \
2086 TRY_TO(TraverseTemplateInstantiations(D)); \
2100 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
2101 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2102 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
2103 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2107 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2110template <typename Derived>
2111bool RecursiveASTVisitor<Derived>::TraverseTemplateTypeParamDeclConstraints(
2113 if (
const auto *TC = D->getTypeConstraint())
2114 TRY_TO(TraverseTypeConstraint(TC));
2120 if (D->getTypeForDecl())
2122 TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));
2123 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2124 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
2128 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2135 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2142 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
2143 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2147 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
2148 TRY_TO(TraverseStmt(D->getConstraintExpr()));
2163 TRY_TO(TraverseDeclTemplateParameterLists(D));
2166 if (
auto *TSI = D->getIntegerTypeSourceInfo())
2167 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2173template <typename Derived>
2174bool RecursiveASTVisitor<Derived>::TraverseRecordHelper(
RecordDecl *D) {
2178 TRY_TO(TraverseDeclTemplateParameterLists(D));
2183template <
typename Derived>
2186 TRY_TO(TraverseTypeLoc(
Base.getTypeSourceInfo()->getTypeLoc()));
2190template <
typename Derived>
2191bool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(
CXXRecordDecl *D) {
2192 if (!TraverseRecordHelper(D))
2194 if (D->isCompleteDefinition()) {
2195 for (
const auto &I : D->bases()) {
2196 TRY_TO(TraverseCXXBaseSpecifier(I));
2208template <typename Derived>
2209bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
2211 for (
unsigned I = 0; I < Count; ++I) {
2212 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
2217#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2218 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \
2228 if (D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \
2229 const auto *ArgsWritten = D->getTemplateArgsAsWritten(); \
2230 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2231 ArgsWritten->getTemplateArgs(), ArgsWritten->NumTemplateArgs)); \
2232 } else if (!getDerived().shouldVisitTemplateInstantiations()) { \
2241 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2247#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2248 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
2250 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
2252 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2253 D->getTemplateArgsAsWritten()->getTemplateArgs(), \
2254 D->getTemplateArgsAsWritten()->NumTemplateArgs)); \
2259 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2273 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2278template <typename Derived>
2279bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(
DeclaratorDecl *D) {
2280 TRY_TO(TraverseDeclTemplateParameterLists(D));
2282 if (D->getTypeSourceInfo())
2283 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2285 TRY_TO(TraverseType(D->getType()));
2290 TRY_TO(TraverseVarHelper(D));
2291 for (
auto *Binding : D->bindings()) {
2292 TRY_TO(TraverseDecl(Binding));
2297 if (getDerived().shouldVisitImplicitCode()) {
2298 TRY_TO(TraverseStmt(D->getBinding()));
2299 if (
const auto HoldingVar = D->getHoldingVar())
2300 TRY_TO(TraverseDecl(HoldingVar));
2312 TRY_TO(TraverseDeclaratorHelper(D));
2313 if (D->isBitField())
2314 TRY_TO(TraverseStmt(D->getBitWidth()));
2315 if (D->hasInClassInitializer())
2316 TRY_TO(TraverseStmt(D->getInClassInitializer()));
2320 TRY_TO(TraverseDeclaratorHelper(D));
2321 if (D->isBitField())
2322 TRY_TO(TraverseStmt(D->getBitWidth()));
2327 TRY_TO(TraverseDeclaratorHelper(D));
2328 if (D->isBitField())
2329 TRY_TO(TraverseStmt(D->getBitWidth()));
2333template <typename Derived>
2334bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(
FunctionDecl *D) {
2335 TRY_TO(TraverseDeclTemplateParameterLists(D));
2337 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2345 D->getTemplateSpecializationInfo()) {
2351 FTSI->TemplateArgumentsAsWritten) {
2352 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2353 TALI->NumTemplateArgs));
2357 D->getDependentSpecializationInfo()) {
2359 DFSI->TemplateArgumentsAsWritten) {
2360 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2361 TALI->NumTemplateArgs));
2370 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2371 }
else if (getDerived().shouldVisitImplicitCode()) {
2383 D->getTrailingRequiresClause()) {
2385 const_cast<Expr *
>(TrailingRequiresClause.ConstraintExpr)));
2390 for (
auto *I : Ctor->inits()) {
2391 if (I->isWritten() || getDerived().shouldVisitImplicitCode())
2392 TRY_TO(TraverseConstructorInitializer(I));
2397 D->isThisDeclarationADefinition() &&
2400 (!D->isDefaulted() || getDerived().shouldVisitImplicitCode());
2402 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2404 if (RD->isLambda() &&
2406 VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();
2412 TRY_TO(TraverseStmt(D->getBody()));
2415 for (
auto *Child : D->decls()) {
2417 TRY_TO(TraverseDecl(Child));
2426 ShouldVisitChildren =
false;
2433 ShouldVisitChildren =
false;
2440 ShouldVisitChildren =
false;
2447 ShouldVisitChildren =
false;
2456 ShouldVisitChildren =
false;
2463 ShouldVisitChildren =
false;
2467template <typename Derived>
2468bool RecursiveASTVisitor<Derived>::TraverseVarHelper(
VarDecl *D) {
2469 TRY_TO(TraverseDeclaratorHelper(D));
2472 (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))
2473 TRY_TO(TraverseStmt(D->getInit()));
2483 TRY_TO(TraverseDeclaratorHelper(D));
2484 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2485 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
2489 TRY_TO(TraverseVarHelper(D));
2491 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
2492 !D->hasUnparsedDefaultArg())
2493 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
2495 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
2496 !D->hasUnparsedDefaultArg())
2497 TRY_TO(TraverseStmt(D->getDefaultArg()));
2503 TRY_TO(TraverseTemplateArguments(D->getTemplateArguments()));
2519 template <
typename Derived> \
2521 STMT *S, DataRecursionQueue *Queue) { \
2522 bool ShouldVisitChildren =
true; \
2524 if (!getDerived().shouldTraversePostOrder()) \
2525 TRY_TO(WalkUpFrom##
STMT(S)); \
2527 if (ShouldVisitChildren) { \
2528 for (
Stmt * SubStmt : getDerived().getStmtChildren(S)) { \
2529 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
2536 if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \
2537 TRY_TO(WalkUpFrom##
STMT(S)); \
2544 for (
unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
2547 for (
unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
2550 for (
unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
2563 TRY_TO(TraverseDecl(S->getExceptionDecl()));
2568 TRY_TO(TraverseDecl(S->getCatchParamDecl()));
2573 for (
auto *I : S->decls()) {
2581 ShouldVisitChildren =
false;
2609 if (!getDerived().shouldVisitImplicitCode()) {
2616 ShouldVisitChildren =
false;
2622 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2633 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2634 if (S->hasExplicitTemplateArgs()) {
2635 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2636 S->getNumTemplateArgs()));
2641 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2642 TRY_TO(TraverseTemplateName(S->getTemplateName()));
2643 TRY_TO(TraverseTemplateArgumentLocsHelper(S->template_arguments().data(),
2644 S->getNumTemplateArgs()));
2649 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2650 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2651 S->getNumTemplateArgs()));
2656 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2657 if (S->hasExplicitTemplateArgs()) {
2658 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2659 S->getNumTemplateArgs()));
2665 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2666 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2667 S->getNumTemplateArgs()));
2677 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2681 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2685 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2689 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2693 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2697 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2701 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2705 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2708template <typename Derived>
2714 if (!getDerived().shouldTraversePostOrder())
2715 TRY_TO(WalkUpFromInitListExpr(S));
2722 if (!Queue && getDerived().shouldTraversePostOrder())
2723 TRY_TO(WalkUpFromInitListExpr(S));
2728template <
typename Derived>
2734template <
typename Derived>
2737 if (!getDerived().shouldTraversePostOrder())
2738 TRY_TO(VisitConceptReference(CR));
2740 TRY_TO(TraverseDeclarationNameInfo(CR->getConceptNameInfo()));
2741 TRY_TO(TraverseTemplateName(CR->getNamedConcept(),
2743 if (CR->hasExplicitTemplateArgs())
2744 TRY_TO(TraverseTemplateArgumentLocsHelper(
2745 CR->getTemplateArgsAsWritten()->getTemplateArgs(),
2746 CR->getTemplateArgsAsWritten()->NumTemplateArgs));
2747 if (getDerived().shouldTraversePostOrder())
2748 TRY_TO(VisitConceptReference(CR));
2752template <
typename Derived>
2755 TRY_TO(VisitOffsetOfNode(Node));
2767template <
typename Derived>
2770 if (S->isSemanticForm() && S->isSyntacticForm()) {
2772 TRY_TO(TraverseSynOrSemInitListExpr(S, Queue));
2775 TRY_TO(TraverseSynOrSemInitListExpr(
2776 S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
2777 if (getDerived().shouldVisitImplicitCode()) {
2780 TRY_TO(TraverseSynOrSemInitListExpr(
2781 S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
2790 if (S->isExprPredicate())
2791 TRY_TO(TraverseStmt(S->getControllingExpr()));
2793 TRY_TO(TraverseTypeLoc(S->getControllingType()->getTypeLoc()));
2797 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2800 ShouldVisitChildren =
false;
2808 e = S->semantics_end();
2812 sub = OVE->getSourceExpr();
2815 ShouldVisitChildren =
false;
2821 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2826 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
2830 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2834 for (
unsigned I = 0, E = S->getNumComponents(); I != E; ++I)
2835 TRY_TO(TraverseOffsetOfNode(&S->getComponent(I)));
2841 if (S->isArgumentType())
2842 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
2848 if (S->isTypeOperand())
2849 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2861 if (S->isTypeOperand())
2862 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2866 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2867 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2871 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
2879 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
2884 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2890 for (
unsigned I = 0, N = S->capture_size(); I != N; ++I) {
2892 if (
C->isExplicit() || getDerived().shouldVisitImplicitCode()) {
2893 TRY_TO(TraverseLambdaCapture(S,
C, S->capture_init_begin()[I]));
2897 if (getDerived().shouldVisitImplicitCode()) {
2899 TRY_TO(TraverseDecl(S->getLambdaClass()));
2902 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2905 TRY_TO(TraverseTemplateParameterListHelper(S->getTemplateParameterList()));
2906 if (S->hasExplicitParameters()) {
2908 for (
unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2909 TRY_TO(TraverseDecl(Proto.getParam(I)));
2912 auto *
T = Proto.getTypePtr();
2913 for (
const auto &E :
T->exceptions())
2916 if (
Expr *NE =
T->getNoexceptExpr())
2919 if (S->hasExplicitResultType())
2920 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2922 const_cast<Expr *
>(S->getTrailingRequiresClause().ConstraintExpr));
2926 ShouldVisitChildren =
false;
2931 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2953 TRY_TO(TraverseDecl(S->getBlockDecl()));
2959 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2965 if (getDerived().shouldVisitImplicitCode())
2966 TRY_TO(TraverseStmt(S->getExpr()));
2970 if (getDerived().shouldVisitImplicitCode())
2971 TRY_TO(TraverseStmt(S->getExpr()));
2983 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2984 if (
TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2985 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
3009 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
3017 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
3021 if (S->isClassReceiver()) {
3023 QualType Type = IDecl->getASTContext().getObjCInterfaceType(IDecl);
3025 Data.NameLoc = S->getReceiverLocation();
3036 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
3043 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
3046 if (getDerived().shouldVisitImplicitCode()) {
3047 TRY_TO(TraverseStmt(S->getOriginalStmt()));
3048 TRY_TO(TraverseStmt(S->getKernelLaunchIdExpr()));
3049 ShouldVisitChildren =
false;
3066 if (S->hasExplicitTemplateArgs()) {
3067 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
3068 S->getNumTemplateArgs()));
3074 if (S->hasExplicitTemplateArgs()) {
3075 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
3076 S->getNumTemplateArgs()));
3087 if (getDerived().shouldVisitImplicitCode()) {
3088 TRY_TO(TraverseStmt(S->getOriginalStmt()));
3089 TRY_TO(TraverseStmt(S->getKernelLaunchStmt()));
3090 TRY_TO(TraverseDecl(S->getOutlinedFunctionDecl()));
3091 ShouldVisitChildren =
false;
3097 if (!getDerived().shouldVisitImplicitCode()) {
3099 S->getDecomposedForm();
3100 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.LHS)));
3101 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.RHS)));
3102 ShouldVisitChildren =
false;
3128 if (S->getLifetimeExtendedTemporaryDecl()) {
3129 TRY_TO(TraverseLifetimeExtendedTemporaryDecl(
3130 S->getLifetimeExtendedTemporaryDecl()));
3131 ShouldVisitChildren =
false;
3138 if (!getDerived().shouldVisitImplicitCode()) {
3140 ShouldVisitChildren =
false;
3144 if (!getDerived().shouldVisitImplicitCode()) {
3146 ShouldVisitChildren =
false;
3150 if (!getDerived().shouldVisitImplicitCode()) {
3152 ShouldVisitChildren =
false;
3156 if (!getDerived().shouldVisitImplicitCode()) {
3158 ShouldVisitChildren =
false;
3162 if (!getDerived().shouldVisitImplicitCode()) {
3164 ShouldVisitChildren =
false;
3169 TRY_TO(TraverseConceptReference(S->getConceptReference()));
3173 TRY_TO(TraverseDecl(S->getBody()));
3175 TRY_TO(TraverseDecl(Parm));
3177 TRY_TO(TraverseConceptRequirement(Req));
3200template <typename Derived>
3201bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
3202 OMPExecutableDirective *S) {
3203 for (
auto *
C : S->clauses()) {
3210 if (!getDerived().shouldVisitImplicitCode()) {
3212 TRY_TO(TraverseStmt(S->getLoopStmt()));
3213 ShouldVisitChildren =
false;
3217template <typename Derived>
3219RecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
3220 return TraverseOMPExecutableDirective(S);
3224 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3227 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3230 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3233 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3236 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3239 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3242 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3245 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3248 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3251 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3254 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3257 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3260 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3263 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3266 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3269 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3272 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3275 TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
3276 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)); })
3394 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3397 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3400 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3403 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3406 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3409 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3412 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3415 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3418 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3421 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3424 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3427 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3430 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3433 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3436 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3439 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3442 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3445 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3448 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3451 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3454 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3457 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3460 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3463template <typename Derived>
3464bool RecursiveASTVisitor<Derived>::TraverseOMPClause(
OMPClause *
C) {
3467 switch (
C->getClauseKind()) {
3468#define GEN_CLANG_CLAUSE_CLASS
3469#define CLAUSE_CLASS(Enum, Str, Class) \
3470 case llvm::omp::Clause::Enum: \
3471 TRY_TO(Visit##Class(static_cast<Class *>(C))); \
3473#define CLAUSE_NO_CLASS(Enum, Str) \
3474 case llvm::omp::Clause::Enum: \
3476#include "llvm/Frontend/OpenMP/OMP.inc"
3481template <
typename Derived>
3482bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
3484 TRY_TO(TraverseStmt(Node->getPreInitStmt()));
3488template <
typename Derived>
3489bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
3491 TRY_TO(VisitOMPClauseWithPreInit(Node));
3492 TRY_TO(TraverseStmt(Node->getPostUpdateExpr()));
3496template <
typename Derived>
3499 TRY_TO(TraverseStmt(
C->getAllocator()));
3503template <
typename Derived>
3505 TRY_TO(TraverseStmt(
C->getAllocator()));
3506 TRY_TO(VisitOMPClauseList(
C));
3510template <
typename Derived>
3512 TRY_TO(VisitOMPClauseWithPreInit(
C));
3513 TRY_TO(TraverseStmt(
C->getCondition()));
3517template <
typename Derived>
3519 TRY_TO(VisitOMPClauseWithPreInit(
C));
3520 TRY_TO(TraverseStmt(
C->getCondition()));
3524template <
typename Derived>
3527 if (
auto *E =
C->getDimsModifierExpr())
3529 TRY_TO(VisitOMPClauseList(
C));
3530 TRY_TO(VisitOMPClauseWithPreInit(
C));
3534template <
typename Derived>
3536 TRY_TO(TraverseStmt(
C->getAlignment()));
3540template <
typename Derived>
3542 TRY_TO(TraverseStmt(
C->getSafelen()));
3546template <
typename Derived>
3548 TRY_TO(TraverseStmt(
C->getSimdlen()));
3552template <
typename Derived>
3554 for (
Expr *E :
C->getSizesRefs())
3559template <
typename Derived>
3561 for (
Expr *E :
C->getCountsRefs())
3566template <
typename Derived>
3569 for (
Expr *E :
C->getArgsRefs())
3574template <
typename Derived>
3579template <
typename Derived>
3582 TRY_TO(TraverseStmt(
C->getFirst()));
3583 TRY_TO(TraverseStmt(
C->getCount()));
3587template <
typename Derived>
3589 TRY_TO(TraverseStmt(
C->getFactor()));
3593template <
typename Derived>
3596 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3600template <
typename Derived>
3605template <
typename Derived>
3611template <
typename Derived>
3613 OMPTransparentClause *
C) {
3614 TRY_TO(TraverseStmt(
C->getImpexType()));
3618template <
typename Derived>
3623template <
typename Derived>
3625 OMPUnifiedAddressClause *) {
3629template <
typename Derived>
3631 OMPUnifiedSharedMemoryClause *) {
3635template <
typename Derived>
3637 OMPReverseOffloadClause *) {
3641template <
typename Derived>
3643 OMPDynamicAllocatorsClause *) {
3647template <
typename Derived>
3649 OMPAtomicDefaultMemOrderClause *) {
3653template <
typename Derived>
3658template <
typename Derived>
3663template <
typename Derived>
3668template <
typename Derived>
3670 TRY_TO(TraverseStmt(
C->getMessageString()));
3674template <
typename Derived>
3677 TRY_TO(VisitOMPClauseWithPreInit(
C));
3678 TRY_TO(TraverseStmt(
C->getChunkSize()));
3682template <
typename Derived>
3684 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3688template <
typename Derived>
3690 TRY_TO(TraverseStmt(
C->getCondition()));
3694template <
typename Derived>
3699template <
typename Derived>
3705template <
typename Derived>
3710template <
typename Derived>
3715template <
typename Derived>
3720template <
typename Derived>
3722 OMPUpdateDependObjectsClause *) {
3726template <
typename Derived>
3731template <
typename Derived>
3736template <
typename Derived>
3741template <
typename Derived>
3746template <
typename Derived>
3751template <
typename Derived>
3756template <
typename Derived>
3761template <
typename Derived>
3766template <
typename Derived>
3771template <
typename Derived>
3773 OMPNoOpenMPRoutinesClause *) {
3777template <
typename Derived>
3779 OMPNoOpenMPConstructsClause *) {
3783template <
typename Derived>
3785 OMPNoParallelismClause *) {
3789template <
typename Derived>
3794template <
typename Derived>
3799template <
typename Derived>
3804template <
typename Derived>
3809template <
typename Derived>
3814template <
typename Derived>
3819template <
typename Derived>
3824template <
typename Derived>
3826 TRY_TO(VisitOMPClauseList(
C));
3829 for (
Expr *A :
C->attrs())
3834template <
typename Derived>
3836 TRY_TO(TraverseStmt(
C->getInteropVar()));
3840template <
typename Derived>
3842 TRY_TO(TraverseStmt(
C->getInteropVar()));
3846template <
typename Derived>
3848 OMPNovariantsClause *
C) {
3849 TRY_TO(VisitOMPClauseWithPreInit(
C));
3850 TRY_TO(TraverseStmt(
C->getCondition()));
3854template <
typename Derived>
3856 OMPNocontextClause *
C) {
3857 TRY_TO(VisitOMPClauseWithPreInit(
C));
3858 TRY_TO(TraverseStmt(
C->getCondition()));
3862template <
typename Derived>
3863template <
typename T>
3864bool RecursiveASTVisitor<Derived>::VisitOMPClauseList(
T *Node) {
3865 for (
auto *E : Node->varlist()) {
3871template <
typename Derived>
3873 OMPInclusiveClause *
C) {
3874 TRY_TO(VisitOMPClauseList(
C));
3878template <
typename Derived>
3880 OMPExclusiveClause *
C) {
3881 TRY_TO(VisitOMPClauseList(
C));
3885template <
typename Derived>
3887 TRY_TO(VisitOMPClauseList(
C));
3888 for (
auto *E :
C->private_copies()) {
3894template <
typename Derived>
3896 OMPFirstprivateClause *
C) {
3897 TRY_TO(VisitOMPClauseList(
C));
3898 TRY_TO(VisitOMPClauseWithPreInit(
C));
3899 for (
auto *E :
C->private_copies()) {
3902 for (
auto *E :
C->inits()) {
3908template <
typename Derived>
3910 OMPLastprivateClause *
C) {
3911 TRY_TO(VisitOMPClauseList(
C));
3912 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3913 for (
auto *E :
C->private_copies()) {
3916 for (
auto *E :
C->source_exprs()) {
3919 for (
auto *E :
C->destination_exprs()) {
3922 for (
auto *E :
C->assignment_ops()) {
3928template <
typename Derived>
3930 TRY_TO(VisitOMPClauseList(
C));
3934template <
typename Derived>
3936 TRY_TO(TraverseStmt(
C->getStep()));
3937 TRY_TO(TraverseStmt(
C->getCalcStep()));
3938 TRY_TO(VisitOMPClauseList(
C));
3939 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
3940 for (
auto *E :
C->privates()) {
3943 for (
auto *E :
C->inits()) {
3946 for (
auto *E :
C->updates()) {
3949 for (
auto *E :
C->finals()) {
3955template <
typename Derived>
3957 TRY_TO(TraverseStmt(
C->getAlignment()));
3958 TRY_TO(VisitOMPClauseList(
C));
3962template <
typename Derived>
3964 TRY_TO(VisitOMPClauseList(
C));
3965 for (
auto *E :
C->source_exprs()) {
3968 for (
auto *E :
C->destination_exprs()) {
3971 for (
auto *E :
C->assignment_ops()) {
3977template <
typename Derived>
3979 OMPCopyprivateClause *
C) {
3980 TRY_TO(VisitOMPClauseList(
C));
3981 for (
auto *E :
C->source_exprs()) {
3984 for (
auto *E :
C->destination_exprs()) {
3987 for (
auto *E :
C->assignment_ops()) {
3993template <
typename Derived>
3997 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3998 TRY_TO(VisitOMPClauseList(
C));
3999 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
4000 for (
auto *E :
C->privates()) {
4003 for (
auto *E :
C->lhs_exprs()) {
4006 for (
auto *E :
C->rhs_exprs()) {
4009 for (
auto *E :
C->reduction_ops()) {
4012 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
4013 for (
auto *E :
C->copy_ops()) {
4016 for (
auto *E :
C->copy_array_temps()) {
4019 for (
auto *E :
C->copy_array_elems()) {
4026template <
typename Derived>
4028 OMPTaskReductionClause *
C) {
4030 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
4031 TRY_TO(VisitOMPClauseList(
C));
4032 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
4033 for (
auto *E :
C->privates()) {
4036 for (
auto *E :
C->lhs_exprs()) {
4039 for (
auto *E :
C->rhs_exprs()) {
4042 for (
auto *E :
C->reduction_ops()) {
4048template <
typename Derived>
4050 OMPInReductionClause *
C) {
4052 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
4053 TRY_TO(VisitOMPClauseList(
C));
4054 TRY_TO(VisitOMPClauseWithPostUpdate(
C));
4055 for (
auto *E :
C->privates()) {
4058 for (
auto *E :
C->lhs_exprs()) {
4061 for (
auto *E :
C->rhs_exprs()) {
4064 for (
auto *E :
C->reduction_ops()) {
4067 for (
auto *E :
C->taskgroup_descriptors())
4072template <
typename Derived>
4074 TRY_TO(VisitOMPClauseList(
C));
4078template <
typename Derived>
4080 TRY_TO(TraverseStmt(
C->getDepobj()));
4084template <
typename Derived>
4086 TRY_TO(VisitOMPClauseList(
C));
4090template <
typename Derived>
4092 TRY_TO(VisitOMPClauseWithPreInit(
C));
4093 TRY_TO(TraverseStmt(
C->getDevice()));
4097template <
typename Derived>
4099 TRY_TO(VisitOMPClauseList(
C));
4103template <
typename Derived>
4105 OMPNumTeamsClause *
C) {
4106 if (
auto *E =
C->getModifierExpr())
4108 TRY_TO(VisitOMPClauseList(
C));
4109 TRY_TO(VisitOMPClauseWithPreInit(
C));
4113template <
typename Derived>
4115 OMPThreadLimitClause *
C) {
4116 if (
auto *E =
C->getModifierExpr())
4118 TRY_TO(VisitOMPClauseList(
C));
4119 TRY_TO(VisitOMPClauseWithPreInit(
C));
4123template <
typename Derived>
4125 OMPPriorityClause *
C) {
4126 TRY_TO(VisitOMPClauseWithPreInit(
C));
4127 TRY_TO(TraverseStmt(
C->getPriority()));
4131template <
typename Derived>
4133 OMPGrainsizeClause *
C) {
4134 TRY_TO(VisitOMPClauseWithPreInit(
C));
4135 TRY_TO(TraverseStmt(
C->getGrainsize()));
4139template <
typename Derived>
4141 OMPNumTasksClause *
C) {
4142 TRY_TO(VisitOMPClauseWithPreInit(
C));
4143 TRY_TO(TraverseStmt(
C->getNumTasks()));
4147template <
typename Derived>
4149 TRY_TO(TraverseStmt(
C->getHint()));
4153template <
typename Derived>
4155 OMPDistScheduleClause *
C) {
4156 TRY_TO(VisitOMPClauseWithPreInit(
C));
4157 TRY_TO(TraverseStmt(
C->getChunkSize()));
4161template <
typename Derived>
4167template <
typename Derived>
4169 TRY_TO(VisitOMPClauseList(
C));
4173template <
typename Derived>
4175 TRY_TO(VisitOMPClauseList(
C));
4179template <
typename Derived>
4181 OMPUseDevicePtrClause *
C) {
4182 TRY_TO(VisitOMPClauseList(
C));
4186template <
typename Derived>
4188 OMPUseDeviceAddrClause *
C) {
4189 TRY_TO(VisitOMPClauseList(
C));
4193template <
typename Derived>
4195 OMPIsDevicePtrClause *
C) {
4196 TRY_TO(VisitOMPClauseList(
C));
4200template <
typename Derived>
4202 OMPHasDeviceAddrClause *
C) {
4203 TRY_TO(VisitOMPClauseList(
C));
4207template <
typename Derived>
4209 OMPNontemporalClause *
C) {
4210 TRY_TO(VisitOMPClauseList(
C));
4211 for (
auto *E :
C->private_refs()) {
4217template <
typename Derived>
4222template <
typename Derived>
4224 TRY_TO(TraverseStmt(
C->getEventHandler()));
4228template <
typename Derived>
4230 OMPUsesAllocatorsClause *
C) {
4231 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
4232 const OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
4239template <
typename Derived>
4241 OMPAffinityClause *
C) {
4242 TRY_TO(TraverseStmt(
C->getModifier()));
4243 for (
Expr *E :
C->varlist())
4248template <
typename Derived>
4250 TRY_TO(VisitOMPClauseWithPreInit(
C));
4251 TRY_TO(TraverseStmt(
C->getThreadID()));
4255template <
typename Derived>
4260template <
typename Derived>
4262 OMPXDynCGroupMemClause *
C) {
4263 TRY_TO(VisitOMPClauseWithPreInit(
C));
4264 TRY_TO(TraverseStmt(
C->getSize()));
4268template <
typename Derived>
4270 OMPDynGroupprivateClause *
C) {
4271 TRY_TO(VisitOMPClauseWithPreInit(
C));
4272 TRY_TO(TraverseStmt(
C->getSize()));
4276template <
typename Derived>
4278 OMPDoacrossClause *
C) {
4279 TRY_TO(VisitOMPClauseList(
C));
4283template <
typename Derived>
4285 OMPXAttributeClause *
C) {
4289template <
typename Derived>
4294template <
typename Derived>
4295bool RecursiveASTVisitor<Derived>::TraverseOpenACCConstructStmt(
4297 TRY_TO(VisitOpenACCClauseList(
C->clauses()));
4301template <
typename Derived>
4302bool RecursiveASTVisitor<Derived>::TraverseOpenACCAssociatedStmtConstruct(
4304 TRY_TO(TraverseOpenACCConstructStmt(S));
4305 TRY_TO(TraverseStmt(S->getAssociatedStmt()));
4309template <
typename Derived>
4310bool RecursiveASTVisitor<Derived>::VisitOpenACCClause(
const OpenACCClause *
C) {
4311 for (
const Stmt *Child :
C->children())
4312 TRY_TO(TraverseStmt(
const_cast<Stmt *
>(Child)));
4316template <
typename Derived>
4317bool RecursiveASTVisitor<Derived>::VisitOpenACCClauseList(
4320 for (
const auto *
C : Clauses)
4321 TRY_TO(VisitOpenACCClause(
C));
4326 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4328 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4330 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4332 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4334 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4336 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4338 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4340 if (S->hasDevNumExpr())
4341 TRY_TO(TraverseStmt(S->getDevNumExpr()));
4342 for (
auto *E : S->getQueueIdExprs())
4344 TRY_TO(VisitOpenACCClauseList(S->clauses()));
4347 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4349 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4351 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4353 {
TRY_TO(VisitOpenACCClauseList(S->clauses())); })
4355 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
4357 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.
This is a common base class for loop directives ('omp simd', 'omp for', 'omp for simd' etc....
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]).
Helper that selects an expression from an InitListExpr depending on the current expansion index.
Represents a C++26 expansion statement declaration.
Represents the code generated for an expanded expansion statement.
CXXExpansionStmtPattern - Represents an unexpanded C++ expansion statement.
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.
Represents a C++26 reflect expression [expr.reflect].
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.
A template-id naming a variable template or a concept through a template template parameter.
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 an explicit instantiation of a template entity in source code.
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...
Represents a placeholder type for late-parsed type attributes.
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.
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
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 'align' clause in the 'pragma omp allocate' directive.
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]......
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 the 'counts' clause in the 'pragma omp split' directive.
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 'final' clause in the 'pragma omp ...' directive.
Representation of the 'full' clause of the 'pragma omp unroll' directive.
This represents 'pragma omp groupprivate ...' directive.
This represents 'if' clause in the 'pragma omp ...' directive.
OpenMP 5.0 [2.1.6 Iterators] Iterators are identifiers that expand to multiple values in the clause o...
This class represents the 'looprange' clause in the 'pragma omp fuse' directive.
This represents 'num_threads' 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 'pragma omp requires...' directive.
This represents 'safelen' clause in the 'pragma omp ...' directive.
This represents 'simdlen' clause in the 'pragma omp ...' directive.
This represents the 'sizes' clause in the 'pragma omp tile' directive.
This represents 'pragma omp threadprivate ...' directive.
This represents 'threadset' clause in the 'pragma omp task ...' 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,...
Helper class for OffsetOfExpr.
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.
A structure for storing a pack-index-template-name ([temp.names]).
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 TraverseOffsetOfNode(const OffsetOfNode *Node)
Recursively visit a single component of an __builtin_offsetof designator (a field,...
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.
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 VisitOffsetOfNode(const OffsetOfNode *Node)
Visit a single component of an __builtin_offsetof designator.
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.
bool TraverseTemplateName(TemplateName Template, bool TraverseQualifier=true)
Recursively visit a template name and dispatch to the appropriate method.
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.
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.
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...
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
A static requirement that can be used in a requires-expression to check properties of types and expre...
A requires-expression requirement which queries the existence of a type name or type template special...
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...
Top level wrappers for InstallAPI frontend operations.
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
NestedNameSpecifierLoc Prefix
NestedNameSpecifier Prefix