File tree Expand file tree Collapse file tree 4 files changed +51
-23
lines changed Expand file tree Collapse file tree 4 files changed +51
-23
lines changed Original file line number Diff line number Diff 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 ) {
Original file line number Diff line number Diff line change 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)]
115fn 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+
3240fn f<T: Copy>(y: &T) -> T {
3341 *y
3442}
Original file line number Diff line number Diff line change 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) ]
115fn 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+
3240fn f < T : Copy > ( y : & T ) -> T {
3341 * y
3442}
Original file line number Diff line number Diff line change 11error: 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+
915error: 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 |
1218LL | 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
You can’t perform that action at this time.
0 commit comments