https://github.com/zeyi2 created 
https://github.com/llvm/llvm-project/pull/175449

Closes [#174826](https://github.com/llvm/llvm-project/issues/174826)

>From 522cdc7921a73b281cddf6a79d644903324ac9a1 Mon Sep 17 00:00:00 2001
From: mtx <[email protected]>
Date: Sat, 10 Jan 2026 16:51:28 +0800
Subject: [PATCH] [clang-tidy] Fix performance-move-const-arg for trivially
 copyable types with private copy constructor

---
 .../performance/MoveConstArgCheck.cpp         |  3 +-
 clang-tools-extra/docs/ReleaseNotes.rst       | 16 +++++----
 .../checkers/performance/move-const-arg.cpp   | 34 +++++++++++++++++++
 3 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp 
b/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
index 91f025dc87d8e..63be104df5e05 100644
--- a/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/MoveConstArgCheck.cpp
@@ -136,7 +136,8 @@ void MoveConstArgCheck::check(const 
MatchFinder::MatchResult &Result) {
         return;
       // Don't warn when the type is not copyable.
       for (const auto *Ctor : R->ctors())
-        if (Ctor->isCopyConstructor() && Ctor->isDeleted())
+        if (Ctor->isCopyConstructor() &&
+            (Ctor->isDeleted() || Ctor->getAccess() != AS_public))
           return;
     }
 
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 391c3a6b3db79..a9c3547624594 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -111,10 +111,10 @@ Hover
 Code completion
 ^^^^^^^^^^^^^^^
 
-- Added a new ``MacroFilter`` configuration option to ``Completion`` to 
-  allow fuzzy-matching with the ``FuzzyMatch`` option when suggesting 
-  macros. ``ExactPrefix`` is the default, which retains previous 
-  behavior of suggesting macros which match the prefix exactly.  
+- Added a new ``MacroFilter`` configuration option to ``Completion`` to
+  allow fuzzy-matching with the ``FuzzyMatch`` option when suggesting
+  macros. ``ExactPrefix`` is the default, which retains previous
+  behavior of suggesting macros which match the prefix exactly.
 
 Code actions
 ^^^^^^^^^^^^
@@ -205,7 +205,7 @@ Improvements to clang-tidy
 
 - Improved :program:`clang-tidy` by adding the `--removed-arg` option to remove
   arguments sent to the compiler when invoking Clang-Tidy. This option was also
-  added to :program:`run-clang-tidy.py` and :program:`clang-tidy-diff.py` and 
+  added to :program:`run-clang-tidy.py` and :program:`clang-tidy-diff.py` and
   can be configured in the config file through the `RemovedArgs` option.
 
 - Deprecated the :program:`clang-tidy` ``zircon`` module. All checks have been
@@ -364,7 +364,7 @@ New check aliases
   keeping initial check as an alias to the new one.
 
 - Renamed :doc:`google-build-namespaces 
<clang-tidy/checks/google/build-namespaces>` to
-  :doc:`misc-anonymous-namespace-in-header 
+  :doc:`misc-anonymous-namespace-in-header
   <clang-tidy/checks/misc/anonymous-namespace-in-header>`
   keeping initial check as an alias to the new one.
 
@@ -604,6 +604,10 @@ Changes in existing checks
   <clang-tidy/checks/modernize/use-using>` check to correctly provide fix-its
   for typedefs of pointers or references to array types.
 
+- Improved :doc:`performance-move-const-arg
+  <clang-tidy/checks/performance/move-const-arg>` check by avoiding false
+  positives on trivially copyable types with a non-public copy constructor.
+
 - Improved :doc:`performance-unnecessary-copy-initialization
   <clang-tidy/checks/performance/unnecessary-copy-initialization>` by printing
   the type of the diagnosed variable.
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp
index e616cbe78bc3a..34d51930ac6c8 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/move-const-arg.cpp
@@ -583,3 +583,37 @@ void testTernaryMove() {
 
 };
 } // namespace GH126515
+
+namespace GH174826 {
+
+struct PrivateCopy {
+  PrivateCopy() = default;
+  PrivateCopy(PrivateCopy &&) = default;
+
+private:
+  PrivateCopy(const PrivateCopy &) = default;
+};
+
+void receive(PrivateCopy) {}
+
+void testPrivate() {
+  PrivateCopy v;
+  receive(std::move(v));
+}
+
+struct PublicCopy {
+  PublicCopy() = default;
+  PublicCopy(const PublicCopy &) = default;
+  PublicCopy(PublicCopy &&) = default;
+};
+
+void receive(PublicCopy) {}
+
+void testPublic() {
+  PublicCopy v;
+  receive(std::move(v));
+  // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: std::move of the variable 'v' 
of the trivially-copyable type 'PublicCopy' has no effect; remove std::move() 
[performance-move-const-arg]
+  // CHECK-FIXES: receive(v);
+}
+
+} // namespace GH174826

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

Reply via email to