From 6b4b77aa4408d6c297e8270e79c3ad36a07b0f1b Mon Sep 17 00:00:00 2001 From: dswij Date: Thu, 9 Sep 2021 23:33:28 +0800 Subject: [PATCH 1/3] Update test for needless-borrow FP for mutable ref --- tests/ui/needless_borrow.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/tests/ui/needless_borrow.rs b/tests/ui/needless_borrow.rs index 059dc8ceac31..31977416bc70 100644 --- a/tests/ui/needless_borrow.rs +++ b/tests/ui/needless_borrow.rs @@ -1,17 +1,16 @@ // run-rustfix -#![allow(clippy::needless_borrowed_reference)] - -fn x(y: &i32) -> i32 { - *y -} - #[warn(clippy::all, clippy::needless_borrow)] #[allow(unused_variables)] fn main() { let a = 5; - let b = x(&a); - let c = x(&&a); + let _ = x(&a); // no warning + let _ = x(&&a); // warn + + let mut b = 5; + mut_ref(&mut b); // no warning + mut_ref(&mut &mut b); // warn + let s = &String::from("hi"); let s_ident = f(&s); // should not error, because `&String` implements Copy, but `String` does not let g_val = g(&Vec::new()); // should not error, because `&Vec` derefs to `&[T]` @@ -29,6 +28,15 @@ fn main() { }; } +#[allow(clippy::needless_borrowed_reference)] +fn x(y: &i32) -> i32 { + *y +} + +fn mut_ref(y: &mut i32) { + *y = 5; +} + fn f(y: &T) -> T { *y } From 46c3076784b94b4f56771ee02850d01480d9aca2 Mon Sep 17 00:00:00 2001 From: dswij Date: Thu, 9 Sep 2021 23:37:18 +0800 Subject: [PATCH 2/3] Fix `needless_borrow` not linting mutable reference --- clippy_lints/src/needless_borrow.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/clippy_lints/src/needless_borrow.rs b/clippy_lints/src/needless_borrow.rs index ba8f9446af85..1b2495d764d2 100644 --- a/clippy_lints/src/needless_borrow.rs +++ b/clippy_lints/src/needless_borrow.rs @@ -104,7 +104,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessBorrow { if e.span.from_expansion() { return; } - if let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = e.kind { + if let ExprKind::AddrOf(BorrowKind::Ref, mutability, inner) = e.kind { if let ty::Ref(_, ty, _) = cx.typeck_results().expr_ty(inner).kind() { for adj3 in cx.typeck_results().expr_adjustments(e).windows(3) { if let [Adjustment { @@ -116,14 +116,20 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessBorrow { .. }] = *adj3 { + let help_msg_ty = if matches!(mutability, Mutability::Not) { + format!("&{}", ty) + } else { + format!("&mut {}", ty) + }; + span_lint_and_then( cx, NEEDLESS_BORROW, e.span, &format!( - "this expression borrows a reference (`&{}`) that is immediately dereferenced \ + "this expression borrows a reference (`{}`) that is immediately dereferenced \ by the compiler", - ty + help_msg_ty ), |diag| { if let Some(snippet) = snippet_opt(cx, inner.span) { From 81d57de79106171026159399aa821830412fe8e8 Mon Sep 17 00:00:00 2001 From: dswij Date: Thu, 9 Sep 2021 23:38:03 +0800 Subject: [PATCH 3/3] Update `needless_borrow` test output and expected fix --- tests/ui/needless_borrow.fixed | 24 ++++++++++++++++-------- tests/ui/needless_borrow.stderr | 14 ++++++++++---- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/tests/ui/needless_borrow.fixed b/tests/ui/needless_borrow.fixed index a87171dc3f24..42c2bb9f4149 100644 --- a/tests/ui/needless_borrow.fixed +++ b/tests/ui/needless_borrow.fixed @@ -1,17 +1,16 @@ // run-rustfix -#![allow(clippy::needless_borrowed_reference)] - -fn x(y: &i32) -> i32 { - *y -} - #[warn(clippy::all, clippy::needless_borrow)] #[allow(unused_variables)] fn main() { let a = 5; - let b = x(&a); - let c = x(&a); + let _ = x(&a); // no warning + let _ = x(&a); // warn + + let mut b = 5; + mut_ref(&mut b); // no warning + mut_ref(&mut b); // warn + let s = &String::from("hi"); let s_ident = f(&s); // should not error, because `&String` implements Copy, but `String` does not let g_val = g(&Vec::new()); // should not error, because `&Vec` derefs to `&[T]` @@ -29,6 +28,15 @@ fn main() { }; } +#[allow(clippy::needless_borrowed_reference)] +fn x(y: &i32) -> i32 { + *y +} + +fn mut_ref(y: &mut i32) { + *y = 5; +} + fn f(y: &T) -> T { *y } diff --git a/tests/ui/needless_borrow.stderr b/tests/ui/needless_borrow.stderr index 6eddf26db068..012d62e28715 100644 --- a/tests/ui/needless_borrow.stderr +++ b/tests/ui/needless_borrow.stderr @@ -1,16 +1,22 @@ error: this expression borrows a reference (`&i32`) that is immediately dereferenced by the compiler - --> $DIR/needless_borrow.rs:14:15 + --> $DIR/needless_borrow.rs:8:15 | -LL | let c = x(&&a); +LL | let _ = x(&&a); // warn | ^^^ help: change this to: `&a` | = note: `-D clippy::needless-borrow` implied by `-D warnings` +error: this expression borrows a reference (`&mut i32`) that is immediately dereferenced by the compiler + --> $DIR/needless_borrow.rs:12:13 + | +LL | mut_ref(&mut &mut b); // warn + | ^^^^^^^^^^^ help: change this to: `&mut b` + error: this expression borrows a reference (`&i32`) that is immediately dereferenced by the compiler - --> $DIR/needless_borrow.rs:27:15 + --> $DIR/needless_borrow.rs:26:15 | LL | 46 => &&a, | ^^^ help: change this to: `&a` -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors