diff --git a/src/librustc_mir/borrow_check/move_errors.rs b/src/librustc_mir/borrow_check/move_errors.rs index f892c1597057b..c421839513c01 100644 --- a/src/librustc_mir/borrow_check/move_errors.rs +++ b/src/librustc_mir/borrow_check/move_errors.rs @@ -503,32 +503,12 @@ impl<'a, 'gcx, 'tcx> MirBorrowckCtxt<'a, 'gcx, 'tcx> { move_from, .. } => { - let try_remove_deref = match move_from { - Place::Projection(box Projection { - elem: ProjectionElem::Deref, - .. - }) => true, - _ => false, - }; - if try_remove_deref && snippet.starts_with('*') { - // The snippet doesn't start with `*` in (e.g.) index - // expressions `a[b]`, which roughly desugar to - // `*Index::index(&a, b)` or - // `*IndexMut::index_mut(&mut a, b)`. - err.span_suggestion( - span, - "consider removing the `*`", - snippet[1..].to_owned(), - Applicability::Unspecified, - ); - } else { - err.span_suggestion( - span, - "consider borrowing here", - format!("&{}", snippet), - Applicability::Unspecified, - ); - } + err.span_suggestion( + span, + "consider borrowing here", + format!("&{}", snippet), + Applicability::Unspecified, + ); if binds_to.is_empty() { let place_ty = move_from.ty(self.mir, self.infcx.tcx).ty; diff --git a/src/test/ui/access-mode-in-closures.stderr b/src/test/ui/access-mode-in-closures.stderr index 424d7ebb37444..349e3f4a836a0 100644 --- a/src/test/ui/access-mode-in-closures.stderr +++ b/src/test/ui/access-mode-in-closures.stderr @@ -6,7 +6,7 @@ LL | match *s { S(v) => v } | | | | | data moved here | | move occurs because `v` has type `std::vec::Vec`, which does not implement the `Copy` trait - | help: consider removing the `*`: `s` + | help: consider borrowing here: `&*s` error: aborting due to previous error diff --git a/src/test/ui/borrowck/borrowck-issue-2657-2.stderr b/src/test/ui/borrowck/borrowck-issue-2657-2.stderr index 908b2c0ff5ee8..5880a1abb818c 100644 --- a/src/test/ui/borrowck/borrowck-issue-2657-2.stderr +++ b/src/test/ui/borrowck/borrowck-issue-2657-2.stderr @@ -5,7 +5,7 @@ LL | let _b = *y; | ^^ | | | move occurs because `*y` has type `std::boxed::Box`, which does not implement the `Copy` trait - | help: consider removing the `*`: `y` + | help: consider borrowing here: `&*y` error: aborting due to previous error diff --git a/src/test/ui/borrowck/borrowck-move-error-with-note.stderr b/src/test/ui/borrowck/borrowck-move-error-with-note.stderr index 13d3faab6508a..d56b9f562c932 100644 --- a/src/test/ui/borrowck/borrowck-move-error-with-note.stderr +++ b/src/test/ui/borrowck/borrowck-move-error-with-note.stderr @@ -2,7 +2,7 @@ error[E0507]: cannot move out of `f.0` which is behind a shared reference --> $DIR/borrowck-move-error-with-note.rs:11:11 | LL | match *f { - | ^^ help: consider removing the `*`: `f` + | ^^ help: consider borrowing here: `&*f` LL | Foo::Foo1(num1, | ---- data moved here LL | num2) => (), diff --git a/src/test/ui/borrowck/borrowck-move-from-unsafe-ptr.stderr b/src/test/ui/borrowck/borrowck-move-from-unsafe-ptr.stderr index 6c806e0896b37..7dfae33920e1c 100644 --- a/src/test/ui/borrowck/borrowck-move-from-unsafe-ptr.stderr +++ b/src/test/ui/borrowck/borrowck-move-from-unsafe-ptr.stderr @@ -5,7 +5,7 @@ LL | let y = *x; | ^^ | | | move occurs because `*x` has type `std::boxed::Box`, which does not implement the `Copy` trait - | help: consider removing the `*`: `x` + | help: consider borrowing here: `&*x` error: aborting due to previous error diff --git a/src/test/ui/borrowck/borrowck-move-out-of-overloaded-deref.stderr b/src/test/ui/borrowck/borrowck-move-out-of-overloaded-deref.stderr index da3e5c54b75f7..1501644fac758 100644 --- a/src/test/ui/borrowck/borrowck-move-out-of-overloaded-deref.stderr +++ b/src/test/ui/borrowck/borrowck-move-out-of-overloaded-deref.stderr @@ -5,7 +5,7 @@ LL | let _x = *Rc::new("hi".to_string()); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | move occurs because value has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `Rc::new("hi".to_string())` + | help: consider borrowing here: `&*Rc::new("hi".to_string())` error: aborting due to previous error diff --git a/src/test/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr b/src/test/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr index 6ba801b9714bf..78d44f3206199 100644 --- a/src/test/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr +++ b/src/test/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr @@ -5,7 +5,7 @@ LL | *array | ^^^^^^ | | | move occurs because `*array` has type `std::vec::Vec`, which does not implement the `Copy` trait - | help: consider removing the `*`: `array` + | help: consider borrowing here: `&*array` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-20801.stderr b/src/test/ui/issues/issue-20801.stderr index 1bbd874a44802..d276231dc0c96 100644 --- a/src/test/ui/issues/issue-20801.stderr +++ b/src/test/ui/issues/issue-20801.stderr @@ -5,7 +5,7 @@ LL | let a = unsafe { *mut_ref() }; | ^^^^^^^^^^ | | | move occurs because value has type `T`, which does not implement the `Copy` trait - | help: consider removing the `*`: `mut_ref()` + | help: consider borrowing here: `&*mut_ref()` error[E0507]: cannot move out of a shared reference --> $DIR/issue-20801.rs:29:22 @@ -14,7 +14,7 @@ LL | let b = unsafe { *imm_ref() }; | ^^^^^^^^^^ | | | move occurs because value has type `T`, which does not implement the `Copy` trait - | help: consider removing the `*`: `imm_ref()` + | help: consider borrowing here: `&*imm_ref()` error[E0507]: cannot move out of a raw pointer --> $DIR/issue-20801.rs:32:22 @@ -23,7 +23,7 @@ LL | let c = unsafe { *mut_ptr() }; | ^^^^^^^^^^ | | | move occurs because value has type `T`, which does not implement the `Copy` trait - | help: consider removing the `*`: `mut_ptr()` + | help: consider borrowing here: `&*mut_ptr()` error[E0507]: cannot move out of a raw pointer --> $DIR/issue-20801.rs:35:22 @@ -32,7 +32,7 @@ LL | let d = unsafe { *const_ptr() }; | ^^^^^^^^^^^^ | | | move occurs because value has type `T`, which does not implement the `Copy` trait - | help: consider removing the `*`: `const_ptr()` + | help: consider borrowing here: `&*const_ptr()` error: aborting due to 4 previous errors diff --git a/src/test/ui/nll/cannot-move-block-spans.stderr b/src/test/ui/nll/cannot-move-block-spans.stderr index 4a9635b060db3..7db5d731acd17 100644 --- a/src/test/ui/nll/cannot-move-block-spans.stderr +++ b/src/test/ui/nll/cannot-move-block-spans.stderr @@ -5,7 +5,7 @@ LL | let x = { *r }; | ^^ | | | move occurs because `*r` has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error[E0507]: cannot move out of `*r` which is behind a shared reference --> $DIR/cannot-move-block-spans.rs:6:22 @@ -14,7 +14,7 @@ LL | let y = unsafe { *r }; | ^^ | | | move occurs because `*r` has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error[E0507]: cannot move out of `*r` which is behind a shared reference --> $DIR/cannot-move-block-spans.rs:7:26 @@ -23,7 +23,7 @@ LL | let z = loop { break *r; }; | ^^ | | | move occurs because `*r` has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error[E0508]: cannot move out of type `[std::string::String; 2]`, a non-copy array --> $DIR/cannot-move-block-spans.rs:11:15 @@ -62,7 +62,7 @@ LL | let x = { let mut u = 0; u += 1; *r }; | ^^ | | | move occurs because `*r` has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error[E0507]: cannot move out of `*r` which is behind a shared reference --> $DIR/cannot-move-block-spans.rs:18:45 @@ -71,7 +71,7 @@ LL | let y = unsafe { let mut u = 0; u += 1; *r }; | ^^ | | | move occurs because `*r` has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error[E0507]: cannot move out of `*r` which is behind a shared reference --> $DIR/cannot-move-block-spans.rs:19:49 @@ -80,7 +80,7 @@ LL | let z = loop { let mut u = 0; u += 1; break *r; u += 2; }; | ^^ | | | move occurs because `*r` has type `std::string::String`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error: aborting due to 9 previous errors diff --git a/src/test/ui/nll/move-errors.stderr b/src/test/ui/nll/move-errors.stderr index 086f7bcdc4f27..7139617a97a4f 100644 --- a/src/test/ui/nll/move-errors.stderr +++ b/src/test/ui/nll/move-errors.stderr @@ -5,7 +5,7 @@ LL | let b = *a; | ^^ | | | move occurs because `*a` has type `A`, which does not implement the `Copy` trait - | help: consider removing the `*`: `a` + | help: consider borrowing here: `&*a` error[E0508]: cannot move out of type `[A; 1]`, a non-copy array --> $DIR/move-errors.rs:12:13 @@ -24,7 +24,7 @@ LL | let s = **r; | ^^^ | | | move occurs because `**r` has type `A`, which does not implement the `Copy` trait - | help: consider removing the `*`: `*r` + | help: consider borrowing here: `&**r` error[E0507]: cannot move out of an `Rc` --> $DIR/move-errors.rs:27:13 @@ -33,7 +33,7 @@ LL | let s = *r; | ^^ | | | move occurs because value has type `A`, which does not implement the `Copy` trait - | help: consider removing the `*`: `r` + | help: consider borrowing here: `&*r` error[E0508]: cannot move out of type `[A; 1]`, a non-copy array --> $DIR/move-errors.rs:32:13 @@ -49,7 +49,7 @@ error[E0507]: cannot move out of `a.0` which is behind a shared reference --> $DIR/move-errors.rs:38:16 | LL | let A(s) = *a; - | - ^^ help: consider removing the `*`: `a` + | - ^^ help: consider borrowing here: `&*a` | | | data moved here | move occurs because `s` has type `std::string::String`, which does not implement the `Copy` trait @@ -148,7 +148,7 @@ error[E0507]: cannot move out of `x.0` which is behind a shared reference --> $DIR/move-errors.rs:110:11 | LL | match *x { - | ^^ help: consider removing the `*`: `x` + | ^^ help: consider borrowing here: `&*x` LL | LL | Ok(s) | Err(s) => (), | - diff --git a/src/test/ui/std-uncopyable-atomics.stderr b/src/test/ui/std-uncopyable-atomics.stderr index 189a27db382cd..9db9fcf40f82c 100644 --- a/src/test/ui/std-uncopyable-atomics.stderr +++ b/src/test/ui/std-uncopyable-atomics.stderr @@ -5,7 +5,7 @@ LL | let x = *&x; | ^^^ | | | move occurs because value has type `std::sync::atomic::AtomicBool`, which does not implement the `Copy` trait - | help: consider removing the `*`: `&x` + | help: consider borrowing here: `&*&x` error[E0507]: cannot move out of a shared reference --> $DIR/std-uncopyable-atomics.rs:11:13 @@ -14,7 +14,7 @@ LL | let x = *&x; | ^^^ | | | move occurs because value has type `std::sync::atomic::AtomicIsize`, which does not implement the `Copy` trait - | help: consider removing the `*`: `&x` + | help: consider borrowing here: `&*&x` error[E0507]: cannot move out of a shared reference --> $DIR/std-uncopyable-atomics.rs:13:13 @@ -23,7 +23,7 @@ LL | let x = *&x; | ^^^ | | | move occurs because value has type `std::sync::atomic::AtomicUsize`, which does not implement the `Copy` trait - | help: consider removing the `*`: `&x` + | help: consider borrowing here: `&*&x` error[E0507]: cannot move out of a shared reference --> $DIR/std-uncopyable-atomics.rs:15:13 @@ -32,7 +32,7 @@ LL | let x = *&x; | ^^^ | | | move occurs because value has type `std::sync::atomic::AtomicPtr`, which does not implement the `Copy` trait - | help: consider removing the `*`: `&x` + | help: consider borrowing here: `&*&x` error: aborting due to 4 previous errors diff --git a/src/test/ui/suggestions/dont-suggest-ref/simple.rs b/src/test/ui/suggestions/dont-suggest-ref/simple.rs index 31ab1a6639acc..69b303a66237e 100644 --- a/src/test/ui/suggestions/dont-suggest-ref/simple.rs +++ b/src/test/ui/suggestions/dont-suggest-ref/simple.rs @@ -37,26 +37,26 @@ pub fn main() { let X(_t) = *s; //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION s if let Either::One(_t) = *r { } //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION r while let Either::One(_t) = *r { } //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION r match *r { //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION r Either::One(_t) | Either::Two(_t) => (), } match *r { //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION r Either::One(_t) => (), Either::Two(ref _t) => (), @@ -65,26 +65,26 @@ pub fn main() { let X(_t) = *sm; //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION sm if let Either::One(_t) = *rm { } //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION rm while let Either::One(_t) = *rm { } //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION rm match *rm { //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION rm Either::One(_t) | Either::Two(_t) => (), } match *rm { //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION rm Either::One(_t) => (), Either::Two(ref _t) => (), @@ -92,7 +92,7 @@ pub fn main() { } match *rm { //~^ ERROR cannot move - //~| HELP consider removing the `*` + //~| HELP consider borrowing here //~| SUGGESTION rm Either::One(_t) => (), Either::Two(ref mut _t) => (), diff --git a/src/test/ui/suggestions/dont-suggest-ref/simple.stderr b/src/test/ui/suggestions/dont-suggest-ref/simple.stderr index bde3afa3840a2..cb3ce5991aeee 100644 --- a/src/test/ui/suggestions/dont-suggest-ref/simple.stderr +++ b/src/test/ui/suggestions/dont-suggest-ref/simple.stderr @@ -2,7 +2,7 @@ error[E0507]: cannot move out of `s.0` which is behind a shared reference --> $DIR/simple.rs:38:17 | LL | let X(_t) = *s; - | -- ^^ help: consider removing the `*`: `s` + | -- ^^ help: consider borrowing here: `&*s` | | | data moved here | move occurs because `_t` has type `Y`, which does not implement the `Copy` trait @@ -11,7 +11,7 @@ error[E0507]: cannot move out of `r.0` which is behind a shared reference --> $DIR/simple.rs:42:30 | LL | if let Either::One(_t) = *r { } - | -- ^^ help: consider removing the `*`: `r` + | -- ^^ help: consider borrowing here: `&*r` | | | data moved here | move occurs because `_t` has type `X`, which does not implement the `Copy` trait @@ -20,7 +20,7 @@ error[E0507]: cannot move out of `r.0` which is behind a shared reference --> $DIR/simple.rs:46:33 | LL | while let Either::One(_t) = *r { } - | -- ^^ help: consider removing the `*`: `r` + | -- ^^ help: consider borrowing here: `&*r` | | | data moved here | move occurs because `_t` has type `X`, which does not implement the `Copy` trait @@ -29,7 +29,7 @@ error[E0507]: cannot move out of `r.0` which is behind a shared reference --> $DIR/simple.rs:50:11 | LL | match *r { - | ^^ help: consider removing the `*`: `r` + | ^^ help: consider borrowing here: `&*r` ... LL | Either::One(_t) | -- @@ -41,7 +41,7 @@ error[E0507]: cannot move out of `r.0` which is behind a shared reference --> $DIR/simple.rs:57:11 | LL | match *r { - | ^^ help: consider removing the `*`: `r` + | ^^ help: consider borrowing here: `&*r` ... LL | Either::One(_t) => (), | -- @@ -53,7 +53,7 @@ error[E0507]: cannot move out of `sm.0` which is behind a mutable reference --> $DIR/simple.rs:66:17 | LL | let X(_t) = *sm; - | -- ^^^ help: consider removing the `*`: `sm` + | -- ^^^ help: consider borrowing here: `&*sm` | | | data moved here | move occurs because `_t` has type `Y`, which does not implement the `Copy` trait @@ -62,7 +62,7 @@ error[E0507]: cannot move out of `rm.0` which is behind a mutable reference --> $DIR/simple.rs:70:30 | LL | if let Either::One(_t) = *rm { } - | -- ^^^ help: consider removing the `*`: `rm` + | -- ^^^ help: consider borrowing here: `&*rm` | | | data moved here | move occurs because `_t` has type `X`, which does not implement the `Copy` trait @@ -71,7 +71,7 @@ error[E0507]: cannot move out of `rm.0` which is behind a mutable reference --> $DIR/simple.rs:74:33 | LL | while let Either::One(_t) = *rm { } - | -- ^^^ help: consider removing the `*`: `rm` + | -- ^^^ help: consider borrowing here: `&*rm` | | | data moved here | move occurs because `_t` has type `X`, which does not implement the `Copy` trait @@ -80,7 +80,7 @@ error[E0507]: cannot move out of `rm.0` which is behind a mutable reference --> $DIR/simple.rs:78:11 | LL | match *rm { - | ^^^ help: consider removing the `*`: `rm` + | ^^^ help: consider borrowing here: `&*rm` ... LL | Either::One(_t) | -- @@ -92,7 +92,7 @@ error[E0507]: cannot move out of `rm.0` which is behind a mutable reference --> $DIR/simple.rs:85:11 | LL | match *rm { - | ^^^ help: consider removing the `*`: `rm` + | ^^^ help: consider borrowing here: `&*rm` ... LL | Either::One(_t) => (), | -- @@ -104,7 +104,7 @@ error[E0507]: cannot move out of `rm.0` which is behind a mutable reference --> $DIR/simple.rs:93:11 | LL | match *rm { - | ^^^ help: consider removing the `*`: `rm` + | ^^^ help: consider borrowing here: `&*rm` ... LL | Either::One(_t) => (), | --