mirror of https://github.com/rust-lang/rust.git
Rollup merge of #68819 - estebank:split_at_mut, r=oli-obk
Suggest `split_at_mut` on multiple mutable index access cc #58792.
This commit is contained in:
commit
793a5e68b4
|
@ -397,14 +397,20 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
|
|
||||||
(BorrowKind::Mut { .. }, BorrowKind::Mut { .. }) => {
|
(BorrowKind::Mut { .. }, BorrowKind::Mut { .. }) => {
|
||||||
first_borrow_desc = "first ";
|
first_borrow_desc = "first ";
|
||||||
self.cannot_mutably_borrow_multiply(
|
let mut err = self.cannot_mutably_borrow_multiply(
|
||||||
span,
|
span,
|
||||||
&desc_place,
|
&desc_place,
|
||||||
&msg_place,
|
&msg_place,
|
||||||
issued_span,
|
issued_span,
|
||||||
&msg_borrow,
|
&msg_borrow,
|
||||||
None,
|
None,
|
||||||
)
|
);
|
||||||
|
self.suggest_split_at_mut_if_applicable(
|
||||||
|
&mut err,
|
||||||
|
&place,
|
||||||
|
&issued_borrow.borrowed_place,
|
||||||
|
);
|
||||||
|
err
|
||||||
}
|
}
|
||||||
|
|
||||||
(BorrowKind::Unique, BorrowKind::Unique) => {
|
(BorrowKind::Unique, BorrowKind::Unique) => {
|
||||||
|
@ -549,6 +555,23 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
||||||
err
|
err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn suggest_split_at_mut_if_applicable(
|
||||||
|
&self,
|
||||||
|
err: &mut DiagnosticBuilder<'_>,
|
||||||
|
place: &Place<'tcx>,
|
||||||
|
borrowed_place: &Place<'tcx>,
|
||||||
|
) {
|
||||||
|
match (&place.projection[..], &borrowed_place.projection[..]) {
|
||||||
|
([ProjectionElem::Index(_)], [ProjectionElem::Index(_)]) => {
|
||||||
|
err.help(
|
||||||
|
"consider using `.split_at_mut(position)` or similar method to obtain \
|
||||||
|
two mutable non-overlapping sub-slices",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the description of the root place for a conflicting borrow and the full
|
/// Returns the description of the root place for a conflicting borrow and the full
|
||||||
/// descriptions of the places that caused the conflict.
|
/// descriptions of the places that caused the conflict.
|
||||||
///
|
///
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
fn main() {
|
||||||
|
let mut foo = [1, 2, 3, 4];
|
||||||
|
let a = &mut foo[2];
|
||||||
|
let b = &mut foo[3]; //~ ERROR cannot borrow `foo[_]` as mutable more than once at a time
|
||||||
|
*a = 5;
|
||||||
|
*b = 6;
|
||||||
|
println!("{:?} {:?}", a, b);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
error[E0499]: cannot borrow `foo[_]` as mutable more than once at a time
|
||||||
|
--> $DIR/suggest-split-at-mut.rs:4:13
|
||||||
|
|
|
||||||
|
LL | let a = &mut foo[2];
|
||||||
|
| ----------- first mutable borrow occurs here
|
||||||
|
LL | let b = &mut foo[3];
|
||||||
|
| ^^^^^^^^^^^ second mutable borrow occurs here
|
||||||
|
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
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0499`.
|
Loading…
Reference in New Issue