13#ifndef LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
14#define LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
46#include "llvm/ADT/PointerIntPair.h"
47#include "llvm/ADT/SmallVector.h"
48#include "llvm/Support/Casting.h"
59#define TRY_TO(CALL_EXPR) \
61 if (!getDerived().CALL_EXPR) \
67template <
typename T,
typename U>
69template <
typename T,
typename U,
typename R,
typename...
P>
75template <
typename FirstMethodPtrTy,
typename SecondMethodPtrTy>
76LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_ATTRIBUTE_NODEBUG
auto
78 [[maybe_unused]] SecondMethodPtrTy SecondMethodPtr)
81 SecondMethodPtrTy>::value)
82 return FirstMethodPtr == SecondMethodPtr;
164 Derived &
getDerived() {
return *
static_cast<Derived *
>(
this); }
329#define ATTR_VISITOR_DECLS_ONLY
330#include "clang/AST/AttrVisitor.inc"
331#undef ATTR_VISITOR_DECLS_ONLY
343#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE) \
344 (::clang::detail::has_same_member_pointer_type< \
345 decltype(&RecursiveASTVisitor::Traverse##NAME), \
346 decltype(&Derived::Traverse##NAME)>::value \
347 ? static_cast<std::conditional_t< \
348 ::clang::detail::has_same_member_pointer_type< \
349 decltype(&RecursiveASTVisitor::Traverse##NAME), \
350 decltype(&Derived::Traverse##NAME)>::value, \
351 Derived &, RecursiveASTVisitor &>>(*this) \
352 .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) \
353 : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))
358#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S) \
360 if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) \
366#define ABSTRACT_STMT(STMT)
367#define STMT(CLASS, PARENT) \
368 bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);
369#include "clang/AST/StmtNodes.inc"
375#define STMT(CLASS, PARENT) \
376 bool WalkUpFrom##CLASS(CLASS *S) { \
377 TRY_TO(WalkUpFrom##PARENT(S)); \
378 TRY_TO(Visit##CLASS(S)); \
381 bool Visit##CLASS(CLASS *S) { return true; }
382#include "clang/AST/StmtNodes.inc"
388#define ABSTRACT_TYPE(CLASS, BASE)
389#define TYPE(CLASS, BASE) bool Traverse##CLASS##Type(CLASS##Type *T);
390#include "clang/AST/TypeNodes.inc"
396#define TYPE(CLASS, BASE) \
397 bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \
398 TRY_TO(WalkUpFrom##BASE(T)); \
399 TRY_TO(Visit##CLASS##Type(T)); \
402 bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
403#include "clang/AST/TypeNodes.inc"
409#define ABSTRACT_TYPELOC(CLASS, BASE)
410#define TYPELOC(CLASS, BASE) bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL);
411#include "clang/AST/TypeLocNodes.def"
430#define TYPE(CLASS, BASE) \
431 bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
432 TRY_TO(WalkUpFrom##BASE##Loc(TL)); \
433 TRY_TO(Visit##CLASS##TypeLoc(TL)); \
436 bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
437#include "clang/AST/TypeNodes.inc"
442#define ABSTRACT_DECL(DECL)
443#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
444#include "clang/AST/DeclNodes.inc"
450#define DECL(CLASS, BASE) \
451 bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \
452 TRY_TO(WalkUpFrom##BASE(D)); \
453 TRY_TO(Visit##CLASS##Decl(D)); \
456 bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
457#include "clang/AST/DeclNodes.inc"
461#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND) \
462 bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);
466#undef DEF_TRAVERSE_TMPL_INST
482 template <
typename T>
483 bool TraverseDeclTemplateParameterLists(
T *D);
495 bool TraverseVarHelper(
VarDecl *D);
499#define GEN_CLANG_CLAUSE_CLASS
500#define CLAUSE_CLASS(Enum, Str, Class) bool Visit##Class(Class *C);
501#include "llvm/Frontend/OpenMP/OMP.inc"
503 template <
typename T>
bool VisitOMPClauseList(
T *
Node);
505 bool VisitOMPClauseWithPreInit(OMPClauseWithPreInit *
Node);
506 bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *
Node);
508 bool PostVisitStmt(Stmt *S);
509 bool TraverseOpenACCConstructStmt(OpenACCConstructStmt *S);
511 TraverseOpenACCAssociatedStmtConstruct(OpenACCAssociatedStmtConstruct *S);
512 bool VisitOpenACCClauseList(ArrayRef<const OpenACCClause *>);
515template <
typename Derived>
518 if (!getDerived().shouldVisitImplicitCode()) {
519 TRY_TO(TraverseConceptReference(
C->getConceptReference()));
522 if (
Expr *IDC =
C->getImmediatelyDeclaredConstraint()) {
523 TRY_TO(TraverseStmt(IDC));
529 TRY_TO(TraverseConceptReference(
C->getConceptReference()));
534template <
typename Derived>
539 return getDerived().TraverseConceptTypeRequirement(
540 cast<concepts::TypeRequirement>(R));
543 return getDerived().TraverseConceptExprRequirement(
544 cast<concepts::ExprRequirement>(R));
546 return getDerived().TraverseConceptNestedRequirement(
547 cast<concepts::NestedRequirement>(R));
549 llvm_unreachable(
"unexpected case");
552template <
typename Derived>
556 switch (S->getStmtClass()) {
559#define ABSTRACT_STMT(STMT)
560#define STMT(CLASS, PARENT) \
561 case Stmt::CLASS##Class: \
562 return TRAVERSE_STMT_BASE(CLASS, CLASS, S, Queue);
563#include "clang/AST/StmtNodes.inc"
571template <
typename Derived>
579template <
typename Derived>
585 if (RetReq.isTypeConstraint()) {
586 if (getDerived().shouldVisitImplicitCode()) {
587 TRY_TO(TraverseTemplateParameterListHelper(
588 RetReq.getTypeConstraintTemplateParameterList()));
591 TRY_TO(TraverseTypeConstraint(RetReq.getTypeConstraint()));
597template <
typename Derived>
605template <
typename Derived>
623 switch (S->getStmtClass()) {
626#define ABSTRACT_STMT(STMT)
627#define STMT(CLASS, PARENT) \
628 case Stmt::CLASS##Class: \
629 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
630 &Derived::Traverse##CLASS)) { \
631 TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); \
634#define INITLISTEXPR(CLASS, PARENT) \
635 case Stmt::CLASS##Class: \
636 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
637 &Derived::Traverse##CLASS)) { \
638 auto ILE = static_cast<CLASS *>(S); \
639 if (auto Syn = ILE->isSemanticForm() ? ILE->getSyntacticForm() : ILE) \
640 TRY_TO(WalkUpFrom##CLASS(Syn)); \
641 if (auto Sem = ILE->isSemanticForm() ? ILE : ILE->getSemanticForm()) \
642 TRY_TO(WalkUpFrom##CLASS(Sem)); \
645#include "clang/AST/StmtNodes.inc"
653template <
typename Derived>
660 Queue->push_back({S,
false});
665 LocalQueue.push_back({S,
false});
667 while (!LocalQueue.empty()) {
668 auto &CurrSAndVisited = LocalQueue.back();
669 Stmt *CurrS = CurrSAndVisited.getPointer();
670 bool Visited = CurrSAndVisited.getInt();
672 LocalQueue.pop_back();
673 TRY_TO(dataTraverseStmtPost(CurrS));
674 if (getDerived().shouldTraversePostOrder()) {
675 TRY_TO(PostVisitStmt(CurrS));
680 if (getDerived().dataTraverseStmtPre(CurrS)) {
681 CurrSAndVisited.setInt(
true);
682 size_t N = LocalQueue.size();
683 TRY_TO(dataTraverseNode(CurrS, &LocalQueue));
685 std::reverse(LocalQueue.begin() + N, LocalQueue.end());
687 LocalQueue.pop_back();
694template <
typename Derived>
700#define ABSTRACT_TYPE(CLASS, BASE)
701#define TYPE(CLASS, BASE) \
703 return getDerived().Traverse##CLASS##Type( \
704 static_cast<CLASS##Type *>(const_cast<Type *>(T.getTypePtr())));
705#include "clang/AST/TypeNodes.inc"
711template <
typename Derived>
717#define ABSTRACT_TYPELOC(CLASS, BASE)
718#define TYPELOC(CLASS, BASE) \
719 case TypeLoc::CLASS: \
720 return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
721#include "clang/AST/TypeLocNodes.def"
728#define VISITORCLASS RecursiveASTVisitor
729#include "clang/AST/AttrVisitor.inc"
732template <
typename Derived>
739 if (!getDerived().shouldVisitImplicitCode() && D->
isImplicit()) {
743 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(D))
744 return TraverseTemplateTypeParamDeclConstraints(TTPD);
749#define ABSTRACT_DECL(DECL)
750#define DECL(CLASS, BASE) \
752 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
755#include "clang/AST/DeclNodes.inc"
760template <
typename Derived>
785template <
typename Derived>
792 TRY_TO(TraverseNestedNameSpecifierLoc(Prefix));
811template <
typename Derived>
819 TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc()));
823 TRY_TO(TraverseTemplateName(
840template <
typename Derived>
843 TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
845 TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
850template <
typename Derived>
862 return getDerived().TraverseType(Arg.
getAsType());
866 return getDerived().TraverseTemplateName(
870 return getDerived().TraverseStmt(Arg.
getAsExpr());
873 return getDerived().TraverseTemplateArguments(Arg.
pack_elements());
881template <
typename Derived>
897 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
899 return getDerived().TraverseType(Arg.
getAsType());
905 TRY_TO(getDerived().TraverseNestedNameSpecifierLoc(
907 return getDerived().TraverseTemplateName(
914 return getDerived().TraverseTemplateArguments(Arg.
pack_elements());
920template <
typename Derived>
924 TRY_TO(TraverseTemplateArgument(Arg));
929template <
typename Derived>
933 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
935 if (
Init->isWritten() || getDerived().shouldVisitImplicitCode())
941template <
typename Derived>
946 if (LE->isInitCapture(
C))
947 TRY_TO(TraverseDecl(
C->getCapturedVar()));
956#define DEF_TRAVERSE_TYPE(TYPE, CODE) \
957 template <typename Derived> \
958 bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) { \
959 if (!getDerived().shouldTraversePostOrder()) \
960 TRY_TO(WalkUpFrom##TYPE(T)); \
962 if (getDerived().shouldTraversePostOrder()) \
963 TRY_TO(WalkUpFrom##TYPE(T)); \
983 TRY_TO(TraverseType(QualType(
T->getClass(), 0)));
992 TRY_TO(TraverseType(
T->getElementType()));
993 if (
T->getSizeExpr())
994 TRY_TO(TraverseStmt(
const_cast<Expr*
>(
T->getSizeExpr())));
998 TRY_TO(TraverseType(
T->getElementType()));
999 if (
T->getSizeExpr())
1000 TRY_TO(TraverseStmt(
const_cast<Expr *
>(
T->getSizeExpr())));
1004 {
TRY_TO(TraverseType(
T->getElementType())); })
1007 TRY_TO(TraverseType(
T->getElementType()));
1012 TRY_TO(TraverseType(
T->getElementType()));
1013 if (
T->getSizeExpr())
1014 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1018 TRY_TO(TraverseStmt(
T->getAddrSpaceExpr()));
1023 if (
T->getSizeExpr())
1024 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1025 TRY_TO(TraverseType(
T->getElementType()));
1029 if (
T->getSizeExpr())
1030 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1039 {
TRY_TO(TraverseType(
T->getElementType())); })
1042 if (
T->getRowExpr())
1043 TRY_TO(TraverseStmt(
T->getRowExpr()));
1044 if (
T->getColumnExpr())
1045 TRY_TO(TraverseStmt(
T->getColumnExpr()));
1046 TRY_TO(TraverseType(
T->getElementType()));
1064 TRY_TO(TraverseStmt(NE));
1072 {
TRY_TO(TraverseStmt(
T->getUnderlyingExpr())); })
1077 {
TRY_TO(TraverseStmt(
T->getUnderlyingExpr())); })
1080 TRY_TO(TraverseType(
T->getPattern()));
1085 TRY_TO(TraverseType(
T->getBaseType()));
1086 TRY_TO(TraverseType(
T->getUnderlyingType()));
1090 TRY_TO(TraverseType(
T->getDeducedType()));
1091 if (
T->isConstrained()) {
1092 TRY_TO(TraverseTemplateArguments(
T->getTypeConstraintArguments()));
1096 TRY_TO(TraverseTemplateName(
T->getTemplateName()));
1097 TRY_TO(TraverseType(
T->getDeducedType()));
1104 TRY_TO(TraverseType(
T->getReplacementType()));
1107 TRY_TO(TraverseTemplateArgument(
T->getArgumentPack()));
1111 TRY_TO(TraverseTemplateName(
T->getTemplateName()));
1112 TRY_TO(TraverseTemplateArguments(
T->template_arguments()));
1118 {
TRY_TO(TraverseType(
T->getModifiedType())); })
1121 if (
T->getCountExpr())
1122 TRY_TO(TraverseStmt(
T->getCountExpr()));
1127 {
TRY_TO(TraverseType(
T->getWrappedType())); })
1132 {
TRY_TO(TraverseType(
T->getUnderlyingType())); })
1135 if (
T->getQualifier()) {
1136 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1138 TRY_TO(TraverseType(
T->getNamedType()));
1142 {
TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier())); })
1145 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1146 TRY_TO(TraverseTemplateArguments(
T->template_arguments()));
1158 if (
T->getBaseType().getTypePtr() !=
T)
1159 TRY_TO(TraverseType(
T->getBaseType()));
1160 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
1161 TRY_TO(TraverseType(typeArg));
1174 {
TRY_TO(TraverseStmt(
T->getNumBitsExpr())); })
1186 template <
typename Derived> \
1187 bool RecursiveASTVisitor<Derived>::Traverse##
TYPE##Loc(
TYPE##Loc TL) { \
1188 if (!getDerived().shouldTraversePostOrder()) { \
1189 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1190 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1191 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1194 if (getDerived().shouldTraversePostOrder()) { \
1195 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1196 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1197 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1202template <
typename Derived>
1204RecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc(QualifiedTypeLoc TL) {
1220 return TraverseTypeLoc(TL.getUnqualifiedLoc());
1227 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1231 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1234 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1237 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1240 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1245 if (
auto *TSI = TL.getClassTInfo())
1246 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1253 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1256 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1258template <typename Derived>
1259bool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) {
1261 TRY_TO(TraverseStmt(TL.getSizeExpr()));
1266 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1267 TRY_TO(TraverseArrayTypeLocHelper(TL));
1271 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1276 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1277 TRY_TO(TraverseArrayTypeLocHelper(TL));
1281 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1282 TRY_TO(TraverseArrayTypeLocHelper(TL));
1286 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1287 TRY_TO(TraverseArrayTypeLocHelper(TL));
1291 TRY_TO(TraverseStmt(TL.getTypePtr()->getAddrSpaceExpr()));
1292 TRY_TO(TraverseType(TL.getTypePtr()->getPointeeType()));
1298 if (TL.getTypePtr()->getSizeExpr())
1299 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1300 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1305 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1309 if (TL.getTypePtr()->getSizeExpr())
1310 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1311 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1317 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1321 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1322 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1323 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1327 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1328 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1329 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1333 {
TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1337 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1341 for (
unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
1342 if (TL.getParam(I)) {
1343 TRY_TO(TraverseDecl(TL.getParam(I)));
1344 }
else if (I < T->getNumParams()) {
1354 TRY_TO(TraverseStmt(NE));
1362 {
TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1365 TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo()->getTypeLoc()));
1370 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
1374 TRY_TO(TraverseType(TL.getPattern()));
1375 TRY_TO(TraverseStmt(TL.getTypePtr()->getIndexExpr()));
1379 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1383 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1384 if (TL.isConstrained()) {
1385 TRY_TO(TraverseConceptReference(TL.getConceptReference()));
1390 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1391 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1398 TRY_TO(TraverseType(TL.getTypePtr()->getReplacementType()));
1401 TRY_TO(TraverseTemplateArgument(TL.getTypePtr()->getArgumentPack()));
1406 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1407 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1408 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1417 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1420 {
TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1423 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1426 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1429 if (TL.getQualifierLoc()) {
1430 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1432 TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc()));
1436 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1440 if (TL.getQualifierLoc()) {
1441 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1444 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1445 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1450 {
TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1453 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1454 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));
1455 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1464 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
1465 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
1466 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
1467 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
1468 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1469 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));
1470 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1475 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1483 TRY_TO(TraverseStmt(TL.getTypePtr()->getNumBitsExpr()));
1495template <typename Derived>
1497 const Decl *Child) {
1500 if (isa<BlockDecl>(Child) || isa<CapturedDecl>(Child))
1503 if (
const CXXRecordDecl* Cls = dyn_cast<CXXRecordDecl>(Child))
1504 return Cls->isLambda();
1508template <
typename Derived>
1509bool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) {
1513 for (
auto *Child : DC->decls()) {
1514 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1515 TRY_TO(TraverseDecl(Child));
1522#define DEF_TRAVERSE_DECL(DECL, CODE) \
1523 template <typename Derived> \
1524 bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
1525 bool ShouldVisitChildren = true; \
1526 bool ReturnValue = true; \
1527 if (!getDerived().shouldTraversePostOrder()) \
1528 TRY_TO(WalkUpFrom##DECL(D)); \
1530 if (ReturnValue && ShouldVisitChildren) \
1531 TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
1532 if (ReturnValue) { \
1534 for (auto *I : D->attrs()) \
1535 TRY_TO(getDerived().TraverseAttr(I)); \
1537 if (ReturnValue && getDerived().shouldTraversePostOrder()) \
1538 TRY_TO(WalkUpFrom##DECL(D)); \
1539 return ReturnValue; \
1545 if (TypeSourceInfo *TInfo = D->getSignatureAsWritten())
1546 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
1547 TRY_TO(TraverseStmt(D->getBody()));
1548 for (
const auto &I : D->captures()) {
1549 if (I.hasCopyExpr()) {
1550 TRY_TO(TraverseStmt(I.getCopyExpr()));
1553 ShouldVisitChildren =
false;
1557 TRY_TO(TraverseStmt(D->getBody()));
1558 ShouldVisitChildren =
false;
1566 TRY_TO(TraverseStmt(D->getTemporaryExpr()));
1570 {
TRY_TO(TraverseStmt(D->getAsmString())); })
1578 if (D->getFriendType()) {
1579 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1582 if (
auto *ET = D->getFriendType()->getType()->getAs<ElaboratedType>())
1583 TRY_TO(TraverseDecl(ET->getOwnedTagDecl()));
1585 TRY_TO(TraverseDecl(D->getFriendDecl()));
1590 if (D->getFriendType())
1591 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1593 TRY_TO(TraverseDecl(D->getFriendDecl()));
1594 for (
unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
1595 TemplateParameterList *TPL = D->getTemplateParameterList(I);
1596 for (TemplateParameterList::iterator ITPL = TPL->begin(), ETPL = TPL->end();
1597 ITPL != ETPL; ++ITPL) {
1598 TRY_TO(TraverseDecl(*ITPL));
1611 TRY_TO(TraverseStmt(D->getAssertExpr()));
1612 TRY_TO(TraverseStmt(D->getMessage()));
1622 auto Scope = D->getASTContext().getTraversalScope();
1623 bool HasLimitedScope =
1624 Scope.size() != 1 || !isa<TranslationUnitDecl>(Scope.front());
1625 if (HasLimitedScope) {
1626 ShouldVisitChildren =
false;
1627 for (
auto *Child : Scope) {
1628 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1629 TRY_TO(TraverseDecl(Child));
1641 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1645 ShouldVisitChildren =
false;
1662 if (ObjCTypeParamList *typeParamList = D->getTypeParamList()) {
1663 for (
auto typeParam : *typeParamList) {
1664 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1667 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1668 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1669 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1680 if (ObjCTypeParamList *typeParamList = D->getTypeParamListAsWritten()) {
1681 for (
auto typeParam : *typeParamList) {
1682 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1686 if (TypeSourceInfo *superTInfo = D->getSuperClassTInfo()) {
1687 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
1689 if (D->isThisDeclarationADefinition()) {
1690 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1691 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1692 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1698 if (D->isThisDeclarationADefinition()) {
1699 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1700 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1701 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1707 if (D->getReturnTypeSourceInfo()) {
1708 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1710 for (ParmVarDecl *Parameter : D->parameters()) {
1711 TRY_TO(TraverseDecl(Parameter));
1713 if (D->isThisDeclarationADefinition()) {
1714 TRY_TO(TraverseStmt(D->getBody()));
1716 ShouldVisitChildren =
false;
1720 if (D->hasExplicitBound()) {
1721 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1729 if (D->getTypeSourceInfo())
1730 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1732 TRY_TO(TraverseType(D->getType()));
1733 ShouldVisitChildren =
false;
1737 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1738 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1742 {
TRY_TO(TraverseTypeLoc(D->getEnumTypeLoc())); })
1747 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1755 for (
auto *I : D->varlists()) {
1761 for (
auto *C : D->clauselists()) {
1762 TRY_TO(TraverseOMPClause(C));
1767 TRY_TO(TraverseStmt(D->getCombiner()));
1768 if (
auto *Initializer = D->getInitializer())
1769 TRY_TO(TraverseStmt(Initializer));
1770 TRY_TO(TraverseType(D->getType()));
1775 for (
auto *C : D->clauselists())
1776 TRY_TO(TraverseOMPClause(C));
1777 TRY_TO(TraverseType(D->getType()));
1784 for (
auto *I : D->varlists())
1786 for (
auto *C : D->clauselists())
1787 TRY_TO(TraverseOMPClause(C));
1791template <typename Derived>
1792bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1793 TemplateParameterList *TPL) {
1795 for (NamedDecl *D : *TPL) {
1798 if (Expr *RequiresClause = TPL->getRequiresClause()) {
1799 TRY_TO(TraverseStmt(RequiresClause));
1805template <
typename Derived>
1806template <
typename T>
1807bool RecursiveASTVisitor<Derived>::TraverseDeclTemplateParameterLists(T *D) {
1808 for (
unsigned i = 0; i < D->getNumTemplateParameterLists(); i++) {
1809 TemplateParameterList *TPL = D->getTemplateParameterList(i);
1810 TraverseTemplateParameterListHelper(TPL);
1815template <
typename Derived>
1816bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1817 ClassTemplateDecl *D) {
1818 for (
auto *SD : D->specializations()) {
1819 for (
auto *RD : SD->redecls()) {
1820 assert(!cast<CXXRecordDecl>(RD)->isInjectedClassName());
1822 cast<ClassTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1826 TRY_TO(TraverseDecl(RD));
1843template <
typename Derived>
1844bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1845 VarTemplateDecl *D) {
1846 for (
auto *SD : D->specializations()) {
1847 for (
auto *RD : SD->redecls()) {
1849 cast<VarTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1852 TRY_TO(TraverseDecl(RD));
1868template <
typename Derived>
1869bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1870 FunctionTemplateDecl *D) {
1871 for (
auto *FD : D->specializations()) {
1872 for (
auto *RD : FD->redecls()) {
1873 switch (RD->getTemplateSpecializationKind()) {
1877 TRY_TO(TraverseDecl(RD));
1884 TRY_TO(TraverseDecl(RD));
1898#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND) \
1899 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \
1900 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
1901 TRY_TO(TraverseDecl(D->getTemplatedDecl())); \
1909 if (getDerived().shouldVisitTemplateInstantiations() && \
1910 D == D->getCanonicalDecl()) \
1911 TRY_TO(TraverseTemplateInstantiations(D)); \
1925 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1926 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1927 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
1928 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1932 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1935template <typename Derived>
1936bool RecursiveASTVisitor<Derived>::TraverseTemplateTypeParamDeclConstraints(
1937 const TemplateTypeParmDecl *D) {
1938 if (
const auto *TC = D->getTypeConstraint())
1939 TRY_TO(TraverseTypeConstraint(TC));
1945 if (D->getTypeForDecl())
1946 TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1947 TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));
1948 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1949 TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
1953 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1960 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1967 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1968 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1972 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1973 TRY_TO(TraverseStmt(D->getConstraintExpr()));
1979 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1988 TRY_TO(TraverseDeclTemplateParameterLists(D));
1990 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1991 if (
auto *TSI = D->getIntegerTypeSourceInfo())
1992 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1998template <typename Derived>
1999bool RecursiveASTVisitor<Derived>::TraverseRecordHelper(RecordDecl *D) {
2003 TRY_TO(TraverseDeclTemplateParameterLists(D));
2004 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2008template <
typename Derived>
2009bool RecursiveASTVisitor<Derived>::TraverseCXXBaseSpecifier(
2010 const CXXBaseSpecifier &
Base) {
2011 TRY_TO(TraverseTypeLoc(
Base.getTypeSourceInfo()->getTypeLoc()));
2015template <
typename Derived>
2016bool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(CXXRecordDecl *D) {
2017 if (!TraverseRecordHelper(D))
2019 if (D->isCompleteDefinition()) {
2020 for (
const auto &I : D->bases()) {
2021 TRY_TO(TraverseCXXBaseSpecifier(I));
2034 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \
2043 if (TypeSourceInfo *TSI = D->getTypeAsWritten()) \
2044 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc())); \
2046 if (getDerived().shouldVisitTemplateInstantiations() || \
2047 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \
2049 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2051 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); \
2064template <
typename Derived>
2065bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
2066 const TemplateArgumentLoc *TAL,
unsigned Count) {
2067 for (
unsigned I = 0; I < Count; ++I) {
2068 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
2073#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2074 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
2076 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
2078 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2079 D->getTemplateArgsAsWritten()->getTemplateArgs(), \
2080 D->getTemplateArgsAsWritten()->NumTemplateArgs)); \
2085 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2098 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2099 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2104template <typename Derived>
2105bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) {
2106 TRY_TO(TraverseDeclTemplateParameterLists(D));
2107 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2108 if (D->getTypeSourceInfo())
2109 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2111 TRY_TO(TraverseType(D->getType()));
2116 TRY_TO(TraverseVarHelper(D));
2117 for (
auto *Binding : D->bindings()) {
2118 TRY_TO(TraverseDecl(Binding));
2123 if (getDerived().shouldVisitImplicitCode())
2124 TRY_TO(TraverseStmt(D->getBinding()));
2135 TRY_TO(TraverseDeclaratorHelper(D));
2136 if (D->isBitField())
2137 TRY_TO(TraverseStmt(D->getBitWidth()));
2138 if (D->hasInClassInitializer())
2139 TRY_TO(TraverseStmt(D->getInClassInitializer()));
2143 TRY_TO(TraverseDeclaratorHelper(D));
2144 if (D->isBitField())
2145 TRY_TO(TraverseStmt(D->getBitWidth()));
2150 TRY_TO(TraverseDeclaratorHelper(D));
2151 if (D->isBitField())
2152 TRY_TO(TraverseStmt(D->getBitWidth()));
2156template <typename Derived>
2157bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
2158 TRY_TO(TraverseDeclTemplateParameterLists(D));
2159 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2160 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2167 if (
const FunctionTemplateSpecializationInfo *FTSI =
2168 D->getTemplateSpecializationInfo()) {
2169 if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared &&
2170 FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) {
2173 if (
const ASTTemplateArgumentListInfo *TALI =
2174 FTSI->TemplateArgumentsAsWritten) {
2175 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2176 TALI->NumTemplateArgs));
2179 }
else if (
const DependentFunctionTemplateSpecializationInfo *DFSI =
2180 D->getDependentSpecializationInfo()) {
2181 if (
const ASTTemplateArgumentListInfo *TALI =
2182 DFSI->TemplateArgumentsAsWritten) {
2183 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2184 TALI->NumTemplateArgs));
2192 if (TypeSourceInfo *TSI = D->getTypeSourceInfo()) {
2193 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2194 }
else if (getDerived().shouldVisitImplicitCode()) {
2199 for (ParmVarDecl *Parameter : D->parameters()) {
2200 TRY_TO(TraverseDecl(Parameter));
2205 if (Expr *TrailingRequiresClause = D->getTrailingRequiresClause()) {
2206 TRY_TO(TraverseStmt(TrailingRequiresClause));
2209 if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
2211 for (
auto *I : Ctor->inits()) {
2212 if (I->isWritten() || getDerived().shouldVisitImplicitCode())
2213 TRY_TO(TraverseConstructorInitializer(I));
2218 D->isThisDeclarationADefinition() &&
2221 (!D->isDefaulted() || getDerived().shouldVisitImplicitCode());
2223 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2224 if (
const CXXRecordDecl *RD = MD->getParent()) {
2225 if (RD->isLambda() &&
2227 VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();
2233 TRY_TO(TraverseStmt(D->getBody()));
2236 for (
auto *Child : D->decls()) {
2237 if (isa<UsingShadowDecl>(Child))
2238 TRY_TO(TraverseDecl(Child));
2247 ShouldVisitChildren =
false;
2254 ShouldVisitChildren =
false;
2261 ShouldVisitChildren =
false;
2268 ShouldVisitChildren =
false;
2277 ShouldVisitChildren =
false;
2284 ShouldVisitChildren =
false;
2288template <typename Derived>
2289bool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) {
2290 TRY_TO(TraverseDeclaratorHelper(D));
2292 if (!isa<ParmVarDecl>(D) &&
2293 (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))
2294 TRY_TO(TraverseStmt(D->getInit()));
2304 TRY_TO(TraverseDeclaratorHelper(D));
2305 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2306 TRY_TO(TraverseStmt(D->getDefaultArgument()));
2310 TRY_TO(TraverseVarHelper(D));
2312 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
2313 !D->hasUnparsedDefaultArg())
2314 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
2316 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
2317 !D->hasUnparsedDefaultArg())
2318 TRY_TO(TraverseStmt(D->getDefaultArg()));
2324 TRY_TO(TraverseTemplateArguments(D->getTemplateArguments()));
2340 template <
typename Derived> \
2341 bool RecursiveASTVisitor<Derived>::Traverse##
STMT( \
2342 STMT *S, DataRecursionQueue *Queue) { \
2343 bool ShouldVisitChildren =
true; \
2345 if (!getDerived().shouldTraversePostOrder()) \
2346 TRY_TO(WalkUpFrom##
STMT(S)); \
2348 if (ShouldVisitChildren) { \
2349 for (Stmt * SubStmt : getDerived().getStmtChildren(S)) { \
2350 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
2357 if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \
2358 TRY_TO(WalkUpFrom##
STMT(S)); \
2365 for (
unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
2368 for (
unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
2371 for (
unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
2384 TRY_TO(TraverseDecl(S->getExceptionDecl()));
2389 for (
auto *I : S->decls()) {
2397 ShouldVisitChildren =
false;
2425 if (!getDerived().shouldVisitImplicitCode()) {
2432 ShouldVisitChildren =
false;
2437 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2438 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2448 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2449 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2450 if (S->hasExplicitTemplateArgs()) {
2451 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2452 S->getNumTemplateArgs()));
2457 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2458 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2459 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2460 S->getNumTemplateArgs()));
2464 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2465 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2466 if (S->hasExplicitTemplateArgs()) {
2467 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2468 S->getNumTemplateArgs()));
2473 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2474 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2475 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2476 S->getNumTemplateArgs()));
2486 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2490 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2494 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2498 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2502 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2506 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2510 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2514 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2517template <typename Derived>
2518bool RecursiveASTVisitor<Derived>::TraverseSynOrSemInitListExpr(
2519 InitListExpr *S, DataRecursionQueue *Queue) {
2523 if (!getDerived().shouldTraversePostOrder())
2524 TRY_TO(WalkUpFromInitListExpr(S));
2527 for (Stmt *SubStmt : S->children()) {
2531 if (!Queue && getDerived().shouldTraversePostOrder())
2532 TRY_TO(WalkUpFromInitListExpr(S));
2537template <
typename Derived>
2538bool RecursiveASTVisitor<Derived>::TraverseObjCProtocolLoc(
2539 ObjCProtocolLoc ProtocolLoc) {
2543template <
typename Derived>
2544bool RecursiveASTVisitor<Derived>::TraverseConceptReference(
2545 ConceptReference *CR) {
2546 if (!getDerived().shouldTraversePostOrder())
2547 TRY_TO(VisitConceptReference(CR));
2548 TRY_TO(TraverseNestedNameSpecifierLoc(CR->getNestedNameSpecifierLoc()));
2549 TRY_TO(TraverseDeclarationNameInfo(CR->getConceptNameInfo()));
2550 if (CR->hasExplicitTemplateArgs())
2551 TRY_TO(TraverseTemplateArgumentLocsHelper(
2552 CR->getTemplateArgsAsWritten()->getTemplateArgs(),
2553 CR->getTemplateArgsAsWritten()->NumTemplateArgs));
2554 if (getDerived().shouldTraversePostOrder())
2555 TRY_TO(VisitConceptReference(CR));
2567template <
typename Derived>
2568bool RecursiveASTVisitor<Derived>::TraverseInitListExpr(
2569 InitListExpr *S, DataRecursionQueue *Queue) {
2570 if (S->isSemanticForm() && S->isSyntacticForm()) {
2572 TRY_TO(TraverseSynOrSemInitListExpr(S, Queue));
2575 TRY_TO(TraverseSynOrSemInitListExpr(
2576 S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
2577 if (getDerived().shouldVisitImplicitCode()) {
2580 TRY_TO(TraverseSynOrSemInitListExpr(
2581 S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
2590 if (S->isExprPredicate())
2591 TRY_TO(TraverseStmt(S->getControllingExpr()));
2593 TRY_TO(TraverseTypeLoc(S->getControllingType()->getTypeLoc()));
2595 for (
const GenericSelectionExpr::Association Assoc : S->associations()) {
2596 if (TypeSourceInfo *TSI = Assoc.getTypeSourceInfo())
2597 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2598 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(Assoc.getAssociationExpr());
2600 ShouldVisitChildren =
false;
2607 for (PseudoObjectExpr::semantics_iterator i = S->semantics_begin(),
2608 e = S->semantics_end();
2611 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub))
2612 sub = OVE->getSourceExpr();
2615 ShouldVisitChildren =
false;
2621 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2626 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
2634 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2640 if (S->isArgumentType())
2641 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
2647 if (S->isTypeOperand())
2648 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2652 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2660 if (S->isTypeOperand())
2661 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2665 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2666 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2670 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
2678 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
2683 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2689 for (
unsigned I = 0, N = S->capture_size(); I != N; ++I) {
2690 const LambdaCapture *
C = S->capture_begin() + I;
2691 if (
C->isExplicit() || getDerived().shouldVisitImplicitCode()) {
2692 TRY_TO(TraverseLambdaCapture(S, C, S->capture_init_begin()[I]));
2696 if (getDerived().shouldVisitImplicitCode()) {
2698 TRY_TO(TraverseDecl(S->getLambdaClass()));
2701 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2702 FunctionProtoTypeLoc Proto = TL.getAsAdjusted<FunctionProtoTypeLoc>();
2704 TRY_TO(TraverseTemplateParameterListHelper(S->getTemplateParameterList()));
2705 if (S->hasExplicitParameters()) {
2707 for (
unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2708 TRY_TO(TraverseDecl(Proto.getParam(I)));
2711 auto *
T = Proto.getTypePtr();
2718 if (S->hasExplicitResultType())
2719 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2724 ShouldVisitChildren =
false;
2729 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2748 TRY_TO(TraverseDecl(S->getBlockDecl()));
2754 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2760 if (getDerived().shouldVisitImplicitCode())
2761 TRY_TO(TraverseStmt(S->getExpr()));
2765 if (getDerived().shouldVisitImplicitCode())
2766 TRY_TO(TraverseStmt(S->getExpr()));
2776 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2777 if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())
2778 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2779 if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2780 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
2795 if (OpaqueValueExpr *OVE = S->getCommonExpr())
2802 if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())
2803 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2810 if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())
2811 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2815 if (S->isClassReceiver()) {
2816 ObjCInterfaceDecl *IDecl = S->getClassReceiver();
2817 QualType
Type = IDecl->getASTContext().getObjCInterfaceType(IDecl);
2818 ObjCInterfaceLocInfo
Data;
2819 Data.NameLoc = S->getReceiverLocation();
2830 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2837 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2846 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2847 if (S->hasExplicitTemplateArgs()) {
2848 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2849 S->getNumTemplateArgs()));
2854 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2855 if (S->hasExplicitTemplateArgs()) {
2856 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2857 S->getNumTemplateArgs()));
2869 if (!getDerived().shouldVisitImplicitCode()) {
2870 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2871 S->getDecomposedForm();
2872 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.LHS)));
2873 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.RHS)));
2874 ShouldVisitChildren =
false;
2901 if (S->getLifetimeExtendedTemporaryDecl()) {
2902 TRY_TO(TraverseLifetimeExtendedTemporaryDecl(
2903 S->getLifetimeExtendedTemporaryDecl()));
2904 ShouldVisitChildren =
false;
2911 if (!getDerived().shouldVisitImplicitCode()) {
2913 ShouldVisitChildren =
false;
2917 if (!getDerived().shouldVisitImplicitCode()) {
2919 ShouldVisitChildren =
false;
2923 if (!getDerived().shouldVisitImplicitCode()) {
2925 ShouldVisitChildren =
false;
2929 if (!getDerived().shouldVisitImplicitCode()) {
2931 ShouldVisitChildren =
false;
2935 if (!getDerived().shouldVisitImplicitCode()) {
2937 ShouldVisitChildren =
false;
2942 TRY_TO(TraverseConceptReference(S->getConceptReference()));
2946 TRY_TO(TraverseDecl(S->getBody()));
2947 for (ParmVarDecl *Parm : S->getLocalParameters())
2948 TRY_TO(TraverseDecl(Parm));
2949 for (concepts::Requirement *Req : S->getRequirements())
2950 TRY_TO(TraverseConceptRequirement(Req));
2969template <typename Derived>
2970bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
2971 OMPExecutableDirective *S) {
2972 for (
auto *C : S->clauses()) {
2973 TRY_TO(TraverseOMPClause(C));
2979 if (!getDerived().shouldVisitImplicitCode()) {
2981 TRY_TO(TraverseStmt(S->getLoopStmt()));
2982 ShouldVisitChildren =
false;
2986template <typename Derived>
2988RecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
2989 return TraverseOMPExecutableDirective(S);
2993 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2996 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2999 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3002 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3005 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3008 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3011 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3014 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3017 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3020 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3023 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3026 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3029 TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
3030 TRY_TO(TraverseOMPExecutableDirective(S));
3034 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3037 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3040 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3043 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3046 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3049 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3052 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3055 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3058 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3061 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3064 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3067 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3070 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3073 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3076 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3079 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3082 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3085 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3088 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3091 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3094 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3097 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3100 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3103 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3106 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3109 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3112 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3115 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3118 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3121 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3124 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3127 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3130 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3133 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3136 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3139 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3142 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3145 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3148 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3151 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3154 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3157 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3160 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3163 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3166 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3169 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3172 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3175 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3178 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3181 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3184 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3187 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3190 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3193 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3196 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3199 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3202 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3205 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3208 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3211template <typename Derived>
3212bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
3215 switch (
C->getClauseKind()) {
3216#define GEN_CLANG_CLAUSE_CLASS
3217#define CLAUSE_CLASS(Enum, Str, Class) \
3218 case llvm::omp::Clause::Enum: \
3219 TRY_TO(Visit##Class(static_cast<Class *>(C))); \
3221#define CLAUSE_NO_CLASS(Enum, Str) \
3222 case llvm::omp::Clause::Enum: \
3224#include "llvm/Frontend/OpenMP/OMP.inc"
3229template <
typename Derived>
3230bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
3231 OMPClauseWithPreInit *
Node) {
3232 TRY_TO(TraverseStmt(
Node->getPreInitStmt()));
3236template <
typename Derived>
3237bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
3238 OMPClauseWithPostUpdate *
Node) {
3240 TRY_TO(TraverseStmt(
Node->getPostUpdateExpr()));
3244template <
typename Derived>
3245bool RecursiveASTVisitor<Derived>::VisitOMPAllocatorClause(
3246 OMPAllocatorClause *C) {
3247 TRY_TO(TraverseStmt(
C->getAllocator()));
3251template <
typename Derived>
3252bool RecursiveASTVisitor<Derived>::VisitOMPAllocateClause(OMPAllocateClause *C) {
3253 TRY_TO(TraverseStmt(
C->getAllocator()));
3254 TRY_TO(VisitOMPClauseList(C));
3258template <
typename Derived>
3259bool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
3260 TRY_TO(VisitOMPClauseWithPreInit(C));
3261 TRY_TO(TraverseStmt(
C->getCondition()));
3265template <
typename Derived>
3266bool RecursiveASTVisitor<Derived>::VisitOMPFinalClause(OMPFinalClause *C) {
3267 TRY_TO(VisitOMPClauseWithPreInit(C));
3268 TRY_TO(TraverseStmt(
C->getCondition()));
3272template <
typename Derived>
3274RecursiveASTVisitor<Derived>::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
3275 TRY_TO(VisitOMPClauseWithPreInit(C));
3276 TRY_TO(TraverseStmt(
C->getNumThreads()));
3280template <
typename Derived>
3281bool RecursiveASTVisitor<Derived>::VisitOMPAlignClause(OMPAlignClause *C) {
3282 TRY_TO(TraverseStmt(
C->getAlignment()));
3286template <
typename Derived>
3287bool RecursiveASTVisitor<Derived>::VisitOMPSafelenClause(OMPSafelenClause *C) {
3288 TRY_TO(TraverseStmt(
C->getSafelen()));
3292template <
typename Derived>
3293bool RecursiveASTVisitor<Derived>::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
3294 TRY_TO(TraverseStmt(
C->getSimdlen()));
3298template <
typename Derived>
3299bool RecursiveASTVisitor<Derived>::VisitOMPSizesClause(OMPSizesClause *C) {
3300 for (Expr *E :
C->getSizesRefs())
3305template <
typename Derived>
3306bool RecursiveASTVisitor<Derived>::VisitOMPFullClause(OMPFullClause *C) {
3310template <
typename Derived>
3311bool RecursiveASTVisitor<Derived>::VisitOMPPartialClause(OMPPartialClause *C) {
3312 TRY_TO(TraverseStmt(
C->getFactor()));
3316template <
typename Derived>
3318RecursiveASTVisitor<Derived>::VisitOMPCollapseClause(OMPCollapseClause *C) {
3319 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3323template <
typename Derived>
3324bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {
3328template <
typename Derived>
3329bool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
3333template <
typename Derived>
3334bool RecursiveASTVisitor<Derived>::VisitOMPUnifiedAddressClause(
3335 OMPUnifiedAddressClause *) {
3339template <
typename Derived>
3340bool RecursiveASTVisitor<Derived>::VisitOMPUnifiedSharedMemoryClause(
3341 OMPUnifiedSharedMemoryClause *) {
3345template <
typename Derived>
3346bool RecursiveASTVisitor<Derived>::VisitOMPReverseOffloadClause(
3347 OMPReverseOffloadClause *) {
3351template <
typename Derived>
3352bool RecursiveASTVisitor<Derived>::VisitOMPDynamicAllocatorsClause(
3353 OMPDynamicAllocatorsClause *) {
3357template <
typename Derived>
3358bool RecursiveASTVisitor<Derived>::VisitOMPAtomicDefaultMemOrderClause(
3359 OMPAtomicDefaultMemOrderClause *) {
3363template <
typename Derived>
3364bool RecursiveASTVisitor<Derived>::VisitOMPAtClause(OMPAtClause *) {
3368template <
typename Derived>
3369bool RecursiveASTVisitor<Derived>::VisitOMPSeverityClause(OMPSeverityClause *) {
3373template <
typename Derived>
3374bool RecursiveASTVisitor<Derived>::VisitOMPMessageClause(OMPMessageClause *C) {
3375 TRY_TO(TraverseStmt(
C->getMessageString()));
3379template <
typename Derived>
3381RecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
3382 TRY_TO(VisitOMPClauseWithPreInit(C));
3383 TRY_TO(TraverseStmt(
C->getChunkSize()));
3387template <
typename Derived>
3388bool RecursiveASTVisitor<Derived>::VisitOMPOrderedClause(OMPOrderedClause *C) {
3389 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3393template <
typename Derived>
3394bool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause *) {
3398template <
typename Derived>
3399bool RecursiveASTVisitor<Derived>::VisitOMPUntiedClause(OMPUntiedClause *) {
3403template <
typename Derived>
3405RecursiveASTVisitor<Derived>::VisitOMPMergeableClause(OMPMergeableClause *) {
3409template <
typename Derived>
3410bool RecursiveASTVisitor<Derived>::VisitOMPReadClause(OMPReadClause *) {
3414template <
typename Derived>
3415bool RecursiveASTVisitor<Derived>::VisitOMPWriteClause(OMPWriteClause *) {
3419template <
typename Derived>
3420bool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
3424template <
typename Derived>
3425bool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
3429template <
typename Derived>
3430bool RecursiveASTVisitor<Derived>::VisitOMPCompareClause(OMPCompareClause *) {
3434template <
typename Derived>
3435bool RecursiveASTVisitor<Derived>::VisitOMPFailClause(OMPFailClause *) {
3439template <
typename Derived>
3440bool RecursiveASTVisitor<Derived>::VisitOMPSeqCstClause(OMPSeqCstClause *) {
3444template <
typename Derived>
3445bool RecursiveASTVisitor<Derived>::VisitOMPAcqRelClause(OMPAcqRelClause *) {
3449template <
typename Derived>
3450bool RecursiveASTVisitor<Derived>::VisitOMPAcquireClause(OMPAcquireClause *) {
3454template <
typename Derived>
3455bool RecursiveASTVisitor<Derived>::VisitOMPReleaseClause(OMPReleaseClause *) {
3459template <
typename Derived>
3460bool RecursiveASTVisitor<Derived>::VisitOMPRelaxedClause(OMPRelaxedClause *) {
3464template <
typename Derived>
3465bool RecursiveASTVisitor<Derived>::VisitOMPWeakClause(OMPWeakClause *) {
3469template <
typename Derived>
3470bool RecursiveASTVisitor<Derived>::VisitOMPThreadsClause(OMPThreadsClause *) {
3474template <
typename Derived>
3475bool RecursiveASTVisitor<Derived>::VisitOMPSIMDClause(OMPSIMDClause *) {
3479template <
typename Derived>
3480bool RecursiveASTVisitor<Derived>::VisitOMPNogroupClause(OMPNogroupClause *) {
3484template <
typename Derived>
3485bool RecursiveASTVisitor<Derived>::VisitOMPInitClause(OMPInitClause *C) {
3486 TRY_TO(VisitOMPClauseList(C));
3490template <
typename Derived>
3491bool RecursiveASTVisitor<Derived>::VisitOMPUseClause(OMPUseClause *C) {
3492 TRY_TO(TraverseStmt(
C->getInteropVar()));
3496template <
typename Derived>
3497bool RecursiveASTVisitor<Derived>::VisitOMPDestroyClause(OMPDestroyClause *C) {
3498 TRY_TO(TraverseStmt(
C->getInteropVar()));
3502template <
typename Derived>
3503bool RecursiveASTVisitor<Derived>::VisitOMPNovariantsClause(
3504 OMPNovariantsClause *C) {
3505 TRY_TO(VisitOMPClauseWithPreInit(C));
3506 TRY_TO(TraverseStmt(
C->getCondition()));
3510template <
typename Derived>
3511bool RecursiveASTVisitor<Derived>::VisitOMPNocontextClause(
3512 OMPNocontextClause *C) {
3513 TRY_TO(VisitOMPClauseWithPreInit(C));
3514 TRY_TO(TraverseStmt(
C->getCondition()));
3518template <
typename Derived>
3519template <
typename T>
3520bool RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *
Node) {
3521 for (
auto *E :
Node->varlists()) {
3527template <
typename Derived>
3528bool RecursiveASTVisitor<Derived>::VisitOMPInclusiveClause(
3529 OMPInclusiveClause *C) {
3530 TRY_TO(VisitOMPClauseList(C));
3534template <
typename Derived>
3535bool RecursiveASTVisitor<Derived>::VisitOMPExclusiveClause(
3536 OMPExclusiveClause *C) {
3537 TRY_TO(VisitOMPClauseList(C));
3541template <
typename Derived>
3542bool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
3543 TRY_TO(VisitOMPClauseList(C));
3544 for (
auto *E :
C->private_copies()) {
3550template <
typename Derived>
3551bool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
3552 OMPFirstprivateClause *C) {
3553 TRY_TO(VisitOMPClauseList(C));
3554 TRY_TO(VisitOMPClauseWithPreInit(C));
3555 for (
auto *E :
C->private_copies()) {
3558 for (
auto *E :
C->inits()) {
3564template <
typename Derived>
3565bool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
3566 OMPLastprivateClause *C) {
3567 TRY_TO(VisitOMPClauseList(C));
3568 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3569 for (
auto *E :
C->private_copies()) {
3572 for (
auto *E :
C->source_exprs()) {
3575 for (
auto *E :
C->destination_exprs()) {
3578 for (
auto *E :
C->assignment_ops()) {
3584template <
typename Derived>
3585bool RecursiveASTVisitor<Derived>::VisitOMPSharedClause(OMPSharedClause *C) {
3586 TRY_TO(VisitOMPClauseList(C));
3590template <
typename Derived>
3591bool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(OMPLinearClause *C) {
3592 TRY_TO(TraverseStmt(
C->getStep()));
3593 TRY_TO(TraverseStmt(
C->getCalcStep()));
3594 TRY_TO(VisitOMPClauseList(C));
3595 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3596 for (
auto *E :
C->privates()) {
3599 for (
auto *E :
C->inits()) {
3602 for (
auto *E :
C->updates()) {
3605 for (
auto *E :
C->finals()) {
3611template <
typename Derived>
3612bool RecursiveASTVisitor<Derived>::VisitOMPAlignedClause(OMPAlignedClause *C) {
3613 TRY_TO(TraverseStmt(
C->getAlignment()));
3614 TRY_TO(VisitOMPClauseList(C));
3618template <
typename Derived>
3619bool RecursiveASTVisitor<Derived>::VisitOMPCopyinClause(OMPCopyinClause *C) {
3620 TRY_TO(VisitOMPClauseList(C));
3621 for (
auto *E :
C->source_exprs()) {
3624 for (
auto *E :
C->destination_exprs()) {
3627 for (
auto *E :
C->assignment_ops()) {
3633template <
typename Derived>
3634bool RecursiveASTVisitor<Derived>::VisitOMPCopyprivateClause(
3635 OMPCopyprivateClause *C) {
3636 TRY_TO(VisitOMPClauseList(C));
3637 for (
auto *E :
C->source_exprs()) {
3640 for (
auto *E :
C->destination_exprs()) {
3643 for (
auto *E :
C->assignment_ops()) {
3649template <
typename Derived>
3651RecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
3652 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3653 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3654 TRY_TO(VisitOMPClauseList(C));
3655 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3656 for (
auto *E :
C->privates()) {
3659 for (
auto *E :
C->lhs_exprs()) {
3662 for (
auto *E :
C->rhs_exprs()) {
3665 for (
auto *E :
C->reduction_ops()) {
3668 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
3669 for (
auto *E :
C->copy_ops()) {
3672 for (
auto *E :
C->copy_array_temps()) {
3675 for (
auto *E :
C->copy_array_elems()) {
3682template <
typename Derived>
3683bool RecursiveASTVisitor<Derived>::VisitOMPTaskReductionClause(
3684 OMPTaskReductionClause *C) {
3685 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3686 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3687 TRY_TO(VisitOMPClauseList(C));
3688 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3689 for (
auto *E :
C->privates()) {
3692 for (
auto *E :
C->lhs_exprs()) {
3695 for (
auto *E :
C->rhs_exprs()) {
3698 for (
auto *E :
C->reduction_ops()) {
3704template <
typename Derived>
3705bool RecursiveASTVisitor<Derived>::VisitOMPInReductionClause(
3706 OMPInReductionClause *C) {
3707 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3708 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3709 TRY_TO(VisitOMPClauseList(C));
3710 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3711 for (
auto *E :
C->privates()) {
3714 for (
auto *E :
C->lhs_exprs()) {
3717 for (
auto *E :
C->rhs_exprs()) {
3720 for (
auto *E :
C->reduction_ops()) {
3723 for (
auto *E :
C->taskgroup_descriptors())
3728template <
typename Derived>
3729bool RecursiveASTVisitor<Derived>::VisitOMPFlushClause(OMPFlushClause *C) {
3730 TRY_TO(VisitOMPClauseList(C));
3734template <
typename Derived>
3735bool RecursiveASTVisitor<Derived>::VisitOMPDepobjClause(OMPDepobjClause *C) {
3736 TRY_TO(TraverseStmt(
C->getDepobj()));
3740template <
typename Derived>
3741bool RecursiveASTVisitor<Derived>::VisitOMPDependClause(OMPDependClause *C) {
3742 TRY_TO(VisitOMPClauseList(C));
3746template <
typename Derived>
3747bool RecursiveASTVisitor<Derived>::VisitOMPDeviceClause(OMPDeviceClause *C) {
3748 TRY_TO(VisitOMPClauseWithPreInit(C));
3749 TRY_TO(TraverseStmt(
C->getDevice()));
3753template <
typename Derived>
3754bool RecursiveASTVisitor<Derived>::VisitOMPMapClause(OMPMapClause *C) {
3755 TRY_TO(VisitOMPClauseList(C));
3759template <
typename Derived>
3760bool RecursiveASTVisitor<Derived>::VisitOMPNumTeamsClause(
3761 OMPNumTeamsClause *C) {
3762 TRY_TO(VisitOMPClauseWithPreInit(C));
3763 TRY_TO(TraverseStmt(
C->getNumTeams()));
3767template <
typename Derived>
3768bool RecursiveASTVisitor<Derived>::VisitOMPThreadLimitClause(
3769 OMPThreadLimitClause *C) {
3770 TRY_TO(VisitOMPClauseWithPreInit(C));
3771 TRY_TO(TraverseStmt(
C->getThreadLimit()));
3775template <
typename Derived>
3776bool RecursiveASTVisitor<Derived>::VisitOMPPriorityClause(
3777 OMPPriorityClause *C) {
3778 TRY_TO(VisitOMPClauseWithPreInit(C));
3779 TRY_TO(TraverseStmt(
C->getPriority()));
3783template <
typename Derived>
3784bool RecursiveASTVisitor<Derived>::VisitOMPGrainsizeClause(
3785 OMPGrainsizeClause *C) {
3786 TRY_TO(VisitOMPClauseWithPreInit(C));
3787 TRY_TO(TraverseStmt(
C->getGrainsize()));
3791template <
typename Derived>
3792bool RecursiveASTVisitor<Derived>::VisitOMPNumTasksClause(
3793 OMPNumTasksClause *C) {
3794 TRY_TO(VisitOMPClauseWithPreInit(C));
3795 TRY_TO(TraverseStmt(
C->getNumTasks()));
3799template <
typename Derived>
3800bool RecursiveASTVisitor<Derived>::VisitOMPHintClause(OMPHintClause *C) {
3801 TRY_TO(TraverseStmt(
C->getHint()));
3805template <
typename Derived>
3806bool RecursiveASTVisitor<Derived>::VisitOMPDistScheduleClause(
3807 OMPDistScheduleClause *C) {
3808 TRY_TO(VisitOMPClauseWithPreInit(C));
3809 TRY_TO(TraverseStmt(
C->getChunkSize()));
3813template <
typename Derived>
3815RecursiveASTVisitor<Derived>::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
3819template <
typename Derived>
3820bool RecursiveASTVisitor<Derived>::VisitOMPToClause(OMPToClause *C) {
3821 TRY_TO(VisitOMPClauseList(C));
3825template <
typename Derived>
3826bool RecursiveASTVisitor<Derived>::VisitOMPFromClause(OMPFromClause *C) {
3827 TRY_TO(VisitOMPClauseList(C));
3831template <
typename Derived>
3832bool RecursiveASTVisitor<Derived>::VisitOMPUseDevicePtrClause(
3833 OMPUseDevicePtrClause *C) {
3834 TRY_TO(VisitOMPClauseList(C));
3838template <
typename Derived>
3839bool RecursiveASTVisitor<Derived>::VisitOMPUseDeviceAddrClause(
3840 OMPUseDeviceAddrClause *C) {
3841 TRY_TO(VisitOMPClauseList(C));
3845template <
typename Derived>
3846bool RecursiveASTVisitor<Derived>::VisitOMPIsDevicePtrClause(
3847 OMPIsDevicePtrClause *C) {
3848 TRY_TO(VisitOMPClauseList(C));
3852template <
typename Derived>
3853bool RecursiveASTVisitor<Derived>::VisitOMPHasDeviceAddrClause(
3854 OMPHasDeviceAddrClause *C) {
3855 TRY_TO(VisitOMPClauseList(C));
3859template <
typename Derived>
3860bool RecursiveASTVisitor<Derived>::VisitOMPNontemporalClause(
3861 OMPNontemporalClause *C) {
3862 TRY_TO(VisitOMPClauseList(C));
3863 for (
auto *E :
C->private_refs()) {
3869template <
typename Derived>
3870bool RecursiveASTVisitor<Derived>::VisitOMPOrderClause(OMPOrderClause *) {
3874template <
typename Derived>
3875bool RecursiveASTVisitor<Derived>::VisitOMPDetachClause(OMPDetachClause *C) {
3876 TRY_TO(TraverseStmt(
C->getEventHandler()));
3880template <
typename Derived>
3881bool RecursiveASTVisitor<Derived>::VisitOMPUsesAllocatorsClause(
3882 OMPUsesAllocatorsClause *C) {
3883 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
3884 const OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
3891template <
typename Derived>
3892bool RecursiveASTVisitor<Derived>::VisitOMPAffinityClause(
3893 OMPAffinityClause *C) {
3894 TRY_TO(TraverseStmt(
C->getModifier()));
3895 for (Expr *E :
C->varlists())
3900template <
typename Derived>
3901bool RecursiveASTVisitor<Derived>::VisitOMPFilterClause(OMPFilterClause *C) {
3902 TRY_TO(VisitOMPClauseWithPreInit(C));
3903 TRY_TO(TraverseStmt(
C->getThreadID()));
3907template <
typename Derived>
3908bool RecursiveASTVisitor<Derived>::VisitOMPBindClause(OMPBindClause *C) {
3912template <
typename Derived>
3913bool RecursiveASTVisitor<Derived>::VisitOMPXDynCGroupMemClause(
3914 OMPXDynCGroupMemClause *C) {
3915 TRY_TO(VisitOMPClauseWithPreInit(C));
3916 TRY_TO(TraverseStmt(
C->getSize()));
3920template <
typename Derived>
3921bool RecursiveASTVisitor<Derived>::VisitOMPDoacrossClause(
3922 OMPDoacrossClause *C) {
3923 TRY_TO(VisitOMPClauseList(C));
3927template <
typename Derived>
3928bool RecursiveASTVisitor<Derived>::VisitOMPXAttributeClause(
3929 OMPXAttributeClause *C) {
3933template <
typename Derived>
3934bool RecursiveASTVisitor<Derived>::VisitOMPXBareClause(OMPXBareClause *C) {
3938template <
typename Derived>
3939bool RecursiveASTVisitor<Derived>::TraverseOpenACCConstructStmt(
3940 OpenACCConstructStmt *C) {
3941 TRY_TO(VisitOpenACCClauseList(
C->clauses()));
3945template <
typename Derived>
3946bool RecursiveASTVisitor<Derived>::TraverseOpenACCAssociatedStmtConstruct(
3947 OpenACCAssociatedStmtConstruct *S) {
3948 TRY_TO(TraverseOpenACCConstructStmt(S));
3949 TRY_TO(TraverseStmt(S->getAssociatedStmt()));
3953template <
typename Derived>
3954bool RecursiveASTVisitor<Derived>::VisitOpenACCClauseList(
3955 ArrayRef<const OpenACCClause *>) {
3962 {
TRY_TO(TraverseOpenACCAssociatedStmtConstruct(S)); })
This file provides AST data structures related to concepts.
#define TYPE(DERIVED, BASE)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
llvm::DenseSet< const void * > Visited
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_INST(TMPLDECLKIND)
#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 STMT(CLASS, PARENT)
#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.
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 a type which was implicitly adjusted by the semantic engine for arbitrary reasons.
Wrapper for source info for arrays.
Attr - This represents one attribute.
An attributed type is a type to which a type attribute has been applied.
Represents a base class of a C++ class.
Represents a C++ base or member initializer.
Represents a C++ struct/union/class.
Complex values, per C99 6.2.5p11.
A reference to a concept and its template args, as it appears in the code.
Represents the canonical version of C arrays with a specified constant size.
Represents a concrete matrix type with constant number of rows and columns.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
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.
Represents the type decltype(expr) (C++11).
Represents a C++17 deduced template specialization type.
Represents a qualified type name for which the type name is dependent.
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 dependent template name that cannot be resolved prior to template instantiation.
Represents a vector type where either the type or size is dependent.
This represents one expression.
Represents a function declaration or definition.
Represents a K&R-style 'int foo()' function, which has no information available about its arguments.
Represents a prototype with parameter type info, e.g.
QualType getParamType(unsigned i) const
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
ArrayRef< QualType > exceptions() const
ArrayRef< QualType > param_types() const
QualType getReturnType() const
Represents a C array with an unspecified size.
Describes an C or C++ initializer list.
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...
Sugar type that represents a type that was qualified by a qualifier written as a macro invocation.
A C++ nested-name-specifier augmented with source location information.
TypeLoc getTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
NestedNameSpecifierLoc getPrefix() const
Return the prefix of this nested-name-specifier.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
@ NamespaceAlias
A namespace alias, stored as a NamespaceAliasDecl*.
@ TypeSpec
A type, stored as a Type*.
@ TypeSpecWithTemplate
A type that was preceded by the 'template' keyword, stored as a Type*.
@ Super
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Identifier
An identifier, stored as an IdentifierInfo*.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace, stored as a NamespaceDecl*.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
This is a basic class for representing single OpenMP clause.
This is a basic class for representing single OpenMP executable directive.
This is a common base class for loop directives ('omp simd', 'omp for', 'omp for simd' etc....
Represents a pointer to an Objective C object.
Represents a pack expansion of types.
Sugar for parentheses used when specifying types.
A (possibly-)qualified type.
Represents a template name that was expressed as a qualified name.
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.
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
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 TraverseType(QualType T)
Recursively visit a type, by dispatching to Traverse*Type() based on the argument's getTypeClass() pr...
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 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 TraverseNestedNameSpecifier(NestedNameSpecifier *NNS)
Recursively visit a C++ nested-name-specifier.
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 TraverseStmt(Stmt *S, DataRecursionQueue *Queue=nullptr)
Recursively visit a statement or expression, by dispatching to Traverse*() based on the argument's dy...
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 TraverseTypeLoc(TypeLoc TL)
Recursively visit a type with location, by dispatching to Traverse*TypeLoc() based on the argument ty...
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 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.
Stmt - This represents one statement.
llvm::iterator_range< child_iterator > child_range
Represents the result of substituting a set of types for a template type parameter pack.
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
NestedNameSpecifierLoc getTemplateQualifierLoc() const
Expr * getSourceExpression() 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.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
Declaration of a template type parameter.
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.
TypeLocClass getTypeLocClass() const
Represents a typeof (or typeof) expression (a C23 feature and GCC extension) or a typeof_unqual expre...
A container of type source information.
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
The base class of the type hierarchy.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
TypeClass getTypeClass() const
Wrapper of type source information for a type with no direct qualifiers.
Represents a variable declaration or definition.
Represents a GCC generic vector type.
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...
bool ReturnValue(const T &V, APValue &R)
Convert a value to an APValue.
The JSON file list parser is used to communicate input to InstallAPI.
for(const auto &A :T->param_types())
const FunctionProtoType * T
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,...
@ Class
The "class" keyword introduces the elaborated-type-specifier.
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.