Skip to content

Commit

Permalink
Rollup merge of rust-lang#61332 - kennethbgoodin:borrowck-remove-aste…
Browse files Browse the repository at this point in the history
…risk-suggestion, r=matthewjasper

Remove asterisk suggestion for move errors in borrowck

As per the decision in rust-lang#54985 completely removes the suggestion to add an asterisk when checking move errors. I believe I've preserved the correct behavior with the "consider borrowing here" branch of the original match arm, but I'm not positive on that.

This is my first PR to rustc so any feedback is greatly appreciated. Thanks.
  • Loading branch information
Centril committed Jun 7, 2019
2 parents c1c60d2 + de677b9 commit 9ab654c
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Loading

0 comments on commit 9ab654c

Please sign in to comment.