Suggest function borrow ignoring needs_note
`needs_note` is false if we've already suggested why the type is Copy... but that has nothing to do with the diagnostic.
This commit is contained in:
parent
a9b02e13a6
commit
ac95e80186
9 changed files with 53 additions and 4 deletions
|
@ -284,10 +284,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
None => "value".to_owned(),
|
None => "value".to_owned(),
|
||||||
};
|
};
|
||||||
if self.suggest_borrow_fn_like(&mut err, ty, &move_site_vec, ¬e_msg) {
|
if self.suggest_borrow_fn_like(&mut err, ty, &move_site_vec, ¬e_msg) {
|
||||||
// Suppress the next note, since we don't want to put more `Fn`-like bounds onto something that already has them
|
// Suppress the next suggestion since we don't want to put more bounds onto
|
||||||
} else if needs_note {
|
// something that already has `Fn`-like bounds (or is a closure), so we can't
|
||||||
|
// restrict anyways.
|
||||||
|
} else {
|
||||||
self.suggest_adding_copy_bounds(&mut err, ty, span);
|
self.suggest_adding_copy_bounds(&mut err, ty, span);
|
||||||
|
}
|
||||||
|
|
||||||
|
if needs_note {
|
||||||
let span = if let Some(local) = place.as_local() {
|
let span = if let Some(local) = place.as_local() {
|
||||||
Some(self.body.local_decls[local].source_info.span)
|
Some(self.body.local_decls[local].source_info.span)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -12,6 +12,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | a = 1;
|
LL | a = 1;
|
||||||
| ^
|
| ^
|
||||||
|
help: consider mutably borrowing `b`
|
||||||
|
|
|
||||||
|
LL | let mut c = &mut b;
|
||||||
|
| ++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | if let MultiVariant::Point(ref mut x, _) = point {
|
LL | if let MultiVariant::Point(ref mut x, _) = point {
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
help: consider mutably borrowing `c`
|
||||||
|
|
|
||||||
|
LL | let a = &mut c;
|
||||||
|
| ++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | let SingleVariant::Point(ref mut x, _) = point;
|
LL | let SingleVariant::Point(ref mut x, _) = point;
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
help: consider mutably borrowing `c`
|
||||||
|
|
|
||||||
|
LL | let b = &mut c;
|
||||||
|
| ++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | x.y.a += 1;
|
LL | x.y.a += 1;
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
help: consider mutably borrowing `hello`
|
||||||
|
|
|
||||||
|
LL | let b = &mut hello;
|
||||||
|
| ++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | x.0 += 1;
|
LL | x.0 += 1;
|
||||||
| ^^^
|
| ^^^
|
||||||
|
help: consider mutably borrowing `hello`
|
||||||
|
|
|
||||||
|
LL | let b = &mut hello;
|
||||||
|
| ++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -17,11 +17,13 @@ fn takes_fn_mut(m: impl FnMut()) {
|
||||||
|
|
||||||
fn has_closure() {
|
fn has_closure() {
|
||||||
let mut x = 0;
|
let mut x = 0;
|
||||||
let closure = || {
|
let mut closure = || {
|
||||||
x += 1;
|
x += 1;
|
||||||
};
|
};
|
||||||
takes_fnonce(closure);
|
takes_fnonce(closure);
|
||||||
|
//~^ HELP consider mutably borrowing
|
||||||
closure();
|
closure();
|
||||||
|
//~^ ERROR borrow of moved value
|
||||||
}
|
}
|
||||||
|
|
||||||
fn maybe() -> bool {
|
fn maybe() -> bool {
|
||||||
|
|
|
@ -29,6 +29,25 @@ help: consider mutably borrowing `m`
|
||||||
LL | takes_fnonce(&mut m);
|
LL | takes_fnonce(&mut m);
|
||||||
| ++++
|
| ++++
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error[E0382]: borrow of moved value: `closure`
|
||||||
|
--> $DIR/borrow-closures-instead-of-move.rs:25:5
|
||||||
|
|
|
||||||
|
LL | takes_fnonce(closure);
|
||||||
|
| ------- value moved here
|
||||||
|
LL |
|
||||||
|
LL | closure();
|
||||||
|
| ^^^^^^^ value borrowed here after move
|
||||||
|
|
|
||||||
|
note: closure cannot be moved more than once as it is not `Copy` due to moving the variable `x` out of its environment
|
||||||
|
--> $DIR/borrow-closures-instead-of-move.rs:21:9
|
||||||
|
|
|
||||||
|
LL | x += 1;
|
||||||
|
| ^
|
||||||
|
help: consider mutably borrowing `closure`
|
||||||
|
|
|
||||||
|
LL | takes_fnonce(&mut closure);
|
||||||
|
| ++++
|
||||||
|
|
||||||
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0382`.
|
For more information about this error, try `rustc --explain E0382`.
|
||||||
|
|
|
@ -11,6 +11,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | a += 1;
|
LL | a += 1;
|
||||||
| ^
|
| ^
|
||||||
|
help: consider mutably borrowing `hello`
|
||||||
|
|
|
||||||
|
LL | let b = &mut hello;
|
||||||
|
| ++++
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue