Skip to content

Conversation

@vbvictor
Copy link
Contributor

  • Deleted unused includes
  • Deleted useless braces
  • Modernized tests to use CHECK-MESSAGES-NOT and CHECK-FIXES-NOT for better readability and maintainability

@llvmbot
Copy link
Member

llvmbot commented May 20, 2025

@llvm/pr-subscribers-clang-tools-extra

@llvm/pr-subscribers-clang-tidy

Author: Baranov Victor (vbvictor)

Changes
  • Deleted unused includes
  • Deleted useless braces
  • Modernized tests to use CHECK-MESSAGES-NOT and CHECK-FIXES-NOT for better readability and maintainability

Full diff: https://github.com/llvm/llvm-project/pull/140753.diff

3 Files Affected:

  • (modified) clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp (+1-2)
  • (modified) clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h (-2)
  • (modified) clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value.cpp (+13-11)
diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
index 7a9d04bfa8ba1..35f90fb8da15b 100644
--- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
+++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.cpp
@@ -166,9 +166,8 @@ static bool hasRValueOverload(const CXXConstructorDecl *Ctor,
   };
 
   for (const auto *Candidate : Record->ctors()) {
-    if (IsRValueOverload(Candidate)) {
+    if (IsRValueOverload(Candidate))
       return true;
-    }
   }
   return false;
 }
diff --git a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
index c7677edc37dc4..b586b8d5fbf66 100644
--- a/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
+++ b/clang-tools-extra/clang-tidy/modernize/PassByValueCheck.h
@@ -12,8 +12,6 @@
 #include "../ClangTidyCheck.h"
 #include "../utils/IncludeInserter.h"
 
-#include <memory>
-
 namespace clang::tidy::modernize {
 
 class PassByValueCheck : public ClangTidyCheck {
diff --git a/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value.cpp b/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value.cpp
index c0ebaebe4ccf6..4977186478793 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/modernize/pass-by-value.cpp
@@ -32,7 +32,7 @@ struct A {
 Movable GlobalObj;
 struct B {
   B(const Movable &M) : M(GlobalObj) {}
-  // CHECK-FIXES: B(const Movable &M) : M(GlobalObj) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   Movable M;
 };
 
@@ -40,11 +40,11 @@ struct B {
 struct C {
   // Tests extra-reference in body.
   C(const Movable &M) : M(M) { this->i = M.a; }
-  // CHECK-FIXES: C(const Movable &M) : M(M) { this->i = M.a; }
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
 
   // Tests extra-reference in init-list.
   C(const Movable &M, int) : M(M), i(M.a) {}
-  // CHECK-FIXES: C(const Movable &M, int) : M(M), i(M.a) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   Movable M;
   int i;
 };
@@ -70,7 +70,7 @@ struct E {
 // Test with object that can't be moved.
 struct F {
   F(const NotMovable &NM) : NM(NM) {}
-  // CHECK-FIXES: F(const NotMovable &NM) : NM(NM) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   NotMovable NM;
 };
 
@@ -112,7 +112,8 @@ struct I {
 // Test that templates aren't modified.
 template <typename T> struct J {
   J(const T &M) : M(M) {}
-  // CHECK-FIXES: J(const T &M) : M(M) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
+  // CHECK-FIXES-NOT: J(T M) : M(std::move(M)) {}
   T M;
 };
 J<Movable> j1(Movable());
@@ -129,13 +130,14 @@ struct MovableTemplateT
 template <class T>
 struct J2 {
   J2(const MovableTemplateT<T>& A);
-  // CHECK-FIXES: J2(const MovableTemplateT<T>& A);
+  // CHECK-FIXES-NOT: J2(MovableTemplateT<T> A);
   MovableTemplateT<T> M;
 };
 
 template <class T>
 J2<T>::J2(const MovableTemplateT<T>& A) : M(A) {}
-// CHECK-FIXES: J2<T>::J2(const MovableTemplateT<T>& A) : M(A) {}
+// CHECK-MESSAGES-NOT: :[[@LINE-1]]:11: warning: pass by value and use std::move
+// CHECK-FIXES-NOT: J2<T>::J2(MovableTemplateT<T> A) : M(std::move(A)) {}
 J2<int> j3(MovableTemplateT<int>{});
 
 struct K_Movable {
@@ -182,7 +184,7 @@ struct O {
 // Test with a const-value parameter.
 struct P {
   P(const Movable M) : M(M) {}
-  // CHECK-FIXES: P(const Movable M) : M(M) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   Movable M;
 };
 
@@ -215,7 +217,7 @@ struct R {
 // Test with rvalue parameter.
 struct S {
   S(Movable &&M) : M(M) {}
-  // CHECK-FIXES: S(Movable &&M) : M(M) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   Movable M;
 };
 
@@ -225,13 +227,13 @@ template <typename T, int N> struct array { T A[N]; };
 // cause problems with performance-move-const-arg, as it will revert it.
 struct T {
   T(array<int, 10> a) : a_(a) {}
-  // CHECK-FIXES: T(array<int, 10> a) : a_(a) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   array<int, 10> a_;
 };
 
 struct U {
   U(const POD &M) : M(M) {}
-  // CHECK-FIXES: U(const POD &M) : M(M) {}
+  // CHECK-MESSAGES-NOT: :[[@LINE-1]]:5: warning: pass by value and use std::move
   POD M;
 };
 

Copy link
Contributor

@carlosgalvezp carlosgalvezp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why are the fixes being removed? CHECK-FIXES is not equivalent to CHECK-MESSAGES-NOT

@carlosgalvezp
Copy link
Contributor

carlosgalvezp commented May 20, 2025

Also, CHECK-MESSAGES-NOT is discouraged, since the testing framework already checks that no other output is produced by default.

@vbvictor
Copy link
Contributor Author

vbvictor commented May 20, 2025

Also, CHECK-MESSAGES-NOT is discouraged, since the testing framework already checks that no other output is produced by default.

So if CHECK-FIXES are the same as previous (written in test file) code, we can remove them completely (I changed them to CHECK-MESSAGES-NOT)

@vbvictor vbvictor requested a review from carlosgalvezp May 20, 2025 17:29
@vbvictor
Copy link
Contributor Author

vbvictor commented May 20, 2025

Why are the fixes being removed? CHECK-FIXES is not equivalent to CHECK-MESSAGES-NOT

CHECK-FIXES are removed completely because they have the same code as the "unfixed" version.
e.g.

F(const NotMovable &NM) : NM(NM) {}
// CHECK-FIXES: F(const NotMovable &NM) : NM(NM) {}

I think this was used to make sure that the check doesn't produce messages and change the code, but now this behavior is active by default so we don't need them

@carlosgalvezp
Copy link
Contributor

Thanks, I didn't notice they were the same. In that case they should be removed and have nothing. Optionally one can add a human-readable comment like "Should not trigger here" or something, but it's not necessary.

Copy link
Contributor

@carlosgalvezp carlosgalvezp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@carlosgalvezp carlosgalvezp merged commit 64dcf78 into llvm:main May 21, 2025
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants