[clang] [clang-tools-extra] [Clang] [NFC] Migrate more AST visitors (PR #160290)

via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 23 06:02:10 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-tools-extra

Author: None (Sirraide)

<details>
<summary>Changes</summary>

This migrates a few dozen more AST visitors to use DRAV; for more information, see #<!-- -->115144. This also adds `const` in a number of places and removes around 30 uses of `const_cast`.

LLVM compiler time tracker link for this branch: https://llvm-compile-time-tracker.com/compare.php?from=ebcf1bf2ecba6b25ece3c2bbddb4485e76189387&to=a832fd0afe94c9ed3ac81544820919b49ee2f0ef&stat=instructions:u

---

Patch is 206.95 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/160290.diff


54 Files Affected:

- (modified) clang-tools-extra/clang-doc/Mapper.h (+11-11) 
- (modified) clang-tools-extra/clang-tidy/bugprone/AssignmentInIfConditionCheck.cpp (+8-11) 
- (modified) clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp (+9-9) 
- (modified) clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp (+7-7) 
- (modified) clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp (+26-25) 
- (modified) clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.h (+37-53) 
- (modified) clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp (+4-7) 
- (modified) clang-tools-extra/clang-tidy/modernize/UseTrailingReturnTypeCheck.cpp (+11-11) 
- (modified) clang-tools-extra/clang-tidy/readability/ConvertMemberFunctionsToStatic.cpp (+6-4) 
- (modified) clang-tools-extra/clang-tidy/readability/FunctionCognitiveComplexityCheck.cpp (+19-14) 
- (modified) clang-tools-extra/clang-tidy/readability/FunctionSizeCheck.cpp (+13-13) 
- (modified) clang-tools-extra/clang-tidy/readability/MakeMemberFunctionConstCheck.cpp (+5-5) 
- (modified) clang-tools-extra/clang-tidy/readability/SimplifyBooleanExprCheck.cpp (+17-16) 
- (modified) clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp (+24-27) 
- (modified) clang-tools-extra/clangd/AST.cpp (+25-25) 
- (modified) clang-tools-extra/clangd/AST.h (+1-1) 
- (modified) clang-tools-extra/clangd/DumpAST.cpp (+36-30) 
- (modified) clang-tools-extra/clangd/FindTarget.cpp (+22-22) 
- (modified) clang-tools-extra/clangd/InlayHints.cpp (+27-27) 
- (modified) clang-tools-extra/clangd/SemanticHighlighting.cpp (+48-44) 
- (modified) clang-tools-extra/clangd/XRefs.cpp (+13-13) 
- (modified) clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp (+5-5) 
- (modified) clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp (+15-17) 
- (modified) clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp (+9-11) 
- (modified) clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/unittests/ASTTests.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/unittests/PrintASTTests.cpp (+3-3) 
- (modified) clang-tools-extra/clangd/unittests/TestTU.cpp (+3-3) 
- (modified) clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp (+7-7) 
- (modified) clang-tools-extra/include-cleaner/unittests/LocateSymbolTest.cpp (+3-3) 
- (modified) clang-tools-extra/modularize/Modularize.cpp (+59-43) 
- (modified) clang-tools-extra/unittests/clang-doc/SerializeTest.cpp (+15-10) 
- (modified) clang-tools-extra/unittests/clang-tidy/OverlappingReplacementsTest.cpp (+4-4) 
- (modified) clang/include/clang/AST/DynamicRecursiveASTVisitor.h (+1-2) 
- (modified) clang/include/clang/AST/RecursiveASTVisitor.h (+2) 
- (modified) clang/include/clang/InstallAPI/Visitor.h (+11-9) 
- (modified) clang/lib/AST/ASTImporterLookupTable.cpp (+11-10) 
- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+10-11) 
- (modified) clang/lib/CodeGen/CGHLSLRuntime.cpp (+4-4) 
- (modified) clang/lib/CodeGen/CodeGenModule.cpp (+10-11) 
- (modified) clang/lib/CodeGen/CodeGenPGO.cpp (+25-25) 
- (modified) clang/lib/CodeGen/ObjectFilePCHContainerWriter.cpp (+7-7) 
- (modified) clang/lib/Frontend/ASTConsumers.cpp (+120-118) 
- (modified) clang/lib/Frontend/InterfaceStubFunctionsConsumer.cpp (+4-4) 
- (modified) clang/lib/Index/IndexBody.cpp (+46-45) 
- (modified) clang/lib/Index/IndexTypeSourceInfo.cpp (+21-20) 
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/ForwardDeclChecker.cpp (+14-15) 
- (modified) clang/lib/StaticAnalyzer/Checkers/WebKit/RetainPtrCtorAdoptChecker.cpp (+16-17) 
- (modified) clang/lib/Tooling/ASTDiff/ASTDiff.cpp (+12-9) 
- (modified) clang/lib/Tooling/Refactoring/Rename/USRFinder.cpp (+3-5) 
- (modified) clang/lib/Tooling/Refactoring/Rename/USRFindingAction.cpp (+6-7) 
- (modified) clang/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp (+11-12) 
- (modified) clang/unittests/AST/RecursiveASTVisitorTest.cpp (+18-18) 
- (modified) clang/unittests/Frontend/NoAlterCodeGenActionTest.cpp (+4-4) 


``````````diff
diff --git a/clang-tools-extra/clang-doc/Mapper.h b/clang-tools-extra/clang-doc/Mapper.h
index 322df6d594b3d..3d2e505515715 100644
--- a/clang-tools-extra/clang-doc/Mapper.h
+++ b/clang-tools-extra/clang-doc/Mapper.h
@@ -18,7 +18,7 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_MAPPER_H
 
 #include "Representation.h"
-#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/DynamicRecursiveASTVisitor.h"
 #include "clang/Tooling/Execution.h"
 
 using namespace clang::comments;
@@ -27,22 +27,22 @@ using namespace clang::tooling;
 namespace clang {
 namespace doc {
 
-class MapASTVisitor : public clang::RecursiveASTVisitor<MapASTVisitor>,
+class MapASTVisitor : public ConstDynamicRecursiveASTVisitor,
                       public ASTConsumer {
 public:
   explicit MapASTVisitor(ASTContext *Ctx, ClangDocContext CDCtx)
       : CDCtx(CDCtx) {}
 
   void HandleTranslationUnit(ASTContext &Context) override;
-  bool VisitNamespaceDecl(const NamespaceDecl *D);
-  bool VisitRecordDecl(const RecordDecl *D);
-  bool VisitEnumDecl(const EnumDecl *D);
-  bool VisitCXXMethodDecl(const CXXMethodDecl *D);
-  bool VisitFunctionDecl(const FunctionDecl *D);
-  bool VisitTypedefDecl(const TypedefDecl *D);
-  bool VisitTypeAliasDecl(const TypeAliasDecl *D);
-  bool VisitConceptDecl(const ConceptDecl *D);
-  bool VisitVarDecl(const VarDecl *D);
+  bool VisitNamespaceDecl(const NamespaceDecl *D) override;
+  bool VisitRecordDecl(const RecordDecl *D) override;
+  bool VisitEnumDecl(const EnumDecl *D) override;
+  bool VisitCXXMethodDecl(const CXXMethodDecl *D) override;
+  bool VisitFunctionDecl(const FunctionDecl *D) override;
+  bool VisitTypedefDecl(const TypedefDecl *D) override;
+  bool VisitTypeAliasDecl(const TypeAliasDecl *D) override;
+  bool VisitConceptDecl(const ConceptDecl *D) override;
+  bool VisitVarDecl(const VarDecl *D) override;
 
 private:
   template <typename T> bool mapDecl(const T *D, bool IsDefinition);
diff --git a/clang-tools-extra/clang-tidy/bugprone/AssignmentInIfConditionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/AssignmentInIfConditionCheck.cpp
index 2c8856298e7be..66e34418fb0ac 100644
--- a/clang-tools-extra/clang-tidy/bugprone/AssignmentInIfConditionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/AssignmentInIfConditionCheck.cpp
@@ -8,7 +8,7 @@
 
 #include "AssignmentInIfConditionCheck.h"
 #include "clang/AST/ASTContext.h"
-#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/DynamicRecursiveASTVisitor.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 
 using namespace clang::ast_matchers;
@@ -21,13 +21,13 @@ void AssignmentInIfConditionCheck::registerMatchers(MatchFinder *Finder) {
 
 void AssignmentInIfConditionCheck::check(
     const ast_matchers::MatchFinder::MatchResult &Result) {
-  class Visitor : public RecursiveASTVisitor<Visitor> {
+  class Visitor : public ConstDynamicRecursiveASTVisitor {
     AssignmentInIfConditionCheck &Check;
 
   public:
     explicit Visitor(AssignmentInIfConditionCheck &Check) : Check(Check) {}
-    bool VisitIfStmt(IfStmt *If) {
-      class ConditionVisitor : public RecursiveASTVisitor<ConditionVisitor> {
+    bool VisitIfStmt(const IfStmt *If) override {
+      class ConditionVisitor : public ConstDynamicRecursiveASTVisitor {
         AssignmentInIfConditionCheck &Check;
 
       public:
@@ -35,23 +35,20 @@ void AssignmentInIfConditionCheck::check(
             : Check(Check) {}
 
         // Dont traverse into any lambda expressions.
-        bool TraverseLambdaExpr(LambdaExpr *, DataRecursionQueue * = nullptr) {
-          return true;
-        }
+        bool TraverseLambdaExpr(const LambdaExpr *) override { return true; }
 
         // Dont traverse into any requires expressions.
-        bool TraverseRequiresExpr(RequiresExpr *,
-                                  DataRecursionQueue * = nullptr) {
+        bool TraverseRequiresExpr(const RequiresExpr *) override {
           return true;
         }
 
-        bool VisitBinaryOperator(BinaryOperator *BO) {
+        bool VisitBinaryOperator(const BinaryOperator *BO) override {
           if (BO->isAssignmentOp())
             Check.report(BO);
           return true;
         }
 
-        bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr *OCE) {
+        bool VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *OCE) override {
           if (OCE->isAssignmentOp())
             Check.report(OCE);
           return true;
diff --git a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
index d8207b30f1b5e..1a677b512320c 100644
--- a/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/EasilySwappableParametersCheck.cpp
@@ -9,7 +9,7 @@
 #include "EasilySwappableParametersCheck.h"
 #include "../utils/OptionsUtils.h"
 #include "clang/AST/ASTContext.h"
-#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/DynamicRecursiveASTVisitor.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Lex/Lexer.h"
 #include "llvm/ADT/SmallSet.h"
@@ -1600,8 +1600,8 @@ static bool lazyMapOfSetsIntersectionExists(const MapTy &Map, const ElemTy &E1,
 /// a usage for both in the same strict expression subtree. A strict
 /// expression subtree is a tree which only includes Expr nodes, i.e. no
 /// Stmts and no Decls.
-class AppearsInSameExpr : public RecursiveASTVisitor<AppearsInSameExpr> {
-  using Base = RecursiveASTVisitor<AppearsInSameExpr>;
+class AppearsInSameExpr : public ConstDynamicRecursiveASTVisitor {
+  using Base = ConstDynamicRecursiveASTVisitor;
 
   const FunctionDecl *FD;
   const Expr *CurrentExprOnlyTreeRoot = nullptr;
@@ -1612,7 +1612,7 @@ class AppearsInSameExpr : public RecursiveASTVisitor<AppearsInSameExpr> {
 public:
   void setup(const FunctionDecl *FD) {
     this->FD = FD;
-    TraverseFunctionDecl(const_cast<FunctionDecl *>(FD));
+    TraverseFunctionDecl(FD);
   }
 
   bool operator()(const ParmVarDecl *Param1, const ParmVarDecl *Param2) const {
@@ -1620,13 +1620,13 @@ class AppearsInSameExpr : public RecursiveASTVisitor<AppearsInSameExpr> {
                                            Param2);
   }
 
-  bool TraverseDecl(Decl *D) {
+  bool TraverseDecl(const Decl *D) override {
     CurrentExprOnlyTreeRoot = nullptr;
     return Base::TraverseDecl(D);
   }
 
-  bool TraverseStmt(Stmt *S, DataRecursionQueue *Queue = nullptr) {
-    if (auto *E = dyn_cast_or_null<Expr>(S)) {
+  bool TraverseStmt(const Stmt *S) override {
+    if (const auto *E = dyn_cast_or_null<Expr>(S)) {
       bool RootSetInCurrentStackFrame = false;
       if (!CurrentExprOnlyTreeRoot) {
         CurrentExprOnlyTreeRoot = E;
@@ -1646,11 +1646,11 @@ class AppearsInSameExpr : public RecursiveASTVisitor<AppearsInSameExpr> {
     return Base::TraverseStmt(S);
   }
 
-  bool VisitDeclRefExpr(DeclRefExpr *DRE) {
+  bool VisitDeclRefExpr(const DeclRefExpr *DRE) override {
     if (!CurrentExprOnlyTreeRoot)
       return true;
 
-    if (auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
+    if (const auto *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl()))
       if (llvm::find(FD->parameters(), PVD))
         ParentExprsForParamRefs[PVD].insert(CurrentExprOnlyTreeRoot);
 
diff --git a/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp b/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp
index 9f4c215614287..47b592842df5b 100644
--- a/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/DeprecatedHeadersCheck.cpp
@@ -7,7 +7,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "DeprecatedHeadersCheck.h"
-#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/DynamicRecursiveASTVisitor.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Lex/PPCallbacks.h"
 #include "clang/Lex/Preprocessor.h"
@@ -44,19 +44,19 @@ class IncludeModernizePPCallbacks : public PPCallbacks {
   bool CheckHeaderFile;
 };
 
-class ExternCRefutationVisitor
-    : public RecursiveASTVisitor<ExternCRefutationVisitor> {
+class ExternCRefutationVisitor : public ConstDynamicRecursiveASTVisitor {
   std::vector<IncludeMarker> &IncludesToBeProcessed;
   const SourceManager &SM;
 
 public:
   ExternCRefutationVisitor(std::vector<IncludeMarker> &IncludesToBeProcessed,
                            SourceManager &SM)
-      : IncludesToBeProcessed(IncludesToBeProcessed), SM(SM) {}
-  bool shouldWalkTypesOfTypeLocs() const { return false; }
-  bool shouldVisitLambdaBody() const { return false; }
+      : IncludesToBeProcessed(IncludesToBeProcessed), SM(SM) {
+    ShouldWalkTypesOfTypeLocs = false;
+    ShouldVisitLambdaBody = false;
+  }
 
-  bool VisitLinkageSpecDecl(LinkageSpecDecl *LinkSpecDecl) const {
+  bool VisitLinkageSpecDecl(const LinkageSpecDecl *LinkSpecDecl) override {
     if (LinkSpecDecl->getLanguage() != LinkageSpecLanguageIDs::C ||
         !LinkSpecDecl->hasBraces())
       return true;
diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp
index 286c39be44ce4..f9de75656a0d9 100644
--- a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.cpp
@@ -34,10 +34,10 @@ namespace clang::tidy::modernize {
 /// RecursiveASTVisitor::TraverseStmt() and pop_back() afterwards. The Stmt atop
 /// the stack is the parent of the current statement (NULL for the topmost
 /// statement).
-bool StmtAncestorASTVisitor::TraverseStmt(Stmt *Statement) {
+bool StmtAncestorASTVisitor::TraverseStmt(const Stmt *Statement) {
   StmtAncestors.insert(std::make_pair(Statement, StmtStack.back()));
   StmtStack.push_back(Statement);
-  RecursiveASTVisitor<StmtAncestorASTVisitor>::TraverseStmt(Statement);
+  ConstDynamicRecursiveASTVisitor::TraverseStmt(Statement);
   StmtStack.pop_back();
   return true;
 }
@@ -47,7 +47,7 @@ bool StmtAncestorASTVisitor::TraverseStmt(Stmt *Statement) {
 /// Combined with StmtAncestors, this provides roughly the same information as
 /// Scope, as we can map a VarDecl to its DeclStmt, then walk up the parent tree
 /// using StmtAncestors.
-bool StmtAncestorASTVisitor::VisitDeclStmt(DeclStmt *Statement) {
+bool StmtAncestorASTVisitor::VisitDeclStmt(const DeclStmt *Statement) {
   for (const auto *Decl : Statement->decls()) {
     if (const auto *V = dyn_cast<VarDecl>(Decl))
       DeclParents.insert(std::make_pair(V, Statement));
@@ -56,27 +56,27 @@ bool StmtAncestorASTVisitor::VisitDeclStmt(DeclStmt *Statement) {
 }
 
 /// record the DeclRefExpr as part of the parent expression.
-bool ComponentFinderASTVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
+bool ComponentFinderASTVisitor::VisitDeclRefExpr(const DeclRefExpr *E) {
   Components.push_back(E);
   return true;
 }
 
 /// record the MemberExpr as part of the parent expression.
-bool ComponentFinderASTVisitor::VisitMemberExpr(MemberExpr *Member) {
+bool ComponentFinderASTVisitor::VisitMemberExpr(const MemberExpr *Member) {
   Components.push_back(Member);
   return true;
 }
 
 /// Forward any DeclRefExprs to a check on the referenced variable
 /// declaration.
-bool DependencyFinderASTVisitor::VisitDeclRefExpr(DeclRefExpr *DeclRef) {
+bool DependencyFinderASTVisitor::VisitDeclRefExpr(const DeclRefExpr *DeclRef) {
   if (auto *V = dyn_cast_or_null<VarDecl>(DeclRef->getDecl()))
     return VisitVarDecl(V);
   return true;
 }
 
 /// Determine if any this variable is declared inside the ContainingStmt.
-bool DependencyFinderASTVisitor::VisitVarDecl(VarDecl *V) {
+bool DependencyFinderASTVisitor::VisitVarDecl(const VarDecl *V) {
   const Stmt *Curr = DeclParents->lookup(V);
   // First, see if the variable was declared within an inner scope of the loop.
   while (Curr != nullptr) {
@@ -100,7 +100,7 @@ bool DependencyFinderASTVisitor::VisitVarDecl(VarDecl *V) {
 
 /// If we already created a variable for TheLoop, check to make sure
 /// that the name was not already taken.
-bool DeclFinderASTVisitor::VisitForStmt(ForStmt *TheLoop) {
+bool DeclFinderASTVisitor::VisitForStmt(const ForStmt *TheLoop) {
   StmtGeneratedVarNameMap::const_iterator I = GeneratedDecls->find(TheLoop);
   if (I != GeneratedDecls->end() && I->second == Name) {
     Found = true;
@@ -111,7 +111,7 @@ bool DeclFinderASTVisitor::VisitForStmt(ForStmt *TheLoop) {
 
 /// If any named declaration within the AST subtree has the same name,
 /// then consider Name already taken.
-bool DeclFinderASTVisitor::VisitNamedDecl(NamedDecl *D) {
+bool DeclFinderASTVisitor::VisitNamedDecl(const NamedDecl *D) {
   const IdentifierInfo *Ident = D->getIdentifier();
   if (Ident && Ident->getName() == Name) {
     Found = true;
@@ -122,7 +122,7 @@ bool DeclFinderASTVisitor::VisitNamedDecl(NamedDecl *D) {
 
 /// Forward any declaration references to the actual check on the
 /// referenced declaration.
-bool DeclFinderASTVisitor::VisitDeclRefExpr(DeclRefExpr *DeclRef) {
+bool DeclFinderASTVisitor::VisitDeclRefExpr(const DeclRefExpr *DeclRef) {
   if (auto *D = dyn_cast<NamedDecl>(DeclRef->getDecl()))
     return VisitNamedDecl(D);
   return true;
@@ -497,7 +497,7 @@ void ForLoopIndexUseVisitor::addUsage(const Usage &U) {
 ///     int k = *i + 2;
 ///   }
 /// \endcode
-bool ForLoopIndexUseVisitor::TraverseUnaryOperator(UnaryOperator *Uop) {
+bool ForLoopIndexUseVisitor::TraverseUnaryOperator(const UnaryOperator *Uop) {
   // If we dereference an iterator that's actually a pointer, count the
   // occurrence.
   if (isDereferenceOfUop(Uop, IndexVar)) {
@@ -533,7 +533,7 @@ bool ForLoopIndexUseVisitor::TraverseUnaryOperator(UnaryOperator *Uop) {
 ///   }
 /// \endcode
 /// will not.
-bool ForLoopIndexUseVisitor::TraverseMemberExpr(MemberExpr *Member) {
+bool ForLoopIndexUseVisitor::TraverseMemberExpr(const MemberExpr *Member) {
   const Expr *Base = Member->getBase();
   const DeclRefExpr *Obj = getDeclRef(Base);
   const Expr *ResultExpr = Member;
@@ -593,8 +593,8 @@ bool ForLoopIndexUseVisitor::TraverseMemberExpr(MemberExpr *Member) {
 /// Calls on the iterator object are not permitted, unless done through
 /// operator->(). The one exception is allowing vector::at() for pseudoarrays.
 bool ForLoopIndexUseVisitor::TraverseCXXMemberCallExpr(
-    CXXMemberCallExpr *MemberCall) {
-  auto *Member =
+    const CXXMemberCallExpr *MemberCall) {
+  const auto *Member =
       dyn_cast<MemberExpr>(MemberCall->getCallee()->IgnoreParenImpCasts());
   if (!Member)
     return VisitorBase::TraverseCXXMemberCallExpr(MemberCall);
@@ -638,7 +638,7 @@ bool ForLoopIndexUseVisitor::TraverseCXXMemberCallExpr(
 ///   }
 /// \endcode
 bool ForLoopIndexUseVisitor::TraverseCXXOperatorCallExpr(
-    CXXOperatorCallExpr *OpCall) {
+    const CXXOperatorCallExpr *OpCall) {
   switch (OpCall->getOperator()) {
   case OO_Star:
     if (isDereferenceOfOpCall(OpCall, IndexVar)) {
@@ -683,8 +683,9 @@ bool ForLoopIndexUseVisitor::TraverseCXXOperatorCallExpr(
 /// \endcode
 /// and further checking needs to be done later to ensure that exactly one array
 /// is referenced.
-bool ForLoopIndexUseVisitor::TraverseArraySubscriptExpr(ArraySubscriptExpr *E) {
-  Expr *Arr = E->getBase();
+bool ForLoopIndexUseVisitor::TraverseArraySubscriptExpr(
+    const ArraySubscriptExpr *E) {
+  const Expr *Arr = E->getBase();
   if (!isIndexInSubscriptExpr(E->getIdx(), IndexVar))
     return VisitorBase::TraverseArraySubscriptExpr(E);
 
@@ -737,7 +738,7 @@ bool ForLoopIndexUseVisitor::TraverseArraySubscriptExpr(ArraySubscriptExpr *E) {
 ///    for (int i = 0; i < obj.getVector().size(); ++i)
 ///      obj.foo(10); // using `obj` is considered risky
 /// \endcode
-bool ForLoopIndexUseVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
+bool ForLoopIndexUseVisitor::VisitDeclRefExpr(const DeclRefExpr *E) {
   const ValueDecl *TheDecl = E->getDecl();
   if (areSameVariable(IndexVar, TheDecl) ||
       exprReferencesVariable(IndexVar, E) || areSameVariable(EndVar, TheDecl) ||
@@ -770,9 +771,9 @@ bool ForLoopIndexUseVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
 ///     f(elem);
 ///   }
 /// \endcode
-bool ForLoopIndexUseVisitor::TraverseLambdaCapture(LambdaExpr *LE,
+bool ForLoopIndexUseVisitor::TraverseLambdaCapture(const LambdaExpr *LE,
                                                    const LambdaCapture *C,
-                                                   Expr *Init) {
+                                                   const Expr *Init) {
   if (C->capturesVariable()) {
     ValueDecl *VDecl = C->getCapturedVar();
     if (areSameVariable(IndexVar, VDecl)) {
@@ -785,7 +786,7 @@ bool ForLoopIndexUseVisitor::TraverseLambdaCapture(LambdaExpr *LE,
                      C->getLocation()));
     }
     if (VDecl->isInitCapture())
-      TraverseStmtImpl(cast<VarDecl>(VDecl)->getInit());
+      traverseStmtImpl(cast<VarDecl>(VDecl)->getInit());
   }
   return VisitorBase::TraverseLambdaCapture(LE, C, Init);
 }
@@ -794,7 +795,7 @@ bool ForLoopIndexUseVisitor::TraverseLambdaCapture(LambdaExpr *LE,
 /// element, note it for reuse as the loop variable.
 ///
 /// See the comments for isAliasDecl.
-bool ForLoopIndexUseVisitor::VisitDeclStmt(DeclStmt *S) {
+bool ForLoopIndexUseVisitor::VisitDeclStmt(const DeclStmt *S) {
   if (!AliasDecl && S->isSingleDecl() &&
       isAliasDecl(Context, S->getSingleDecl(), IndexVar)) {
     AliasDecl = S;
@@ -815,7 +816,7 @@ bool ForLoopIndexUseVisitor::VisitDeclStmt(DeclStmt *S) {
   return true;
 }
 
-bool ForLoopIndexUseVisitor::TraverseStmtImpl(Stmt *S) {
+bool ForLoopIndexUseVisitor::traverseStmtImpl(const Stmt *S) {
   // All this pointer swapping is a mechanism for tracking immediate parentage
   // of Stmts.
   const Stmt *OldNextParent = NextStmtParent;
@@ -826,7 +827,7 @@ bool ForLoopIndexUseVisitor::TraverseStmtImpl(Stmt *S) {
   return Result;
 }
 
-bool ForLoopIndexUseVisitor::TraverseStmt(Stmt *S) {
+bool ForLoopIndexUseVisitor::TraverseStmt(const Stmt *S) {
   // If this is an initialization expression for a lambda capture, prune the
   // traversal so that we don't end up diagnosing the contained DeclRefExpr as
   // inconsistent usage. No need to record the usage here -- this is done in
@@ -838,7 +839,7 @@ bool ForLoopIndexUseVisitor::TraverseStmt(Stmt *S) {
       return true;
     }
   }
-  return TraverseStmtImpl(S);
+  return traverseStmtImpl(S);
 }
 
 std::string VariableNamer::createIndexName() {
diff --git a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.h b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.h
index 306eca7140d1a..dc7ab847d9921 100644
--- a/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.h
+++ b/clang-tools-extra/clang-tidy/modernize/LoopConvertUtils.h
@@ -10,7 +10,7 @@
 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_LOOP_CONVERT_UTILS_H
 
 #include "clang/AST/ASTContext.h"
-#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/DynamicRecursiveASTVisitor.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Basic/SourceLocation.h"
 #include "llvm/ADT/DenseMap.h"
@@ -53,8 +53,7 @@ using ComponentVector = llvm::SmallVector<const clang::Expr *, 16>;
 
 /// Class used build the reverse AST properties needed to detect
 /// name conflicts and free variables.
-class StmtAncestorASTVisitor
-    : public clang::RecursiveASTVisitor<StmtAncestorASTVisitor> {
+class StmtAncestorASTVisitor : public ConstDynamicRecursiveASTVisitor {
 public:
   StmtAncestorASTVisitor() { StmtStack.push_back(nullptr); }
 
@@ -72,45 +71,37 @@ class StmtAncestorASTVisitor
   /// Accessor for DeclParents.
   const DeclParentMap &getDeclToParentStmtMap() { return DeclParents; }
 
-  friend class clang::RecursiveASTVisitor<StmtAncestorASTVisitor>;
-
 private:
   StmtParentMap StmtAncestors;
   DeclParentMap DeclParents;
   llvm::SmallVector<const clang::Stmt *, 16> StmtStack;
 
-  bool TraverseStmt(clang::Stmt *Statement);
-  bool VisitDeclStmt(clang::DeclStmt *Statement);
+  bool TraverseStmt(const Stmt *Statement) override;
+  bool VisitDeclStmt(const DeclStmt *Statement) override;
 };
 
 /// Class used to find the variables and member expressions on which an
 /// arbitrary expression depends.
-class ComponentFinderASTVisitor
-    : public clang::RecursiveASTVisitor<ComponentFinderASTVisitor> {
+class ComponentFinderASTVisitor : public ConstDynamicRecursiveASTVisitor {
 public:
   ComponentFinderASTVisitor() = default;
 
   /// Find the...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/160290


More information about the cfe-commits mailing list