[clang-tools-extra] [clang-tidy] Fix false positives in `bugprone-crtp-constructor-accessibility` check (PR #132543)
Baranov Victor via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 26 04:36:52 PDT 2025
https://github.com/vbvictor updated https://github.com/llvm/llvm-project/pull/132543
>From 814972e0398507a5137a1ee6c69e7bba3704eb6b Mon Sep 17 00:00:00 2001
From: Victor Baranov <bar.victor.2002 at gmail.com>
Date: Sat, 22 Mar 2025 14:39:43 +0300
Subject: [PATCH 1/2] [clang-tidy] Fix false positives in
crtp-constructor-accessibility check
---
.../CrtpConstructorAccessibilityCheck.cpp | 2 +-
clang-tools-extra/docs/ReleaseNotes.rst | 5 +++
.../crtp-constructor-accessibility.cpp | 31 +++++++++++++++++++
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/bugprone/CrtpConstructorAccessibilityCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/CrtpConstructorAccessibilityCheck.cpp
index 8eaf54fe0088a..28e8fe002d575 100644
--- a/clang-tools-extra/clang-tidy/bugprone/CrtpConstructorAccessibilityCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/CrtpConstructorAccessibilityCheck.cpp
@@ -157,7 +157,7 @@ void CrtpConstructorAccessibilityCheck::check(
}
for (auto &&Ctor : CRTPDeclaration->ctors()) {
- if (Ctor->getAccess() == AS_private)
+ if (Ctor->getAccess() == AS_private || Ctor->isDeleted())
continue;
const bool IsPublic = Ctor->getAccess() == AS_public;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 72aa05eb4dcd1..4bbe4a693c811 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -127,6 +127,11 @@ New check aliases
Changes in existing checks
^^^^^^^^^^^^^^^^^^^^^^^^^^
+- Improved :doc:`bugprone-crtp-constructor-accessibility
+ <clang-tidy/checks/bugprone/crtp-constructor-accessibility>` check by fixing
+ false positives on deleted constructors that cannot be used to construct
+ objects, even if they have public or protected access.
+
- Improved :doc:`bugprone-optional-value-conversion
<clang-tidy/checks/bugprone/optional-value-conversion>` check to detect
conversion in argument of ``std::make_optional``.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/crtp-constructor-accessibility.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/crtp-constructor-accessibility.cpp
index f33b8457cc8af..44cfcd136f238 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/crtp-constructor-accessibility.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/crtp-constructor-accessibility.cpp
@@ -253,3 +253,34 @@ void foo() {
(void) A;
}
} // namespace no_warning_unsupported
+
+namespace public_copy_move_constructors_deleted {
+template <typename T>
+class CRTP
+{
+ CRTP() = default;
+ friend T;
+ public:
+ CRTP(const CRTP&) = delete;
+ CRTP(CRTP&&) = delete;
+};
+
+class A : CRTP<A> {};
+
+} // namespace public_copy_move_constructors_deleted
+
+namespace public_copy_protected_move_constructor_deleted {
+template <typename T>
+class CRTP
+{
+ CRTP() = default;
+ friend T;
+ public:
+ CRTP(const CRTP&) = delete;
+ protected:
+ CRTP(CRTP&&) = delete;
+};
+
+class A : CRTP<A> {};
+
+} // namespace public_copy_protected_move_constructor_deleted
>From 60a4bc5c8a22f709c17c0df93bd53ddc58fbe223 Mon Sep 17 00:00:00 2001
From: Victor Baranov <bar.victor.2002 at gmail.com>
Date: Wed, 26 Mar 2025 14:36:39 +0300
Subject: [PATCH 2/2] fix: added docs about deleted public ctors
---
.../checks/bugprone/crtp-constructor-accessibility.rst | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang-tools-extra/docs/clang-tidy/checks/bugprone/crtp-constructor-accessibility.rst b/clang-tools-extra/docs/clang-tidy/checks/bugprone/crtp-constructor-accessibility.rst
index afd88764b5967..dad30fcbd63b4 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/bugprone/crtp-constructor-accessibility.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/bugprone/crtp-constructor-accessibility.rst
@@ -65,7 +65,8 @@ Example:
To ensure that no accidental instantiation happens, the best practice is to
make the constructor private and declare the derived class as friend. Note
that as a tradeoff, this also gives the derived class access to every other
-private members of the CRTP.
+private members of the CRTP. However, constructors can still be public or
+protected if they are deleted.
Example:
More information about the cfe-commits
mailing list