Simplify creation of AutoBorrowMutability
This commit is contained in:
parent
6486ba94a3
commit
f9a332a48c
@ -258,15 +258,11 @@ fn try_overloaded_call_traits(
|
||||
return None;
|
||||
};
|
||||
|
||||
let mutbl = match mutbl {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
hir::Mutability::Mut => AutoBorrowMutability::Mut {
|
||||
// For initial two-phase borrow
|
||||
// deployment, conservatively omit
|
||||
// overloaded function call ops.
|
||||
allow_two_phase_borrow: AllowTwoPhase::No,
|
||||
},
|
||||
};
|
||||
// For initial two-phase borrow
|
||||
// deployment, conservatively omit
|
||||
// overloaded function call ops.
|
||||
let mutbl = AutoBorrowMutability::new(*mutbl, AllowTwoPhase::No);
|
||||
|
||||
autoref = Some(Adjustment {
|
||||
kind: Adjust::Borrow(AutoBorrow::Ref(*region, mutbl)),
|
||||
target: method.sig.inputs()[0],
|
||||
|
@ -478,12 +478,7 @@ fn coerce_borrowed_pointer(
|
||||
let ty::Ref(r_borrow, _, _) = ty.kind() else {
|
||||
span_bug!(span, "expected a ref type, got {:?}", ty);
|
||||
};
|
||||
let mutbl = match mutbl_b {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
hir::Mutability::Mut => {
|
||||
AutoBorrowMutability::Mut { allow_two_phase_borrow: self.allow_two_phase }
|
||||
}
|
||||
};
|
||||
let mutbl = AutoBorrowMutability::new(mutbl_b, self.allow_two_phase);
|
||||
adjustments.push(Adjustment {
|
||||
kind: Adjust::Borrow(AutoBorrow::Ref(*r_borrow, mutbl)),
|
||||
target: ty,
|
||||
@ -552,15 +547,12 @@ fn coerce_unsized(&self, mut source: Ty<'tcx>, mut target: Ty<'tcx>) -> CoerceRe
|
||||
|
||||
let coercion = Coercion(self.cause.span);
|
||||
let r_borrow = self.next_region_var(coercion);
|
||||
let mutbl = match mutbl_b {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
hir::Mutability::Mut => AutoBorrowMutability::Mut {
|
||||
// We don't allow two-phase borrows here, at least for initial
|
||||
// implementation. If it happens that this coercion is a function argument,
|
||||
// the reborrow in coerce_borrowed_ptr will pick it up.
|
||||
allow_two_phase_borrow: AllowTwoPhase::No,
|
||||
},
|
||||
};
|
||||
|
||||
// We don't allow two-phase borrows here, at least for initial
|
||||
// implementation. If it happens that this coercion is a function argument,
|
||||
// the reborrow in coerce_borrowed_ptr will pick it up.
|
||||
let mutbl = AutoBorrowMutability::new(mutbl_b, AllowTwoPhase::No);
|
||||
|
||||
Some((
|
||||
Adjustment { kind: Adjust::Deref(None), target: ty_a },
|
||||
Adjustment {
|
||||
|
@ -170,14 +170,11 @@ fn adjust_self_ty(
|
||||
let base_ty = target;
|
||||
|
||||
target = self.tcx.mk_ref(region, ty::TypeAndMut { mutbl, ty: target });
|
||||
let mutbl = match mutbl {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
hir::Mutability::Mut => AutoBorrowMutability::Mut {
|
||||
// Method call receivers are the primary use case
|
||||
// for two-phase borrows.
|
||||
allow_two_phase_borrow: AllowTwoPhase::Yes,
|
||||
},
|
||||
};
|
||||
|
||||
// Method call receivers are the primary use case
|
||||
// for two-phase borrows.
|
||||
let mutbl = AutoBorrowMutability::new(mutbl, AllowTwoPhase::Yes);
|
||||
|
||||
adjustments.push(Adjustment {
|
||||
kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)),
|
||||
target,
|
||||
|
@ -263,14 +263,7 @@ fn check_overloaded_binop(
|
||||
let by_ref_binop = !op.node.is_by_value();
|
||||
if is_assign == IsAssign::Yes || by_ref_binop {
|
||||
if let ty::Ref(region, _, mutbl) = method.sig.inputs()[0].kind() {
|
||||
let mutbl = match mutbl {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
hir::Mutability::Mut => AutoBorrowMutability::Mut {
|
||||
// Allow two-phase borrows for binops in initial deployment
|
||||
// since they desugar to methods
|
||||
allow_two_phase_borrow: AllowTwoPhase::Yes,
|
||||
},
|
||||
};
|
||||
let mutbl = AutoBorrowMutability::new(*mutbl, AllowTwoPhase::Yes);
|
||||
let autoref = Adjustment {
|
||||
kind: Adjust::Borrow(AutoBorrow::Ref(*region, mutbl)),
|
||||
target: method.sig.inputs()[0],
|
||||
@ -280,14 +273,10 @@ fn check_overloaded_binop(
|
||||
}
|
||||
if by_ref_binop {
|
||||
if let ty::Ref(region, _, mutbl) = method.sig.inputs()[1].kind() {
|
||||
let mutbl = match mutbl {
|
||||
hir::Mutability::Not => AutoBorrowMutability::Not,
|
||||
hir::Mutability::Mut => AutoBorrowMutability::Mut {
|
||||
// Allow two-phase borrows for binops in initial deployment
|
||||
// since they desugar to methods
|
||||
allow_two_phase_borrow: AllowTwoPhase::Yes,
|
||||
},
|
||||
};
|
||||
// Allow two-phase borrows for binops in initial deployment
|
||||
// since they desugar to methods
|
||||
let mutbl = AutoBorrowMutability::new(*mutbl, AllowTwoPhase::Yes);
|
||||
|
||||
let autoref = Adjustment {
|
||||
kind: Adjust::Borrow(AutoBorrow::Ref(*region, mutbl)),
|
||||
target: method.sig.inputs()[1],
|
||||
|
@ -159,6 +159,18 @@ pub enum AutoBorrowMutability {
|
||||
Not,
|
||||
}
|
||||
|
||||
impl AutoBorrowMutability {
|
||||
/// Creates an `AutoBorrowMutability` from a mutability and allowance of two phase borrows.
|
||||
///
|
||||
/// Note that when `mutbl.is_not()`, `allow_two_phase_borrow` is ignored
|
||||
pub fn new(mutbl: hir::Mutability, allow_two_phase_borrow: AllowTwoPhase) -> Self {
|
||||
match mutbl {
|
||||
hir::Mutability::Not => Self::Not,
|
||||
hir::Mutability::Mut => Self::Mut { allow_two_phase_borrow },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<AutoBorrowMutability> for hir::Mutability {
|
||||
fn from(m: AutoBorrowMutability) -> Self {
|
||||
match m {
|
||||
|
Loading…
Reference in New Issue
Block a user