14 #ifndef LLVM_CLANG_AST_DATARECURSIVEASTVISITOR_H
15 #define LLVM_CLANG_AST_DATARECURSIVEASTVISITOR_H
41 #define UNARYOP_LIST() \
42 OPERATOR(PostInc) OPERATOR(PostDec) OPERATOR(PreInc) OPERATOR(PreDec) \
43 OPERATOR(AddrOf) OPERATOR(Deref) OPERATOR(Plus) OPERATOR(Minus) \
44 OPERATOR(Not) OPERATOR(LNot) OPERATOR(Real) OPERATOR(Imag) \
48 #define BINOP_LIST() \
49 OPERATOR(PtrMemD) OPERATOR(PtrMemI) OPERATOR(Mul) OPERATOR(Div) \
50 OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub) OPERATOR(Shl) OPERATOR(Shr) \
51 OPERATOR(LT) OPERATOR(GT) OPERATOR(LE) OPERATOR(GE) OPERATOR(EQ) \
52 OPERATOR(NE) OPERATOR(And) OPERATOR(Xor) OPERATOR(Or) OPERATOR(LAnd) \
53 OPERATOR(LOr) OPERATOR(Assign) OPERATOR(Comma)
57 OPERATOR(Mul) OPERATOR(Div) OPERATOR(Rem) OPERATOR(Add) OPERATOR(Sub) \
58 OPERATOR(Shl) OPERATOR(Shr) OPERATOR(And) OPERATOR(Or) OPERATOR(Xor)
64 #define RecursiveASTVisitor DataRecursiveASTVisitor
70 #define TRY_TO(CALL_EXPR) \
72 if (!getDerived().CALL_EXPR) \
143 Derived &
getDerived() {
return *
static_cast<Derived *
>(
this); }
259 #define ATTR_VISITOR_DECLS_ONLY
260 #include "clang/AST/AttrVisitor.inc"
261 #undef ATTR_VISITOR_DECLS_ONLY
266 #define ABSTRACT_STMT(STMT)
267 #define STMT(CLASS, PARENT) bool Traverse##CLASS(CLASS *S);
268 #include "clang/AST/StmtNodes.inc"
274 #define STMT(CLASS, PARENT) \
275 bool WalkUpFrom##CLASS(CLASS *S) { \
276 TRY_TO(WalkUpFrom##PARENT(S)); \
277 TRY_TO(Visit##CLASS(S)); \
280 bool Visit##CLASS(CLASS *S) { return true; }
281 #include "clang/AST/StmtNodes.inc"
286 #define OPERATOR(NAME) \
287 bool TraverseUnary##NAME(UnaryOperator *S) { \
288 TRY_TO(WalkUpFromUnary##NAME(S)); \
289 StmtQueueAction StmtQueue(*this); \
290 StmtQueue.queue(S->getSubExpr()); \
293 bool WalkUpFromUnary##NAME(UnaryOperator *S) { \
294 TRY_TO(WalkUpFromUnaryOperator(S)); \
295 TRY_TO(VisitUnary##NAME(S)); \
298 bool VisitUnary##NAME(UnaryOperator *S) { return true; }
306 #define GENERAL_BINOP_FALLBACK(NAME, BINOP_TYPE) \
307 bool TraverseBin##NAME(BINOP_TYPE *S) { \
308 TRY_TO(WalkUpFromBin##NAME(S)); \
309 StmtQueueAction StmtQueue(*this); \
310 StmtQueue.queue(S->getLHS()); \
311 StmtQueue.queue(S->getRHS()); \
314 bool WalkUpFromBin##NAME(BINOP_TYPE *S) { \
315 TRY_TO(WalkUpFrom##BINOP_TYPE(S)); \
316 TRY_TO(VisitBin##NAME(S)); \
319 bool VisitBin##NAME(BINOP_TYPE *S) { return true; }
321 #define OPERATOR(NAME) GENERAL_BINOP_FALLBACK(NAME, BinaryOperator)
329 #define OPERATOR(NAME) \
330 GENERAL_BINOP_FALLBACK(NAME##Assign, CompoundAssignOperator)
334 #undef GENERAL_BINOP_FALLBACK
340 #define ABSTRACT_TYPE(CLASS, BASE)
341 #define TYPE(CLASS, BASE) bool Traverse##CLASS##Type(CLASS##Type *T);
342 #include "clang/AST/TypeNodes.def"
348 #define TYPE(CLASS, BASE) \
349 bool WalkUpFrom##CLASS##Type(CLASS##Type *T) { \
350 TRY_TO(WalkUpFrom##BASE(T)); \
351 TRY_TO(Visit##CLASS##Type(T)); \
354 bool Visit##CLASS##Type(CLASS##Type *T) { return true; }
355 #include "clang/AST/TypeNodes.def"
361 #define ABSTRACT_TYPELOC(CLASS, BASE)
362 #define TYPELOC(CLASS, BASE) bool Traverse##CLASS##TypeLoc(CLASS##TypeLoc TL);
363 #include "clang/AST/TypeLocNodes.def"
382 #define TYPE(CLASS, BASE) \
383 bool WalkUpFrom##CLASS##TypeLoc(CLASS##TypeLoc TL) { \
384 TRY_TO(WalkUpFrom##BASE##Loc(TL)); \
385 TRY_TO(Visit##CLASS##TypeLoc(TL)); \
388 bool Visit##CLASS##TypeLoc(CLASS##TypeLoc TL) { return true; }
389 #include "clang/AST/TypeNodes.def"
394 #define ABSTRACT_DECL(DECL)
395 #define DECL(CLASS, BASE) bool Traverse##CLASS##Decl(CLASS##Decl *D);
396 #include "clang/AST/DeclNodes.inc"
402 #define DECL(CLASS, BASE) \
403 bool WalkUpFrom##CLASS##Decl(CLASS##Decl *D) { \
404 TRY_TO(WalkUpFrom##BASE(D)); \
405 TRY_TO(Visit##CLASS##Decl(D)); \
408 bool Visit##CLASS##Decl(CLASS##Decl *D) { return true; }
409 #include "clang/AST/DeclNodes.inc"
413 bool TraverseTemplateParameterListHelper(TemplateParameterList *TPL);
414 bool TraverseClassInstantiations(ClassTemplateDecl *D);
415 bool TraverseVariableInstantiations(VarTemplateDecl *D);
416 bool TraverseFunctionInstantiations(FunctionTemplateDecl *D);
417 bool TraverseTemplateArgumentLocsHelper(
const TemplateArgumentLoc *TAL,
419 bool TraverseArrayTypeLocHelper(ArrayTypeLoc TL);
420 bool TraverseRecordHelper(RecordDecl *D);
421 bool TraverseCXXRecordHelper(CXXRecordDecl *D);
422 bool TraverseDeclaratorHelper(DeclaratorDecl *D);
423 bool TraverseDeclContextHelper(DeclContext *DC);
424 bool TraverseFunctionHelper(FunctionDecl *D);
425 bool TraverseVarHelper(VarDecl *D);
426 bool TraverseOMPExecutableDirective(OMPExecutableDirective *
S);
427 bool TraverseOMPLoopDirective(OMPLoopDirective *
S);
428 bool TraverseOMPClause(OMPClause *
C);
429 #define OPENMP_CLAUSE(Name, Class) bool Visit##Class(Class *C);
430 #include "clang/Basic/OpenMPKinds.def"
432 template <
typename T>
bool VisitOMPClauseList(T *
Node);
434 typedef SmallVector<Stmt *, 16> StmtsTy;
435 typedef SmallVector<StmtsTy *, 4> QueuesTy;
444 RAV.Queues.push_back(&queue);
446 ~NewQueueRAII() { RAV.Queues.pop_back(); }
449 StmtsTy &getCurrentQueue() {
450 assert(!Queues.empty() &&
"base TraverseStmt was never called?");
451 return *Queues.back();
460 : CurrQueue(RAV.getCurrentQueue()) {}
466 #define DISPATCH(NAME, CLASS, VAR) \
467 return getDerived().Traverse##NAME(static_cast<CLASS *>(VAR))
469 template <
typename Derived>
476 NewQueueRAII NQ(StmtsToEnqueue, *
this);
478 while (!Queue.empty()) {
479 S = Queue.pop_back_val();
483 StmtsToEnqueue.clear();
485 #define DISPATCH_STMT(NAME, CLASS, VAR) \
486 TRY_TO(Traverse##NAME(static_cast<CLASS *>(VAR))); \
493 switch (BinOp->getOpcode()) {
494 #define OPERATOR(NAME) \
496 DISPATCH_STMT(Bin##NAME, BinaryOperator, S);
502 #define OPERATOR(NAME) \
503 case BO_##NAME##Assign: \
504 DISPATCH_STMT(Bin##NAME##Assign, CompoundAssignOperator, S);
510 }
else if (
UnaryOperator *UnOp = dyn_cast<UnaryOperator>(S)) {
511 switch (UnOp->getOpcode()) {
512 #define OPERATOR(NAME) \
514 DISPATCH_STMT(Unary##NAME, UnaryOperator, S);
523 switch (S->getStmtClass()) {
524 case Stmt::NoStmtClass:
526 #define ABSTRACT_STMT(STMT)
527 #define STMT(CLASS, PARENT) \
528 case Stmt::CLASS##Class: \
529 DISPATCH_STMT(CLASS, CLASS, S);
530 #include "clang/AST/StmtNodes.inc"
534 Queue.append(StmtsToEnqueue.rbegin(), StmtsToEnqueue.rend());
542 template <
typename Derived>
548 #define ABSTRACT_TYPE(CLASS, BASE)
549 #define TYPE(CLASS, BASE) \
551 DISPATCH(CLASS##Type, CLASS##Type, const_cast<Type *>(T.getTypePtr()));
552 #include "clang/AST/TypeNodes.def"
558 template <
typename Derived>
564 #define ABSTRACT_TYPELOC(CLASS, BASE)
565 #define TYPELOC(CLASS, BASE) \
566 case TypeLoc::CLASS: \
567 return getDerived().Traverse##CLASS##TypeLoc(TL.castAs<CLASS##TypeLoc>());
568 #include "clang/AST/TypeLocNodes.def"
575 #define VISITORCLASS RecursiveASTVisitor
576 #include "clang/AST/AttrVisitor.inc"
579 template <
typename Derived>
591 #define ABSTRACT_DECL(DECL)
592 #define DECL(CLASS, BASE) \
594 if (!getDerived().Traverse##CLASS##Decl(static_cast<CLASS##Decl *>(D))) \
597 #include "clang/AST/DeclNodes.inc"
601 for (
auto *I : D->
attrs()) {
602 if (!getDerived().TraverseAttr(I))
610 template <
typename Derived>
635 template <
typename Derived>
642 TRY_TO(TraverseNestedNameSpecifierLoc(Prefix));
661 template <
typename Derived>
669 TRY_TO(TraverseTypeLoc(TSInfo->getTypeLoc()));
686 template <
typename Derived>
689 TRY_TO(TraverseNestedNameSpecifier(DTN->getQualifier()));
691 TRY_TO(TraverseNestedNameSpecifier(QTN->getQualifier()));
696 template <
typename Derived>
707 return getDerived().TraverseType(Arg.
getAsType());
711 return getDerived().TraverseTemplateName(
715 return getDerived().TraverseStmt(Arg.
getAsExpr());
718 return getDerived().TraverseTemplateArguments(Arg.
pack_begin(),
727 template <
typename Derived>
742 return getDerived().TraverseTypeLoc(TSI->getTypeLoc());
744 return getDerived().TraverseType(Arg.
getAsType());
750 TRY_TO(getDerived().TraverseNestedNameSpecifierLoc(
752 return getDerived().TraverseTemplateName(
759 return getDerived().TraverseTemplateArguments(Arg.
pack_begin(),
766 template <
typename Derived>
769 for (
unsigned I = 0; I != NumArgs; ++I) {
770 TRY_TO(TraverseTemplateArgument(Args[I]));
776 template <
typename Derived>
780 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
787 template <
typename Derived>
796 template <
typename Derived>
806 #define DEF_TRAVERSE_TYPE(TYPE, CODE) \
807 template <typename Derived> \
808 bool RecursiveASTVisitor<Derived>::Traverse##TYPE(TYPE *T) { \
809 TRY_TO(WalkUpFrom##TYPE(T)); \
821 {
TRY_TO(TraverseType(T->getPointeeType())); })
824 {
TRY_TO(TraverseType(T->getPointeeType())); })
827 {
TRY_TO(TraverseType(T->getPointeeType())); })
830 TRY_TO(TraverseType(QualType(T->getClass(), 0)));
831 TRY_TO(TraverseType(T->getPointeeType()));
839 {
TRY_TO(TraverseType(T->getElementType())); })
842 {
TRY_TO(TraverseType(T->getElementType())); })
845 TRY_TO(TraverseType(T->getElementType()));
846 TRY_TO(TraverseStmt(T->getSizeExpr()));
850 TRY_TO(TraverseType(T->getElementType()));
851 if (T->getSizeExpr())
852 TRY_TO(TraverseStmt(T->getSizeExpr()));
856 if (T->getSizeExpr())
857 TRY_TO(TraverseStmt(T->getSizeExpr()));
858 TRY_TO(TraverseType(T->getElementType()));
866 {
TRY_TO(TraverseType(T->getReturnType())); })
869 TRY_TO(TraverseType(T->getReturnType()));
871 for (
const auto &A : T->param_types()) {
875 for (
const auto &E : T->exceptions()) {
879 if (Expr *NE = T->getNoexceptExpr())
887 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
892 {
TRY_TO(TraverseStmt(T->getUnderlyingExpr())); })
895 TRY_TO(TraverseType(T->getBaseType()));
896 TRY_TO(TraverseType(T->getUnderlyingType()));
908 TRY_TO(TraverseTemplateName(T->getTemplateName()));
909 TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs()));
915 {
TRY_TO(TraverseType(T->getModifiedType())); })
920 if (T->getQualifier()) {
921 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
923 TRY_TO(TraverseType(T->getNamedType()));
927 {
TRY_TO(TraverseNestedNameSpecifier(T->getQualifier())); })
930 TRY_TO(TraverseNestedNameSpecifier(T->getQualifier()));
931 TRY_TO(TraverseTemplateArguments(T->getArgs(), T->getNumArgs()));
941 if (T->getBaseType().getTypePtr() != T)
942 TRY_TO(TraverseType(T->getBaseType()));
943 for (
auto typeArg : T->getTypeArgsAsWritten()) {
944 TRY_TO(TraverseType(typeArg));
949 {
TRY_TO(TraverseType(T->getPointeeType())); })
963 template <typename Derived>
\
964 bool RecursiveASTVisitor<Derived>::Traverse##
TYPE##Loc(
TYPE##Loc TL) {
\
965 if (getDerived().shouldWalkTypesOfTypeLocs())
\
966 TRY_TO(WalkUpFrom##
TYPE(const_cast<TYPE *>(TL.getTypePtr())));
\
972 template <
typename Derived>
974 RecursiveASTVisitor<Derived>::TraverseQualifiedTypeLoc(QualifiedTypeLoc TL) {
990 return TraverseTypeLoc(TL.getUnqualifiedLoc());
997 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1001 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1004 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1007 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1010 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1016 TRY_TO(TraverseType(QualType(TL.getTypePtr()->getClass(), 0)));
1017 TRY_TO(TraverseTypeLoc(TL.getPointeeLoc()));
1021 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1024 {
TRY_TO(TraverseTypeLoc(TL.getOriginalLoc())); })
1026 template <typename Derived>
1029 TRY_TO(TraverseStmt(TL.getSizeExpr()));
1034 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1039 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1044 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1049 TRY_TO(TraverseTypeLoc(TL.getElementLoc()));
1056 if (TL.getTypePtr()->getSizeExpr())
1057 TRY_TO(TraverseStmt(TL.getTypePtr()->getSizeExpr()));
1058 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1063 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1069 TRY_TO(TraverseType(TL.getTypePtr()->getElementType()));
1073 {
TRY_TO(TraverseTypeLoc(TL.getReturnLoc())); })
1077 TRY_TO(TraverseTypeLoc(TL.getReturnLoc()));
1079 const FunctionProtoType *T = TL.getTypePtr();
1081 for (
unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
1082 if (TL.getParam(I)) {
1083 TRY_TO(TraverseDecl(TL.getParam(I)));
1084 }
else if (I < T->getNumParams()) {
1085 TRY_TO(TraverseType(T->getParamType(I)));
1089 for (
const auto &E : T->exceptions()) {
1093 if (Expr *NE = T->getNoexceptExpr())
1094 TRY_TO(TraverseStmt(NE));
1101 {
TRY_TO(TraverseStmt(TL.getUnderlyingExpr())); })
1104 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1109 TRY_TO(TraverseStmt(TL.getTypePtr()->getUnderlyingExpr()));
1113 TRY_TO(TraverseTypeLoc(TL.getUnderlyingTInfo()->getTypeLoc()));
1117 TRY_TO(TraverseType(TL.getTypePtr()->getDeducedType()));
1128 TRY_TO(TraverseTemplateName(TL.getTypePtr()->getTemplateName()));
1129 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1130 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1139 {
TRY_TO(TraverseTypeLoc(TL.getModifiedLoc())); })
1142 if (TL.getQualifierLoc()) {
1143 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1145 TRY_TO(TraverseTypeLoc(TL.getNamedTypeLoc()));
1149 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1153 if (TL.getQualifierLoc()) {
1154 TRY_TO(TraverseNestedNameSpecifierLoc(TL.getQualifierLoc()));
1157 for (
unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
1158 TRY_TO(TraverseTemplateArgumentLoc(TL.getArgLoc(I)));
1163 {
TRY_TO(TraverseTypeLoc(TL.getPatternLoc())); })
1170 if (TL.getTypePtr()->getBaseType().getTypePtr() != TL.getTypePtr())
1171 TRY_TO(TraverseTypeLoc(TL.getBaseLoc()));
1172 for (
unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
1173 TRY_TO(TraverseTypeLoc(TL.getTypeArgTInfo(i)->getTypeLoc()));
1177 {
TRY_TO(TraverseTypeLoc(TL.getPointeeLoc())); })
1190 template <typename Derived>
1191 bool RecursiveASTVisitor<Derived>::TraverseDeclContextHelper(DeclContext *DC) {
1195 for (
auto *Child : DC->decls()) {
1198 if (!isa<BlockDecl>(Child) && !isa<CapturedDecl>(Child))
1199 TRY_TO(TraverseDecl(Child));
1206 #define DEF_TRAVERSE_DECL(DECL, CODE) \
1207 template <typename Derived> \
1208 bool RecursiveASTVisitor<Derived>::Traverse##DECL(DECL *D) { \
1209 TRY_TO(WalkUpFrom##DECL(D)); \
1211 TRY_TO(TraverseDeclContextHelper(dyn_cast<DeclContext>(D))); \
1218 if (TypeSourceInfo *TInfo = D->getSignatureAsWritten())
1219 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
1220 TRY_TO(TraverseStmt(D->getBody()));
1221 for (
const auto &I : D->captures()) {
1222 if (I.hasCopyExpr()) {
1223 TRY_TO(TraverseStmt(I.getCopyExpr()));
1233 TRY_TO(TraverseStmt(D->getBody()));
1243 {
TRY_TO(TraverseStmt(D->getAsmString())); })
1249 if (D->getFriendType())
1250 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1252 TRY_TO(TraverseDecl(D->getFriendDecl()));
1256 if (D->getFriendType())
1257 TRY_TO(TraverseTypeLoc(D->getFriendType()->getTypeLoc()));
1259 TRY_TO(TraverseDecl(D->getFriendDecl()));
1260 for (
unsigned I = 0, E = D->getNumTemplateParameters(); I < E; ++I) {
1261 TemplateParameterList *TPL = D->getTemplateParameterList(I);
1263 ITPL != ETPL; ++ITPL) {
1264 TRY_TO(TraverseDecl(*ITPL));
1270 {
TRY_TO(TraverseDecl(D->getSpecialization())); })
1278 TRY_TO(TraverseStmt(D->getAssertExpr()));
1279 TRY_TO(TraverseStmt(D->getMessage()));
1283 TranslationUnitDecl,
1315 if (ObjCTypeParamList *typeParamList = D->getTypeParamList()) {
1316 for (
auto typeParam : *typeParamList) {
1317 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1330 if (ObjCTypeParamList *typeParamList = D->getTypeParamListAsWritten()) {
1331 for (
auto typeParam : *typeParamList) {
1332 TRY_TO(TraverseObjCTypeParamDecl(typeParam));
1336 if (TypeSourceInfo *superTInfo = D->getSuperClassTInfo()) {
1337 TRY_TO(TraverseTypeLoc(superTInfo->getTypeLoc()));
1345 if (D->getReturnTypeSourceInfo()) {
1346 TRY_TO(TraverseTypeLoc(D->getReturnTypeSourceInfo()->getTypeLoc()));
1350 TRY_TO(TraverseDecl(*I));
1352 if (D->isThisDeclarationADefinition()) {
1353 TRY_TO(TraverseStmt(D->getBody()));
1359 if (D->hasExplicitBound()) {
1360 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1368 if (D->getTypeSourceInfo())
1369 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1371 TRY_TO(TraverseType(D->getType()));
1376 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1377 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1381 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1387 for (
auto *I : D->varlists()) {
1393 template <typename Derived>
1394 bool RecursiveASTVisitor<Derived>::TraverseTemplateParameterListHelper(
1395 TemplateParameterList *TPL) {
1399 TRY_TO(TraverseDecl(*I));
1407 template <
typename Derived>
1408 bool RecursiveASTVisitor<Derived>::TraverseClassInstantiations(
1409 ClassTemplateDecl *D) {
1410 for (
auto *SD : D->specializations()) {
1411 for (
auto *RD : SD->redecls()) {
1413 if (cast<CXXRecordDecl>(RD)->isInjectedClassName())
1417 cast<ClassTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1421 TRY_TO(TraverseDecl(RD));
1439 CXXRecordDecl *TempDecl = D->getTemplatedDecl();
1440 TRY_TO(TraverseDecl(TempDecl));
1441 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1449 if (getDerived().shouldVisitTemplateInstantiations() &&
1450 D == D->getCanonicalDecl())
1451 TRY_TO(TraverseClassInstantiations(D));
1460 template <typename Derived>
1461 bool RecursiveASTVisitor<Derived>::TraverseVariableInstantiations(
1462 VarTemplateDecl *D) {
1463 for (
auto *SD : D->specializations()) {
1464 for (
auto *RD : SD->redecls()) {
1466 cast<VarTemplateSpecializationDecl>(RD)->getSpecializationKind()) {
1470 TRY_TO(TraverseDecl(RD));
1488 VarDecl *TempDecl = D->getTemplatedDecl();
1489 TRY_TO(TraverseDecl(TempDecl));
1490 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1498 if (getDerived().shouldVisitTemplateInstantiations() &&
1499 D == D->getCanonicalDecl())
1500 TRY_TO(TraverseVariableInstantiations(D));
1509 template <typename Derived>
1510 bool RecursiveASTVisitor<Derived>::TraverseFunctionInstantiations(
1511 FunctionTemplateDecl *D) {
1512 for (
auto *FD : D->specializations()) {
1513 for (
auto *RD : FD->redecls()) {
1514 switch (RD->getTemplateSpecializationKind()) {
1518 TRY_TO(TraverseDecl(RD));
1539 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1540 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1548 if (getDerived().shouldVisitTemplateInstantiations() &&
1549 D == D->getCanonicalDecl())
1550 TRY_TO(TraverseFunctionInstantiations(D));
1556 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1557 if (D->hasDefaultArgument()) {
1558 TRY_TO(TraverseTemplateArgumentLoc(D->getDefaultArgument()));
1560 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1565 if (D->getTypeForDecl())
1566 TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1567 if (D->hasDefaultArgument())
1568 TRY_TO(TraverseTypeLoc(D->getDefaultArgumentInfo()->getTypeLoc()));
1572 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1579 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1586 TRY_TO(TraverseDecl(D->getTemplatedDecl()));
1587 TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters()));
1593 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1600 if (D->getTypeForDecl())
1601 TRY_TO(TraverseType(QualType(D->getTypeForDecl(), 0)));
1603 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1609 template <typename Derived>
1610 bool RecursiveASTVisitor<Derived>::TraverseRecordHelper(RecordDecl *D) {
1614 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1618 template <
typename Derived>
1619 bool RecursiveASTVisitor<Derived>::TraverseCXXRecordHelper(CXXRecordDecl *D) {
1620 if (!TraverseRecordHelper(D))
1622 if (D->isCompleteDefinition()) {
1623 for (
const auto &I : D->bases()) {
1624 TRY_TO(TraverseTypeLoc(I.getTypeSourceInfo()->getTypeLoc()));
1645 if (TypeSourceInfo *TSI = D->getTypeAsWritten())
1646 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1648 if (!getDerived().shouldVisitTemplateInstantiations() &&
1657 template <typename Derived>
1658 bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
1659 const TemplateArgumentLoc *TAL,
unsigned Count) {
1660 for (
unsigned I = 0; I <
Count; ++I) {
1661 TRY_TO(TraverseTemplateArgumentLoc(TAL[I]));
1668 if (TemplateParameterList *TPL = D->getTemplateParameters()) {
1671 TRY_TO(TraverseDecl(*I));
1675 TRY_TO(TraverseTemplateArgumentLocsHelper(
1676 D->getTemplateArgsAsWritten()->getTemplateArgs(),
1677 D->getTemplateArgsAsWritten()->NumTemplateArgs));
1682 TRY_TO(TraverseCXXRecordHelper(D));
1692 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1693 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1698 template <typename Derived>
1699 bool RecursiveASTVisitor<Derived>::TraverseDeclaratorHelper(DeclaratorDecl *D) {
1700 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1701 if (D->getTypeSourceInfo())
1702 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1704 TRY_TO(TraverseType(D->getType()));
1711 TRY_TO(TraverseDeclaratorHelper(D));
1712 if (D->isBitField())
1713 TRY_TO(TraverseStmt(D->getBitWidth()));
1714 else if (D->hasInClassInitializer())
1715 TRY_TO(TraverseStmt(D->getInClassInitializer()));
1719 TRY_TO(TraverseDeclaratorHelper(D));
1720 if (D->isBitField())
1721 TRY_TO(TraverseStmt(D->getBitWidth()));
1726 TRY_TO(TraverseDeclaratorHelper(D));
1727 if (D->isBitField())
1728 TRY_TO(TraverseStmt(D->getBitWidth()));
1732 template <typename Derived>
1733 bool RecursiveASTVisitor<Derived>::TraverseFunctionHelper(FunctionDecl *D) {
1734 TRY_TO(TraverseNestedNameSpecifierLoc(D->getQualifierLoc()));
1735 TRY_TO(TraverseDeclarationNameInfo(D->getNameInfo()));
1742 if (
const FunctionTemplateSpecializationInfo *FTSI =
1743 D->getTemplateSpecializationInfo()) {
1748 if (
const ASTTemplateArgumentListInfo *TALI =
1749 FTSI->TemplateArgumentsAsWritten) {
1750 TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getTemplateArgs(),
1751 TALI->NumTemplateArgs));
1760 TRY_TO(TraverseTypeLoc(D->getTypeSourceInfo()->getTypeLoc()));
1762 if (CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(D)) {
1764 for (
auto *I : Ctor->inits()) {
1765 TRY_TO(TraverseConstructorInitializer(I));
1769 if (D->isThisDeclarationADefinition()) {
1770 TRY_TO(TraverseStmt(D->getBody()));
1778 return TraverseFunctionHelper(D);
1784 return TraverseFunctionHelper(D);
1790 return TraverseFunctionHelper(D);
1798 return TraverseFunctionHelper(D);
1804 return TraverseFunctionHelper(D);
1807 template <typename Derived>
1808 bool RecursiveASTVisitor<Derived>::TraverseVarHelper(VarDecl *D) {
1809 TRY_TO(TraverseDeclaratorHelper(D));
1811 if (!isa<ParmVarDecl>(D))
1812 TRY_TO(TraverseStmt(D->getInit()));
1822 if (TypeSourceInfo *TSI = D->getTypeAsWritten())
1823 TRY_TO(TraverseTypeLoc(TSI->getTypeLoc()));
1825 if (!getDerived().shouldVisitTemplateInstantiations() &&
1835 if (TemplateParameterList *TPL = D->getTemplateParameters()) {
1838 TRY_TO(TraverseDecl(*I));
1842 TRY_TO(TraverseTemplateArgumentLocsHelper(
1843 D->getTemplateArgsAsWritten()->getTemplateArgs(),
1844 D->getTemplateArgsAsWritten()->NumTemplateArgs));
1849 TRY_TO(TraverseVarHelper(D));
1859 TRY_TO(TraverseDeclaratorHelper(D));
1860 TRY_TO(TraverseStmt(D->getDefaultArgument()));
1864 TRY_TO(TraverseVarHelper(D));
1866 if (D->hasDefaultArg() && D->hasUninstantiatedDefaultArg() &&
1867 !D->hasUnparsedDefaultArg())
1868 TRY_TO(TraverseStmt(D->getUninstantiatedDefaultArg()));
1870 if (D->hasDefaultArg() && !D->hasUninstantiatedDefaultArg() &&
1871 !D->hasUnparsedDefaultArg())
1872 TRY_TO(TraverseStmt(D->getDefaultArg()));
1888 template <typename Derived>
\
1891 StmtQueueAction StmtQueue(*
this); \
1893 for (
Stmt *SubStmt : S->children()) { \
1894 StmtQueue.queue(SubStmt); \
1900 StmtQueue.queue(S->getAsmString());
1901 for (
unsigned I = 0, E = S->getNumInputs(); I < E; ++I) {
1902 StmtQueue.queue(S->getInputConstraintLiteral(I));
1904 for (
unsigned I = 0, E = S->getNumOutputs(); I < E; ++I) {
1905 StmtQueue.queue(S->getOutputConstraintLiteral(I));
1907 for (
unsigned I = 0, E = S->getNumClobbers(); I < E; ++I) {
1908 StmtQueue.queue(S->getClobberStringLiteral(I));
1920 TRY_TO(TraverseDecl(S->getExceptionDecl()));
1925 for (
auto *I : S->decls()) {
1961 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
1962 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
1969 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
1970 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
1971 if (S->hasExplicitTemplateArgs()) {
1972 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
1973 S->getNumTemplateArgs()));
1978 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
1979 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
1980 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
1981 S->getNumTemplateArgs()));
1985 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
1986 TRY_TO(TraverseDeclarationNameInfo(S->getNameInfo()));
1987 if (S->hasExplicitTemplateArgs()) {
1988 TRY_TO(TraverseTemplateArgumentLocsHelper(
1989 S->getExplicitTemplateArgs().getTemplateArgs(),
1990 S->getNumTemplateArgs()));
1995 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
1996 TRY_TO(TraverseDeclarationNameInfo(S->getMemberNameInfo()));
1997 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
1998 S->getNumTemplateArgs()));
2008 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2012 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2016 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2020 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2024 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2028 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2036 template <typename Derived>
2037 bool RecursiveASTVisitor<Derived>::TraverseInitListExpr(InitListExpr *S) {
2038 if (InitListExpr *Syn = S->getSyntacticForm())
2040 TRY_TO(WalkUpFromInitListExpr(S));
2041 StmtQueueAction StmtQueue(*
this);
2043 for (
Stmt *SubStmt : S->children()) {
2044 StmtQueue.queue(SubStmt);
2052 template <
typename Derived>
2053 bool RecursiveASTVisitor<Derived>::TraverseGenericSelectionExpr(
2054 GenericSelectionExpr *S) {
2055 TRY_TO(WalkUpFromGenericSelectionExpr(S));
2056 StmtQueueAction StmtQueue(*
this);
2057 StmtQueue.queue(S->getControllingExpr());
2058 for (
unsigned i = 0; i != S->getNumAssocs(); ++i) {
2059 if (TypeSourceInfo *TS = S->getAssocTypeSourceInfo(i))
2060 TRY_TO(TraverseTypeLoc(TS->getTypeLoc()));
2061 StmtQueue.queue(S->getAssocExpr(i));
2068 template <
typename Derived>
2070 RecursiveASTVisitor<Derived>::TraversePseudoObjectExpr(PseudoObjectExpr *S) {
2071 TRY_TO(WalkUpFromPseudoObjectExpr(S));
2072 StmtQueueAction StmtQueue(*
this);
2073 StmtQueue.queue(S->getSyntacticForm());
2075 e = S->semantics_end();
2078 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(sub))
2079 sub = OVE->getSourceExpr();
2080 StmtQueue.queue(sub);
2088 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2093 TRY_TO(TraverseTypeLoc(S->getAllocatedTypeSourceInfo()->getTypeLoc()));
2101 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2107 if (S->isArgumentType())
2108 TRY_TO(TraverseTypeLoc(S->getArgumentTypeInfo()->getTypeLoc()));
2114 if (S->isTypeOperand())
2115 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2119 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2125 if (S->isTypeOperand())
2126 TRY_TO(TraverseTypeLoc(S->getTypeOperandSourceInfo()->getTypeLoc()));
2130 for (
unsigned I = 0, N = S->getNumArgs(); I != N; ++I)
2131 TRY_TO(TraverseTypeLoc(S->getArg(I)->getTypeLoc()));
2135 TRY_TO(TraverseTypeLoc(S->getQueriedTypeSourceInfo()->getTypeLoc()));
2139 { StmtQueue.queue(S->getQueriedExpression()); })
2143 TRY_TO(TraverseTypeLoc(S->getWrittenTypeInfo()->getTypeLoc()));
2148 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2152 template <typename Derived>
2153 bool RecursiveASTVisitor<Derived>::TraverseLambdaExpr(LambdaExpr *S) {
2154 TRY_TO(WalkUpFromLambdaExpr(S));
2157 CEnd = S->explicit_capture_end();
2159 TRY_TO(TraverseLambdaCapture(S,
C));
2162 TypeLoc TL = S->getCallOperator()->getTypeSourceInfo()->getTypeLoc();
2163 FunctionProtoTypeLoc Proto = TL.castAs<FunctionProtoTypeLoc>();
2165 if (S->hasExplicitParameters() && S->hasExplicitResultType()) {
2167 TRY_TO(TraverseTypeLoc(TL));
2169 if (S->hasExplicitParameters()) {
2171 for (
unsigned I = 0, N = Proto.getNumParams(); I != N; ++I) {
2172 TRY_TO(TraverseDecl(Proto.getParam(I)));
2174 }
else if (S->hasExplicitResultType()) {
2175 TRY_TO(TraverseTypeLoc(Proto.getReturnLoc()));
2178 auto *T = Proto.getTypePtr();
2179 for (
const auto &E : T->exceptions()) {
2183 if (Expr *NE = T->getNoexceptExpr())
2184 TRY_TO(TraverseStmt(NE));
2187 TRY_TO(TraverseLambdaBody(S));
2193 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2207 TRY_TO(TraverseDecl(S->getBlockDecl()));
2212 TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
2223 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2224 if (TypeSourceInfo *ScopeInfo = S->getScopeTypeInfo())
2225 TRY_TO(TraverseTypeLoc(ScopeInfo->getTypeLoc()));
2226 if (TypeSourceInfo *DestroyedTypeInfo = S->getDestroyedTypeInfo())
2227 TRY_TO(TraverseTypeLoc(DestroyedTypeInfo->getTypeLoc()));
2240 if (TypeSourceInfo *TInfo = S->getEncodedTypeSourceInfo())
2241 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2246 if (TypeSourceInfo *TInfo = S->getClassReceiverTypeInfo())
2247 TRY_TO(TraverseTypeLoc(TInfo->getTypeLoc()));
2255 TRY_TO(TraverseTypeLoc(S->getTypeInfoAsWritten()->getTypeLoc()));
2264 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2265 if (S->hasExplicitTemplateArgs()) {
2266 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2267 S->getNumTemplateArgs()));
2272 TRY_TO(TraverseNestedNameSpecifierLoc(S->getQualifierLoc()));
2273 if (S->hasExplicitTemplateArgs()) {
2274 TRY_TO(TraverseTemplateArgumentLocsHelper(S->getTemplateArgs(),
2275 S->getNumTemplateArgs()));
2322 template <typename Derived>
2323 bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
2324 OMPExecutableDirective *S) {
2325 for (
auto *
C : S->clauses()) {
2331 template <
typename Derived>
2333 RecursiveASTVisitor<Derived>::TraverseOMPLoopDirective(OMPLoopDirective *S) {
2334 return TraverseOMPExecutableDirective(S);
2338 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2341 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2344 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2347 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2350 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2353 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2356 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2359 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2362 TRY_TO(TraverseDeclarationNameInfo(S->getDirectiveName()));
2363 TRY_TO(TraverseOMPExecutableDirective(S));
2367 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2370 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2373 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2376 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2379 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2382 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2385 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2388 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2391 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2394 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2397 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2400 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2403 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2406 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2409 {
TRY_TO(TraverseOMPExecutableDirective(S)); })
2412 template <typename Derived>
2413 bool RecursiveASTVisitor<Derived>::TraverseOMPClause(OMPClause *
C) {
2416 switch (C->getClauseKind()) {
2417 #define OPENMP_CLAUSE(Name, Class) \
2419 TRY_TO(Visit##Class(static_cast<Class *>(C))); \
2421 #include "clang/Basic/OpenMPKinds.def"
2429 template <
typename Derived>
2430 bool RecursiveASTVisitor<Derived>::VisitOMPIfClause(OMPIfClause *C) {
2431 TRY_TO(TraverseStmt(C->getCondition()));
2435 template <
typename Derived>
2436 bool RecursiveASTVisitor<Derived>::VisitOMPFinalClause(OMPFinalClause *C) {
2437 TRY_TO(TraverseStmt(C->getCondition()));
2441 template <
typename Derived>
2443 RecursiveASTVisitor<Derived>::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) {
2444 TRY_TO(TraverseStmt(C->getNumThreads()));
2448 template <
typename Derived>
2449 bool RecursiveASTVisitor<Derived>::VisitOMPSafelenClause(OMPSafelenClause *C) {
2450 TRY_TO(TraverseStmt(C->getSafelen()));
2454 template <
typename Derived>
2456 RecursiveASTVisitor<Derived>::VisitOMPCollapseClause(OMPCollapseClause *C) {
2457 TRY_TO(TraverseStmt(C->getNumForLoops()));
2461 template <
typename Derived>
2462 bool RecursiveASTVisitor<Derived>::VisitOMPDefaultClause(OMPDefaultClause *) {
2466 template <
typename Derived>
2467 bool RecursiveASTVisitor<Derived>::VisitOMPProcBindClause(OMPProcBindClause *) {
2471 template <
typename Derived>
2473 RecursiveASTVisitor<Derived>::VisitOMPScheduleClause(OMPScheduleClause *C) {
2474 TRY_TO(TraverseStmt(C->getChunkSize()));
2475 TRY_TO(TraverseStmt(C->getHelperChunkSize()));
2479 template <
typename Derived>
2480 bool RecursiveASTVisitor<Derived>::VisitOMPOrderedClause(OMPOrderedClause *) {
2484 template <
typename Derived>
2485 bool RecursiveASTVisitor<Derived>::VisitOMPNowaitClause(OMPNowaitClause *) {
2489 template <
typename Derived>
2490 bool RecursiveASTVisitor<Derived>::VisitOMPUntiedClause(OMPUntiedClause *) {
2494 template <
typename Derived>
2496 RecursiveASTVisitor<Derived>::VisitOMPMergeableClause(OMPMergeableClause *) {
2500 template <
typename Derived>
2501 bool RecursiveASTVisitor<Derived>::VisitOMPReadClause(OMPReadClause *) {
2505 template <
typename Derived>
2506 bool RecursiveASTVisitor<Derived>::VisitOMPWriteClause(OMPWriteClause *) {
2510 template <
typename Derived>
2511 bool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
2515 template <
typename Derived>
2516 bool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
2520 template <
typename Derived>
2521 bool RecursiveASTVisitor<Derived>::VisitOMPSeqCstClause(OMPSeqCstClause *) {
2525 template <
typename Derived>
2526 template <
typename T>
2527 bool RecursiveASTVisitor<Derived>::VisitOMPClauseList(T *
Node) {
2528 for (
auto *E : Node->varlists()) {
2534 template <
typename Derived>
2535 bool RecursiveASTVisitor<Derived>::VisitOMPPrivateClause(OMPPrivateClause *C) {
2536 TRY_TO(VisitOMPClauseList(C));
2537 for (
auto *E : C->private_copies()) {
2543 template <
typename Derived>
2544 bool RecursiveASTVisitor<Derived>::VisitOMPFirstprivateClause(
2545 OMPFirstprivateClause *C) {
2546 TRY_TO(VisitOMPClauseList(C));
2547 for (
auto *E : C->private_copies()) {
2550 for (
auto *E : C->inits()) {
2556 template <
typename Derived>
2557 bool RecursiveASTVisitor<Derived>::VisitOMPLastprivateClause(
2558 OMPLastprivateClause *C) {
2559 TRY_TO(VisitOMPClauseList(C));
2560 for (
auto *E : C->private_copies()) {
2563 for (
auto *E : C->source_exprs()) {
2566 for (
auto *E : C->destination_exprs()) {
2569 for (
auto *E : C->assignment_ops()) {
2575 template <
typename Derived>
2576 bool RecursiveASTVisitor<Derived>::VisitOMPSharedClause(OMPSharedClause *C) {
2577 TRY_TO(VisitOMPClauseList(C));
2581 template <
typename Derived>
2582 bool RecursiveASTVisitor<Derived>::VisitOMPLinearClause(
OMPLinearClause *C) {
2583 TRY_TO(TraverseStmt(C->getStep()));
2584 TRY_TO(TraverseStmt(C->getCalcStep()));
2585 TRY_TO(VisitOMPClauseList(C));
2586 for (
auto *E : C->inits()) {
2589 for (
auto *E : C->updates()) {
2592 for (
auto *E : C->finals()) {
2598 template <
typename Derived>
2599 bool RecursiveASTVisitor<Derived>::VisitOMPAlignedClause(
OMPAlignedClause *C) {
2601 TRY_TO(VisitOMPClauseList(C));
2605 template <
typename Derived>
2606 bool RecursiveASTVisitor<Derived>::VisitOMPCopyinClause(
OMPCopyinClause *C) {
2607 TRY_TO(VisitOMPClauseList(C));
2620 template <
typename Derived>
2621 bool RecursiveASTVisitor<Derived>::VisitOMPCopyprivateClause(
2623 TRY_TO(VisitOMPClauseList(C));
2636 template <
typename Derived>
2638 RecursiveASTVisitor<Derived>::VisitOMPReductionClause(OMPReductionClause *C) {
2639 TRY_TO(TraverseNestedNameSpecifierLoc(C->getQualifierLoc()));
2640 TRY_TO(TraverseDeclarationNameInfo(C->getNameInfo()));
2641 TRY_TO(VisitOMPClauseList(C));
2642 for (
auto *E : C->lhs_exprs()) {
2645 for (
auto *E : C->rhs_exprs()) {
2648 for (
auto *E : C->reduction_ops()) {
2654 template <
typename Derived>
2655 bool RecursiveASTVisitor<Derived>::VisitOMPFlushClause(
OMPFlushClause *C) {
2656 TRY_TO(VisitOMPClauseList(C));
2660 template <
typename Derived>
2661 bool RecursiveASTVisitor<Derived>::VisitOMPDependClause(
OMPDependClause *C) {
2662 TRY_TO(VisitOMPClauseList(C));
2683 #undef DEF_TRAVERSE_STMT
2687 #undef RecursiveASTVisitor
2691 #endif // LLVM_CLANG_LIBCLANG_RECURSIVEASTVISITOR_H
Expr * getSourceExpression() const
This represents clause 'copyin' in the '#pragma omp ...' directives.
helper_expr_const_range source_exprs() const
bool TraverseLambdaBody(LambdaExpr *LE)
Recursively visit the body of a lambda expression.
Expr *const * semantics_iterator
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in...
NestedNameSpecifierLoc getPrefix() const
Return the prefix of this nested-name-specifier.
Defines the C++ template declaration subclasses.
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
bool VisitTypeLoc(TypeLoc TL)
NestedNameSpecifier * getPrefix() const
Return the prefix of this nested name specifier.
A container of type source information.
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool TraverseTemplateName(TemplateName Template)
Recursively visit a template name and dispatch to the appropriate method.
Describes the capture of a variable or of this, or of a C++1y init-capture.
Expr * getAlignment()
Returns alignment.
An identifier, stored as an IdentifierInfo*.
TRY_TO(TraverseType(T->getPointeeType()))
Expr * getInit() const
Get the initializer.
Wrapper of type source information for a type with non-trivial direct qualifiers. ...
Derived & getDerived()
Return a reference to the derived class.
Represents an empty template argument, e.g., one that has not been deduced.
A namespace, stored as a NamespaceDecl*.
This represents implicit clause 'flush' for the '#pragma omp flush' directive. This clause does not e...
Defines the Objective-C statement AST node classes.
Defines the clang::Expr interface and subclasses for C++ expressions.
bool TraverseDecl(Decl *D)
Recursively visit a declaration, by dispatching to Traverse*Decl() based on the argument's dynamic ty...
Base wrapper for a particular "section" of type source info.
DeclarationName getName() const
getName - Returns the embedded declaration name.
A C++ nested-name-specifier augmented with source location information.
Represents a dependent template name that cannot be resolved prior to template instantiation.
bool shouldVisitTemplateInstantiations() const
Return whether this visitor should recurse into template instantiations.
bool TraverseLambdaCapture(LambdaExpr *LE, const LambdaCapture *C)
Recursively visit a lambda capture.
#define STMT(CLASS, PARENT)
Wrapper of type source information for a type with no direct qualifiers.
TypeSourceInfo * getTypeSourceInfo() const
TypeSourceInfo * getNamedTypeInfo() const
This represents clause 'copyprivate' in the '#pragma omp ...' directives.
#define RecursiveASTVisitor
NamedDecl ** iterator
Iterates through the template parameters in this list.
bool TraverseDeclarationNameInfo(DeclarationNameInfo NameInfo)
Recursively visit a name with its location information.
NestedNameSpecifierLoc getTemplateQualifierLoc() const
A builtin binary operation expression such as "x + y" or "x <= y".
bool WalkUpFromType(Type *T)
TypeClass getTypeClass() const
VarDecl * getCapturedVar() const
Retrieve the declaration of the local variable being captured.
CompoundStmt * getBody() const
Retrieve the body of the lambda.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
bool WalkUpFromStmt(Stmt *S)
A class that does preorder depth-first traversal on the entire Clang AST and visits each node...
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
bool WalkUpFromTypeLoc(TypeLoc TL)
TypeLoc getTypeLoc() const
For a nested-name-specifier that refers to a type, retrieve the type with source-location information...
This represents clause 'aligned' in the '#pragma omp ...' directives.
DEF_TRAVERSE_TYPE(ComplexType,{TRY_TO(TraverseType(T->getElementType()));}) DEF_TRAVERSE_TYPE(PointerType
NameKind getNameKind() const
getNameKind - Determine what kind of name this is.
This represents implicit clause 'depend' for the '#pragma omp task' directive.
SpecifierKind getKind() const
Determine what kind of nested name specifier is stored.
bool TraverseConstructorInitializer(CXXCtorInitializer *Init)
Recursively visit a constructor initializer. This automatically dispatches to another visitor for the...
helper_expr_const_range assignment_ops() const
bool WalkUpFromDecl(Decl *D)
bool WalkUpFromQualifiedTypeLoc(QualifiedTypeLoc TL)
ArgKind getKind() const
Return the kind of stored template argument.
ParmVarDecl *const * param_iterator
bool VisitQualifiedTypeLoc(QualifiedTypeLoc TL)
Represents a C++ template name within the type system.
Defines the clang::TypeLoc interface and its subclasses.
A namespace alias, stored as a NamespaceAliasDecl*.
OMPLinearClause(SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, unsigned NumVars)
Build 'linear' clause with given number of variables NumVars.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion, return the pattern as a template name.
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
A type, stored as a Type*.
DEF_TRAVERSE_TYPELOC(ComplexType,{TRY_TO(TraverseType(TL.getTypePtr() ->getElementType()));}) DEF_TRAVERSE_TYPELOC(PointerType
return TraverseArrayTypeLocHelper(TL)
#define TYPE(CLASS, BASE)
helper_expr_const_range destination_exprs() const
bool WalkUpFromUnqualTypeLoc(UnqualTypeLoc TL)
#define DEF_TRAVERSE_DECL(DECL, CODE)
bool TraverseTypeLoc(TypeLoc TL)
Recursively visit a type with location, by dispatching to Traverse*TypeLoc() based on the argument ty...
bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS)
Recursively visit a C++ nested-name-specifier with location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
This file defines OpenMP nodes for declarative directives.
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
TypeLocClass getTypeLocClass() const
bool TraverseType(QualType T)
Recursively visit a type, by dispatching to Traverse*Type() based on the argument's getTypeClass() pr...
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
#define DEF_TRAVERSE_STMT(STMT, CODE)
ast_type_traits::DynTypedNode Node
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T-> getSizeExpr()))
Represents a template argument.
QualType getAsType() const
Retrieve the type for a type template argument.
Represents a template name that was expressed as a qualified name.
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
return(x >> y)|(x<< (32-y))
const internal::VariadicDynCastAllOfMatcher< Stmt, CUDAKernelCallExpr > CUDAKernelCallExpr
Matches CUDA kernel call expression.
for(auto typeArg:T->getTypeArgsAsWritten())
A type that was preceded by the 'template' keyword, stored as a Type*.
This file defines OpenMP AST classes for executable directives and clauses.
bool TraverseTemplateArgument(const TemplateArgument &Arg)
Recursively visit a template argument and dispatch to the appropriate method for the argument type...
Represents a C++ base or member initializer.
UnqualTypeLoc getUnqualifiedLoc() const
The template argument is a type.
bool TraverseNestedNameSpecifier(NestedNameSpecifier *NNS)
Recursively visit a C++ nested-name-specifier.
helper_expr_const_range destination_exprs() const
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate.h) and friends (in DeclFriend.h).
unsigned pack_size() const
The number of template arguments in the given template argument pack.
NestedNameSpecifier * getNestedNameSpecifier() const
Retrieve the nested-name-specifier to which this instance refers.
const Capture * capture_iterator
An iterator that walks over the captures of the lambda, both implicit and explicit.
bool TraverseTemplateArguments(const TemplateArgument *Args, unsigned NumArgs)
Recursively visit a set of template arguments. This can be overridden by a subclass, but it's not expected that will be needed – this visitor always dispatches to another.
bool TraverseAttr(Attr *At)
Recursively visit an attribute, by dispatching to Traverse*Attr() based on the argument's dynamic typ...
UnqualTypeLoc getUnqualifiedLoc() const
Skips past any qualifiers, if this is qualified.
bool VisitUnqualTypeLoc(UnqualTypeLoc TL)
bool isNull() const
isNull - Return true if this QualType doesn't point to a type yet.
The global specifier '::'. There is no stored value.
bool shouldWalkTypesOfTypeLocs() const
Return whether this visitor should recurse into the types of TypeLocs.
const TemplateArgument & getArgument() const
StmtQueueAction(RecursiveASTVisitor &RAV)
bool TraverseStmt(Stmt *S)
Recursively visit a statement or expression, by dispatching to Traverse*() based on the argument's dy...
bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc)
Recursively visit a template argument location and dispatch to the appropriate method for the argumen...
Attr - This represents one attribute.
helper_expr_const_range assignment_ops() const
helper_expr_const_range source_exprs() const