enum ArtificialField {
Discriminant,
ArrayLength,
+ ShallowBorrow,
}
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
Control::Continue
}
- (Read(_), BorrowKind::Shared) | (Reservation(..), BorrowKind::Shared) => {
+ (Read(_), BorrowKind::Shared) | (Reservation(..), BorrowKind::Shared)
+ | (Read(_), BorrowKind::Shallow) | (Reservation(..), BorrowKind::Shallow) => {
+ Control::Continue
+ }
+
+ (Write(WriteKind::Move), BorrowKind::Shallow) => {
+ // Handled by initialization checks.
Control::Continue
}
match *rvalue {
Rvalue::Ref(_ /*rgn*/, bk, ref place) => {
let access_kind = match bk {
+ BorrowKind::Shallow => {
+ (Shallow(Some(ArtificialField::ShallowBorrow)), Read(ReadKind::Borrow(bk)))
+ },
BorrowKind::Shared => (Deep, Read(ReadKind::Borrow(bk))),
BorrowKind::Unique | BorrowKind::Mut { .. } => {
let wk = WriteKind::MutableBorrow(bk);
return;
}
- // FIXME: replace this with a proper borrow_conflicts_with_place when
- // that is merged.
let sd = if might_be_alive { Deep } else { Shallow(None) };
- if places_conflict::places_conflict(self.infcx.tcx, self.mir, place, root_place, sd) {
+ if places_conflict::borrow_conflicts_with_place(
+ self.infcx.tcx,
+ self.mir,
+ place,
+ borrow.kind,
+ root_place,
+ sd
+ ) {
debug!("check_for_invalidation_at_exit({:?}): INVALID", place);
// FIXME: should be talking about the region lifetime instead
// of just a span here.
// only mutable borrows should be 2-phase
assert!(match borrow.kind {
- BorrowKind::Shared => false,
+ BorrowKind::Shared | BorrowKind::Shallow => false,
BorrowKind::Unique | BorrowKind::Mut { .. } => true,
});
let is_local_mutation_allowed = match borrow_kind {
BorrowKind::Unique => LocalMutationIsAllowed::Yes,
BorrowKind::Mut { .. } => is_local_mutation_allowed,
- BorrowKind::Shared => unreachable!(),
+ BorrowKind::Shared | BorrowKind::Shallow => unreachable!(),
};
match self.is_mutable(place, is_local_mutation_allowed) {
Ok(root_place) => {
| Write(wk @ WriteKind::Move)
| Reservation(wk @ WriteKind::StorageDeadOrDrop)
| Reservation(wk @ WriteKind::MutableBorrow(BorrowKind::Shared))
+ | Reservation(wk @ WriteKind::MutableBorrow(BorrowKind::Shallow))
| Write(wk @ WriteKind::StorageDeadOrDrop)
- | Write(wk @ WriteKind::MutableBorrow(BorrowKind::Shared)) => {
+ | Write(wk @ WriteKind::MutableBorrow(BorrowKind::Shared))
+ | Write(wk @ WriteKind::MutableBorrow(BorrowKind::Shallow)) => {
if let Err(_place_err) = self.is_mutable(place, is_local_mutation_allowed) {
if self.infcx.tcx.migrate_borrowck() {
// rust-lang/rust#46908: In pure NLL mode this
Read(ReadKind::Borrow(BorrowKind::Unique))
| Read(ReadKind::Borrow(BorrowKind::Mut { .. }))
| Read(ReadKind::Borrow(BorrowKind::Shared))
+ | Read(ReadKind::Borrow(BorrowKind::Shallow))
| Read(ReadKind::Copy) => {
// Access authorized
return false;