Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove asterisk suggestion for move errors in borrowck #61332

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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