Skip to content

Commit 59cd777

Browse files
committed
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
2 parents ed7a82e + 81d57de commit 59cd777

File tree

4 files changed

+51
-23
lines changed

4 files changed

+51
-23
lines changed

clippy_lints/src/needless_borrow.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessBorrow {
104104
if e.span.from_expansion() {
105105
return;
106106
}
107-
if let ExprKind::AddrOf(BorrowKind::Ref, Mutability::Not, inner) = e.kind {
107+
if let ExprKind::AddrOf(BorrowKind::Ref, mutability, inner) = e.kind {
108108
if let ty::Ref(_, ty, _) = cx.typeck_results().expr_ty(inner).kind() {
109109
for adj3 in cx.typeck_results().expr_adjustments(e).windows(3) {
110110
if let [Adjustment {
@@ -116,14 +116,20 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessBorrow {
116116
..
117117
}] = *adj3
118118
{
119+
let help_msg_ty = if matches!(mutability, Mutability::Not) {
120+
format!("&{}", ty)
121+
} else {
122+
format!("&mut {}", ty)
123+
};
124+
119125
span_lint_and_then(
120126
cx,
121127
NEEDLESS_BORROW,
122128
e.span,
123129
&format!(
124-
"this expression borrows a reference (`&{}`) that is immediately dereferenced \
130+
"this expression borrows a reference (`{}`) that is immediately dereferenced \
125131
by the compiler",
126-
ty
132+
help_msg_ty
127133
),
128134
|diag| {
129135
if let Some(snippet) = snippet_opt(cx, inner.span) {

tests/ui/needless_borrow.fixed

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
// run-rustfix
22

3-
#![allow(clippy::needless_borrowed_reference)]
4-
5-
fn x(y: &i32) -> i32 {
6-
*y
7-
}
8-
93
#[warn(clippy::all, clippy::needless_borrow)]
104
#[allow(unused_variables)]
115
fn main() {
126
let a = 5;
13-
let b = x(&a);
14-
let c = x(&a);
7+
let _ = x(&a); // no warning
8+
let _ = x(&a); // warn
9+
10+
let mut b = 5;
11+
mut_ref(&mut b); // no warning
12+
mut_ref(&mut b); // warn
13+
1514
let s = &String::from("hi");
1615
let s_ident = f(&s); // should not error, because `&String` implements Copy, but `String` does not
1716
let g_val = g(&Vec::new()); // should not error, because `&Vec<T>` derefs to `&[T]`
@@ -29,6 +28,15 @@ fn main() {
2928
};
3029
}
3130

31+
#[allow(clippy::needless_borrowed_reference)]
32+
fn x(y: &i32) -> i32 {
33+
*y
34+
}
35+
36+
fn mut_ref(y: &mut i32) {
37+
*y = 5;
38+
}
39+
3240
fn f<T: Copy>(y: &T) -> T {
3341
*y
3442
}

tests/ui/needless_borrow.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
// run-rustfix
22

3-
#![allow(clippy::needless_borrowed_reference)]
4-
5-
fn x(y: &i32) -> i32 {
6-
*y
7-
}
8-
93
#[warn(clippy::all, clippy::needless_borrow)]
104
#[allow(unused_variables)]
115
fn main() {
126
let a = 5;
13-
let b = x(&a);
14-
let c = x(&&a);
7+
let _ = x(&a); // no warning
8+
let _ = x(&&a); // warn
9+
10+
let mut b = 5;
11+
mut_ref(&mut b); // no warning
12+
mut_ref(&mut &mut b); // warn
13+
1514
let s = &String::from("hi");
1615
let s_ident = f(&s); // should not error, because `&String` implements Copy, but `String` does not
1716
let g_val = g(&Vec::new()); // should not error, because `&Vec<T>` derefs to `&[T]`
@@ -29,6 +28,15 @@ fn main() {
2928
};
3029
}
3130

31+
#[allow(clippy::needless_borrowed_reference)]
32+
fn x(y: &i32) -> i32 {
33+
*y
34+
}
35+
36+
fn mut_ref(y: &mut i32) {
37+
*y = 5;
38+
}
39+
3240
fn f<T: Copy>(y: &T) -> T {
3341
*y
3442
}

tests/ui/needless_borrow.stderr

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
error: this expression borrows a reference (`&i32`) that is immediately dereferenced by the compiler
2-
--> $DIR/needless_borrow.rs:14:15
2+
--> $DIR/needless_borrow.rs:8:15
33
|
4-
LL | let c = x(&&a);
4+
LL | let _ = x(&&a); // warn
55
| ^^^ help: change this to: `&a`
66
|
77
= note: `-D clippy::needless-borrow` implied by `-D warnings`
88

9+
error: this expression borrows a reference (`&mut i32`) that is immediately dereferenced by the compiler
10+
--> $DIR/needless_borrow.rs:12:13
11+
|
12+
LL | mut_ref(&mut &mut b); // warn
13+
| ^^^^^^^^^^^ help: change this to: `&mut b`
14+
915
error: this expression borrows a reference (`&i32`) that is immediately dereferenced by the compiler
10-
--> $DIR/needless_borrow.rs:27:15
16+
--> $DIR/needless_borrow.rs:26:15
1117
|
1218
LL | 46 => &&a,
1319
| ^^^ help: change this to: `&a`
1420

15-
error: aborting due to 2 previous errors
21+
error: aborting due to 3 previous errors
1622

0 commit comments

Comments
 (0)