Account for closures
This commit is contained in:
parent
3a471b5fd8
commit
0da4c44190
6 changed files with 9 additions and 24 deletions
|
@ -167,7 +167,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.add_moved_or_invoked_closure_note(location, used_place, &mut err);
|
let closure = self.add_moved_or_invoked_closure_note(location, used_place, &mut err);
|
||||||
|
|
||||||
let mut is_loop_move = false;
|
let mut is_loop_move = false;
|
||||||
let mut in_pattern = false;
|
let mut in_pattern = false;
|
||||||
|
@ -193,7 +193,9 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if !seen_spans.contains(&move_span) {
|
if !seen_spans.contains(&move_span) {
|
||||||
self.suggest_ref_or_clone(mpi, move_span, &mut err, &mut in_pattern);
|
if !closure {
|
||||||
|
self.suggest_ref_or_clone(mpi, move_span, &mut err, &mut in_pattern);
|
||||||
|
}
|
||||||
|
|
||||||
self.explain_captures(
|
self.explain_captures(
|
||||||
&mut err,
|
&mut err,
|
||||||
|
|
|
@ -70,7 +70,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
location: Location,
|
location: Location,
|
||||||
place: PlaceRef<'tcx>,
|
place: PlaceRef<'tcx>,
|
||||||
diag: &mut Diagnostic,
|
diag: &mut Diagnostic,
|
||||||
) {
|
) -> bool {
|
||||||
debug!("add_moved_or_invoked_closure_note: location={:?} place={:?}", location, place);
|
debug!("add_moved_or_invoked_closure_note: location={:?} place={:?}", location, place);
|
||||||
let mut target = place.local_or_deref_local();
|
let mut target = place.local_or_deref_local();
|
||||||
for stmt in &self.body[location.block].statements[location.statement_index..] {
|
for stmt in &self.body[location.block].statements[location.statement_index..] {
|
||||||
|
@ -106,7 +106,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
{
|
{
|
||||||
place.local_or_deref_local().unwrap()
|
place.local_or_deref_local().unwrap()
|
||||||
}
|
}
|
||||||
_ => return,
|
_ => return false,
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("add_moved_or_invoked_closure_note: closure={:?}", closure);
|
debug!("add_moved_or_invoked_closure_note: closure={:?}", closure);
|
||||||
|
@ -125,7 +125,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
ty::place_to_string_for_capture(self.infcx.tcx, hir_place)
|
ty::place_to_string_for_capture(self.infcx.tcx, hir_place)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
return;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,9 +149,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
ty::place_to_string_for_capture(self.infcx.tcx, hir_place)
|
ty::place_to_string_for_capture(self.infcx.tcx, hir_place)
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
/// End-user visible description of `place` if one can be found.
|
/// End-user visible description of `place` if one can be found.
|
||||||
|
|
|
@ -16,10 +16,6 @@ note: this value implements `FnOnce`, which causes it to be moved when called
|
||||||
|
|
|
|
||||||
LL | debug_dump_dict();
|
LL | debug_dump_dict();
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
help: consider cloning the value if the performance cost is acceptable
|
|
||||||
|
|
|
||||||
LL | debug_dump_dict.clone()();
|
|
||||||
| ++++++++
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -58,13 +58,6 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
|
||||||
|
|
|
|
||||||
LL | x += 1;
|
LL | x += 1;
|
||||||
| ^
|
| ^
|
||||||
note: consider changing this parameter type in function `takes_fnonce` to borrow instead if owning the value isn't necessary
|
|
||||||
--> $DIR/borrow-closures-instead-of-move.rs:34:20
|
|
||||||
|
|
|
||||||
LL | fn takes_fnonce(_: impl FnOnce()) {}
|
|
||||||
| ------------ ^^^^^^^^^^^^^ this parameter takes ownership of the value
|
|
||||||
| |
|
|
||||||
| in this function
|
|
||||||
help: consider mutably borrowing `closure`
|
help: consider mutably borrowing `closure`
|
||||||
|
|
|
|
||||||
LL | takes_fnonce(&mut closure);
|
LL | takes_fnonce(&mut closure);
|
||||||
|
|
|
@ -16,10 +16,6 @@ note: this value implements `FnOnce`, which causes it to be moved when called
|
||||||
|
|
|
|
||||||
LL | tick();
|
LL | tick();
|
||||||
| ^^^^
|
| ^^^^
|
||||||
help: consider cloning the value if the performance cost is acceptable
|
|
||||||
|
|
|
||||||
LL | tick.clone()();
|
|
||||||
| ++++++++
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
|
@ -16,10 +16,6 @@ note: this value implements `FnOnce`, which causes it to be moved when called
|
||||||
|
|
|
|
||||||
LL | tick();
|
LL | tick();
|
||||||
| ^^^^
|
| ^^^^
|
||||||
help: consider cloning the value if the performance cost is acceptable
|
|
||||||
|
|
|
||||||
LL | tick.clone()();
|
|
||||||
| ++++++++
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue