Skip to content

Commit

Permalink
Remove asterisk suggestion for move errors in borrowck
Browse files Browse the repository at this point in the history
As per issue #54985 removes the not useful suggestion to remove asterisk in
move errors. Includes minor changes to tests in the `ui` suite to account
for the removed suggestion.
  • Loading branch information
kungfukennyg committed Jun 4, 2019
1 parent acda261 commit de677b9
Show file tree
Hide file tree
Showing 13 changed files with 53 additions and 73 deletions.
32 changes: 6 additions & 26 deletions src/librustc_mir/borrow_check/move_errors.rs
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/access-mode-in-closures.stderr
Expand Up @@ -6,7 +6,7 @@ LL | match *s { S(v) => v }
| | |
| | data moved here
| | move occurs because `v` has type `std::vec::Vec<isize>`, which does not implement the `Copy` trait
| help: consider removing the `*`: `s`
| help: consider borrowing here: `&*s`

error: aborting due to previous error

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/borrowck/borrowck-issue-2657-2.stderr
Expand Up @@ -5,7 +5,7 @@ LL | let _b = *y;
| ^^
| |
| move occurs because `*y` has type `std::boxed::Box<i32>`, which does not implement the `Copy` trait
| help: consider removing the `*`: `y`
| help: consider borrowing here: `&*y`

error: aborting due to previous error

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/borrowck/borrowck-move-error-with-note.stderr
Expand Up @@ -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) => (),
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/borrowck/borrowck-move-from-unsafe-ptr.stderr
Expand Up @@ -5,7 +5,7 @@ LL | let y = *x;
| ^^
| |
| move occurs because `*x` has type `std::boxed::Box<isize>`, which does not implement the `Copy` trait
| help: consider removing the `*`: `x`
| help: consider borrowing here: `&*x`

error: aborting due to previous error

Expand Down
Expand Up @@ -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

Expand Down
Expand Up @@ -5,7 +5,7 @@ LL | *array
| ^^^^^^
| |
| move occurs because `*array` has type `std::vec::Vec<Value>`, which does not implement the `Copy` trait
| help: consider removing the `*`: `array`
| help: consider borrowing here: `&*array`

error: aborting due to previous error

Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/issues/issue-20801.stderr
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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

Expand Down
12 changes: 6 additions & 6 deletions src/test/ui/nll/cannot-move-block-spans.stderr
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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

Expand Down
10 changes: 5 additions & 5 deletions src/test/ui/nll/move-errors.stderr
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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) => (),
| -
Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/std-uncopyable-atomics.stderr
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand All @@ -32,7 +32,7 @@ LL | let x = *&x;
| ^^^
| |
| move occurs because value has type `std::sync::atomic::AtomicPtr<usize>`, which does not implement the `Copy` trait
| help: consider removing the `*`: `&x`
| help: consider borrowing here: `&*&x`

error: aborting due to 4 previous errors

Expand Down
22 changes: 11 additions & 11 deletions src/test/ui/suggestions/dont-suggest-ref/simple.rs
Expand Up @@ -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) => (),
Expand All @@ -65,34 +65,34 @@ 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) => (),
// FIXME: should suggest removing `ref` too
}
match *rm {
//~^ ERROR cannot move
//~| HELP consider removing the `*`
//~| HELP consider borrowing here
//~| SUGGESTION rm
Either::One(_t) => (),
Either::Two(ref mut _t) => (),
Expand Down

0 comments on commit de677b9

Please sign in to comment.