diff options
| author | Giacomo Stevanato <giaco.stevanato@gmail.com> | 2021-04-06 21:39:44 +0200 |
|---|---|---|
| committer | Giacomo Stevanato <giaco.stevanato@gmail.com> | 2021-04-06 21:39:44 +0200 |
| commit | 7f823e5bbdcc806fed36c7ec0f69a2a2a5d23241 (patch) | |
| tree | afd3f48d8f04dc70d6c63d1c5aff6571607b554d | |
| parent | 354cc751b74e813f180755fa67bebcb669825755 (diff) | |
| download | rust-7f823e5bbdcc806fed36c7ec0f69a2a2a5d23241.tar.gz rust-7f823e5bbdcc806fed36c7ec0f69a2a2a5d23241.zip | |
Add reborrow suggestion when mutable reference is moved in a for loop
| -rw-r--r-- | compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs index d5deec82088..5fdf8a8d1ee 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs @@ -264,7 +264,24 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if let Some(DesugaringKind::ForLoop(_)) = move_span.desugaring_kind() { let sess = self.infcx.tcx.sess; - if let Ok(snippet) = sess.source_map().span_to_snippet(move_span) { + let ty = used_place.ty(self.body, self.infcx.tcx).ty; + // If we have a `&mut` ref, we need to reborrow. + if let ty::Ref(_, _, hir::Mutability::Mut) = ty.kind() { + // If we are in a loop this will be suggested later. + if !is_loop_move { + err.span_suggestion_verbose( + move_span.shrink_to_lo(), + &format!( + "consider creating a fresh reborrow of {} here", + self.describe_place(moved_place.as_ref()) + .map(|n| format!("`{}`", n)) + .unwrap_or_else(|| "the mutable reference".to_string()), + ), + format!("&mut *"), + Applicability::MachineApplicable, + ); + } + } else if let Ok(snippet) = sess.source_map().span_to_snippet(move_span) { err.span_suggestion( move_span, "consider borrowing to avoid moving into the for loop", |
