Author: Jakob Widauer
Date: 2026-02-25T07:09:20-07:00
New Revision: b7c056a31cf84022c3d9cd34d66fed5db1ae22bc

URL: 
https://github.com/llvm/llvm-project/commit/b7c056a31cf84022c3d9cd34d66fed5db1ae22bc
DIFF: 
https://github.com/llvm/llvm-project/commit/b7c056a31cf84022c3d9cd34d66fed5db1ae22bc.diff

LOG: [clang-tidy] Fix erroneous warning to make deleted function public 
(#182577)

This PR fixes #54276 and fixes #135249 by only matching private deleted
functions with a public overload or special member functions.

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp
    clang-tools-extra/docs/ReleaseNotes.rst
    clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-delete.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp 
b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp
index 25140152219cf..f0466852ef5c3 100644
--- a/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/UseEqualsDeleteCheck.cpp
@@ -39,6 +39,21 @@ AST_MATCHER(CXXMethodDecl, isSpecialFunction) {
   return isa<CXXDestructorDecl>(Node) || Node.isCopyAssignmentOperator() ||
          Node.isMoveAssignmentOperator();
 }
+
+AST_MATCHER(CXXMethodDecl, hasPublicOverload) {
+  const DeclContext::lookup_result LookupResult =
+      Node.getParent()->lookup(Node.getNameInfo().getName());
+
+  if (LookupResult.isSingleResult())
+    return false; // No overloads
+
+  static constexpr auto IsPublicOverload = [](const Decl *Overload) {
+    return isa<CXXMethodDecl, FunctionTemplateDecl>(Overload) &&
+           Overload->getAccess() == AS_public;
+  };
+
+  return llvm::any_of(LookupResult, IsPublicOverload);
+}
 } // namespace
 
 static constexpr char SpecialFunction[] = "SpecialFunction";
@@ -66,8 +81,12 @@ void UseEqualsDeleteCheck::registerMatchers(MatchFinder 
*Finder) {
           .bind(SpecialFunction),
       this);
 
+  // Add a matcher for deleted private member functions, with a public 
overload,
+  // to recommend moving them to the public section.
   Finder->addMatcher(
-      cxxMethodDecl(isDeleted(), unless(isPublic())).bind(DeletedNotPublic),
+      cxxMethodDecl(isDeleted(), unless(isPublic()),
+                    anyOf(hasPublicOverload(), isSpecialFunction()))
+          .bind(DeletedNotPublic),
       this);
 }
 

diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 64c8fbbe2f07a..10b5e41dd79ed 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -222,6 +222,11 @@ Changes in existing checks
 - Improved :doc:`modernize-redundant-void-arg
   <clang-tidy/checks/modernize/redundant-void-arg>` check to work in C23.
 
+- Improved :doc:`modernize-use-equals-delete
+  <clang-tidy/checks/modernize/use-equals-delete>` check by only warning on
+  private deleted functions, if they do not have a public overload or are a
+  special member function.
+
 - Improved :doc:`modernize-use-std-format
   <clang-tidy/checks/modernize/use-std-format>` check by fixing a crash
   when an argument is part of a macro expansion.

diff  --git 
a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-delete.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-delete.cpp
index 061a2722b1ac7..940e7e0443b19 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-delete.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/use-equals-delete.cpp
@@ -194,28 +194,73 @@ class C {
 
 namespace PR33759 {
 
-  class Number {
-    private:
-      Number();
-      ~Number();
-
-    public:
-      static Number& getNumber() {
-        static Number number;
-        return number;
-      }
-
-      int getIntValue() { return (int)someFloat; }
-      float getFloatValue() { return someFloat; }
-    private:
-      float someFloat;
-  };
-
-  class Number2 {
-    private:
-      Number2();
-      ~Number2();
-    public:
-      static Number& getNumber();
-  };
+class Number {
+  private:
+    Number();
+    ~Number();
+
+  public:
+    static Number& getNumber() {
+      static Number number;
+      return number;
+    }
+
+    int getIntValue() { return (int)someFloat; }
+    float getFloatValue() { return someFloat; }
+  private:
+    float someFloat;
+};
+
+class Number2 {
+  private:
+    Number2();
+    ~Number2();
+  public:
+    static Number& getNumber();
+};
+}
+
+namespace PR54276 {
+
+class PrivateDeletedFunctionWithPublicOverload {
+  public:
+    void foo() {}
+  private:
+    void foo(int) = delete;
+    // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: deleted member function 
should be public [modernize-use-equals-delete]
+};
+
+class PrivateDeletedFunctionWithPrivateOverload {
+  private:
+    void foo() {}
+    void foo(int) = delete;
+};
+
+class PrivateDeletedFunctionTemplateWithPublicOverload {
+  public:
+    template<typename T>
+    void foo(T) {}
+  private:
+    template<typename T>
+    void foo(T, int) = delete;
+    // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: deleted member function 
should be public [modernize-use-equals-delete]
+};
+
+class PrivateDeletedFunctionTemplateWithPrivateOverload {
+  private:
+    template<typename T>
+    void foo(T) {}
+    template<typename T>
+    void foo(T, int) = delete;
+};
+
+class PrivateDeletedFunctionTemplateWithProtectedOverload {
+  protected:
+    template<typename T>
+    void foo(T) {}
+  private:
+    template<typename T>
+    void foo(T, int) = delete;
+};
+
 }


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to