[clang] [clang-tools-extra] [clang-tidy] New performance linter: performance-inefficient-copy-assign (PR #179467)
Baranov Victor via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 3 07:04:31 PST 2026
================
@@ -0,0 +1,75 @@
+// RUN: %check_clang_tidy %s performance-inefficient-copy-assign %t
+
+struct NonTrivialMoveAssign {
+ NonTrivialMoveAssign& operator=(const NonTrivialMoveAssign&);
+ NonTrivialMoveAssign& operator=(NonTrivialMoveAssign&&);
+ NonTrivialMoveAssign& operator+=(const NonTrivialMoveAssign&);
+ NonTrivialMoveAssign& operator+=(NonTrivialMoveAssign&&);
+ void stuff();
+};
+
+struct TrivialMoveAssign {
+ TrivialMoveAssign& operator=(const TrivialMoveAssign&);
+ TrivialMoveAssign& operator=(TrivialMoveAssign&&) = default;
+};
+
+struct NoMoveAssign {
+ NoMoveAssign& operator=(const NoMoveAssign&);
+ NoMoveAssign& operator=(NoMoveAssign&&) = delete;
+};
+
+void ConvertibleNonTrivialMoveAssign(NonTrivialMoveAssign& target, NonTrivialMoveAssign source) {
+ // CHECK-MESSAGES: [[@LINE+1]]:{{[0-9]*}}: warning: 'source' could be moved here [performance-inefficient-copy-assign]
+ target = source;
+}
+
+void NonProfitableTrivialMoveAssign(TrivialMoveAssign& target, TrivialMoveAssign source) {
+ // No message expected, moving is possible but pedantic.
+ target = source;
+}
+
+void ConvertibleNonTrivialMoveAssignWithBranching(bool cond, NonTrivialMoveAssign& target, NonTrivialMoveAssign source) {
+ if(cond) {
+ // CHECK-MESSAGES: [[@LINE+1]]:{{[0-9]*}}: warning: 'source' could be moved here [performance-inefficient-copy-assign]
+ target = source;
+ }
----------------
vbvictor wrote:
also with variables that are const/thread_local/extern, etc...
Please refer to cases in https://reviews.llvm.org/D137205 and pick that you are missing.
https://github.com/llvm/llvm-project/pull/179467
More information about the cfe-commits
mailing list