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

Add suggestion to borrow Fn and FnMut params/opaque/closures instead of move #95257

Merged
merged 3 commits into from
Mar 29, 2022
Merged
Changes from 1 commit
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
Prev Previous commit
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.
compiler-errors committed Mar 29, 2022
commit ac95e8018655fcdc2a0429789cc7aa3770208c7a
8 changes: 6 additions & 2 deletions compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
Original file line number Diff line number Diff line change
@@ -284,10 +284,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
None => "value".to_owned(),
};
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
} else if needs_note {
// Suppress the next suggestion since we don't want to put more bounds onto
// 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);
}

if needs_note {
let span = if let Some(local) = place.as_local() {
Some(self.body.local_decls[local].source_info.span)
} else {
4 changes: 4 additions & 0 deletions src/test/ui/chalkify/closure.stderr
Original file line number Diff line number Diff line change
@@ -12,6 +12,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
LL | a = 1;
| ^
help: consider mutably borrowing `b`
|
LL | let mut c = &mut b;
| ++++

error: aborting due to previous error

Original file line number Diff line number Diff line change
@@ -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 {
| ^^^^^
help: consider mutably borrowing `c`
|
LL | let a = &mut c;
| ++++

error: aborting due to previous error

Original file line number Diff line number Diff line change
@@ -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;
| ^^^^^
help: consider mutably borrowing `c`
|
LL | let b = &mut c;
| ++++

error: aborting due to previous error

Original file line number Diff line number Diff line change
@@ -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;
| ^^^^^
help: consider mutably borrowing `hello`
|
LL | let b = &mut hello;
| ++++

error: aborting due to previous error

Original file line number Diff line number Diff line change
@@ -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;
| ^^^
help: consider mutably borrowing `hello`
|
LL | let b = &mut hello;
| ++++

error: aborting due to previous error

4 changes: 3 additions & 1 deletion src/test/ui/moves/borrow-closures-instead-of-move.rs
Original file line number Diff line number Diff line change
@@ -17,11 +17,13 @@ fn takes_fn_mut(m: impl FnMut()) {

fn has_closure() {
let mut x = 0;
let closure = || {
let mut closure = || {
x += 1;
};
takes_fnonce(closure);
//~^ HELP consider mutably borrowing
closure();
//~^ ERROR borrow of moved value
}

fn maybe() -> bool {
21 changes: 20 additions & 1 deletion src/test/ui/moves/borrow-closures-instead-of-move.stderr
Original file line number Diff line number Diff line change
@@ -29,6 +29,25 @@ help: consider mutably borrowing `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`.
4 changes: 4 additions & 0 deletions src/test/ui/not-copy-closure.stderr
Original file line number Diff line number Diff line change
@@ -11,6 +11,10 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
LL | a += 1;
| ^
help: consider mutably borrowing `hello`
|
LL | let b = &mut hello;
| ++++

error: aborting due to previous error