Don't suggest reborrow if usage is inside a closure
This commit is contained in:
parent
a2cdcb3fea
commit
41d4ea2314
3 changed files with 33 additions and 1 deletions
|
@ -258,7 +258,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
let ty = place.ty(self.body, self.infcx.tcx).ty;
|
let ty = place.ty(self.body, self.infcx.tcx).ty;
|
||||||
|
|
||||||
// If we're in pattern, we do nothing in favor of the previous suggestion (#80913).
|
// If we're in pattern, we do nothing in favor of the previous suggestion (#80913).
|
||||||
if is_loop_move & !in_pattern {
|
// Same for if we're in a loop, see #101119.
|
||||||
|
if is_loop_move & !in_pattern && !matches!(use_spans, UseSpans::ClosureUse { .. }) {
|
||||||
if let ty::Ref(_, _, hir::Mutability::Mut) = ty.kind() {
|
if let ty::Ref(_, _, hir::Mutability::Mut) = ty.kind() {
|
||||||
// We have a `&mut` ref, we need to reborrow on each iteration (#62112).
|
// We have a `&mut` ref, we need to reborrow on each iteration (#62112).
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
|
|
16
src/test/ui/borrowck/issue-101119.rs
Normal file
16
src/test/ui/borrowck/issue-101119.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
struct State;
|
||||||
|
|
||||||
|
fn once(_: impl FnOnce()) {}
|
||||||
|
|
||||||
|
fn fill_memory_blocks_mt(state: &mut State) {
|
||||||
|
loop {
|
||||||
|
once(move || {
|
||||||
|
//~^ ERROR use of moved value: `state`
|
||||||
|
fill_segment(state);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn fill_segment(_: &mut State) {}
|
||||||
|
|
||||||
|
fn main() {}
|
15
src/test/ui/borrowck/issue-101119.stderr
Normal file
15
src/test/ui/borrowck/issue-101119.stderr
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
error[E0382]: use of moved value: `state`
|
||||||
|
--> $DIR/issue-101119.rs:7:14
|
||||||
|
|
|
||||||
|
LL | fn fill_memory_blocks_mt(state: &mut State) {
|
||||||
|
| ----- move occurs because `state` has type `&mut State`, which does not implement the `Copy` trait
|
||||||
|
LL | loop {
|
||||||
|
LL | once(move || {
|
||||||
|
| ^^^^^^^ value moved into closure here, in previous iteration of loop
|
||||||
|
LL |
|
||||||
|
LL | fill_segment(state);
|
||||||
|
| ----- use occurs due to use in closure
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0382`.
|
Loading…
Add table
Add a link
Reference in a new issue