1
Fork 0

Account for closures

This commit is contained in:
Esteban Küber 2022-11-15 19:43:33 -08:00
parent 3a471b5fd8
commit 0da4c44190
6 changed files with 9 additions and 24 deletions

View file

@ -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) {
if !closure {
self.suggest_ref_or_clone(mpi, move_span, &mut err, &mut in_pattern); self.suggest_ref_or_clone(mpi, move_span, &mut err, &mut in_pattern);
}
self.explain_captures( self.explain_captures(
&mut err, &mut err,

View file

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

View file

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

View file

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

View file

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

View file

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