[clang-tools-extra] b7c056a - [clang-tidy] Fix erroneous warning to make deleted function public (#182577)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 25 06:09:25 PST 2026
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;
+};
+
}
More information about the cfe-commits
mailing list