1
Fork 0

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:
Michael Goulet 2022-03-28 19:30:39 -07:00
parent a9b02e13a6
commit ac95e80186
9 changed files with 53 additions and 4 deletions

View file

@ -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, &note_msg) { if self.suggest_borrow_fn_like(&mut err, ty, &move_site_vec, &note_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 {

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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 {

View file

@ -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`.

View file

@ -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