about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2024-04-24 21:53:33 +0000
committerEsteban Küber <esteban@kuber.com.ar>2024-04-25 16:55:33 +0000
commitabdb64d4eaa989ff5ef96099f6e1585472de1622 (patch)
treee541fcebf6f57736ea9bf4c0681c2f0c6bb22d4c
parentad6ae612462c77fa6c5d1c98df9f197c570e0e81 (diff)
downloadrust-abdb64d4eaa989ff5ef96099f6e1585472de1622.tar.gz
rust-abdb64d4eaa989ff5ef96099f6e1585472de1622.zip
Check equivalence of indices in more cases
-rw-r--r--compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs8
-rw-r--r--tests/ui/suggestions/suggest-split-at-mut.stderr9
2 files changed, 10 insertions, 7 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
index 84f9ebf18a8..b800e8d45d2 100644
--- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
+++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
@@ -2116,7 +2116,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
                     None
                 }
             }) else {
-                note_default_suggestion();
+                let hir::Node::Expr(parent) = tcx.parent_hir_node(index1.hir_id) else { return };
+                let hir::ExprKind::Index(_, idx1, _) = parent.kind else { return };
+                let hir::Node::Expr(parent) = tcx.parent_hir_node(index2.hir_id) else { return };
+                let hir::ExprKind::Index(_, idx2, _) = parent.kind else { return };
+                if !idx1.equals(idx2) {
+                    err.help("use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices");
+                }
                 return;
             };
 
diff --git a/tests/ui/suggestions/suggest-split-at-mut.stderr b/tests/ui/suggestions/suggest-split-at-mut.stderr
index c1d93367ccb..4502ec1f393 100644
--- a/tests/ui/suggestions/suggest-split-at-mut.stderr
+++ b/tests/ui/suggestions/suggest-split-at-mut.stderr
@@ -8,8 +8,7 @@ LL |     let b = &mut foo[3];
 LL |     *a = 5;
    |     ------ first borrow later used here
    |
-   = help: consider using `.split_at_mut(position)` or similar method to obtain two mutable non-overlapping sub-slices
-   = help: consider using `.swap(index_1, index_2)` to swap elements at the specified indices
+   = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices
 
 error[E0499]: cannot borrow `foo` as mutable more than once at a time
   --> $DIR/suggest-split-at-mut.rs:13:18
@@ -59,8 +58,7 @@ LL |     *b = 6;
 LL |     println!("{:?} {:?}", a, b);
    |                           - immutable borrow later used here
    |
-   = help: consider using `.split_at_mut(position)` or similar method to obtain two mutable non-overlapping sub-slices
-   = help: consider using `.swap(index_1, index_2)` to swap elements at the specified indices
+   = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices
 
 error[E0502]: cannot borrow `foo[_]` as immutable because it is also borrowed as mutable
   --> $DIR/suggest-split-at-mut.rs:46:13
@@ -72,8 +70,7 @@ LL |     let b = &foo[2];
 LL |     *a = 5;
    |     ------ mutable borrow later used here
    |
-   = help: consider using `.split_at_mut(position)` or similar method to obtain two mutable non-overlapping sub-slices
-   = help: consider using `.swap(index_1, index_2)` to swap elements at the specified indices
+   = help: use `.split_at_mut(position)` to obtain two mutable non-overlapping sub-slices
 
 error[E0502]: cannot borrow `foo` as immutable because it is also borrowed as mutable
   --> $DIR/suggest-split-at-mut.rs:54:14