diff options
| author | bors <bors@rust-lang.org> | 2021-09-17 22:25:07 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-09-17 22:25:07 +0000 |
| commit | 59cd77710d73ba65d56f0c5c167ef503174a4826 (patch) | |
| tree | 0357334f5187a924978a1e7b1a8697a2f109736e | |
| parent | ed7a82ef053de9560b64f8d72de7294d11a9fc59 (diff) | |
| parent | 81d57de79106171026159399aa821830412fe8e8 (diff) | |
| download | rust-59cd77710d73ba65d56f0c5c167ef503174a4826.tar.gz rust-59cd77710d73ba65d56f0c5c167ef503174a4826.zip | |
Auto merge of #7657 - dswij:needless-borrow-mut, r=llogiq
`needless_borrow` checks for mutable borrow closes #7635 changelog: [`needless_borrow`] now checks for needless mutable borrow
| -rw-r--r-- | clippy_lints/src/needless_borrow.rs | 12 | ||||
| -rw-r--r-- | tests/ui/needless_borrow.fixed | 24 | ||||
| -rw-r--r-- | tests/ui/needless_borrow.rs | 24 | ||||
| -rw-r--r-- | tests/ui/needless_borrow.stderr | 14 |
4 files changed, 51 insertions, 23 deletions
diff --git a/clippy_lints/src/needless_borrow.rs b/clippy_lints/src/needless_borrow.rs index ba8f9446af8..1b2495d764d 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) { diff --git a/tests/ui/needless_borrow.fixed b/tests/ui/needless_borrow.fixed index a87171dc3f2..42c2bb9f414 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<T>` 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<T: Copy>(y: &T) -> T { *y } diff --git a/tests/ui/needless_borrow.rs b/tests/ui/needless_borrow.rs index 059dc8ceac3..31977416bc7 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<T>` 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<T: Copy>(y: &T) -> T { *y } diff --git a/tests/ui/needless_borrow.stderr b/tests/ui/needless_borrow.stderr index 6eddf26db06..012d62e2871 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 |
