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()) {
744 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(D))
745 return TraverseTemplateTypeParamDeclConstraints(TTPD);
756 if (
auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
757 if (llvm::isa_and_present<TypeAliasTemplateDecl>(
758 FTD->getDeclName().getCXXDeductionGuideTemplate()))
763#define ABSTRACT_DECL(DECL)
764#define DECL(CLASS, BASE) \
766 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
769#include "clang/AST/DeclNodes.inc"
774template <
typename Derived>
799template <
typename Derived>
806 TRY_TO(TraverseNestedNameSpecifierLoc(Prefix));
825template <
typename Derived>
833 TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc()));
837 TRY_TO(TraverseTemplateName(
854template <
typename Derived>
857 TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
859 TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
864template <
typename Derived>
876 return getDerived().TraverseType(Arg.
getAsType());
880 return getDerived().TraverseTemplateName(
884 return getDerived().TraverseStmt(Arg.
getAsExpr());
887 return getDerived().TraverseTemplateArguments(Arg.
pack_elements());
895template <
typename Derived>
911 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
913 return getDerived().TraverseType(Arg.
getAsType());
919 TRY_TO(getDerived().TraverseNestedNameSpecifierLoc(
921 return getDerived().TraverseTemplateName(
928 return getDerived().TraverseTemplateArguments(Arg.
pack_elements());
934template <
typename Derived>
938 TRY_TO(TraverseTemplateArgument(Arg));
943template <
typename Derived>
947 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
949 if (
Init->isWritten() || getDerived().shouldVisitImplicitCode())
955template <
typename Derived>
960 if (LE->isInitCapture(
C))
961 TRY_TO(TraverseDecl(
C->getCapturedVar()));
970#define DEF_TRAVERSE_TYPE(TYPE, CODE) \
971 template <typename Derived> \
972 bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) { \
973 if (!getDerived().shouldTraversePostOrder()) \
974 TRY_TO(WalkUpFrom##TYPE(T)); \
976 if (getDerived().shouldTraversePostOrder()) \
977 TRY_TO(WalkUpFrom##TYPE(T)); \
997 TRY_TO(TraverseType(QualType(
T->getClass(), 0)));
1006 TRY_TO(TraverseType(
T->getElementType()));
1007 if (
T->getSizeExpr())
1008 TRY_TO(TraverseStmt(
const_cast<Expr*
>(
T->getSizeExpr())));
1012 TRY_TO(TraverseType(
T->getElementType()));
1013 if (
T->getSizeExpr())
1014 TRY_TO(TraverseStmt(
const_cast<Expr *
>(
T->getSizeExpr())));
1018 {
TRY_TO(TraverseType(
T->getElementType())); })
1021 TRY_TO(TraverseType(
T->getElementType()));
1026 TRY_TO(TraverseType(
T->getElementType()));
1027 if (
T->getSizeExpr())
1028 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1032 TRY_TO(TraverseStmt(
T->getAddrSpaceExpr()));
1037 if (
T->getSizeExpr())
1038 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1039 TRY_TO(TraverseType(
T->getElementType()));
1043 if (
T->getSizeExpr())
1044 TRY_TO(TraverseStmt(
T->getSizeExpr()));
1053 {
TRY_TO(TraverseType(
T->getElementType())); })
1056 if (
T->getRowExpr())
1057 TRY_TO(TraverseStmt(
T->getRowExpr()));
1058 if (
T->getColumnExpr())
1059 TRY_TO(TraverseStmt(
T->getColumnExpr()));
1060 TRY_TO(TraverseType(
T->getElementType()));
1078 TRY_TO(TraverseStmt(NE));
1086 {
TRY_TO(TraverseStmt(
T->getUnderlyingExpr())); })
1091 {
TRY_TO(TraverseStmt(
T->getUnderlyingExpr())); })
1094 TRY_TO(TraverseType(
T->getPattern()));
1099 TRY_TO(TraverseType(
T->getBaseType()));
1100 TRY_TO(TraverseType(
T->getUnderlyingType()));
1104 TRY_TO(TraverseType(
T->getDeducedType()));
1105 if (
T->isConstrained()) {
1106 TRY_TO(TraverseTemplateArguments(
T->getTypeConstraintArguments()));
1110 TRY_TO(TraverseTemplateName(
T->getTemplateName()));
1111 TRY_TO(TraverseType(
T->getDeducedType()));
1118 TRY_TO(TraverseType(
T->getReplacementType()));
1121 TRY_TO(TraverseTemplateArgument(
T->getArgumentPack()));
1125 TRY_TO(TraverseTemplateName(
T->getTemplateName()));
1126 TRY_TO(TraverseTemplateArguments(
T->template_arguments()));
1132 {
TRY_TO(TraverseType(
T->getModifiedType())); })
1135 if (
T->getCountExpr())
1136 TRY_TO(TraverseStmt(
T->getCountExpr()));
1141 {
TRY_TO(TraverseType(
T->getWrappedType())); })
1146 {
TRY_TO(TraverseType(
T->getUnderlyingType())); })
1149 if (
T->getQualifier()) {
1150 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1152 TRY_TO(TraverseType(
T->getNamedType()));
1156 {
TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier())); })
1159 TRY_TO(TraverseNestedNameSpecifier(
T->getQualifier()));
1160 TRY_TO(TraverseTemplateArguments(
T->template_arguments()));
1172 if (
T->getBaseType().getTypePtr() !=
T)
1173 TRY_TO(TraverseType(
T->getBaseType()));
1174 for (
auto typeArg :
T->getTypeArgsAsWritten()) {
1175 TRY_TO(TraverseType(typeArg));
1188 {
TRY_TO(TraverseStmt(
T->getNumBitsExpr())); })
1200 template <
typename Derived> \
1201 bool RecursiveASTVisitor<Derived>::Traverse##
TYPE##
Loc(
TYPE##
Loc TL) { \
1202 if (!getDerived().shouldTraversePostOrder()) { \
1203 TRY_TO(WalkUpFrom##
TYPE##
Loc(TL)); \
1204 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1205 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1208 if (getDerived().shouldTraversePostOrder()) { \
1209 TRY_TO(WalkUpFrom##
TYPE##
Loc(TL)); \
1210 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1211 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1216template <
typename Derived>
1218RecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc(QualifiedTypeLoc TL) {
1234 return TraverseTypeLoc(TL.getUnqualifiedLoc());
1241 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1245 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1248 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1251 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1254 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1259 if (
auto *TSI = TL.getClassTInfo())
1260 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1267 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1270 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1272template <typename Derived>
1273bool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) {
1275 TRY_TO(TraverseStmt(TL.getSizeExpr()));
1280 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1281 TRY_TO(TraverseArrayTypeLocHelper(TL));
1285 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1290 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1291 TRY_TO(TraverseArrayTypeLocHelper(TL));
1295 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1296 TRY_TO(TraverseArrayTypeLocHelper(TL));
1300 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1301 TRY_TO(TraverseArrayTypeLocHelper(TL));
1305 TRY_TO(TraverseStmt(TL.getTypePtr()->getAddrSpaceExpr()));
1306 TRY_TO(TraverseType(TL.getTypePtr()->getPointeeType()));
1312 if (TL.getTypePtr()->getSizeExpr())
1313 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1314 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1319 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1323 if (TL.getTypePtr()->getSizeExpr())
1324 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1325 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1331 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1335 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1336 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1337 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1341 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1342 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1343 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1347 {
TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1351 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1355 for (
unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
1356 if (TL.getParam(I)) {
1357 TRY_TO(TraverseDecl(TL.getParam(I)));
1358 }
else if (I < T->getNumParams()) {
1368 TRY_TO(TraverseStmt(NE));
1376 {
TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1379 TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo()->getTypeLoc()));
1384 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
1388 TRY_TO(TraverseType(TL.getPattern()));
1389 TRY_TO(TraverseStmt(TL.getTypePtr()->getIndexExpr()));
1393 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1397 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1398 if (TL.isConstrained()) {
1399 TRY_TO(TraverseConceptReference(TL.getConceptReference()));
1404 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1405 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1412 TRY_TO(TraverseType(TL.getTypePtr()->getReplacementType()));
1415 TRY_TO(TraverseTemplateArgument(TL.getTypePtr()->getArgumentPack()));
1420 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1421 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1422 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1431 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1434 {
TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1437 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1440 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1443 if (TL.getQualifierLoc()) {
1444 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1446 TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc()));
1450 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1454 if (TL.getQualifierLoc()) {
1455 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1458 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1459 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1464 {
TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1467 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1468 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));
1469 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1478 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
1479 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
1480 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
1481 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
1482 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1483 ObjCProtocolLoc ProtocolLoc(TL.getProtocol(I), TL.getProtocolLoc(I));
1484 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1489 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1497 TRY_TO(TraverseStmt(TL.getTypePtr()->getNumBitsExpr()));
1509template <typename Derived>
1511 const Decl *Child) {
1514 if (isa<BlockDecl>(Child) || isa<CapturedDecl>(Child))
1517 if (
const CXXRecordDecl* Cls = dyn_cast<CXXRecordDecl>(Child))
1518 return Cls->isLambda();
1522template <
typename Derived>
1523bool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) {
1527 for (
auto *Child : DC->decls()) {
1528 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1529 TRY_TO(TraverseDecl(Child));
1536#define DEF_TRAVERSE_DECL(DECL, CODE) \
1537 template <typename Derived> \
1538 bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
1539 bool ShouldVisitChildren = true; \
1540 bool ReturnValue = true; \
1541 if (!getDerived().shouldTraversePostOrder()) \
1542 TRY_TO(WalkUpFrom##DECL(D)); \
1544 if (ReturnValue && ShouldVisitChildren) \
1545 TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
1546 if (ReturnValue) { \
1548 for (auto *I : D->attrs()) \
1549 TRY_TO(getDerived().TraverseAttr(I)); \
1551 if (ReturnValue && getDerived().shouldTraversePostOrder()) \
1552 TRY_TO(WalkUpFrom##DECL(D)); \
1553 return ReturnValue; \
1559 if (TypeSourceInfo *TInfo = D->getSignatureAsWritten())
1560 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
1561 TRY_TO(TraverseStmt(D->getBody()));
1562 for (
const auto &I : D->captures()) {
1563 if (I.hasCopyExpr()) {
1564 TRY_TO(TraverseStmt(I.getCopyExpr()));
1567 ShouldVisitChildren =
false;
1571 TRY_TO(TraverseStmt(D->getBody()));
1572 ShouldVisitChildren =
false;
1580 TRY_TO(TraverseStmt(D->getTemporaryExpr()));
1584 {
TRY_TO(TraverseStmt(D->getAsmString())); })
1592 if (D->getFriendType()) {
1593 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1596 if (
auto *ET = D->getFriendType()->getType()->getAs<ElaboratedType>())
1597 TRY_TO(TraverseDecl(ET->getOwnedTagDecl()));
1599 TRY_TO(TraverseDecl(D->getFriendDecl()));
1604 if (D->getFriendType())
1605 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1607 TRY_TO(TraverseDecl(D->getFriendDecl()));
1608 for (
unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
1609 TemplateParameterList *TPL = D->getTemplateParameterList(I);
1610 for (TemplateParameterList::iterator ITPL = TPL->begin(), ETPL = TPL->end();
1611 ITPL != ETPL; ++ITPL) {
1612 TRY_TO(TraverseDecl(*ITPL));
1625 TRY_TO(TraverseStmt(D->getAssertExpr()));
1626 TRY_TO(TraverseStmt(D->getMessage()));
1636 auto Scope = D->getASTContext().getTraversalScope();
1637 bool HasLimitedScope =
1638 Scope.size() != 1 || !isa<TranslationUnitDecl>(Scope.front());
1639 if (HasLimitedScope) {
1640 ShouldVisitChildren =
false;
1641 for (
auto *Child : Scope) {
1642 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1643 TRY_TO(TraverseDecl(Child));
1655 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1659 ShouldVisitChildren =
false;
1676 if (ObjCTypeParamList *typeParamList = D->getTypeParamList()) {
1677 for (
auto typeParam : *typeParamList) {
1678 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1681 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1682 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1683 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1694 if (ObjCTypeParamList *typeParamList = D->getTypeParamListAsWritten()) {
1695 for (
auto typeParam : *typeParamList) {
1696 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1700 if (TypeSourceInfo *superTInfo = D->getSuperClassTInfo()) {
1701 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
1703 if (D->isThisDeclarationADefinition()) {
1704 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1705 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1706 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1712 if (D->isThisDeclarationADefinition()) {
1713 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1714 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1715 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1721 if (D->getReturnTypeSourceInfo()) {
1722 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1724 for (ParmVarDecl *Parameter : D->parameters()) {
1725 TRY_TO(TraverseDecl(Parameter));
1727 if (D->isThisDeclarationADefinition()) {
1728 TRY_TO(TraverseStmt(D->getBody()));
1730 ShouldVisitChildren =
false;
1734 if (D->hasExplicitBound()) {
1735 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1743 if (D->getTypeSourceInfo())
1744 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1746 TRY_TO(TraverseType(D->getType()));
1747 ShouldVisitChildren =
false;
1751 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1752 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1756 {
TRY_TO(TraverseTypeLoc(D->getEnumTypeLoc())); })
1761 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1769 for (
auto *I : D->varlists()) {
1775 for (
auto *C : D->clauselists()) {
1776 TRY_TO(TraverseOMPClause(C));
1781 TRY_TO(TraverseStmt(D->getCombiner()));
1782 if (
auto *Initializer = D->getInitializer())
1783 TRY_TO(TraverseStmt(Initializer));
1784 TRY_TO(TraverseType(D->getType()));
1789 for (
auto *C : D->clauselists())
1790 TRY_TO(TraverseOMPClause(C));
1791 TRY_TO(TraverseType(D->getType()));
1798 for (
auto *I : D->varlists())
1800 for (
auto *C : D->clauselists())
1801 TRY_TO(TraverseOMPClause(C));
1805template <typename Derived>
1806bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1807 TemplateParameterList *TPL) {
1809 for (NamedDecl *D : *TPL) {
1812 if (Expr *RequiresClause = TPL->getRequiresClause()) {
1813 TRY_TO(TraverseStmt(RequiresClause));
1819template <
typename Derived>
1820template <
typename T>
1821bool RecursiveASTVisitor<Derived>::TraverseDeclTemplateParameterLists(T *D) {
1822 for (
unsigned i = 0; i < D->getNumTemplateParameterLists(); i++) {
1823 TemplateParameterList *TPL = D->getTemplateParameterList(i);
1824 TraverseTemplateParameterListHelper(TPL);
1829template <
typename Derived>
1830bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1831 ClassTemplateDecl *D) {
1832 for (
auto *SD : D->specializations()) {
1833 for (
auto *RD : SD->redecls()) {
1834 assert(!cast<CXXRecordDecl>(RD)->isInjectedClassName());
1836 cast<ClassTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1840 TRY_TO(TraverseDecl(RD));
1857template <
typename Derived>
1858bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1859 VarTemplateDecl *D) {
1860 for (
auto *SD : D->specializations()) {
1861 for (
auto *RD : SD->redecls()) {
1863 cast<VarTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1866 TRY_TO(TraverseDecl(RD));
1882template <
typename Derived>
1883bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1884 FunctionTemplateDecl *D) {
1885 for (
auto *FD : D->specializations()) {
1886 for (
auto *RD : FD->redecls()) {
1887 switch (RD->getTemplateSpecializationKind()) {
1891 TRY_TO(TraverseDecl(RD));
1898 TRY_TO(TraverseDecl(RD));
1912#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND) \
1913 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \
1914 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
1915 TRY_TO(TraverseDecl(D->getTemplatedDecl())); \
1923 if (getDerived().shouldVisitTemplateInstantiations() && \
1924 D == D->getCanonicalDecl()) \
1925 TRY_TO(TraverseTemplateInstantiations(D)); \
1939 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1940 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1941 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
1942 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1946 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1949template <typename Derived>
1950bool RecursiveASTVisitor<Derived>::TraverseTemplateTypeParamDeclConstraints(
1951 const TemplateTypeParmDecl *D) {
1952 if (
const auto *TC = D->getTypeConstraint())
1953 TRY_TO(TraverseTypeConstraint(TC));
1959 if (D->getTypeForDecl())
1960 TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1961 TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));
1962 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1963 TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
1967 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1974 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1981 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1982 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1986 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1987 TRY_TO(TraverseStmt(D->getConstraintExpr()));
1993 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2002 TRY_TO(TraverseDeclTemplateParameterLists(D));
2004 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2005 if (
auto *TSI = D->getIntegerTypeSourceInfo())
2006 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2012template <typename Derived>
2013bool RecursiveASTVisitor<Derived>::TraverseRecordHelper(RecordDecl *D) {
2017 TRY_TO(TraverseDeclTemplateParameterLists(D));
2018 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2022template <
typename Derived>
2023bool RecursiveASTVisitor<Derived>::TraverseCXXBaseSpecifier(
2024 const CXXBaseSpecifier &
Base) {
2025 TRY_TO(TraverseTypeLoc(
Base.getTypeSourceInfo()->getTypeLoc()));
2029template <
typename Derived>
2030bool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(CXXRecordDecl *D) {
2031 if (!TraverseRecordHelper(D))
2033 if (D->isCompleteDefinition()) {
2034 for (
const auto &I : D->bases()) {
2035 TRY_TO(TraverseCXXBaseSpecifier(I));
2047template <typename Derived>
2048bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
2049 const TemplateArgumentLoc *TAL,
unsigned Count) {
2050 for (
unsigned I = 0; I < Count; ++I) {
2051 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
2056#define DEF_TRAVERSE_TMPL_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2057 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \
2066 if (const auto *ArgsWritten = D->getTemplateArgsAsWritten()) { \
2068 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2069 ArgsWritten->getTemplateArgs(), ArgsWritten->NumTemplateArgs)); \
2072 if (getDerived().shouldVisitTemplateInstantiations() || \
2073 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \
2075 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2077 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); \
2090#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2091 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
2093 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
2095 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2096 D->getTemplateArgsAsWritten()->getTemplateArgs(), \
2097 D->getTemplateArgsAsWritten()->NumTemplateArgs)); \
2102 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2115 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2116 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2121template <typename Derived>
2122bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) {
2123 TRY_TO(TraverseDeclTemplateParameterLists(D));
2124 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2125 if (D->getTypeSourceInfo())
2126 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2128 TRY_TO(TraverseType(D->getType()));
2133 TRY_TO(TraverseVarHelper(D));
2134 for (
auto *Binding : D->bindings()) {
2135 TRY_TO(TraverseDecl(Binding));
2140 if (getDerived().shouldVisitImplicitCode())
2141 TRY_TO(TraverseStmt(D->getBinding()));
2152 TRY_TO(TraverseDeclaratorHelper(D));
2153 if (D->isBitField())
2154 TRY_TO(TraverseStmt(D->getBitWidth()));
2155 if (D->hasInClassInitializer())
2156 TRY_TO(TraverseStmt(D->getInClassInitializer()));
2160 TRY_TO(TraverseDeclaratorHelper(D));
2161 if (D->isBitField())
2162 TRY_TO(TraverseStmt(D->getBitWidth()));
2167 TRY_TO(TraverseDeclaratorHelper(D));
2168 if (D->isBitField())
2169 TRY_TO(TraverseStmt(D->getBitWidth()));
2173template <typename Derived>
2174bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
2175 TRY_TO(TraverseDeclTemplateParameterLists(D));
2176 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2177 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2184 if (
const FunctionTemplateSpecializationInfo *FTSI =
2185 D->getTemplateSpecializationInfo()) {
2186 if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared &&
2187 FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) {
2190 if (
const ASTTemplateArgumentListInfo *TALI =
2191 FTSI->TemplateArgumentsAsWritten) {
2192 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2193 TALI->NumTemplateArgs));
2196 }
else if (
const DependentFunctionTemplateSpecializationInfo *DFSI =
2197 D->getDependentSpecializationInfo()) {
2198 if (
const ASTTemplateArgumentListInfo *TALI =
2199 DFSI->TemplateArgumentsAsWritten) {
2200 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2201 TALI->NumTemplateArgs));
2209 if (TypeSourceInfo *TSI = D->getTypeSourceInfo()) {
2210 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2211 }
else if (getDerived().shouldVisitImplicitCode()) {
2216 for (ParmVarDecl *Parameter : D->parameters()) {
2217 TRY_TO(TraverseDecl(Parameter));
2222 if (Expr *TrailingRequiresClause = D->getTrailingRequiresClause()) {
2223 TRY_TO(TraverseStmt(TrailingRequiresClause));
2226 if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
2228 for (
auto *I : Ctor->inits()) {
2229 if (I->isWritten() || getDerived().shouldVisitImplicitCode())
2230 TRY_TO(TraverseConstructorInitializer(I));
2235 D->isThisDeclarationADefinition() &&
2238 (!D->isDefaulted() || getDerived().shouldVisitImplicitCode());
2240 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2241 if (
const CXXRecordDecl *RD = MD->getParent()) {
2242 if (RD->isLambda() &&
2244 VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();
2250 TRY_TO(TraverseStmt(D->getBody()));
2253 for (
auto *Child : D->decls()) {
2254 if (isa<UsingShadowDecl>(Child))
2255 TRY_TO(TraverseDecl(Child));
2264 ShouldVisitChildren =
false;
2271 ShouldVisitChildren =
false;
2278 ShouldVisitChildren =
false;
2285 ShouldVisitChildren =
false;
2294 ShouldVisitChildren =
false;
2301 ShouldVisitChildren =
false;
2305template <typename Derived>
2306bool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) {
2307 TRY_TO(TraverseDeclaratorHelper(D));
2309 if (!isa<ParmVarDecl>(D) &&
2310 (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))
2311 TRY_TO(TraverseStmt(D->getInit()));
2321 TRY_TO(TraverseDeclaratorHelper(D));
2322 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2323 TRY_TO(TraverseStmt(D->getDefaultArgument()));
2327 TRY_TO(TraverseVarHelper(D));
2329 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
2330 !D->hasUnparsedDefaultArg())
2331 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
2333 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
2334 !D->hasUnparsedDefaultArg())
2335 TRY_TO(TraverseStmt(D->getDefaultArg()));
2341 TRY_TO(TraverseTemplateArguments(D->getTemplateArguments()));
2357 template <
typename Derived> \
2358 bool RecursiveASTVisitor<Derived>::Traverse##
STMT( \
2359 STMT *S, DataRecursionQueue *Queue) { \
2360 bool ShouldVisitChildren =
true; \
2362 if (!getDerived().shouldTraversePostOrder()) \
2363 TRY_TO(WalkUpFrom##
STMT(S)); \
2365 if (ShouldVisitChildren) { \
2366 for (Stmt * SubStmt : getDerived().getStmtChildren(S)) { \
2367 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
2374 if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \
2375 TRY_TO(WalkUpFrom##
STMT(S)); \
2382 for (
unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
2385 for (
unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
2388 for (
unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
2401 TRY_TO(TraverseDecl(S->getExceptionDecl()));
2406 for (
auto *I : S->decls()) {
2414 ShouldVisitChildren =
false;
2442 if (!getDerived().shouldVisitImplicitCode()) {
2449 ShouldVisitChildren =
false;
2454 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2455 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2465 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2466 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2467 if (S->hasExplicitTemplateArgs()) {
2468 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2469 S->getNumTemplateArgs()));
2474 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2475 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2476 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2477 S->getNumTemplateArgs()));
2481 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2482 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2483 if (S->hasExplicitTemplateArgs()) {
2484 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2485 S->getNumTemplateArgs()));
2490 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2491 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2492 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2493 S->getNumTemplateArgs()));
2503 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2507 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2511 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2515 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2519 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2523 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2527 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2531 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2534template <typename Derived>
2535bool RecursiveASTVisitor<Derived>::TraverseSynOrSemInitListExpr(
2536 InitListExpr *S, DataRecursionQueue *Queue) {
2540 if (!getDerived().shouldTraversePostOrder())
2541 TRY_TO(WalkUpFromInitListExpr(S));
2544 for (Stmt *SubStmt : S->children()) {
2548 if (!Queue && getDerived().shouldTraversePostOrder())
2549 TRY_TO(WalkUpFromInitListExpr(S));
2554template <
typename Derived>
2555bool RecursiveASTVisitor<Derived>::TraverseObjCProtocolLoc(
2556 ObjCProtocolLoc ProtocolLoc) {
2560template <
typename Derived>
2561bool RecursiveASTVisitor<Derived>::TraverseConceptReference(
2562 ConceptReference *CR) {
2563 if (!getDerived().shouldTraversePostOrder())
2564 TRY_TO(VisitConceptReference(CR));
2565 TRY_TO(TraverseNestedNameSpecifierLoc(CR->getNestedNameSpecifierLoc()));
2566 TRY_TO(TraverseDeclarationNameInfo(CR->getConceptNameInfo()));
2567 if (CR->hasExplicitTemplateArgs())
2568 TRY_TO(TraverseTemplateArgumentLocsHelper(
2569 CR->getTemplateArgsAsWritten()->getTemplateArgs(),
2570 CR->getTemplateArgsAsWritten()->NumTemplateArgs));
2571 if (getDerived().shouldTraversePostOrder())
2572 TRY_TO(VisitConceptReference(CR));
2584template <
typename Derived>
2585bool RecursiveASTVisitor<Derived>::TraverseInitListExpr(
2586 InitListExpr *S, DataRecursionQueue *Queue) {
2587 if (S->isSemanticForm() && S->isSyntacticForm()) {
2589 TRY_TO(TraverseSynOrSemInitListExpr(S, Queue));
2592 TRY_TO(TraverseSynOrSemInitListExpr(
2593 S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
2594 if (getDerived().shouldVisitImplicitCode()) {
2597 TRY_TO(TraverseSynOrSemInitListExpr(
2598 S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
2607 if (S->isExprPredicate())
2608 TRY_TO(TraverseStmt(S->getControllingExpr()));
2610 TRY_TO(TraverseTypeLoc(S->getControllingType()->getTypeLoc()));
2612 for (
const GenericSelectionExpr::Association Assoc : S->associations()) {
2613 if (TypeSourceInfo *TSI = Assoc.getTypeSourceInfo())
2614 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2615 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(Assoc.getAssociationExpr());
2617 ShouldVisitChildren =
false;
2624 for (PseudoObjectExpr::semantics_iterator i = S->semantics_begin(),
2625 e = S->semantics_end();
2628 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub))
2629 sub = OVE->getSourceExpr();
2632 ShouldVisitChildren =
false;
2638 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2643 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
2651 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2657 if (S->isArgumentType())
2658 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
2664 if (S->isTypeOperand())
2665 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2669 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2677 if (S->isTypeOperand())
2678 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2682 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2683 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2687 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
2695 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
2700 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2706 for (
unsigned I = 0, N = S->capture_size(); I != N; ++I) {
2707 const LambdaCapture *
C = S->capture_begin() + I;
2708 if (
C->isExplicit() || getDerived().shouldVisitImplicitCode()) {
2709 TRY_TO(TraverseLambdaCapture(S, C, S->capture_init_begin()[I]));
2713 if (getDerived().shouldVisitImplicitCode()) {
2715 TRY_TO(TraverseDecl(S->getLambdaClass()));
2718 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2719 FunctionProtoTypeLoc Proto = TL.getAsAdjusted<FunctionProtoTypeLoc>();
2721 TRY_TO(TraverseTemplateParameterListHelper(S->getTemplateParameterList()));
2722 if (S->hasExplicitParameters()) {
2724 for (
unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2725 TRY_TO(TraverseDecl(Proto.getParam(I)));
2728 auto *
T = Proto.getTypePtr();
2735 if (S->hasExplicitResultType())
2736 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2741 ShouldVisitChildren =
false;
2746 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2765 TRY_TO(TraverseDecl(S->getBlockDecl()));
2771 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2777 if (getDerived().shouldVisitImplicitCode())
2778 TRY_TO(TraverseStmt(S->getExpr()));
2782 if (getDerived().shouldVisitImplicitCode())
2783 TRY_TO(TraverseStmt(S->getExpr()));
2793 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2794 if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())
2795 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2796 if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2797 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
2812 if (OpaqueValueExpr *OVE = S->getCommonExpr())
2819 if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())
2820 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2827 if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())
2828 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2832 if (S->isClassReceiver()) {
2833 ObjCInterfaceDecl *IDecl = S->getClassReceiver();
2834 QualType
Type = IDecl->getASTContext().getObjCInterfaceType(IDecl);
2835 ObjCInterfaceLocInfo
Data;
2836 Data.NameLoc = S->getReceiverLocation();
2847 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2854 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2863 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2864 if (S->hasExplicitTemplateArgs()) {
2865 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2866 S->getNumTemplateArgs()));
2871 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2872 if (S->hasExplicitTemplateArgs()) {
2873 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2874 S->getNumTemplateArgs()));
2886 if (!getDerived().shouldVisitImplicitCode()) {
2887 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2888 S->getDecomposedForm();
2889 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.LHS)));
2890 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.RHS)));
2891 ShouldVisitChildren =
false;
2918 if (S->getLifetimeExtendedTemporaryDecl()) {
2919 TRY_TO(TraverseLifetimeExtendedTemporaryDecl(
2920 S->getLifetimeExtendedTemporaryDecl()));
2921 ShouldVisitChildren =
false;
2928 if (!getDerived().shouldVisitImplicitCode()) {
2930 ShouldVisitChildren =
false;
2934 if (!getDerived().shouldVisitImplicitCode()) {
2936 ShouldVisitChildren =
false;
2940 if (!getDerived().shouldVisitImplicitCode()) {
2942 ShouldVisitChildren =
false;
2946 if (!getDerived().shouldVisitImplicitCode()) {
2948 ShouldVisitChildren =
false;
2952 if (!getDerived().shouldVisitImplicitCode()) {
2954 ShouldVisitChildren =
false;
2959 TRY_TO(TraverseConceptReference(S->getConceptReference()));
2963 TRY_TO(TraverseDecl(S->getBody()));
2964 for (ParmVarDecl *Parm : S->getLocalParameters())
2965 TRY_TO(TraverseDecl(Parm));
2966 for (concepts::Requirement *Req : S->getRequirements())
2967 TRY_TO(TraverseConceptRequirement(Req));
2986template <typename Derived>
2987bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
2988 OMPExecutableDirective *S) {
2989 for (
auto *C : S->clauses()) {
2990 TRY_TO(TraverseOMPClause(C));
2996 if (!getDerived().shouldVisitImplicitCode()) {
2998 TRY_TO(TraverseStmt(S->getLoopStmt()));
2999 ShouldVisitChildren =
false;
3003template <typename Derived>
3005RecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
3006 return TraverseOMPExecutableDirective(S);
3010 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3013 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3016 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3019 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3022 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3025 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3028 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3031 {
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(TraverseDeclarationNameInfo(S->getDirectiveName()));
3047 TRY_TO(TraverseOMPExecutableDirective(S));
3051 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3054 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3057 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3060 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3063 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3066 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3069 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3072 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3075 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3078 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3081 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3084 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3087 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3090 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3093 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3096 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3099 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3102 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3105 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3108 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3111 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3114 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3117 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3120 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3123 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3126 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3129 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3132 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3135 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3138 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3141 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3144 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3147 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3150 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3153 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3156 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3159 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3162 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3165 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3168 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3171 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3174 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3177 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3180 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3183 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3186 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3189 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3192 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3195 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3198 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3201 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3204 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3207 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3210 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3213 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3216 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3219 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3222 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3225 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3228template <typename Derived>
3229bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
3232 switch (
C->getClauseKind()) {
3233#define GEN_CLANG_CLAUSE_CLASS
3234#define CLAUSE_CLASS(Enum, Str, Class) \
3235 case llvm::omp::Clause::Enum: \
3236 TRY_TO(Visit##Class(static_cast<Class *>(C))); \
3238#define CLAUSE_NO_CLASS(Enum, Str) \
3239 case llvm::omp::Clause::Enum: \
3241#include "llvm/Frontend/OpenMP/OMP.inc"
3246template <
typename Derived>
3247bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
3248 OMPClauseWithPreInit *
Node) {
3249 TRY_TO(TraverseStmt(
Node->getPreInitStmt()));
3253template <
typename Derived>
3254bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
3255 OMPClauseWithPostUpdate *
Node) {
3257 TRY_TO(TraverseStmt(
Node->getPostUpdateExpr()));
3261template <
typename Derived>
3262bool RecursiveASTVisitor<Derived>::VisitOMPAllocatorClause(
3263 OMPAllocatorClause *C) {
3264 TRY_TO(TraverseStmt(
C->getAllocator()));
3268template <
typename Derived>
3269bool RecursiveASTVisitor<Derived>::VisitOMPAllocateClause(OMPAllocateClause *C) {
3270 TRY_TO(TraverseStmt(
C->getAllocator()));
3271 TRY_TO(VisitOMPClauseList(C));
3275template <
typename Derived>
3276bool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
3277 TRY_TO(VisitOMPClauseWithPreInit(C));
3278 TRY_TO(TraverseStmt(
C->getCondition()));
3282template <
typename Derived>
3283bool RecursiveASTVisitor<Derived>::VisitOMPFinalClause(OMPFinalClause *C) {
3284 TRY_TO(VisitOMPClauseWithPreInit(C));
3285 TRY_TO(TraverseStmt(
C->getCondition()));
3289template <
typename Derived>
3291RecursiveASTVisitor<Derived>::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
3292 TRY_TO(VisitOMPClauseWithPreInit(C));
3293 TRY_TO(TraverseStmt(
C->getNumThreads()));
3297template <
typename Derived>
3298bool RecursiveASTVisitor<Derived>::VisitOMPAlignClause(OMPAlignClause *C) {
3299 TRY_TO(TraverseStmt(
C->getAlignment()));
3303template <
typename Derived>
3304bool RecursiveASTVisitor<Derived>::VisitOMPSafelenClause(OMPSafelenClause *C) {
3305 TRY_TO(TraverseStmt(
C->getSafelen()));
3309template <
typename Derived>
3310bool RecursiveASTVisitor<Derived>::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
3311 TRY_TO(TraverseStmt(
C->getSimdlen()));
3315template <
typename Derived>
3316bool RecursiveASTVisitor<Derived>::VisitOMPSizesClause(OMPSizesClause *C) {
3317 for (Expr *E :
C->getSizesRefs())
3322template <
typename Derived>
3323bool RecursiveASTVisitor<Derived>::VisitOMPFullClause(OMPFullClause *C) {
3327template <
typename Derived>
3328bool RecursiveASTVisitor<Derived>::VisitOMPPartialClause(OMPPartialClause *C) {
3329 TRY_TO(TraverseStmt(
C->getFactor()));
3333template <
typename Derived>
3335RecursiveASTVisitor<Derived>::VisitOMPCollapseClause(OMPCollapseClause *C) {
3336 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3340template <
typename Derived>
3341bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {
3345template <
typename Derived>
3346bool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
3350template <
typename Derived>
3351bool RecursiveASTVisitor<Derived>::VisitOMPUnifiedAddressClause(
3352 OMPUnifiedAddressClause *) {
3356template <
typename Derived>
3357bool RecursiveASTVisitor<Derived>::VisitOMPUnifiedSharedMemoryClause(
3358 OMPUnifiedSharedMemoryClause *) {
3362template <
typename Derived>
3363bool RecursiveASTVisitor<Derived>::VisitOMPReverseOffloadClause(
3364 OMPReverseOffloadClause *) {
3368template <
typename Derived>
3369bool RecursiveASTVisitor<Derived>::VisitOMPDynamicAllocatorsClause(
3370 OMPDynamicAllocatorsClause *) {
3374template <
typename Derived>
3375bool RecursiveASTVisitor<Derived>::VisitOMPAtomicDefaultMemOrderClause(
3376 OMPAtomicDefaultMemOrderClause *) {
3380template <
typename Derived>
3381bool RecursiveASTVisitor<Derived>::VisitOMPAtClause(OMPAtClause *) {
3385template <
typename Derived>
3386bool RecursiveASTVisitor<Derived>::VisitOMPSeverityClause(OMPSeverityClause *) {
3390template <
typename Derived>
3391bool RecursiveASTVisitor<Derived>::VisitOMPMessageClause(OMPMessageClause *C) {
3392 TRY_TO(TraverseStmt(
C->getMessageString()));
3396template <
typename Derived>
3398RecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
3399 TRY_TO(VisitOMPClauseWithPreInit(C));
3400 TRY_TO(TraverseStmt(
C->getChunkSize()));
3404template <
typename Derived>
3405bool RecursiveASTVisitor<Derived>::VisitOMPOrderedClause(OMPOrderedClause *C) {
3406 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3410template <
typename Derived>
3411bool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause *) {
3415template <
typename Derived>
3416bool RecursiveASTVisitor<Derived>::VisitOMPUntiedClause(OMPUntiedClause *) {
3420template <
typename Derived>
3422RecursiveASTVisitor<Derived>::VisitOMPMergeableClause(OMPMergeableClause *) {
3426template <
typename Derived>
3427bool RecursiveASTVisitor<Derived>::VisitOMPReadClause(OMPReadClause *) {
3431template <
typename Derived>
3432bool RecursiveASTVisitor<Derived>::VisitOMPWriteClause(OMPWriteClause *) {
3436template <
typename Derived>
3437bool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
3441template <
typename Derived>
3442bool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
3446template <
typename Derived>
3447bool RecursiveASTVisitor<Derived>::VisitOMPCompareClause(OMPCompareClause *) {
3451template <
typename Derived>
3452bool RecursiveASTVisitor<Derived>::VisitOMPFailClause(OMPFailClause *) {
3456template <
typename Derived>
3457bool RecursiveASTVisitor<Derived>::VisitOMPSeqCstClause(OMPSeqCstClause *) {
3461template <
typename Derived>
3462bool RecursiveASTVisitor<Derived>::VisitOMPAcqRelClause(OMPAcqRelClause *) {
3466template <
typename Derived>
3467bool RecursiveASTVisitor<Derived>::VisitOMPAcquireClause(OMPAcquireClause *) {
3471template <
typename Derived>
3472bool RecursiveASTVisitor<Derived>::VisitOMPReleaseClause(OMPReleaseClause *) {
3476template <
typename Derived>
3477bool RecursiveASTVisitor<Derived>::VisitOMPRelaxedClause(OMPRelaxedClause *) {
3481template <
typename Derived>
3482bool RecursiveASTVisitor<Derived>::VisitOMPWeakClause(OMPWeakClause *) {
3486template <
typename Derived>
3487bool RecursiveASTVisitor<Derived>::VisitOMPThreadsClause(OMPThreadsClause *) {
3491template <
typename Derived>
3492bool RecursiveASTVisitor<Derived>::VisitOMPSIMDClause(OMPSIMDClause *) {
3496template <
typename Derived>
3497bool RecursiveASTVisitor<Derived>::VisitOMPNogroupClause(OMPNogroupClause *) {
3501template <
typename Derived>
3502bool RecursiveASTVisitor<Derived>::VisitOMPInitClause(OMPInitClause *C) {
3503 TRY_TO(VisitOMPClauseList(C));
3507template <
typename Derived>
3508bool RecursiveASTVisitor<Derived>::VisitOMPUseClause(OMPUseClause *C) {
3509 TRY_TO(TraverseStmt(
C->getInteropVar()));
3513template <
typename Derived>
3514bool RecursiveASTVisitor<Derived>::VisitOMPDestroyClause(OMPDestroyClause *C) {
3515 TRY_TO(TraverseStmt(
C->getInteropVar()));
3519template <
typename Derived>
3520bool RecursiveASTVisitor<Derived>::VisitOMPNovariantsClause(
3521 OMPNovariantsClause *C) {
3522 TRY_TO(VisitOMPClauseWithPreInit(C));
3523 TRY_TO(TraverseStmt(
C->getCondition()));
3527template <
typename Derived>
3528bool RecursiveASTVisitor<Derived>::VisitOMPNocontextClause(
3529 OMPNocontextClause *C) {
3530 TRY_TO(VisitOMPClauseWithPreInit(C));
3531 TRY_TO(TraverseStmt(
C->getCondition()));
3535template <
typename Derived>
3536template <
typename T>
3537bool RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *
Node) {
3538 for (
auto *E :
Node->varlists()) {
3544template <
typename Derived>
3545bool RecursiveASTVisitor<Derived>::VisitOMPInclusiveClause(
3546 OMPInclusiveClause *C) {
3547 TRY_TO(VisitOMPClauseList(C));
3551template <
typename Derived>
3552bool RecursiveASTVisitor<Derived>::VisitOMPExclusiveClause(
3553 OMPExclusiveClause *C) {
3554 TRY_TO(VisitOMPClauseList(C));
3558template <
typename Derived>
3559bool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
3560 TRY_TO(VisitOMPClauseList(C));
3561 for (
auto *E :
C->private_copies()) {
3567template <
typename Derived>
3568bool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
3569 OMPFirstprivateClause *C) {
3570 TRY_TO(VisitOMPClauseList(C));
3571 TRY_TO(VisitOMPClauseWithPreInit(C));
3572 for (
auto *E :
C->private_copies()) {
3575 for (
auto *E :
C->inits()) {
3581template <
typename Derived>
3582bool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
3583 OMPLastprivateClause *C) {
3584 TRY_TO(VisitOMPClauseList(C));
3585 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3586 for (
auto *E :
C->private_copies()) {
3589 for (
auto *E :
C->source_exprs()) {
3592 for (
auto *E :
C->destination_exprs()) {
3595 for (
auto *E :
C->assignment_ops()) {
3601template <
typename Derived>
3602bool RecursiveASTVisitor<Derived>::VisitOMPSharedClause(OMPSharedClause *C) {
3603 TRY_TO(VisitOMPClauseList(C));
3607template <
typename Derived>
3608bool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(OMPLinearClause *C) {
3609 TRY_TO(TraverseStmt(
C->getStep()));
3610 TRY_TO(TraverseStmt(
C->getCalcStep()));
3611 TRY_TO(VisitOMPClauseList(C));
3612 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3613 for (
auto *E :
C->privates()) {
3616 for (
auto *E :
C->inits()) {
3619 for (
auto *E :
C->updates()) {
3622 for (
auto *E :
C->finals()) {
3628template <
typename Derived>
3629bool RecursiveASTVisitor<Derived>::VisitOMPAlignedClause(OMPAlignedClause *C) {
3630 TRY_TO(TraverseStmt(
C->getAlignment()));
3631 TRY_TO(VisitOMPClauseList(C));
3635template <
typename Derived>
3636bool RecursiveASTVisitor<Derived>::VisitOMPCopyinClause(OMPCopyinClause *C) {
3637 TRY_TO(VisitOMPClauseList(C));
3638 for (
auto *E :
C->source_exprs()) {
3641 for (
auto *E :
C->destination_exprs()) {
3644 for (
auto *E :
C->assignment_ops()) {
3650template <
typename Derived>
3651bool RecursiveASTVisitor<Derived>::VisitOMPCopyprivateClause(
3652 OMPCopyprivateClause *C) {
3653 TRY_TO(VisitOMPClauseList(C));
3654 for (
auto *E :
C->source_exprs()) {
3657 for (
auto *E :
C->destination_exprs()) {
3660 for (
auto *E :
C->assignment_ops()) {
3666template <
typename Derived>
3668RecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
3669 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3670 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3671 TRY_TO(VisitOMPClauseList(C));
3672 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3673 for (
auto *E :
C->privates()) {
3676 for (
auto *E :
C->lhs_exprs()) {
3679 for (
auto *E :
C->rhs_exprs()) {
3682 for (
auto *E :
C->reduction_ops()) {
3685 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
3686 for (
auto *E :
C->copy_ops()) {
3689 for (
auto *E :
C->copy_array_temps()) {
3692 for (
auto *E :
C->copy_array_elems()) {
3699template <
typename Derived>
3700bool RecursiveASTVisitor<Derived>::VisitOMPTaskReductionClause(
3701 OMPTaskReductionClause *C) {
3702 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3703 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3704 TRY_TO(VisitOMPClauseList(C));
3705 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3706 for (
auto *E :
C->privates()) {
3709 for (
auto *E :
C->lhs_exprs()) {
3712 for (
auto *E :
C->rhs_exprs()) {
3715 for (
auto *E :
C->reduction_ops()) {
3721template <
typename Derived>
3722bool RecursiveASTVisitor<Derived>::VisitOMPInReductionClause(
3723 OMPInReductionClause *C) {
3724 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3725 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3726 TRY_TO(VisitOMPClauseList(C));
3727 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3728 for (
auto *E :
C->privates()) {
3731 for (
auto *E :
C->lhs_exprs()) {
3734 for (
auto *E :
C->rhs_exprs()) {
3737 for (
auto *E :
C->reduction_ops()) {
3740 for (
auto *E :
C->taskgroup_descriptors())
3745template <
typename Derived>
3746bool RecursiveASTVisitor<Derived>::VisitOMPFlushClause(OMPFlushClause *C) {
3747 TRY_TO(VisitOMPClauseList(C));
3751template <
typename Derived>
3752bool RecursiveASTVisitor<Derived>::VisitOMPDepobjClause(OMPDepobjClause *C) {
3753 TRY_TO(TraverseStmt(
C->getDepobj()));
3757template <
typename Derived>
3758bool RecursiveASTVisitor<Derived>::VisitOMPDependClause(OMPDependClause *C) {
3759 TRY_TO(VisitOMPClauseList(C));
3763template <
typename Derived>
3764bool RecursiveASTVisitor<Derived>::VisitOMPDeviceClause(OMPDeviceClause *C) {
3765 TRY_TO(VisitOMPClauseWithPreInit(C));
3766 TRY_TO(TraverseStmt(
C->getDevice()));
3770template <
typename Derived>
3771bool RecursiveASTVisitor<Derived>::VisitOMPMapClause(OMPMapClause *C) {
3772 TRY_TO(VisitOMPClauseList(C));
3776template <
typename Derived>
3777bool RecursiveASTVisitor<Derived>::VisitOMPNumTeamsClause(
3778 OMPNumTeamsClause *C) {
3779 TRY_TO(VisitOMPClauseWithPreInit(C));
3780 TRY_TO(TraverseStmt(
C->getNumTeams()));
3784template <
typename Derived>
3785bool RecursiveASTVisitor<Derived>::VisitOMPThreadLimitClause(
3786 OMPThreadLimitClause *C) {
3787 TRY_TO(VisitOMPClauseWithPreInit(C));
3788 TRY_TO(TraverseStmt(
C->getThreadLimit()));
3792template <
typename Derived>
3793bool RecursiveASTVisitor<Derived>::VisitOMPPriorityClause(
3794 OMPPriorityClause *C) {
3795 TRY_TO(VisitOMPClauseWithPreInit(C));
3796 TRY_TO(TraverseStmt(
C->getPriority()));
3800template <
typename Derived>
3801bool RecursiveASTVisitor<Derived>::VisitOMPGrainsizeClause(
3802 OMPGrainsizeClause *C) {
3803 TRY_TO(VisitOMPClauseWithPreInit(C));
3804 TRY_TO(TraverseStmt(
C->getGrainsize()));
3808template <
typename Derived>
3809bool RecursiveASTVisitor<Derived>::VisitOMPNumTasksClause(
3810 OMPNumTasksClause *C) {
3811 TRY_TO(VisitOMPClauseWithPreInit(C));
3812 TRY_TO(TraverseStmt(
C->getNumTasks()));
3816template <
typename Derived>
3817bool RecursiveASTVisitor<Derived>::VisitOMPHintClause(OMPHintClause *C) {
3818 TRY_TO(TraverseStmt(
C->getHint()));
3822template <
typename Derived>
3823bool RecursiveASTVisitor<Derived>::VisitOMPDistScheduleClause(
3824 OMPDistScheduleClause *C) {
3825 TRY_TO(VisitOMPClauseWithPreInit(C));
3826 TRY_TO(TraverseStmt(
C->getChunkSize()));
3830template <
typename Derived>
3832RecursiveASTVisitor<Derived>::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
3836template <
typename Derived>
3837bool RecursiveASTVisitor<Derived>::VisitOMPToClause(OMPToClause *C) {
3838 TRY_TO(VisitOMPClauseList(C));
3842template <
typename Derived>
3843bool RecursiveASTVisitor<Derived>::VisitOMPFromClause(OMPFromClause *C) {
3844 TRY_TO(VisitOMPClauseList(C));
3848template <
typename Derived>
3849bool RecursiveASTVisitor<Derived>::VisitOMPUseDevicePtrClause(
3850 OMPUseDevicePtrClause *C) {
3851 TRY_TO(VisitOMPClauseList(C));
3855template <
typename Derived>
3856bool RecursiveASTVisitor<Derived>::VisitOMPUseDeviceAddrClause(
3857 OMPUseDeviceAddrClause *C) {
3858 TRY_TO(VisitOMPClauseList(C));
3862template <
typename Derived>
3863bool RecursiveASTVisitor<Derived>::VisitOMPIsDevicePtrClause(
3864 OMPIsDevicePtrClause *C) {
3865 TRY_TO(VisitOMPClauseList(C));
3869template <
typename Derived>
3870bool RecursiveASTVisitor<Derived>::VisitOMPHasDeviceAddrClause(
3871 OMPHasDeviceAddrClause *C) {
3872 TRY_TO(VisitOMPClauseList(C));
3876template <
typename Derived>
3877bool RecursiveASTVisitor<Derived>::VisitOMPNontemporalClause(
3878 OMPNontemporalClause *C) {
3879 TRY_TO(VisitOMPClauseList(C));
3880 for (
auto *E :
C->private_refs()) {
3886template <
typename Derived>
3887bool RecursiveASTVisitor<Derived>::VisitOMPOrderClause(OMPOrderClause *) {
3891template <
typename Derived>
3892bool RecursiveASTVisitor<Derived>::VisitOMPDetachClause(OMPDetachClause *C) {
3893 TRY_TO(TraverseStmt(
C->getEventHandler()));
3897template <
typename Derived>
3898bool RecursiveASTVisitor<Derived>::VisitOMPUsesAllocatorsClause(
3899 OMPUsesAllocatorsClause *C) {
3900 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
3901 const OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
3908template <
typename Derived>
3909bool RecursiveASTVisitor<Derived>::VisitOMPAffinityClause(
3910 OMPAffinityClause *C) {
3911 TRY_TO(TraverseStmt(
C->getModifier()));
3912 for (Expr *E :
C->varlists())
3917template <
typename Derived>
3918bool RecursiveASTVisitor<Derived>::VisitOMPFilterClause(OMPFilterClause *C) {
3919 TRY_TO(VisitOMPClauseWithPreInit(C));
3920 TRY_TO(TraverseStmt(
C->getThreadID()));
3924template <
typename Derived>
3925bool RecursiveASTVisitor<Derived>::VisitOMPBindClause(OMPBindClause *C) {
3929template <
typename Derived>
3930bool RecursiveASTVisitor<Derived>::VisitOMPXDynCGroupMemClause(
3931 OMPXDynCGroupMemClause *C) {
3932 TRY_TO(VisitOMPClauseWithPreInit(C));
3933 TRY_TO(TraverseStmt(
C->getSize()));
3937template <
typename Derived>
3938bool RecursiveASTVisitor<Derived>::VisitOMPDoacrossClause(
3939 OMPDoacrossClause *C) {
3940 TRY_TO(VisitOMPClauseList(C));
3944template <
typename Derived>
3945bool RecursiveASTVisitor<Derived>::VisitOMPXAttributeClause(
3946 OMPXAttributeClause *C) {
3950template <
typename Derived>
3951bool RecursiveASTVisitor<Derived>::VisitOMPXBareClause(OMPXBareClause *C) {
3955template <
typename Derived>
3956bool RecursiveASTVisitor<Derived>::TraverseOpenACCConstructStmt(
3957 OpenACCConstructStmt *C) {
3958 TRY_TO(VisitOpenACCClauseList(
C->clauses()));
3962template <
typename Derived>
3963bool RecursiveASTVisitor<Derived>::TraverseOpenACCAssociatedStmtConstruct(
3964 OpenACCAssociatedStmtConstruct *S) {
3965 TRY_TO(TraverseOpenACCConstructStmt(S));
3966 TRY_TO(TraverseStmt(S->getAssociatedStmt()));
3970template <
typename Derived>
3971bool RecursiveASTVisitor<Derived>::VisitOpenACCClauseList(
3972 ArrayRef<const OpenACCClause *>) {
3979 {
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.