13#ifndef LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
14#define LLVM_CLANG_AST_RECURSIVEASTVISITOR_H
45#include "llvm/ADT/PointerIntPair.h"
46#include "llvm/ADT/SmallVector.h"
47#include "llvm/Support/Casting.h"
58#define TRY_TO(CALL_EXPR) \
60 if (!getDerived().CALL_EXPR) \
66template <
typename T,
typename U>
68template <
typename T,
typename U,
typename R,
typename...
P>
74template <
typename FirstMethodPtrTy,
typename SecondMethodPtrTy>
75LLVM_ATTRIBUTE_ALWAYS_INLINE LLVM_ATTRIBUTE_NODEBUG
auto
77 [[maybe_unused]] SecondMethodPtrTy SecondMethodPtr)
80 SecondMethodPtrTy>::value)
81 return FirstMethodPtr == SecondMethodPtr;
163 Derived &
getDerived() {
return *
static_cast<Derived *
>(
this); }
328#define ATTR_VISITOR_DECLS_ONLY
329#include "clang/AST/AttrVisitor.inc"
330#undef ATTR_VISITOR_DECLS_ONLY
342#define TRAVERSE_STMT_BASE(NAME, CLASS, VAR, QUEUE) \
343 (::clang::detail::has_same_member_pointer_type< \
344 decltype(&RecursiveASTVisitor::Traverse##NAME), \
345 decltype(&Derived::Traverse##NAME)>::value \
346 ? static_cast<std::conditional_t< \
347 ::clang::detail::has_same_member_pointer_type< \
348 decltype(&RecursiveASTVisitor::Traverse##NAME), \
349 decltype(&Derived::Traverse##NAME)>::value, \
350 Derived &, RecursiveASTVisitor &>>(*this) \
351 .Traverse##NAME(static_cast<CLASS *>(VAR), QUEUE) \
352 : getDerived().Traverse##NAME(static_cast<CLASS *>(VAR)))
357#define TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S) \
359 if (!TRAVERSE_STMT_BASE(Stmt, Stmt, S, Queue)) \
365#define ABSTRACT_STMT(STMT)
366#define STMT(CLASS, PARENT) \
367 bool Traverse##CLASS(CLASS *S, DataRecursionQueue *Queue = nullptr);
368#include "clang/AST/StmtNodes.inc"
374#define STMT(CLASS, PARENT) \
375 bool WalkUpFrom##CLASS(CLASS *S) { \
376 TRY_TO(WalkUpFrom##PARENT(S)); \
377 TRY_TO(Visit##CLASS(S)); \
380 bool Visit##CLASS(CLASS *S) { return true; }
381#include "clang/AST/StmtNodes.inc"
387#define ABSTRACT_TYPE(CLASS, BASE)
388#define TYPE(CLASS, BASE) bool Traverse##CLASS##Type(CLASS##Type *T);
389#include "clang/AST/TypeNodes.inc"
395#define TYPE(CLASS, BASE) \
396 bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \
397 TRY_TO(WalkUpFrom##BASE(T)); \
398 TRY_TO(Visit##CLASS##Type(T)); \
401 bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
402#include "clang/AST/TypeNodes.inc"
408#define ABSTRACT_TYPELOC(CLASS, BASE)
409#define TYPELOC(CLASS, BASE) bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL);
410#include "clang/AST/TypeLocNodes.def"
429#define TYPE(CLASS, BASE) \
430 bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
431 TRY_TO(WalkUpFrom##BASE##Loc(TL)); \
432 TRY_TO(Visit##CLASS##TypeLoc(TL)); \
435 bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
436#include "clang/AST/TypeNodes.inc"
441#define ABSTRACT_DECL(DECL)
442#define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
443#include "clang/AST/DeclNodes.inc"
449#define DECL(CLASS, BASE) \
450 bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \
451 TRY_TO(WalkUpFrom##BASE(D)); \
452 TRY_TO(Visit##CLASS##Decl(D)); \
455 bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
456#include "clang/AST/DeclNodes.inc"
460#define DEF_TRAVERSE_TMPL_INST(TMPLDECLKIND) \
461 bool TraverseTemplateInstantiations(TMPLDECLKIND##TemplateDecl *D);
465#undef DEF_TRAVERSE_TMPL_INST
481 template <
typename T>
482 bool TraverseDeclTemplateParameterLists(T *D);
494 bool TraverseVarHelper(
VarDecl *D);
498#define GEN_CLANG_CLAUSE_CLASS
499#define CLAUSE_CLASS(Enum, Str, Class) bool Visit##Class(Class *C);
500#include "llvm/Frontend/OpenMP/OMP.inc"
502 template <
typename T>
bool VisitOMPClauseList(T *
Node);
504 bool VisitOMPClauseWithPreInit(OMPClauseWithPreInit *
Node);
505 bool VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *
Node);
507 bool PostVisitStmt(Stmt *S);
510template <
typename Derived>
513 if (!getDerived().shouldVisitImplicitCode()) {
514 TRY_TO(TraverseConceptReference(
C->getConceptReference()));
517 if (
Expr *IDC =
C->getImmediatelyDeclaredConstraint()) {
518 TRY_TO(TraverseStmt(IDC));
524 TRY_TO(TraverseConceptReference(
C->getConceptReference()));
529template <
typename Derived>
534 return getDerived().TraverseConceptTypeRequirement(
535 cast<concepts::TypeRequirement>(R));
538 return getDerived().TraverseConceptExprRequirement(
539 cast<concepts::ExprRequirement>(R));
541 return getDerived().TraverseConceptNestedRequirement(
542 cast<concepts::NestedRequirement>(R));
544 llvm_unreachable(
"unexpected case");
547template <
typename Derived>
551 switch (S->getStmtClass()) {
554#define ABSTRACT_STMT(STMT)
555#define STMT(CLASS, PARENT) \
556 case Stmt::CLASS##Class: \
557 return TRAVERSE_STMT_BASE(CLASS, CLASS, S, Queue);
558#include "clang/AST/StmtNodes.inc"
566template <
typename Derived>
574template <
typename Derived>
580 if (RetReq.isTypeConstraint()) {
581 if (getDerived().shouldVisitImplicitCode()) {
582 TRY_TO(TraverseTemplateParameterListHelper(
583 RetReq.getTypeConstraintTemplateParameterList()));
586 TRY_TO(TraverseTypeConstraint(RetReq.getTypeConstraint()));
592template <
typename Derived>
600template <
typename Derived>
618 switch (S->getStmtClass()) {
621#define ABSTRACT_STMT(STMT)
622#define STMT(CLASS, PARENT) \
623 case Stmt::CLASS##Class: \
624 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
625 &Derived::Traverse##CLASS)) { \
626 TRY_TO(WalkUpFrom##CLASS(static_cast<CLASS *>(S))); \
629#define INITLISTEXPR(CLASS, PARENT) \
630 case Stmt::CLASS##Class: \
631 if (::clang::detail::isSameMethod(&RecursiveASTVisitor::Traverse##CLASS, \
632 &Derived::Traverse##CLASS)) { \
633 auto ILE = static_cast<CLASS *>(S); \
634 if (auto Syn = ILE->isSemanticForm() ? ILE->getSyntacticForm() : ILE) \
635 TRY_TO(WalkUpFrom##CLASS(Syn)); \
636 if (auto Sem = ILE->isSemanticForm() ? ILE : ILE->getSemanticForm()) \
637 TRY_TO(WalkUpFrom##CLASS(Sem)); \
640#include "clang/AST/StmtNodes.inc"
648template <
typename Derived>
655 Queue->push_back({S,
false});
660 LocalQueue.push_back({S,
false});
662 while (!LocalQueue.empty()) {
663 auto &CurrSAndVisited = LocalQueue.back();
664 Stmt *CurrS = CurrSAndVisited.getPointer();
665 bool Visited = CurrSAndVisited.getInt();
667 LocalQueue.pop_back();
668 TRY_TO(dataTraverseStmtPost(CurrS));
669 if (getDerived().shouldTraversePostOrder()) {
670 TRY_TO(PostVisitStmt(CurrS));
675 if (getDerived().dataTraverseStmtPre(CurrS)) {
676 CurrSAndVisited.setInt(
true);
677 size_t N = LocalQueue.size();
678 TRY_TO(dataTraverseNode(CurrS, &LocalQueue));
680 std::reverse(LocalQueue.begin() + N, LocalQueue.end());
682 LocalQueue.pop_back();
689template <
typename Derived>
695#define ABSTRACT_TYPE(CLASS, BASE)
696#define TYPE(CLASS, BASE) \
698 return getDerived().Traverse##CLASS##Type( \
699 static_cast<CLASS##Type *>(const_cast<Type *>(T.getTypePtr())));
700#include "clang/AST/TypeNodes.inc"
706template <
typename Derived>
712#define ABSTRACT_TYPELOC(CLASS, BASE)
713#define TYPELOC(CLASS, BASE) \
714 case TypeLoc::CLASS: \
715 return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
716#include "clang/AST/TypeLocNodes.def"
723#define VISITORCLASS RecursiveASTVisitor
724#include "clang/AST/AttrVisitor.inc"
727template <
typename Derived>
734 if (!getDerived().shouldVisitImplicitCode() && D->
isImplicit()) {
738 if (
auto *TTPD = dyn_cast<TemplateTypeParmDecl>(D))
739 return TraverseTemplateTypeParamDeclConstraints(TTPD);
744#define ABSTRACT_DECL(DECL)
745#define DECL(CLASS, BASE) \
747 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
750#include "clang/AST/DeclNodes.inc"
755template <
typename Derived>
780template <
typename Derived>
787 TRY_TO(TraverseNestedNameSpecifierLoc(Prefix));
806template <
typename Derived>
814 TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc()));
818 TRY_TO(TraverseTemplateName(
835template <
typename Derived>
838 TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
840 TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
845template <
typename Derived>
856 return getDerived().TraverseType(Arg.
getAsType());
860 return getDerived().TraverseTemplateName(
864 return getDerived().TraverseStmt(Arg.
getAsExpr());
867 return getDerived().TraverseTemplateArguments(Arg.
pack_elements());
875template <
typename Derived>
890 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
892 return getDerived().TraverseType(Arg.
getAsType());
898 TRY_TO(getDerived().TraverseNestedNameSpecifierLoc(
900 return getDerived().TraverseTemplateName(
907 return getDerived().TraverseTemplateArguments(Arg.
pack_elements());
913template <
typename Derived>
917 TRY_TO(TraverseTemplateArgument(Arg));
922template <
typename Derived>
926 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
928 if (Init->isWritten() || getDerived().shouldVisitImplicitCode())
929 TRY_TO(TraverseStmt(Init->getInit()));
934template <
typename Derived>
939 if (LE->isInitCapture(
C))
940 TRY_TO(TraverseDecl(
C->getCapturedVar()));
942 TRY_TO(TraverseStmt(Init));
949#define DEF_TRAVERSE_TYPE(TYPE, CODE) \
950 template <typename Derived> \
951 bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) { \
952 if (!getDerived().shouldTraversePostOrder()) \
953 TRY_TO(WalkUpFrom##TYPE(T)); \
955 if (getDerived().shouldTraversePostOrder()) \
956 TRY_TO(WalkUpFrom##TYPE(T)); \
967 {
TRY_TO(TraverseType(T->getPointeeType())); })
970 {
TRY_TO(TraverseType(T->getPointeeType())); })
973 {
TRY_TO(TraverseType(T->getPointeeType())); })
976 TRY_TO(TraverseType(QualType(T->getClass(), 0)));
977 TRY_TO(TraverseType(T->getPointeeType()));
985 TRY_TO(TraverseType(T->getElementType()));
986 if (T->getSizeExpr())
987 TRY_TO(TraverseStmt(
const_cast<Expr*
>(T->getSizeExpr())));
991 {
TRY_TO(TraverseType(T->getElementType())); })
994 TRY_TO(TraverseType(T->getElementType()));
995 TRY_TO(TraverseStmt(T->getSizeExpr()));
999 TRY_TO(TraverseType(T->getElementType()));
1000 if (T->getSizeExpr())
1001 TRY_TO(TraverseStmt(T->getSizeExpr()));
1005 TRY_TO(TraverseStmt(T->getAddrSpaceExpr()));
1006 TRY_TO(TraverseType(T->getPointeeType()));
1010 if (T->getSizeExpr())
1011 TRY_TO(TraverseStmt(T->getSizeExpr()));
1016 if (T->getSizeExpr())
1017 TRY_TO(TraverseStmt(T->getSizeExpr()));
1018 TRY_TO(TraverseType(T->getElementType()));
1026 {
TRY_TO(TraverseType(T->getElementType())); })
1029 if (T->getRowExpr())
1030 TRY_TO(TraverseStmt(T->getRowExpr()));
1031 if (T->getColumnExpr())
1032 TRY_TO(TraverseStmt(T->getColumnExpr()));
1033 TRY_TO(TraverseType(T->getElementType()));
1037 {
TRY_TO(TraverseType(T->getReturnType())); })
1040 TRY_TO(TraverseType(T->getReturnType()));
1042 for (
const auto &A : T->param_types()) {
1046 for (
const auto &E : T->exceptions()) {
1050 if (
Expr *NE = T->getNoexceptExpr())
1051 TRY_TO(TraverseStmt(NE));
1059 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
1064 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
1067 TRY_TO(TraverseType(T->getBaseType()));
1068 TRY_TO(TraverseType(T->getUnderlyingType()));
1072 TRY_TO(TraverseType(T->getDeducedType()));
1073 if (T->isConstrained()) {
1074 TRY_TO(TraverseTemplateArguments(T->getTypeConstraintArguments()));
1078 TRY_TO(TraverseTemplateName(T->getTemplateName()));
1079 TRY_TO(TraverseType(T->getDeducedType()));
1086 TRY_TO(TraverseType(T->getReplacementType()));
1089 TRY_TO(TraverseTemplateArgument(T->getArgumentPack()));
1093 TRY_TO(TraverseTemplateName(T->getTemplateName()));
1094 TRY_TO(TraverseTemplateArguments(T->template_arguments()));
1100 {
TRY_TO(TraverseType(T->getModifiedType())); })
1103 {
TRY_TO(TraverseType(T->getWrappedType())); })
1108 {
TRY_TO(TraverseType(T->getUnderlyingType())); })
1111 if (T->getQualifier()) {
1112 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1114 TRY_TO(TraverseType(T->getNamedType()));
1118 {
TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); })
1121 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
1122 TRY_TO(TraverseTemplateArguments(T->template_arguments()));
1134 if (T->getBaseType().getTypePtr() != T)
1135 TRY_TO(TraverseType(T->getBaseType()));
1136 for (
auto typeArg : T->getTypeArgsAsWritten()) {
1137 TRY_TO(TraverseType(typeArg));
1142 {
TRY_TO(TraverseType(T->getPointeeType())); })
1150 {
TRY_TO(TraverseStmt(T->getNumBitsExpr())); })
1162 template <
typename Derived> \
1163 bool RecursiveASTVisitor<Derived>::Traverse##
TYPE##Loc(
TYPE##Loc TL) { \
1164 if (!getDerived().shouldTraversePostOrder()) { \
1165 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1166 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1167 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1170 if (getDerived().shouldTraversePostOrder()) { \
1171 TRY_TO(WalkUpFrom##
TYPE##Loc(TL)); \
1172 if (getDerived().shouldWalkTypesOfTypeLocs()) \
1173 TRY_TO(WalkUpFrom##
TYPE(
const_cast<TYPE *
>(TL.getTypePtr()))); \
1178template <
typename Derived>
1180RecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc(QualifiedTypeLoc TL) {
1196 return TraverseTypeLoc(TL.getUnqualifiedLoc());
1203 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1207 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1210 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1213 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1216 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1221 if (
auto *TSI = TL.getClassTInfo())
1222 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1229 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1232 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1234template <typename Derived>
1235bool RecursiveASTVisitor<Derived>::TraverseArrayTypeLocHelper(ArrayTypeLoc TL) {
1237 TRY_TO(TraverseStmt(TL.getSizeExpr()));
1242 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1243 TRY_TO(TraverseArrayTypeLocHelper(TL));
1247 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1252 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1253 TRY_TO(TraverseArrayTypeLocHelper(TL));
1257 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1258 TRY_TO(TraverseArrayTypeLocHelper(TL));
1262 TRY_TO(TraverseStmt(TL.getTypePtr()->getAddrSpaceExpr()));
1263 TRY_TO(TraverseType(TL.getTypePtr()->getPointeeType()));
1269 if (TL.getTypePtr()->getSizeExpr())
1270 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1271 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1276 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1280 if (TL.getTypePtr()->getSizeExpr())
1281 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1282 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1288 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1292 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1293 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1294 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1298 TRY_TO(TraverseStmt(TL.getAttrRowOperand()));
1299 TRY_TO(TraverseStmt(TL.getAttrColumnOperand()));
1300 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1304 {
TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1308 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1312 for (
unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
1313 if (TL.getParam(I)) {
1314 TRY_TO(TraverseDecl(TL.getParam(I)));
1315 }
else if (I < T->getNumParams()) {
1325 TRY_TO(TraverseStmt(NE));
1333 {
TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1336 TRY_TO(TraverseTypeLoc(TL.getUnmodifiedTInfo()->getTypeLoc()));
1341 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
1345 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1349 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1350 if (TL.isConstrained()) {
1351 TRY_TO(TraverseConceptReference(TL.getConceptReference()));
1356 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1357 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1364 TRY_TO(TraverseType(TL.getTypePtr()->getReplacementType()));
1367 TRY_TO(TraverseTemplateArgument(TL.getTypePtr()->getArgumentPack()));
1372 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1373 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1374 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1383 {
TRY_TO(TraverseTypeLoc(TL.getInnerLoc())); })
1386 {
TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1389 {
TRY_TO(TraverseTypeLoc(TL.getWrappedLoc())); })
1392 if (TL.getQualifierLoc()) {
1393 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1395 TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc()));
1399 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1403 if (TL.getQualifierLoc()) {
1404 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1407 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1408 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1413 {
TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1416 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1418 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1427 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
1428 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
1429 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
1430 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
1431 for (
unsigned I = 0, N = TL.getNumProtocols(); I != N; ++I) {
1433 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1438 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1446 TRY_TO(TraverseStmt(TL.getTypePtr()->getNumBitsExpr()));
1458template <typename Derived>
1460 const Decl *Child) {
1463 if (isa<BlockDecl>(Child) || isa<CapturedDecl>(Child))
1466 if (
const CXXRecordDecl* Cls = dyn_cast<CXXRecordDecl>(Child))
1467 return Cls->isLambda();
1471template <
typename Derived>
1476 for (
auto *Child : DC->
decls()) {
1477 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1478 TRY_TO(TraverseDecl(Child));
1485#define DEF_TRAVERSE_DECL(DECL, CODE) \
1486 template <typename Derived> \
1487 bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
1488 bool ShouldVisitChildren = true; \
1489 bool ReturnValue = true; \
1490 if (!getDerived().shouldTraversePostOrder()) \
1491 TRY_TO(WalkUpFrom##DECL(D)); \
1493 if (ReturnValue && ShouldVisitChildren) \
1494 TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
1495 if (ReturnValue) { \
1497 for (auto *I : D->attrs()) \
1498 TRY_TO(getDerived().TraverseAttr(I)); \
1500 if (ReturnValue && getDerived().shouldTraversePostOrder()) \
1501 TRY_TO(WalkUpFrom##DECL(D)); \
1502 return ReturnValue; \
1509 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
1510 TRY_TO(TraverseStmt(D->getBody()));
1511 for (
const auto &I : D->captures()) {
1512 if (I.hasCopyExpr()) {
1513 TRY_TO(TraverseStmt(I.getCopyExpr()));
1520 TRY_TO(TraverseStmt(D->getBody()));
1529 TRY_TO(TraverseStmt(D->getTemporaryExpr()));
1533 {
TRY_TO(TraverseStmt(D->getAsmString())); })
1541 if (D->getFriendType()) {
1542 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1545 if (
auto *ET = D->getFriendType()->getType()->getAs<ElaboratedType>())
1546 TRY_TO(TraverseDecl(ET->getOwnedTagDecl()));
1548 TRY_TO(TraverseDecl(D->getFriendDecl()));
1553 if (D->getFriendType())
1554 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1556 TRY_TO(TraverseDecl(D->getFriendDecl()));
1557 for (
unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
1558 TemplateParameterList *TPL = D->getTemplateParameterList(I);
1559 for (TemplateParameterList::iterator ITPL = TPL->begin(), ETPL = TPL->end();
1560 ITPL != ETPL; ++ITPL) {
1561 TRY_TO(TraverseDecl(*ITPL));
1567 TRY_TO(TraverseDecl(D->getSpecialization()));
1569 if (D->hasExplicitTemplateArgs()) {
1570 TRY_TO(TraverseTemplateArgumentLocsHelper(
1571 D->getTemplateArgsAsWritten()->getTemplateArgs(),
1572 D->getTemplateArgsAsWritten()->NumTemplateArgs));
1584 TRY_TO(TraverseStmt(D->getAssertExpr()));
1585 TRY_TO(TraverseStmt(D->getMessage()));
1595 auto Scope = D->getASTContext().getTraversalScope();
1596 bool HasLimitedScope =
1597 Scope.size() != 1 || !isa<TranslationUnitDecl>(Scope.front());
1598 if (HasLimitedScope) {
1600 for (
auto *Child : Scope) {
1601 if (!canIgnoreChildDeclWhileTraversingDeclContext(Child))
1602 TRY_TO(TraverseDecl(Child));
1614 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1635 if (ObjCTypeParamList *typeParamList = D->getTypeParamList()) {
1636 for (
auto typeParam : *typeParamList) {
1637 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1640 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1641 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1642 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1653 if (ObjCTypeParamList *typeParamList = D->getTypeParamListAsWritten()) {
1654 for (
auto typeParam : *typeParamList) {
1655 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1659 if (TypeSourceInfo *superTInfo = D->getSuperClassTInfo()) {
1660 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
1662 if (D->isThisDeclarationADefinition()) {
1663 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1664 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1665 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1671 if (D->isThisDeclarationADefinition()) {
1672 for (
auto It : llvm::zip(D->protocols(), D->protocol_locs())) {
1673 ObjCProtocolLoc ProtocolLoc(std::get<0>(It), std::get<1>(It));
1674 TRY_TO(TraverseObjCProtocolLoc(ProtocolLoc));
1680 if (D->getReturnTypeSourceInfo()) {
1681 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1683 for (ParmVarDecl *Parameter : D->parameters()) {
1684 TRY_TO(TraverseDecl(Parameter));
1686 if (D->isThisDeclarationADefinition()) {
1687 TRY_TO(TraverseStmt(D->getBody()));
1693 if (D->hasExplicitBound()) {
1694 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1702 if (D->getTypeSourceInfo())
1703 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1705 TRY_TO(TraverseType(D->getType()));
1710 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1711 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1715 {
TRY_TO(TraverseTypeLoc(D->getEnumTypeLoc())); })
1720 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1728 for (
auto *I : D->varlists()) {
1734 for (
auto *C : D->clauselists()) {
1735 TRY_TO(TraverseOMPClause(C));
1740 TRY_TO(TraverseStmt(D->getCombiner()));
1741 if (
auto *Initializer = D->getInitializer())
1742 TRY_TO(TraverseStmt(Initializer));
1743 TRY_TO(TraverseType(D->getType()));
1748 for (
auto *C : D->clauselists())
1749 TRY_TO(TraverseOMPClause(C));
1750 TRY_TO(TraverseType(D->getType()));
1757 for (
auto *I : D->varlists())
1759 for (
auto *C : D->clauselists())
1760 TRY_TO(TraverseOMPClause(C));
1764template <typename Derived>
1765bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1766 TemplateParameterList *TPL) {
1768 for (NamedDecl *D : *TPL) {
1771 if (Expr *RequiresClause = TPL->getRequiresClause()) {
1772 TRY_TO(TraverseStmt(RequiresClause));
1778template <
typename Derived>
1779template <
typename T>
1780bool RecursiveASTVisitor<Derived>::TraverseDeclTemplateParameterLists(T *D) {
1781 for (
unsigned i = 0; i < D->getNumTemplateParameterLists(); i++) {
1782 TemplateParameterList *TPL = D->getTemplateParameterList(i);
1783 TraverseTemplateParameterListHelper(TPL);
1788template <
typename Derived>
1789bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1790 ClassTemplateDecl *D) {
1791 for (
auto *SD : D->specializations()) {
1792 for (
auto *RD : SD->redecls()) {
1793 assert(!cast<CXXRecordDecl>(RD)->isInjectedClassName());
1795 cast<ClassTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1799 TRY_TO(TraverseDecl(RD));
1816template <
typename Derived>
1817bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1818 VarTemplateDecl *D) {
1819 for (
auto *SD : D->specializations()) {
1820 for (
auto *RD : SD->redecls()) {
1822 cast<VarTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1825 TRY_TO(TraverseDecl(RD));
1841template <
typename Derived>
1842bool RecursiveASTVisitor<Derived>::TraverseTemplateInstantiations(
1843 FunctionTemplateDecl *D) {
1844 for (
auto *FD : D->specializations()) {
1845 for (
auto *RD : FD->redecls()) {
1846 switch (RD->getTemplateSpecializationKind()) {
1850 TRY_TO(TraverseDecl(RD));
1857 TRY_TO(TraverseDecl(RD));
1871#define DEF_TRAVERSE_TMPL_DECL(TMPLDECLKIND) \
1872 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateDecl, { \
1873 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
1874 TRY_TO(TraverseDecl(D->getTemplatedDecl())); \
1882 if (getDerived().shouldVisitTemplateInstantiations() && \
1883 D == D->getCanonicalDecl()) \
1884 TRY_TO(TraverseTemplateInstantiations(D)); \
1898 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1899 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1900 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
1901 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1905 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1908template <typename Derived>
1909bool RecursiveASTVisitor<Derived>::TraverseTemplateTypeParamDeclConstraints(
1910 const TemplateTypeParmDecl *D) {
1911 if (
const auto *TC = D->getTypeConstraint())
1912 TRY_TO(TraverseTypeConstraint(TC));
1918 if (D->getTypeForDecl())
1919 TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1920 TRY_TO(TraverseTemplateTypeParamDeclConstraints(D));
1921 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
1922 TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
1926 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1933 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1940 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1941 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1945 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1946 TRY_TO(TraverseStmt(D->getConstraintExpr()));
1952 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1961 TRY_TO(TraverseDeclTemplateParameterLists(D));
1963 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1964 if (
auto *TSI = D->getIntegerTypeSourceInfo())
1965 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1971template <typename Derived>
1972bool RecursiveASTVisitor<Derived>::TraverseRecordHelper(RecordDecl *D) {
1976 TRY_TO(TraverseDeclTemplateParameterLists(D));
1977 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1981template <
typename Derived>
1982bool RecursiveASTVisitor<Derived>::TraverseCXXBaseSpecifier(
1983 const CXXBaseSpecifier &
Base) {
1984 TRY_TO(TraverseTypeLoc(
Base.getTypeSourceInfo()->getTypeLoc()));
1988template <
typename Derived>
1989bool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(CXXRecordDecl *D) {
1990 if (!TraverseRecordHelper(D))
1992 if (D->isCompleteDefinition()) {
1993 for (
const auto &I : D->bases()) {
1994 TRY_TO(TraverseCXXBaseSpecifier(I));
2007 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplateSpecializationDecl, { \
2016 if (TypeSourceInfo *TSI = D->getTypeAsWritten()) \
2017 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc())); \
2019 if (getDerived().shouldVisitTemplateInstantiations() || \
2020 D->getTemplateSpecializationKind() == TSK_ExplicitSpecialization) { \
2022 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2024 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc())); \
2037template <
typename Derived>
2038bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
2039 const TemplateArgumentLoc *TAL,
unsigned Count) {
2040 for (
unsigned I = 0; I < Count; ++I) {
2041 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
2046#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
2047 DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
2049 if (TemplateParameterList *TPL = D->getTemplateParameters()) { \
2050 for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end(); \
2052 TRY_TO(TraverseDecl(*I)); \
2056 TRY_TO(TraverseTemplateArgumentLocsHelper( \
2057 D->getTemplateArgsAsWritten()->getTemplateArgs(), \
2058 D->getTemplateArgsAsWritten()->NumTemplateArgs)); \
2063 TRY_TO(Traverse##DECLKIND##Helper(D)); \
2076 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2077 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2082template <typename Derived>
2083bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) {
2084 TRY_TO(TraverseDeclTemplateParameterLists(D));
2085 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2086 if (D->getTypeSourceInfo())
2087 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
2089 TRY_TO(TraverseType(D->getType()));
2094 TRY_TO(TraverseVarHelper(D));
2095 for (
auto *Binding : D->bindings()) {
2096 TRY_TO(TraverseDecl(Binding));
2101 if (getDerived().shouldVisitImplicitCode())
2102 TRY_TO(TraverseStmt(D->getBinding()));
2113 TRY_TO(TraverseDeclaratorHelper(D));
2114 if (D->isBitField())
2115 TRY_TO(TraverseStmt(D->getBitWidth()));
2116 else if (D->hasInClassInitializer())
2117 TRY_TO(TraverseStmt(D->getInClassInitializer()));
2121 TRY_TO(TraverseDeclaratorHelper(D));
2122 if (D->isBitField())
2123 TRY_TO(TraverseStmt(D->getBitWidth()));
2128 TRY_TO(TraverseDeclaratorHelper(D));
2129 if (D->isBitField())
2130 TRY_TO(TraverseStmt(D->getBitWidth()));
2134template <typename Derived>
2135bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
2136 TRY_TO(TraverseDeclTemplateParameterLists(D));
2137 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
2138 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
2145 if (
const FunctionTemplateSpecializationInfo *FTSI =
2146 D->getTemplateSpecializationInfo()) {
2147 if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared &&
2148 FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) {
2151 if (
const ASTTemplateArgumentListInfo *TALI =
2152 FTSI->TemplateArgumentsAsWritten) {
2153 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
2154 TALI->NumTemplateArgs));
2163 if (TypeSourceInfo *TSI = D->getTypeSourceInfo()) {
2164 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2165 }
else if (getDerived().shouldVisitImplicitCode()) {
2170 for (ParmVarDecl *Parameter : D->parameters()) {
2171 TRY_TO(TraverseDecl(Parameter));
2176 if (Expr *TrailingRequiresClause = D->getTrailingRequiresClause()) {
2177 TRY_TO(TraverseStmt(TrailingRequiresClause));
2180 if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
2182 for (
auto *I : Ctor->inits()) {
2183 if (I->isWritten() || getDerived().shouldVisitImplicitCode())
2184 TRY_TO(TraverseConstructorInitializer(I));
2189 D->isThisDeclarationADefinition() &&
2192 (!D->isDefaulted() || getDerived().shouldVisitImplicitCode());
2194 if (
const auto *MD = dyn_cast<CXXMethodDecl>(D)) {
2195 if (
const CXXRecordDecl *RD = MD->getParent()) {
2196 if (RD->isLambda() &&
2198 VisitBody = VisitBody && getDerived().shouldVisitLambdaBody();
2204 TRY_TO(TraverseStmt(D->getBody()));
2207 for (
auto *Child : D->decls()) {
2208 if (isa<UsingShadowDecl>(Child))
2209 TRY_TO(TraverseDecl(Child));
2259template <typename Derived>
2260bool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) {
2261 TRY_TO(TraverseDeclaratorHelper(D));
2263 if (!isa<ParmVarDecl>(D) &&
2264 (!D->isCXXForRangeDecl() || getDerived().shouldVisitImplicitCode()))
2265 TRY_TO(TraverseStmt(D->getInit()));
2275 TRY_TO(TraverseDeclaratorHelper(D));
2276 if (D->hasDefaultArgument() && !D->defaultArgumentWasInherited())
2277 TRY_TO(TraverseStmt(D->getDefaultArgument()));
2281 TRY_TO(TraverseVarHelper(D));
2283 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
2284 !D->hasUnparsedDefaultArg())
2285 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
2287 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
2288 !D->hasUnparsedDefaultArg())
2289 TRY_TO(TraverseStmt(D->getDefaultArg()));
2295 TRY_TO(TraverseTemplateArguments(D->getTemplateArguments()));
2311 template <
typename Derived> \
2312 bool RecursiveASTVisitor<Derived>::Traverse##
STMT( \
2313 STMT *S, DataRecursionQueue *Queue) { \
2316 if (!getDerived().shouldTraversePostOrder()) \
2317 TRY_TO(WalkUpFrom##
STMT(S)); \
2319 if (ShouldVisitChildren) { \
2320 for (Stmt * SubStmt : getDerived().getStmtChildren(S)) { \
2321 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(SubStmt); \
2328 if (!Queue && ReturnValue && getDerived().shouldTraversePostOrder()) { \
2329 TRY_TO(WalkUpFrom##
STMT(S)); \
2336 for (
unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
2339 for (
unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
2342 for (
unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
2355 TRY_TO(TraverseDecl(S->getExceptionDecl()));
2360 for (
auto *I : S->decls()) {
2396 if (!getDerived().shouldVisitImplicitCode()) {
2408 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2409 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2419 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2420 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2421 if (S->hasExplicitTemplateArgs()) {
2422 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2423 S->getNumTemplateArgs()));
2428 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2429 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2430 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2431 S->getNumTemplateArgs()));
2435 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2436 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
2437 if (S->hasExplicitTemplateArgs()) {
2438 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2439 S->getNumTemplateArgs()));
2444 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2445 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
2446 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2447 S->getNumTemplateArgs()));
2457 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2461 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2465 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2469 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2473 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2477 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2481 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2485 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2488template <typename Derived>
2489bool RecursiveASTVisitor<Derived>::TraverseSynOrSemInitListExpr(
2490 InitListExpr *S, DataRecursionQueue *Queue) {
2494 if (!getDerived().shouldTraversePostOrder())
2495 TRY_TO(WalkUpFromInitListExpr(S));
2498 for (Stmt *SubStmt : S->children()) {
2502 if (!Queue && getDerived().shouldTraversePostOrder())
2503 TRY_TO(WalkUpFromInitListExpr(S));
2508template <
typename Derived>
2509bool RecursiveASTVisitor<Derived>::TraverseObjCProtocolLoc(
2510 ObjCProtocolLoc ProtocolLoc) {
2514template <
typename Derived>
2515bool RecursiveASTVisitor<Derived>::TraverseConceptReference(
2516 ConceptReference *CR) {
2517 if (!getDerived().shouldTraversePostOrder())
2518 TRY_TO(VisitConceptReference(CR));
2519 TRY_TO(TraverseNestedNameSpecifierLoc(CR->getNestedNameSpecifierLoc()));
2520 TRY_TO(TraverseDeclarationNameInfo(CR->getConceptNameInfo()));
2521 if (CR->hasExplicitTemplateArgs())
2522 TRY_TO(TraverseTemplateArgumentLocsHelper(
2523 CR->getTemplateArgsAsWritten()->getTemplateArgs(),
2524 CR->getTemplateArgsAsWritten()->NumTemplateArgs));
2525 if (getDerived().shouldTraversePostOrder())
2526 TRY_TO(VisitConceptReference(CR));
2538template <
typename Derived>
2539bool RecursiveASTVisitor<Derived>::TraverseInitListExpr(
2540 InitListExpr *S, DataRecursionQueue *Queue) {
2541 if (S->isSemanticForm() && S->isSyntacticForm()) {
2543 TRY_TO(TraverseSynOrSemInitListExpr(S, Queue));
2546 TRY_TO(TraverseSynOrSemInitListExpr(
2547 S->isSemanticForm() ? S->getSyntacticForm() : S, Queue));
2548 if (getDerived().shouldVisitImplicitCode()) {
2551 TRY_TO(TraverseSynOrSemInitListExpr(
2552 S->isSemanticForm() ? S : S->getSemanticForm(), Queue));
2561 if (S->isExprPredicate())
2562 TRY_TO(TraverseStmt(S->getControllingExpr()));
2564 TRY_TO(TraverseTypeLoc(S->getControllingType()->getTypeLoc()));
2566 for (
const GenericSelectionExpr::Association Assoc : S->associations()) {
2567 if (TypeSourceInfo *TSI = Assoc.getTypeSourceInfo())
2568 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
2569 TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(Assoc.getAssociationExpr());
2571 ShouldVisitChildren =
false;
2578 for (PseudoObjectExpr::semantics_iterator i = S->semantics_begin(),
2579 e = S->semantics_end();
2582 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub))
2583 sub = OVE->getSourceExpr();
2592 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2597 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
2605 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2611 if (S->isArgumentType())
2612 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
2618 if (S->isTypeOperand())
2619 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2623 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2631 if (S->isTypeOperand())
2632 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2636 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2637 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2641 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
2649 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
2654 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2660 for (
unsigned I = 0, N = S->capture_size(); I != N; ++I) {
2661 const LambdaCapture *
C = S->capture_begin() + I;
2662 if (
C->isExplicit() || getDerived().shouldVisitImplicitCode()) {
2663 TRY_TO(TraverseLambdaCapture(S, C, S->capture_init_begin()[I]));
2667 if (getDerived().shouldVisitImplicitCode()) {
2669 TRY_TO(TraverseDecl(S->getLambdaClass()));
2672 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2673 FunctionProtoTypeLoc Proto = TL.getAsAdjusted<FunctionProtoTypeLoc>();
2675 TRY_TO(TraverseTemplateParameterListHelper(S->getTemplateParameterList()));
2676 if (S->hasExplicitParameters()) {
2678 for (
unsigned I = 0, N = Proto.getNumParams(); I != N; ++I)
2679 TRY_TO(TraverseDecl(Proto.getParam(I)));
2682 auto *T = Proto.getTypePtr();
2683 for (
const auto &E : T->exceptions())
2686 if (Expr *NE = T->getNoexceptExpr())
2689 if (S->hasExplicitResultType())
2690 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2700 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2719 TRY_TO(TraverseDecl(S->getBlockDecl()));
2725 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2731 if (getDerived().shouldVisitImplicitCode())
2732 TRY_TO(TraverseStmt(S->getExpr()));
2736 if (getDerived().shouldVisitImplicitCode())
2737 TRY_TO(TraverseStmt(S->getExpr()));
2747 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2748 if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())
2749 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2750 if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2751 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
2766 if (OpaqueValueExpr *OVE = S->getCommonExpr())
2773 if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())
2774 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2781 if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())
2782 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2786 if (S->isClassReceiver()) {
2787 ObjCInterfaceDecl *IDecl = S->getClassReceiver();
2788 QualType
Type = IDecl->getASTContext().getObjCInterfaceType(IDecl);
2789 ObjCInterfaceLocInfo
Data;
2790 Data.NameLoc = S->getReceiverLocation();
2801 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2808 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2817 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2818 if (S->hasExplicitTemplateArgs()) {
2819 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2820 S->getNumTemplateArgs()));
2825 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2826 if (S->hasExplicitTemplateArgs()) {
2827 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2828 S->getNumTemplateArgs()));
2840 if (!getDerived().shouldVisitImplicitCode()) {
2841 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
2842 S->getDecomposedForm();
2843 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.LHS)));
2844 TRY_TO(TraverseStmt(
const_cast<Expr*
>(Decomposed.RHS)));
2871 if (S->getLifetimeExtendedTemporaryDecl()) {
2872 TRY_TO(TraverseLifetimeExtendedTemporaryDecl(
2873 S->getLifetimeExtendedTemporaryDecl()));
2881 if (!getDerived().shouldVisitImplicitCode()) {
2887 if (!getDerived().shouldVisitImplicitCode()) {
2893 if (!getDerived().shouldVisitImplicitCode()) {
2899 if (!getDerived().shouldVisitImplicitCode()) {
2905 if (!getDerived().shouldVisitImplicitCode()) {
2912 TRY_TO(TraverseConceptReference(S->getConceptReference()));
2916 TRY_TO(TraverseDecl(S->getBody()));
2917 for (ParmVarDecl *Parm : S->getLocalParameters())
2918 TRY_TO(TraverseDecl(Parm));
2919 for (concepts::Requirement *Req : S->getRequirements())
2920 TRY_TO(TraverseConceptRequirement(Req));
2939template <typename Derived>
2940bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
2941 OMPExecutableDirective *S) {
2942 for (
auto *C : S->clauses()) {
2943 TRY_TO(TraverseOMPClause(C));
2949 if (!getDerived().shouldVisitImplicitCode()) {
2951 TRY_TO(TraverseStmt(S->getLoopStmt()));
2956template <typename Derived>
2958RecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
2959 return TraverseOMPExecutableDirective(S);
2963 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2966 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2969 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2972 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2975 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2978 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2981 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2984 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2987 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2990 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2993 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2996 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2999 TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
3000 TRY_TO(TraverseOMPExecutableDirective(S));
3004 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
3007 {
TRY_TO(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(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)); })
3181template <typename Derived>
3182bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *C) {
3185 switch (
C->getClauseKind()) {
3186#define GEN_CLANG_CLAUSE_CLASS
3187#define CLAUSE_CLASS(Enum, Str, Class) \
3188 case llvm::omp::Clause::Enum: \
3189 TRY_TO(Visit##Class(static_cast<Class *>(C))); \
3191#define CLAUSE_NO_CLASS(Enum, Str) \
3192 case llvm::omp::Clause::Enum: \
3194#include "llvm/Frontend/OpenMP/OMP.inc"
3199template <
typename Derived>
3200bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPreInit(
3201 OMPClauseWithPreInit *
Node) {
3202 TRY_TO(TraverseStmt(
Node->getPreInitStmt()));
3206template <
typename Derived>
3207bool RecursiveASTVisitor<Derived>::VisitOMPClauseWithPostUpdate(
3208 OMPClauseWithPostUpdate *
Node) {
3210 TRY_TO(TraverseStmt(
Node->getPostUpdateExpr()));
3214template <
typename Derived>
3215bool RecursiveASTVisitor<Derived>::VisitOMPAllocatorClause(
3216 OMPAllocatorClause *C) {
3217 TRY_TO(TraverseStmt(
C->getAllocator()));
3221template <
typename Derived>
3222bool RecursiveASTVisitor<Derived>::VisitOMPAllocateClause(OMPAllocateClause *C) {
3223 TRY_TO(TraverseStmt(
C->getAllocator()));
3224 TRY_TO(VisitOMPClauseList(C));
3228template <
typename Derived>
3229bool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
3230 TRY_TO(VisitOMPClauseWithPreInit(C));
3231 TRY_TO(TraverseStmt(
C->getCondition()));
3235template <
typename Derived>
3236bool RecursiveASTVisitor<Derived>::VisitOMPFinalClause(OMPFinalClause *C) {
3237 TRY_TO(VisitOMPClauseWithPreInit(C));
3238 TRY_TO(TraverseStmt(
C->getCondition()));
3242template <
typename Derived>
3244RecursiveASTVisitor<Derived>::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
3245 TRY_TO(VisitOMPClauseWithPreInit(C));
3246 TRY_TO(TraverseStmt(
C->getNumThreads()));
3250template <
typename Derived>
3251bool RecursiveASTVisitor<Derived>::VisitOMPAlignClause(OMPAlignClause *C) {
3252 TRY_TO(TraverseStmt(
C->getAlignment()));
3256template <
typename Derived>
3257bool RecursiveASTVisitor<Derived>::VisitOMPSafelenClause(OMPSafelenClause *C) {
3258 TRY_TO(TraverseStmt(
C->getSafelen()));
3262template <
typename Derived>
3263bool RecursiveASTVisitor<Derived>::VisitOMPSimdlenClause(OMPSimdlenClause *C) {
3264 TRY_TO(TraverseStmt(
C->getSimdlen()));
3268template <
typename Derived>
3269bool RecursiveASTVisitor<Derived>::VisitOMPSizesClause(OMPSizesClause *C) {
3270 for (Expr *E :
C->getSizesRefs())
3275template <
typename Derived>
3276bool RecursiveASTVisitor<Derived>::VisitOMPFullClause(OMPFullClause *C) {
3280template <
typename Derived>
3281bool RecursiveASTVisitor<Derived>::VisitOMPPartialClause(OMPPartialClause *C) {
3282 TRY_TO(TraverseStmt(
C->getFactor()));
3286template <
typename Derived>
3288RecursiveASTVisitor<Derived>::VisitOMPCollapseClause(OMPCollapseClause *C) {
3289 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3293template <
typename Derived>
3294bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {
3298template <
typename Derived>
3299bool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
3303template <
typename Derived>
3304bool RecursiveASTVisitor<Derived>::VisitOMPUnifiedAddressClause(
3305 OMPUnifiedAddressClause *) {
3309template <
typename Derived>
3310bool RecursiveASTVisitor<Derived>::VisitOMPUnifiedSharedMemoryClause(
3311 OMPUnifiedSharedMemoryClause *) {
3315template <
typename Derived>
3316bool RecursiveASTVisitor<Derived>::VisitOMPReverseOffloadClause(
3317 OMPReverseOffloadClause *) {
3321template <
typename Derived>
3322bool RecursiveASTVisitor<Derived>::VisitOMPDynamicAllocatorsClause(
3323 OMPDynamicAllocatorsClause *) {
3327template <
typename Derived>
3328bool RecursiveASTVisitor<Derived>::VisitOMPAtomicDefaultMemOrderClause(
3329 OMPAtomicDefaultMemOrderClause *) {
3333template <
typename Derived>
3334bool RecursiveASTVisitor<Derived>::VisitOMPAtClause(OMPAtClause *) {
3338template <
typename Derived>
3339bool RecursiveASTVisitor<Derived>::VisitOMPSeverityClause(OMPSeverityClause *) {
3343template <
typename Derived>
3344bool RecursiveASTVisitor<Derived>::VisitOMPMessageClause(OMPMessageClause *C) {
3345 TRY_TO(TraverseStmt(
C->getMessageString()));
3349template <
typename Derived>
3351RecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
3352 TRY_TO(VisitOMPClauseWithPreInit(C));
3353 TRY_TO(TraverseStmt(
C->getChunkSize()));
3357template <
typename Derived>
3358bool RecursiveASTVisitor<Derived>::VisitOMPOrderedClause(OMPOrderedClause *C) {
3359 TRY_TO(TraverseStmt(
C->getNumForLoops()));
3363template <
typename Derived>
3364bool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause *) {
3368template <
typename Derived>
3369bool RecursiveASTVisitor<Derived>::VisitOMPUntiedClause(OMPUntiedClause *) {
3373template <
typename Derived>
3375RecursiveASTVisitor<Derived>::VisitOMPMergeableClause(OMPMergeableClause *) {
3379template <
typename Derived>
3380bool RecursiveASTVisitor<Derived>::VisitOMPReadClause(OMPReadClause *) {
3384template <
typename Derived>
3385bool RecursiveASTVisitor<Derived>::VisitOMPWriteClause(OMPWriteClause *) {
3389template <
typename Derived>
3390bool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
3394template <
typename Derived>
3395bool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
3399template <
typename Derived>
3400bool RecursiveASTVisitor<Derived>::VisitOMPCompareClause(OMPCompareClause *) {
3404template <
typename Derived>
3405bool RecursiveASTVisitor<Derived>::VisitOMPSeqCstClause(OMPSeqCstClause *) {
3409template <
typename Derived>
3410bool RecursiveASTVisitor<Derived>::VisitOMPAcqRelClause(OMPAcqRelClause *) {
3414template <
typename Derived>
3415bool RecursiveASTVisitor<Derived>::VisitOMPAcquireClause(OMPAcquireClause *) {
3419template <
typename Derived>
3420bool RecursiveASTVisitor<Derived>::VisitOMPReleaseClause(OMPReleaseClause *) {
3424template <
typename Derived>
3425bool RecursiveASTVisitor<Derived>::VisitOMPRelaxedClause(OMPRelaxedClause *) {
3429template <
typename Derived>
3430bool RecursiveASTVisitor<Derived>::VisitOMPThreadsClause(OMPThreadsClause *) {
3434template <
typename Derived>
3435bool RecursiveASTVisitor<Derived>::VisitOMPSIMDClause(OMPSIMDClause *) {
3439template <
typename Derived>
3440bool RecursiveASTVisitor<Derived>::VisitOMPNogroupClause(OMPNogroupClause *) {
3444template <
typename Derived>
3445bool RecursiveASTVisitor<Derived>::VisitOMPInitClause(OMPInitClause *C) {
3446 TRY_TO(VisitOMPClauseList(C));
3450template <
typename Derived>
3451bool RecursiveASTVisitor<Derived>::VisitOMPUseClause(OMPUseClause *C) {
3452 TRY_TO(TraverseStmt(
C->getInteropVar()));
3456template <
typename Derived>
3457bool RecursiveASTVisitor<Derived>::VisitOMPDestroyClause(OMPDestroyClause *C) {
3458 TRY_TO(TraverseStmt(
C->getInteropVar()));
3462template <
typename Derived>
3463bool RecursiveASTVisitor<Derived>::VisitOMPNovariantsClause(
3464 OMPNovariantsClause *C) {
3465 TRY_TO(VisitOMPClauseWithPreInit(C));
3466 TRY_TO(TraverseStmt(
C->getCondition()));
3470template <
typename Derived>
3471bool RecursiveASTVisitor<Derived>::VisitOMPNocontextClause(
3472 OMPNocontextClause *C) {
3473 TRY_TO(VisitOMPClauseWithPreInit(C));
3474 TRY_TO(TraverseStmt(
C->getCondition()));
3478template <
typename Derived>
3479template <
typename T>
3480bool RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *
Node) {
3481 for (
auto *E :
Node->varlists()) {
3487template <
typename Derived>
3488bool RecursiveASTVisitor<Derived>::VisitOMPInclusiveClause(
3489 OMPInclusiveClause *C) {
3490 TRY_TO(VisitOMPClauseList(C));
3494template <
typename Derived>
3495bool RecursiveASTVisitor<Derived>::VisitOMPExclusiveClause(
3496 OMPExclusiveClause *C) {
3497 TRY_TO(VisitOMPClauseList(C));
3501template <
typename Derived>
3502bool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
3503 TRY_TO(VisitOMPClauseList(C));
3504 for (
auto *E :
C->private_copies()) {
3510template <
typename Derived>
3511bool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
3512 OMPFirstprivateClause *C) {
3513 TRY_TO(VisitOMPClauseList(C));
3514 TRY_TO(VisitOMPClauseWithPreInit(C));
3515 for (
auto *E :
C->private_copies()) {
3518 for (
auto *E :
C->inits()) {
3524template <
typename Derived>
3525bool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
3526 OMPLastprivateClause *C) {
3527 TRY_TO(VisitOMPClauseList(C));
3528 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3529 for (
auto *E :
C->private_copies()) {
3532 for (
auto *E :
C->source_exprs()) {
3535 for (
auto *E :
C->destination_exprs()) {
3538 for (
auto *E :
C->assignment_ops()) {
3544template <
typename Derived>
3545bool RecursiveASTVisitor<Derived>::VisitOMPSharedClause(OMPSharedClause *C) {
3546 TRY_TO(VisitOMPClauseList(C));
3550template <
typename Derived>
3551bool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(OMPLinearClause *C) {
3552 TRY_TO(TraverseStmt(
C->getStep()));
3553 TRY_TO(TraverseStmt(
C->getCalcStep()));
3554 TRY_TO(VisitOMPClauseList(C));
3555 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3556 for (
auto *E :
C->privates()) {
3559 for (
auto *E :
C->inits()) {
3562 for (
auto *E :
C->updates()) {
3565 for (
auto *E :
C->finals()) {
3571template <
typename Derived>
3572bool RecursiveASTVisitor<Derived>::VisitOMPAlignedClause(OMPAlignedClause *C) {
3573 TRY_TO(TraverseStmt(
C->getAlignment()));
3574 TRY_TO(VisitOMPClauseList(C));
3578template <
typename Derived>
3579bool RecursiveASTVisitor<Derived>::VisitOMPCopyinClause(OMPCopyinClause *C) {
3580 TRY_TO(VisitOMPClauseList(C));
3581 for (
auto *E :
C->source_exprs()) {
3584 for (
auto *E :
C->destination_exprs()) {
3587 for (
auto *E :
C->assignment_ops()) {
3593template <
typename Derived>
3594bool RecursiveASTVisitor<Derived>::VisitOMPCopyprivateClause(
3595 OMPCopyprivateClause *C) {
3596 TRY_TO(VisitOMPClauseList(C));
3597 for (
auto *E :
C->source_exprs()) {
3600 for (
auto *E :
C->destination_exprs()) {
3603 for (
auto *E :
C->assignment_ops()) {
3609template <
typename Derived>
3611RecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
3612 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3613 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3614 TRY_TO(VisitOMPClauseList(C));
3615 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3616 for (
auto *E :
C->privates()) {
3619 for (
auto *E :
C->lhs_exprs()) {
3622 for (
auto *E :
C->rhs_exprs()) {
3625 for (
auto *E :
C->reduction_ops()) {
3628 if (
C->getModifier() == OMPC_REDUCTION_inscan) {
3629 for (
auto *E :
C->copy_ops()) {
3632 for (
auto *E :
C->copy_array_temps()) {
3635 for (
auto *E :
C->copy_array_elems()) {
3642template <
typename Derived>
3643bool RecursiveASTVisitor<Derived>::VisitOMPTaskReductionClause(
3644 OMPTaskReductionClause *C) {
3645 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3646 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3647 TRY_TO(VisitOMPClauseList(C));
3648 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3649 for (
auto *E :
C->privates()) {
3652 for (
auto *E :
C->lhs_exprs()) {
3655 for (
auto *E :
C->rhs_exprs()) {
3658 for (
auto *E :
C->reduction_ops()) {
3664template <
typename Derived>
3665bool RecursiveASTVisitor<Derived>::VisitOMPInReductionClause(
3666 OMPInReductionClause *C) {
3667 TRY_TO(TraverseNestedNameSpecifierLoc(
C->getQualifierLoc()));
3668 TRY_TO(TraverseDeclarationNameInfo(
C->getNameInfo()));
3669 TRY_TO(VisitOMPClauseList(C));
3670 TRY_TO(VisitOMPClauseWithPostUpdate(C));
3671 for (
auto *E :
C->privates()) {
3674 for (
auto *E :
C->lhs_exprs()) {
3677 for (
auto *E :
C->rhs_exprs()) {
3680 for (
auto *E :
C->reduction_ops()) {
3683 for (
auto *E :
C->taskgroup_descriptors())
3688template <
typename Derived>
3689bool RecursiveASTVisitor<Derived>::VisitOMPFlushClause(OMPFlushClause *C) {
3690 TRY_TO(VisitOMPClauseList(C));
3694template <
typename Derived>
3695bool RecursiveASTVisitor<Derived>::VisitOMPDepobjClause(OMPDepobjClause *C) {
3696 TRY_TO(TraverseStmt(
C->getDepobj()));
3700template <
typename Derived>
3701bool RecursiveASTVisitor<Derived>::VisitOMPDependClause(OMPDependClause *C) {
3702 TRY_TO(VisitOMPClauseList(C));
3706template <
typename Derived>
3707bool RecursiveASTVisitor<Derived>::VisitOMPDeviceClause(OMPDeviceClause *C) {
3708 TRY_TO(VisitOMPClauseWithPreInit(C));
3709 TRY_TO(TraverseStmt(
C->getDevice()));
3713template <
typename Derived>
3714bool RecursiveASTVisitor<Derived>::VisitOMPMapClause(OMPMapClause *C) {
3715 TRY_TO(VisitOMPClauseList(C));
3719template <
typename Derived>
3720bool RecursiveASTVisitor<Derived>::VisitOMPNumTeamsClause(
3721 OMPNumTeamsClause *C) {
3722 TRY_TO(VisitOMPClauseWithPreInit(C));
3723 TRY_TO(TraverseStmt(
C->getNumTeams()));
3727template <
typename Derived>
3728bool RecursiveASTVisitor<Derived>::VisitOMPThreadLimitClause(
3729 OMPThreadLimitClause *C) {
3730 TRY_TO(VisitOMPClauseWithPreInit(C));
3731 TRY_TO(TraverseStmt(
C->getThreadLimit()));
3735template <
typename Derived>
3736bool RecursiveASTVisitor<Derived>::VisitOMPPriorityClause(
3737 OMPPriorityClause *C) {
3738 TRY_TO(VisitOMPClauseWithPreInit(C));
3739 TRY_TO(TraverseStmt(
C->getPriority()));
3743template <
typename Derived>
3744bool RecursiveASTVisitor<Derived>::VisitOMPGrainsizeClause(
3745 OMPGrainsizeClause *C) {
3746 TRY_TO(VisitOMPClauseWithPreInit(C));
3747 TRY_TO(TraverseStmt(
C->getGrainsize()));
3751template <
typename Derived>
3752bool RecursiveASTVisitor<Derived>::VisitOMPNumTasksClause(
3753 OMPNumTasksClause *C) {
3754 TRY_TO(VisitOMPClauseWithPreInit(C));
3755 TRY_TO(TraverseStmt(
C->getNumTasks()));
3759template <
typename Derived>
3760bool RecursiveASTVisitor<Derived>::VisitOMPHintClause(OMPHintClause *C) {
3761 TRY_TO(TraverseStmt(
C->getHint()));
3765template <
typename Derived>
3766bool RecursiveASTVisitor<Derived>::VisitOMPDistScheduleClause(
3767 OMPDistScheduleClause *C) {
3768 TRY_TO(VisitOMPClauseWithPreInit(C));
3769 TRY_TO(TraverseStmt(
C->getChunkSize()));
3773template <
typename Derived>
3775RecursiveASTVisitor<Derived>::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) {
3779template <
typename Derived>
3780bool RecursiveASTVisitor<Derived>::VisitOMPToClause(OMPToClause *C) {
3781 TRY_TO(VisitOMPClauseList(C));
3785template <
typename Derived>
3786bool RecursiveASTVisitor<Derived>::VisitOMPFromClause(OMPFromClause *C) {
3787 TRY_TO(VisitOMPClauseList(C));
3791template <
typename Derived>
3792bool RecursiveASTVisitor<Derived>::VisitOMPUseDevicePtrClause(
3793 OMPUseDevicePtrClause *C) {
3794 TRY_TO(VisitOMPClauseList(C));
3798template <
typename Derived>
3799bool RecursiveASTVisitor<Derived>::VisitOMPUseDeviceAddrClause(
3800 OMPUseDeviceAddrClause *C) {
3801 TRY_TO(VisitOMPClauseList(C));
3805template <
typename Derived>
3806bool RecursiveASTVisitor<Derived>::VisitOMPIsDevicePtrClause(
3807 OMPIsDevicePtrClause *C) {
3808 TRY_TO(VisitOMPClauseList(C));
3812template <
typename Derived>
3813bool RecursiveASTVisitor<Derived>::VisitOMPHasDeviceAddrClause(
3814 OMPHasDeviceAddrClause *C) {
3815 TRY_TO(VisitOMPClauseList(C));
3819template <
typename Derived>
3820bool RecursiveASTVisitor<Derived>::VisitOMPNontemporalClause(
3821 OMPNontemporalClause *C) {
3822 TRY_TO(VisitOMPClauseList(C));
3823 for (
auto *E :
C->private_refs()) {
3829template <
typename Derived>
3830bool RecursiveASTVisitor<Derived>::VisitOMPOrderClause(OMPOrderClause *) {
3834template <
typename Derived>
3835bool RecursiveASTVisitor<Derived>::VisitOMPDetachClause(OMPDetachClause *C) {
3836 TRY_TO(TraverseStmt(
C->getEventHandler()));
3840template <
typename Derived>
3841bool RecursiveASTVisitor<Derived>::VisitOMPUsesAllocatorsClause(
3842 OMPUsesAllocatorsClause *C) {
3843 for (
unsigned I = 0, E =
C->getNumberOfAllocators(); I < E; ++I) {
3844 const OMPUsesAllocatorsClause::Data
Data =
C->getAllocatorData(I);
3851template <
typename Derived>
3852bool RecursiveASTVisitor<Derived>::VisitOMPAffinityClause(
3853 OMPAffinityClause *C) {
3854 TRY_TO(TraverseStmt(
C->getModifier()));
3855 for (Expr *E :
C->varlists())
3860template <
typename Derived>
3861bool RecursiveASTVisitor<Derived>::VisitOMPFilterClause(OMPFilterClause *C) {
3862 TRY_TO(VisitOMPClauseWithPreInit(C));
3863 TRY_TO(TraverseStmt(
C->getThreadID()));
3867template <
typename Derived>
3868bool RecursiveASTVisitor<Derived>::VisitOMPBindClause(OMPBindClause *C) {
3872template <
typename Derived>
3873bool RecursiveASTVisitor<Derived>::VisitOMPXDynCGroupMemClause(
3874 OMPXDynCGroupMemClause *C) {
3875 TRY_TO(VisitOMPClauseWithPreInit(C));
3876 TRY_TO(TraverseStmt(
C->getSize()));
3880template <
typename Derived>
3881bool RecursiveASTVisitor<Derived>::VisitOMPDoacrossClause(
3882 OMPDoacrossClause *C) {
3883 TRY_TO(VisitOMPClauseList(C));
3887template <
typename Derived>
3888bool RecursiveASTVisitor<Derived>::VisitOMPXAttributeClause(
3889 OMPXAttributeClause *C) {
3910#undef DEF_TRAVERSE_STMT
3912#undef TRAVERSE_STMT_BASE
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 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 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 block literal declaration, which is like an unnamed FunctionDecl.
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.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
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 a C++17 deduced template specialization type.
Represents an extended address space qualifier where the input address space value is dependent.
Represents an extended vector type where either the type or size is dependent.
Represents a matrix type where the type and the number of rows and columns is dependent on a template...
Represents a dependent template name that cannot be resolved prior to template instantiation.
Represents a template specialization type whose template cannot be resolved, e.g.
Represents a type that was referred to using an elaborated type keyword, e.g., struct S,...
This represents one expression.
ExtVectorType - Extended vector type.
Represents a function declaration or definition.
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
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...
Implicit declaration of a temporary that was materialized by a MaterializeTemporaryExpr and lifetime-...
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 class type in Objective C.
Represents a type parameter type in Objective C.
Sugar for parentheses used when specifying types.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
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.
@ 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.
A declaration that models statements at global scope.
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 typeof(type), a C23 feature and GCC extension, or `typeof_unqual(type),...
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.
TypeClass getTypeClass() const
Wrapper of type source information for a type with no direct qualifiers.
Represents a variable declaration or definition.
Represents a C array with a specified size that is not an integer-constant-expression.
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.
for(unsigned I=0, E=TL.getNumArgs();I !=E;++I)
@ C
Languages that the frontend can parse and compile.
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,...
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.