https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/207586
None >From 6ab697c6f614408a87f2de921f00a4ce0a8b0f38 Mon Sep 17 00:00:00 2001 From: Zeyi Xu <[email protected]> Date: Sun, 5 Jul 2026 21:44:51 +0800 Subject: [PATCH] [clang-tidy] Fix AllowImplicitlyDeletedCopyOrMove missing-move false positive --- .../SpecialMemberFunctionsCheck.cpp | 11 ++++++- clang-tools-extra/docs/ReleaseNotes.rst | 6 ++++ ...ecial-member-functions-implicit-delete.cpp | 31 +++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/special-member-functions-implicit-delete.cpp diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp index 1ef64b702cd66..6f2ab250e441b 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/SpecialMemberFunctionsCheck.cpp @@ -224,10 +224,19 @@ void SpecialMemberFunctionsCheck::checkForMissingMembers( SpecialMemberFunctionKind::CopyAssignment); } + const bool CopyImplicitlyDeleted = + HasImplicitDeletedMember(SpecialMemberFunctionKind::CopyConstructor) && + HasImplicitDeletedMember(SpecialMemberFunctionKind::CopyAssignment); + const bool MoveMissing = + !HasMember(SpecialMemberFunctionKind::MoveConstructor) && + !HasMember(SpecialMemberFunctionKind::MoveAssignment); + if (RequireFive && !(AllowMissingMoveFunctionsWhenCopyIsDeleted && (IsDeleted(SpecialMemberFunctionKind::CopyConstructor) && - IsDeleted(SpecialMemberFunctionKind::CopyAssignment)))) { + IsDeleted(SpecialMemberFunctionKind::CopyAssignment))) && + !(AllowImplicitlyDeletedCopyOrMove && CopyImplicitlyDeleted && + MoveMissing)) { assert(RequireThree); RequireMembers(SpecialMemberFunctionKind::MoveConstructor, SpecialMemberFunctionKind::MoveAssignment); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 2a980cc089a65..0f6699c5e2270 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -538,6 +538,12 @@ Changes in existing checks by fixing a false positive on implicitly generated functions such as inherited constructors. +- Improved :doc:`cppcoreguidelines-special-member-functions + <clang-tidy/checks/cppcoreguidelines/special-member-functions>` check by + fixing a false positive with the `AllowImplicitlyDeletedCopyOrMove` option + for classes whose copy operations are implicitly deleted by a non-copyable + base class. + - Improved :doc:`cppcoreguidelines-use-enum-class <clang-tidy/checks/cppcoreguidelines/use-enum-class>` check by adding the `IgnoreMacros` option. When enabled, unscoped ``enum`` declarations within diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/special-member-functions-implicit-delete.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/special-member-functions-implicit-delete.cpp new file mode 100644 index 0000000000000..45137a30c807c --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/special-member-functions-implicit-delete.cpp @@ -0,0 +1,31 @@ +// RUN: %check_clang_tidy %s cppcoreguidelines-special-member-functions %t -- \ +// RUN: -config="{CheckOptions: {cppcoreguidelines-special-member-functions.AllowImplicitlyDeletedCopyOrMove: true}}" + +struct Base { + Base(const Base &) = delete; + Base &operator=(const Base &) = delete; + Base(Base &&) = delete; + Base &operator=(Base &&) = delete; + ~Base(); +}; + +struct A : Base { + ~A() {} +}; + +struct Member { + Base B; + ~Member() {} +}; + +// CHECK-MESSAGES: [[@LINE+1]]:8: warning: class 'B' defines a non-default destructor and a move constructor but does not define a move assignment operator +struct B : Base { + ~B() {} + B(B &&); +}; + +// CHECK-MESSAGES: [[@LINE+1]]:8: warning: class 'C' defines a non-default destructor and a move assignment operator but does not define a move constructor +struct C : Base { + ~C() {} + C &operator=(C &&); +}; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
