Fallout from allowing some mutation in guards.
For some reason, allowing restricted mutation in match arms exposed an obvious case where a unique borrow can indeed fail, namely something like: ```rust match b { ... ref mut r if { (|| { let bar = &mut *r; **bar = false; })(); false } => { &mut *r } // ~~~~~~~ // | // This ends up holding a `&unique` borrow of `r`, but there ends up being an // implicit shared borrow in the guard thanks to rust-lang/rust#49870 ... } ```
This commit is contained in:
parent
5c30dc85c2
commit
638acd300f
@ -1697,14 +1697,16 @@ impl<'cx, 'gcx, 'tcx> MirBorrowckCtxt<'cx, 'gcx, 'tcx> {
|
||||
);
|
||||
let mut error_reported = false;
|
||||
match kind {
|
||||
Reservation(WriteKind::MutableBorrow(BorrowKind::Unique))
|
||||
| Write(WriteKind::MutableBorrow(BorrowKind::Unique)) => {
|
||||
if let Err(_place_err) = self.is_mutable(place, LocalMutationIsAllowed::Yes) {
|
||||
span_bug!(span, "&unique borrow for {:?} should not fail", place);
|
||||
}
|
||||
}
|
||||
Reservation(WriteKind::MutableBorrow(BorrowKind::Mut { .. }))
|
||||
| Write(WriteKind::MutableBorrow(BorrowKind::Mut { .. })) => {
|
||||
Reservation(WriteKind::MutableBorrow(borrow_kind @ BorrowKind::Unique))
|
||||
| Reservation(WriteKind::MutableBorrow(borrow_kind @ BorrowKind::Mut { .. }))
|
||||
| Write(WriteKind::MutableBorrow(borrow_kind @ BorrowKind::Unique))
|
||||
| Write(WriteKind::MutableBorrow(borrow_kind @ BorrowKind::Mut { .. })) =>
|
||||
{
|
||||
let is_local_mutation_allowed = match borrow_kind {
|
||||
BorrowKind::Unique => LocalMutationIsAllowed::Yes,
|
||||
BorrowKind::Mut { .. } => is_local_mutation_allowed,
|
||||
BorrowKind::Shared => unreachable!(),
|
||||
};
|
||||
match self.is_mutable(place, is_local_mutation_allowed) {
|
||||
Ok(root_place) => self.add_used_mut(root_place, flow_state),
|
||||
Err(place_err) => {
|
||||
|
Loading…
x
Reference in New Issue
Block a user