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.2...@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.2...@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: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits