diff options
9 files changed, 53 insertions, 4 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs index fcbefc74895..883f711b201 100644 --- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs +++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs @@ -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, ¬e_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 { diff --git a/src/test/ui/chalkify/closure.stderr b/src/test/ui/chalkify/closure.stderr index d5a48a7dc6f..515e0cf0142 100644 --- a/src/test/ui/chalkify/closure.stderr +++ b/src/test/ui/chalkify/closure.stderr @@ -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 diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-multi-variant-diagnostics.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-multi-variant-diagnostics.stderr index 066c000c832..83d282aadb9 100644 --- a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-multi-variant-diagnostics.stderr +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-multi-variant-diagnostics.stderr @@ -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 diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr index 2a6e00850fa..46323b75210 100644 --- a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr @@ -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 diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-struct-diagnostics.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-struct-diagnostics.stderr index d7fc51c55ea..25029cc7bd8 100644 --- a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-struct-diagnostics.stderr +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-struct-diagnostics.stderr @@ -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 diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-tuple-diagnostics-1.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-tuple-diagnostics-1.stderr index 63e2d300eb0..06ef7baf9c0 100644 --- a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-tuple-diagnostics-1.stderr +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-tuple-diagnostics-1.stderr @@ -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 diff --git a/src/test/ui/moves/borrow-closures-instead-of-move.rs b/src/test/ui/moves/borrow-closures-instead-of-move.rs index adbbf4ee1a8..51771ced7f2 100644 --- a/src/test/ui/moves/borrow-closures-instead-of-move.rs +++ b/src/test/ui/moves/borrow-closures-instead-of-move.rs @@ -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 { diff --git a/src/test/ui/moves/borrow-closures-instead-of-move.stderr b/src/test/ui/moves/borrow-closures-instead-of-move.stderr index ff10d3c6006..3146b695900 100644 --- a/src/test/ui/moves/borrow-closures-instead-of-move.stderr +++ b/src/test/ui/moves/borrow-closures-instead-of-move.stderr @@ -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`. diff --git a/src/test/ui/not-copy-closure.stderr b/src/test/ui/not-copy-closure.stderr index 10bf570727f..93e011ccec4 100644 --- a/src/test/ui/not-copy-closure.stderr +++ b/src/test/ui/not-copy-closure.stderr @@ -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 |
