about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGiacomo Stevanato <giaco.stevanato@gmail.com>2021-04-06 21:39:44 +0200
committerGiacomo Stevanato <giaco.stevanato@gmail.com>2021-04-06 21:39:44 +0200
commit7f823e5bbdcc806fed36c7ec0f69a2a2a5d23241 (patch)
treeafd3f48d8f04dc70d6c63d1c5aff6571607b554d
parent354cc751b74e813f180755fa67bebcb669825755 (diff)
downloadrust-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.rs19
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",