Rollup merge of #111403 - y21:suggest-slice-swap, r=compiler-errors
suggest `slice::swap` for `mem::swap(&mut x[0], &mut x[1])` borrowck error Recently saw someone ask why this code (example slightly modified): ```rs fn main() { let mut foo = [1, 2]; std::mem::swap(&mut foo[0], &mut foo[1]); } ``` triggers this error and how to fix it: ``` error[E0499]: cannot borrow `foo[_]` as mutable more than once at a time --> src/main.rs:4:33 | 4 | std::mem::swap(&mut foo[0], &mut foo[1]); | -------------- ----------- ^^^^^^^^^^^ second mutable borrow occurs here | | | | | first mutable borrow occurs here | first borrow later used by call | = help: consider using `.split_at_mut(position)` or similar method to obtain two mutable non-overlapping sub-slices ``` The current help message is nice and goes in the right direction, but I think we can do better for this specific instance and suggest `slice::swap`, which makes this compile
This commit is contained in:
commit
6c22e0419f
@ -982,7 +982,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||||||
&msg_borrow,
|
&msg_borrow,
|
||||||
None,
|
None,
|
||||||
);
|
);
|
||||||
self.suggest_split_at_mut_if_applicable(
|
self.suggest_slice_method_if_applicable(
|
||||||
&mut err,
|
&mut err,
|
||||||
place,
|
place,
|
||||||
issued_borrow.borrowed_place,
|
issued_borrow.borrowed_place,
|
||||||
@ -1262,7 +1262,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn suggest_split_at_mut_if_applicable(
|
fn suggest_slice_method_if_applicable(
|
||||||
&self,
|
&self,
|
||||||
err: &mut Diagnostic,
|
err: &mut Diagnostic,
|
||||||
place: Place<'tcx>,
|
place: Place<'tcx>,
|
||||||
@ -1274,7 +1274,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
|
|||||||
err.help(
|
err.help(
|
||||||
"consider using `.split_at_mut(position)` or similar method to obtain \
|
"consider using `.split_at_mut(position)` or similar method to obtain \
|
||||||
two mutable non-overlapping sub-slices",
|
two mutable non-overlapping sub-slices",
|
||||||
);
|
)
|
||||||
|
.help("consider using `.swap(index_1, index_2)` to swap elements at the specified indices");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ LL | *a = 5;
|
|||||||
| ------ first borrow later used here
|
| ------ 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 `.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
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user