https://github.com/serge-sans-paille updated 
https://github.com/llvm/llvm-project/pull/186704

>From cb5f30a35a744ba2a67b641145cff32d8b06fc5a Mon Sep 17 00:00:00 2001
From: serge-sans-paille <[email protected]>
Date: Sun, 15 Mar 2026 22:15:18 +0100
Subject: [PATCH 1/2] [clang-tidy] Fix performance-use-std-move when moving a
 forward declared type within the type definition

---
 .../clang-tidy/performance/UseStdMoveCheck.cpp    |  7 +++++--
 .../checkers/performance/use-std-move.cpp         | 15 +++++++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp 
b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
index 2a7df4142a6de..a97698d1f518c 100644
--- a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
@@ -24,9 +24,12 @@ namespace clang::tidy::performance {
 
 namespace {
 AST_MATCHER(CXXRecordDecl, hasAccessibleNonTrivialMoveAssignment) {
-  if (!Node.hasNonTrivialMoveAssignment())
+  const auto *ND = Node.getDefinition();
+  if (!ND)
     return false;
-  for (const auto *CM : Node.methods())
+  if (!ND->hasNonTrivialMoveAssignment())
+    return false;
+  for (const auto *CM : ND->methods())
     if (CM->isMoveAssignmentOperator())
       return !CM->isDeleted() && CM->getAccess() == AS_public;
   llvm_unreachable("Move Assignment Operator Not Found");
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/performance/use-std-move.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/performance/use-std-move.cpp
index c7014859adf50..87a5c90030d8f 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/performance/use-std-move.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/performance/use-std-move.cpp
@@ -289,6 +289,21 @@ void 
NonConvertibleNonTrivialMoveAssignInLoop(NonTrivialMoveAssign& target, NonT
     target = source;
 }
 
+// Check moving incomplete definition
+// ----------------------------------
+
+struct fwd_cls;
+struct fwd_cls {
+  void ConvertibleNonTrivialMoveAssignReferecingForwardDecl(fwd_cls src) {
+    // CHECK-MESSAGES: [[@LINE+2]]:13: warning: 'src' could be moved here 
[performance-use-std-move]
+    // CHECK-FIXES: *this = std::move(src);
+    *this = src;
+  }
+  fwd_cls &operator=(const fwd_cls &C);
+  fwd_cls &operator=(fwd_cls &&);
+};
+
+
 // Check moving for invalid / non profitable type or operation
 // -----------------------------------------------------------
 

>From 7f08aec8bf207f183a9bdebed5686a967d798d44 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <[email protected]>
Date: Mon, 16 Mar 2026 00:01:43 +0100
Subject: [PATCH 2/2] fixup! [clang-tidy] Fix performance-use-std-move when
 moving a forward declared type within the type definition

---
 clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp 
b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
index a97698d1f518c..7c3bbc3187cd9 100644
--- a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
@@ -24,12 +24,12 @@ namespace clang::tidy::performance {
 
 namespace {
 AST_MATCHER(CXXRecordDecl, hasAccessibleNonTrivialMoveAssignment) {
-  const auto *ND = Node.getDefinition();
+  const CXXRecordDecl *ND = Node.getDefinition();
   if (!ND)
     return false;
   if (!ND->hasNonTrivialMoveAssignment())
     return false;
-  for (const auto *CM : ND->methods())
+  for (const CXXMethodDecl *CM : ND->methods())
     if (CM->isMoveAssignmentOperator())
       return !CM->isDeleted() && CM->getAccess() == AS_public;
   llvm_unreachable("Move Assignment Operator Not Found");

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

Reply via email to