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

>From 83b1b2fd60a014d7a6c85deadc702de9f618a411 Mon Sep 17 00:00:00 2001
From: serge-sans-paille <[email protected]>
Date: Mon, 2 Mar 2026 09:01:29 +0100
Subject: [PATCH 1/2] [clang-tidy] Add fixit capability to
 performance-use-std-move linter

---
 .../clang-tidy/performance/UseStdMoveCheck.cpp     |  6 +++++-
 .../checkers/performance/use-std-move.cpp          | 14 ++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp 
b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
index d6be91b86eb8c..8b7878399fc31 100644
--- a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
@@ -106,8 +106,12 @@ void UseStdMoveCheck::check(const MatchFinder::MatchResult 
&Result) {
 
       const Stmt *EltStmt = Elt.castAs<CFGStmt>().getStmt();
       if (EltStmt == AssignExpr) {
+        StringRef AssignValueName = AssignValue->getDecl()->getName();
         diag(AssignValue->getBeginLoc(), "'%0' could be moved here")
-            << AssignValue->getDecl()->getName();
+            << AssignValueName
+            << FixItHint::CreateReplacement(
+                   AssignValue->getLocation(),
+                   ("std::move(" + AssignValueName + ")").str());
         break;
       }
       // The reference is being referenced after the assignment, bail out.
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 d823fa75720af..4492d976c37bd 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
@@ -42,6 +42,7 @@ void use(T&) {}
 void ConvertibleNonTrivialMoveAssign(NonTrivialMoveAssign& target, 
NonTrivialMoveAssign source) {
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 
 void NonProfitableNonTrivialMoveAssignPointer(NonTrivialMoveAssign*& target, 
NonTrivialMoveAssign* source) {
@@ -52,6 +53,7 @@ void 
NonProfitableNonTrivialMoveAssignPointer(NonTrivialMoveAssign*& target, Non
 void ConvertibleNonTrivialMoveAssignFromLValue(NonTrivialMoveAssign& target, 
NonTrivialMoveAssign&& source) {
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 
 // Check moving already moved values
@@ -74,12 +76,14 @@ struct SomeRecord {
 void ConvertibleNonTrivialMoveAssignWithinMethod(NonTrivialMoveAssign& target, 
NonTrivialMoveAssign source) {
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 };
 
 auto ConvertibleNonTrivialMoveAssignWithinLambda = [](NonTrivialMoveAssign& 
target, NonTrivialMoveAssign source) {
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 };
 
 void SomeFunction(NonTrivialMoveAssign source0, NonTrivialMoveAssign const 
&source1) {
@@ -105,6 +109,7 @@ void 
ConvertibleNonTrivialMoveAssignShadowing(NonTrivialMoveAssign& target, NoMo
     NonTrivialMoveAssign source;
     // CHECK-MESSAGES: [[@LINE+1]]:14: warning: 'source' could be moved here 
[performance-use-std-move]
     target = source;
+    // CHECK-FIXES: target = std::move(source);
   }
 }
 
@@ -147,6 +152,7 @@ void 
NonConvertibleNonTrivialMoveAssignFromConst(NonTrivialMoveAssign& target) {
   NonTrivialMoveAssign source;
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 
 void NonConvertibleNonTrivialMoveAssignFromStatic(NonTrivialMoveAssign& 
target) {
@@ -189,6 +195,7 @@ void 
ConvertibleNonTrivialMoveAssignToStatic(NonTrivialMoveAssign source) {
   static NonTrivialMoveAssign target;
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 
 struct ConvertibleNonTrivialMoveAssignToMember {
@@ -196,6 +203,7 @@ struct ConvertibleNonTrivialMoveAssignToMember {
   void NonConvertibleNonTrivialMoveAssignFromStatic(NonTrivialMoveAssign 
source) {
     // CHECK-MESSAGES: [[@LINE+1]]:14: warning: 'source' could be moved here 
[performance-use-std-move]
     target = source;
+    // CHECK-FIXES: target = std::move(source);
   }
 };
 
@@ -203,18 +211,21 @@ void 
ConvertibleNonTrivialMoveAssignToExtern(NonTrivialMoveAssign source) {
   extern NonTrivialMoveAssign target;
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 
 void ConvertibleNonTrivialMoveAssignToTLS(NonTrivialMoveAssign source) {
   thread_local NonTrivialMoveAssign target;
   // CHECK-MESSAGES: [[@LINE+1]]:12: warning: 'source' could be moved here 
[performance-use-std-move]
   target = source;
+  // CHECK-FIXES: target = std::move(source);
 }
 
 NonTrivialMoveAssign global_target;
 void ConvertibleNonTrivialMoveAssignToGlobal(NonTrivialMoveAssign source) {
   // CHECK-MESSAGES: [[@LINE+1]]:19: warning: 'source' could be moved here 
[performance-use-std-move]
   global_target = source;
+  // CHECK-FIXES: global_target = std::move(source);
 }
 
 void NonConvertibleNonTrivialMoveAssignRValue(NonTrivialMoveAssign& target, 
NonTrivialMoveAssign const& source) {
@@ -234,6 +245,7 @@ void ConvertibleNonTrivialMoveAssignWithBranching(bool 
cond, NonTrivialMoveAssig
   if(cond) {
     // CHECK-MESSAGES: [[@LINE+1]]:14: warning: 'source' could be moved here 
[performance-use-std-move]
     target = source;
+    // CHECK-FIXES: target = std::move(source);
   }
 }
 
@@ -249,11 +261,13 @@ void ConvertibleNonTrivialMoveAssignBothBranches(bool 
cond, NonTrivialMoveAssign
   if(cond) {
     // CHECK-MESSAGES: [[@LINE+1]]:14: warning: 'source' could be moved here 
[performance-use-std-move]
     target = source;
+    // CHECK-FIXES: target = std::move(source);
   }
   else {
     source.stuff();
     // CHECK-MESSAGES: [[@LINE+1]]:14: warning: 'source' could be moved here 
[performance-use-std-move]
     target = source;
+    // CHECK-FIXES: target = std::move(source);
   }
 }
 

>From d63cf36f3d8eda48b1b65af629bb709e053d300d Mon Sep 17 00:00:00 2001
From: serge-sans-paille <[email protected]>
Date: Mon, 2 Mar 2026 12:43:18 +0100
Subject: [PATCH 2/2] WIP

---
 clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp | 2 +-
 clang-tools-extra/docs/clang-tidy/checks/list.rst            | 2 +-
 2 files 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 8b7878399fc31..ecd6a33aa722d 100644
--- a/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
+++ b/clang-tools-extra/clang-tidy/performance/UseStdMoveCheck.cpp
@@ -106,7 +106,7 @@ void UseStdMoveCheck::check(const MatchFinder::MatchResult 
&Result) {
 
       const Stmt *EltStmt = Elt.castAs<CFGStmt>().getStmt();
       if (EltStmt == AssignExpr) {
-        StringRef AssignValueName = AssignValue->getDecl()->getName();
+        const StringRef AssignValueName = AssignValue->getDecl()->getName();
         diag(AssignValue->getBeginLoc(), "'%0' could be moved here")
             << AssignValueName
             << FixItHint::CreateReplacement(
diff --git a/clang-tools-extra/docs/clang-tidy/checks/list.rst 
b/clang-tools-extra/docs/clang-tidy/checks/list.rst
index 24086a4637dbf..4beea34f0c5a6 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/list.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/list.rst
@@ -369,7 +369,7 @@ Clang-Tidy Checks
    :doc:`performance-type-promotion-in-math-fn 
<performance/type-promotion-in-math-fn>`, "Yes"
    :doc:`performance-unnecessary-copy-initialization 
<performance/unnecessary-copy-initialization>`, "Yes"
    :doc:`performance-unnecessary-value-param 
<performance/unnecessary-value-param>`, "Yes"
-   :doc:`performance-use-std-move <performance/use-std-move>`,
+   :doc:`performance-use-std-move <performance/use-std-move>`, "Yes"
    :doc:`portability-avoid-pragma-once <portability/avoid-pragma-once>`,
    :doc:`portability-restrict-system-includes 
<portability/restrict-system-includes>`, "Yes"
    :doc:`portability-simd-intrinsics <portability/simd-intrinsics>`,

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

Reply via email to