mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
rename AddressOf -> RawBorrow inside the compiler
This commit is contained in:
parent
b8464961a2
commit
35709be02d
@ -55,8 +55,8 @@ pub fn categorize(context: PlaceContext) -> Option<DefUse> {
|
|||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::PlaceMention) |
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::PlaceMention) |
|
||||||
PlaceContext::NonUse(NonUseContext::AscribeUserTy(_)) |
|
PlaceContext::NonUse(NonUseContext::AscribeUserTy(_)) |
|
||||||
|
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::AddressOf) |
|
PlaceContext::MutatingUse(MutatingUseContext::RawBorrow) |
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf) |
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::RawBorrow) |
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::Inspect) |
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::Inspect) |
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) |
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::Copy) |
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::Move) |
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::Move) |
|
||||||
|
@ -1242,7 +1242,7 @@ impl<'mir, 'tcx> MirBorrowckCtxt<'_, 'mir, '_, 'tcx> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
&Rvalue::AddressOf(mutability, place) => {
|
&Rvalue::RawPtr(mutability, place) => {
|
||||||
let access_kind = match mutability {
|
let access_kind = match mutability {
|
||||||
Mutability::Mut => (
|
Mutability::Mut => (
|
||||||
Deep,
|
Deep,
|
||||||
|
@ -269,7 +269,7 @@ impl<'cx, 'tcx> LoanInvalidationsGenerator<'cx, 'tcx> {
|
|||||||
self.access_place(location, place, access_kind, LocalMutationIsAllowed::No);
|
self.access_place(location, place, access_kind, LocalMutationIsAllowed::No);
|
||||||
}
|
}
|
||||||
|
|
||||||
&Rvalue::AddressOf(mutability, place) => {
|
&Rvalue::RawPtr(mutability, place) => {
|
||||||
let access_kind = match mutability {
|
let access_kind = match mutability {
|
||||||
Mutability::Mut => (
|
Mutability::Mut => (
|
||||||
Deep,
|
Deep,
|
||||||
|
@ -756,7 +756,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
|
|||||||
PlaceContext::MutatingUse(_) => ty::Invariant,
|
PlaceContext::MutatingUse(_) => ty::Invariant,
|
||||||
PlaceContext::NonUse(StorageDead | StorageLive | VarDebugInfo) => ty::Invariant,
|
PlaceContext::NonUse(StorageDead | StorageLive | VarDebugInfo) => ty::Invariant,
|
||||||
PlaceContext::NonMutatingUse(
|
PlaceContext::NonMutatingUse(
|
||||||
Inspect | Copy | Move | PlaceMention | SharedBorrow | FakeBorrow | AddressOf
|
Inspect | Copy | Move | PlaceMention | SharedBorrow | FakeBorrow | RawBorrow
|
||||||
| Projection,
|
| Projection,
|
||||||
) => ty::Covariant,
|
) => ty::Covariant,
|
||||||
PlaceContext::NonUse(AscribeUserTy(variance)) => variance,
|
PlaceContext::NonUse(AscribeUserTy(variance)) => variance,
|
||||||
@ -2468,7 +2468,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||||||
self.check_operand(right, location);
|
self.check_operand(right, location);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::AddressOf(..)
|
Rvalue::RawPtr(..)
|
||||||
| Rvalue::ThreadLocalRef(..)
|
| Rvalue::ThreadLocalRef(..)
|
||||||
| Rvalue::Len(..)
|
| Rvalue::Len(..)
|
||||||
| Rvalue::Discriminant(..)
|
| Rvalue::Discriminant(..)
|
||||||
@ -2485,7 +2485,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||||||
| Rvalue::ThreadLocalRef(_)
|
| Rvalue::ThreadLocalRef(_)
|
||||||
| Rvalue::Repeat(..)
|
| Rvalue::Repeat(..)
|
||||||
| Rvalue::Ref(..)
|
| Rvalue::Ref(..)
|
||||||
| Rvalue::AddressOf(..)
|
| Rvalue::RawPtr(..)
|
||||||
| Rvalue::Len(..)
|
| Rvalue::Len(..)
|
||||||
| Rvalue::Cast(..)
|
| Rvalue::Cast(..)
|
||||||
| Rvalue::ShallowInitBox(..)
|
| Rvalue::ShallowInitBox(..)
|
||||||
|
@ -25,7 +25,7 @@ pub(crate) fn analyze(fx: &FunctionCx<'_, '_, '_>) -> IndexVec<Local, SsaKind> {
|
|||||||
for stmt in bb.statements.iter() {
|
for stmt in bb.statements.iter() {
|
||||||
match &stmt.kind {
|
match &stmt.kind {
|
||||||
Assign(place_and_rval) => match &place_and_rval.1 {
|
Assign(place_and_rval) => match &place_and_rval.1 {
|
||||||
Rvalue::Ref(_, _, place) | Rvalue::AddressOf(_, place) => {
|
Rvalue::Ref(_, _, place) | Rvalue::RawPtr(_, place) => {
|
||||||
flag_map[place.local] = SsaKind::NotSsa;
|
flag_map[place.local] = SsaKind::NotSsa;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
@ -595,7 +595,7 @@ fn codegen_stmt<'tcx>(
|
|||||||
let val = cplace.to_cvalue(fx);
|
let val = cplace.to_cvalue(fx);
|
||||||
lval.write_cvalue(fx, val)
|
lval.write_cvalue(fx, val)
|
||||||
}
|
}
|
||||||
Rvalue::Ref(_, _, place) | Rvalue::AddressOf(_, place) => {
|
Rvalue::Ref(_, _, place) | Rvalue::RawPtr(_, place) => {
|
||||||
let place = codegen_place(fx, place);
|
let place = codegen_place(fx, place);
|
||||||
let ref_ = place.place_ref(fx, lval.layout());
|
let ref_ = place.place_ref(fx, lval.layout());
|
||||||
lval.write_cvalue(fx, ref_);
|
lval.write_cvalue(fx, ref_);
|
||||||
|
@ -220,14 +220,14 @@ impl<'mir, 'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx>
|
|||||||
| MutatingUseContext::SetDiscriminant
|
| MutatingUseContext::SetDiscriminant
|
||||||
| MutatingUseContext::AsmOutput
|
| MutatingUseContext::AsmOutput
|
||||||
| MutatingUseContext::Borrow
|
| MutatingUseContext::Borrow
|
||||||
| MutatingUseContext::AddressOf
|
| MutatingUseContext::RawBorrow
|
||||||
| MutatingUseContext::Projection,
|
| MutatingUseContext::Projection,
|
||||||
)
|
)
|
||||||
| PlaceContext::NonMutatingUse(
|
| PlaceContext::NonMutatingUse(
|
||||||
NonMutatingUseContext::Inspect
|
NonMutatingUseContext::Inspect
|
||||||
| NonMutatingUseContext::SharedBorrow
|
| NonMutatingUseContext::SharedBorrow
|
||||||
| NonMutatingUseContext::FakeBorrow
|
| NonMutatingUseContext::FakeBorrow
|
||||||
| NonMutatingUseContext::AddressOf
|
| NonMutatingUseContext::RawBorrow
|
||||||
| NonMutatingUseContext::Projection,
|
| NonMutatingUseContext::Projection,
|
||||||
) => {
|
) => {
|
||||||
self.locals[local] = LocalKind::Memory;
|
self.locals[local] = LocalKind::Memory;
|
||||||
|
@ -584,7 +584,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
mir::Rvalue::CopyForDeref(place) => {
|
mir::Rvalue::CopyForDeref(place) => {
|
||||||
self.codegen_operand(bx, &mir::Operand::Copy(place))
|
self.codegen_operand(bx, &mir::Operand::Copy(place))
|
||||||
}
|
}
|
||||||
mir::Rvalue::AddressOf(mutability, place) => {
|
mir::Rvalue::RawPtr(mutability, place) => {
|
||||||
let mk_ptr =
|
let mk_ptr =
|
||||||
move |tcx: TyCtxt<'tcx>, ty: Ty<'tcx>| Ty::new_ptr(tcx, ty, mutability);
|
move |tcx: TyCtxt<'tcx>, ty: Ty<'tcx>| Ty::new_ptr(tcx, ty, mutability);
|
||||||
self.codegen_place_to_pointer(bx, place, mk_ptr)
|
self.codegen_place_to_pointer(bx, place, mk_ptr)
|
||||||
@ -813,7 +813,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
cg_value.len(bx.cx())
|
cg_value.len(bx.cx())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Codegen an `Rvalue::AddressOf` or `Rvalue::Ref`
|
/// Codegen an `Rvalue::RawPtr` or `Rvalue::Ref`
|
||||||
fn codegen_place_to_pointer(
|
fn codegen_place_to_pointer(
|
||||||
&mut self,
|
&mut self,
|
||||||
bx: &mut Bx,
|
bx: &mut Bx,
|
||||||
@ -1085,7 +1085,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
}
|
}
|
||||||
mir::Rvalue::Ref(..) |
|
mir::Rvalue::Ref(..) |
|
||||||
mir::Rvalue::CopyForDeref(..) |
|
mir::Rvalue::CopyForDeref(..) |
|
||||||
mir::Rvalue::AddressOf(..) |
|
mir::Rvalue::RawPtr(..) |
|
||||||
mir::Rvalue::Len(..) |
|
mir::Rvalue::Len(..) |
|
||||||
mir::Rvalue::Cast(..) | // (*)
|
mir::Rvalue::Cast(..) | // (*)
|
||||||
mir::Rvalue::ShallowInitBox(..) | // (*)
|
mir::Rvalue::ShallowInitBox(..) | // (*)
|
||||||
|
@ -431,13 +431,13 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Rvalue::AddressOf(mutbl, place) => {
|
Rvalue::RawPtr(mutbl, place) => {
|
||||||
if let Some(reborrowed_place_ref) = place_as_reborrow(self.tcx, self.body, place) {
|
if let Some(reborrowed_place_ref) = place_as_reborrow(self.tcx, self.body, place) {
|
||||||
let ctx = match mutbl {
|
let ctx = match mutbl {
|
||||||
Mutability::Not => {
|
Mutability::Not => {
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf)
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::RawBorrow)
|
||||||
}
|
}
|
||||||
Mutability::Mut => PlaceContext::MutatingUse(MutatingUseContext::AddressOf),
|
Mutability::Mut => PlaceContext::MutatingUse(MutatingUseContext::RawBorrow),
|
||||||
};
|
};
|
||||||
self.visit_local(reborrowed_place_ref.local, ctx, location);
|
self.visit_local(reborrowed_place_ref.local, ctx, location);
|
||||||
self.visit_projection(reborrowed_place_ref, ctx, location);
|
self.visit_projection(reborrowed_place_ref, ctx, location);
|
||||||
@ -472,7 +472,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::Ref(_, BorrowKind::Mut { .. }, place)
|
Rvalue::Ref(_, BorrowKind::Mut { .. }, place)
|
||||||
| Rvalue::AddressOf(Mutability::Mut, place) => {
|
| Rvalue::RawPtr(Mutability::Mut, place) => {
|
||||||
// Inside mutable statics, we allow arbitrary mutable references.
|
// Inside mutable statics, we allow arbitrary mutable references.
|
||||||
// We've allowed `static mut FOO = &mut [elements];` for a long time (the exact
|
// We've allowed `static mut FOO = &mut [elements];` for a long time (the exact
|
||||||
// reasons why are lost to history), and there is no reason to restrict that to
|
// reasons why are lost to history), and there is no reason to restrict that to
|
||||||
@ -493,7 +493,7 @@ impl<'tcx> Visitor<'tcx> for Checker<'_, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::Ref(_, BorrowKind::Shared | BorrowKind::Fake(_), place)
|
Rvalue::Ref(_, BorrowKind::Shared | BorrowKind::Fake(_), place)
|
||||||
| Rvalue::AddressOf(Mutability::Not, place) => {
|
| Rvalue::RawPtr(Mutability::Not, place) => {
|
||||||
let borrowed_place_has_mut_interior = qualifs::in_place::<HasMutInterior, _>(
|
let borrowed_place_has_mut_interior = qualifs::in_place::<HasMutInterior, _>(
|
||||||
self.ccx,
|
self.ccx,
|
||||||
&mut |local| self.qualifs.has_mut_interior(self.ccx, local, location),
|
&mut |local| self.qualifs.has_mut_interior(self.ccx, local, location),
|
||||||
|
@ -291,7 +291,7 @@ where
|
|||||||
in_operand::<Q, _>(cx, in_local, lhs) || in_operand::<Q, _>(cx, in_local, rhs)
|
in_operand::<Q, _>(cx, in_local, lhs) || in_operand::<Q, _>(cx, in_local, rhs)
|
||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::Ref(_, _, place) | Rvalue::AddressOf(_, place) => {
|
Rvalue::Ref(_, _, place) | Rvalue::RawPtr(_, place) => {
|
||||||
// Special-case reborrows to be more like a copy of the reference.
|
// Special-case reborrows to be more like a copy of the reference.
|
||||||
if let Some((place_base, ProjectionElem::Deref)) = place.as_ref().last_projection() {
|
if let Some((place_base, ProjectionElem::Deref)) = place.as_ref().last_projection() {
|
||||||
let base_ty = place_base.ty(cx.body, cx.tcx).ty;
|
let base_ty = place_base.ty(cx.body, cx.tcx).ty;
|
||||||
|
@ -96,7 +96,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn address_of_allows_mutation(&self) -> bool {
|
fn address_of_allows_mutation(&self) -> bool {
|
||||||
// Exact set of permissions granted by AddressOf is undecided. Conservatively assume that
|
// Exact set of permissions granted by RawPtr is undecided. Conservatively assume that
|
||||||
// it might allow mutation until resolution of #56604.
|
// it might allow mutation until resolution of #56604.
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
@ -170,7 +170,7 @@ where
|
|||||||
self.super_rvalue(rvalue, location);
|
self.super_rvalue(rvalue, location);
|
||||||
|
|
||||||
match rvalue {
|
match rvalue {
|
||||||
mir::Rvalue::AddressOf(_mt, borrowed_place) => {
|
mir::Rvalue::RawPtr(_mt, borrowed_place) => {
|
||||||
if !borrowed_place.is_indirect() && self.address_of_allows_mutation() {
|
if !borrowed_place.is_indirect() && self.address_of_allows_mutation() {
|
||||||
let place_ty = borrowed_place.ty(self.ccx.body, self.ccx.tcx).ty;
|
let place_ty = borrowed_place.ty(self.ccx.body, self.ccx.tcx).ty;
|
||||||
if Q::in_any_value_of_ty(self.ccx, place_ty) {
|
if Q::in_any_value_of_ty(self.ccx, place_ty) {
|
||||||
|
@ -234,7 +234,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
|
|||||||
self.write_immediate(*val, &dest)?;
|
self.write_immediate(*val, &dest)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddressOf(_, place) => {
|
RawPtr(_, place) => {
|
||||||
// Figure out whether this is an addr_of of an already raw place.
|
// Figure out whether this is an addr_of of an already raw place.
|
||||||
let place_base_raw = if place.is_indirect_first_projection() {
|
let place_base_raw = if place.is_indirect_first_projection() {
|
||||||
let ty = self.frame().body.local_decls[place.local].ty;
|
let ty = self.frame().body.local_decls[place.local].ty;
|
||||||
|
@ -967,7 +967,7 @@ impl<'a, 'tcx> CastCheck<'tcx> {
|
|||||||
// need to special-case obtaining a raw pointer
|
// need to special-case obtaining a raw pointer
|
||||||
// from a region pointer to a vector.
|
// from a region pointer to a vector.
|
||||||
|
|
||||||
// Coerce to a raw pointer so that we generate AddressOf in MIR.
|
// Coerce to a raw pointer so that we generate RawPtr in MIR.
|
||||||
let array_ptr_type = Ty::new_ptr(fcx.tcx, m_expr.ty, m_expr.mutbl);
|
let array_ptr_type = Ty::new_ptr(fcx.tcx, m_expr.ty, m_expr.mutbl);
|
||||||
fcx.coerce(self.expr, self.expr_ty, array_ptr_type, AllowTwoPhase::No, None)
|
fcx.coerce(self.expr, self.expr_ty, array_ptr_type, AllowTwoPhase::No, None)
|
||||||
.unwrap_or_else(|_| {
|
.unwrap_or_else(|_| {
|
||||||
|
@ -1038,7 +1038,7 @@ impl<'tcx> Debug for Rvalue<'tcx> {
|
|||||||
|
|
||||||
CopyForDeref(ref place) => write!(fmt, "deref_copy {place:#?}"),
|
CopyForDeref(ref place) => write!(fmt, "deref_copy {place:#?}"),
|
||||||
|
|
||||||
AddressOf(mutability, ref place) => {
|
RawPtr(mutability, ref place) => {
|
||||||
write!(fmt, "&raw {mut_str} {place:?}", mut_str = mutability.ptr_str())
|
write!(fmt, "&raw {mut_str} {place:?}", mut_str = mutability.ptr_str())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,7 +423,7 @@ impl<'tcx> Rvalue<'tcx> {
|
|||||||
| Rvalue::Repeat(_, _)
|
| Rvalue::Repeat(_, _)
|
||||||
| Rvalue::Ref(_, _, _)
|
| Rvalue::Ref(_, _, _)
|
||||||
| Rvalue::ThreadLocalRef(_)
|
| Rvalue::ThreadLocalRef(_)
|
||||||
| Rvalue::AddressOf(_, _)
|
| Rvalue::RawPtr(_, _)
|
||||||
| Rvalue::Len(_)
|
| Rvalue::Len(_)
|
||||||
| Rvalue::Cast(
|
| Rvalue::Cast(
|
||||||
CastKind::IntToInt
|
CastKind::IntToInt
|
||||||
|
@ -1293,14 +1293,14 @@ pub enum Rvalue<'tcx> {
|
|||||||
/// nature of this operation?
|
/// nature of this operation?
|
||||||
ThreadLocalRef(DefId),
|
ThreadLocalRef(DefId),
|
||||||
|
|
||||||
/// Creates a pointer with the indicated mutability to the place.
|
/// Creates a raw pointer with the indicated mutability to the place.
|
||||||
///
|
///
|
||||||
/// This is generated by pointer casts like `&v as *const _` or raw address of expressions like
|
/// This is generated by pointer casts like `&v as *const _` or raw borrow expressions like
|
||||||
/// `&raw v` or `addr_of!(v)`.
|
/// `&raw const v`.
|
||||||
///
|
///
|
||||||
/// Like with references, the semantics of this operation are heavily dependent on the aliasing
|
/// Like with references, the semantics of this operation are heavily dependent on the aliasing
|
||||||
/// model.
|
/// model.
|
||||||
AddressOf(Mutability, Place<'tcx>),
|
RawPtr(Mutability, Place<'tcx>),
|
||||||
|
|
||||||
/// Yields the length of the place, as a `usize`.
|
/// Yields the length of the place, as a `usize`.
|
||||||
///
|
///
|
||||||
|
@ -170,7 +170,7 @@ impl<'tcx> Rvalue<'tcx> {
|
|||||||
let place_ty = place.ty(local_decls, tcx).ty;
|
let place_ty = place.ty(local_decls, tcx).ty;
|
||||||
Ty::new_ref(tcx, reg, place_ty, bk.to_mutbl_lossy())
|
Ty::new_ref(tcx, reg, place_ty, bk.to_mutbl_lossy())
|
||||||
}
|
}
|
||||||
Rvalue::AddressOf(mutability, ref place) => {
|
Rvalue::RawPtr(mutability, ref place) => {
|
||||||
let place_ty = place.ty(local_decls, tcx).ty;
|
let place_ty = place.ty(local_decls, tcx).ty;
|
||||||
Ty::new_ptr(tcx, place_ty, mutability)
|
Ty::new_ptr(tcx, place_ty, mutability)
|
||||||
}
|
}
|
||||||
|
@ -682,13 +682,13 @@ macro_rules! make_mir_visitor {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::AddressOf(m, path) => {
|
Rvalue::RawPtr(m, path) => {
|
||||||
let ctx = match m {
|
let ctx = match m {
|
||||||
Mutability::Mut => PlaceContext::MutatingUse(
|
Mutability::Mut => PlaceContext::MutatingUse(
|
||||||
MutatingUseContext::AddressOf
|
MutatingUseContext::RawBorrow
|
||||||
),
|
),
|
||||||
Mutability::Not => PlaceContext::NonMutatingUse(
|
Mutability::Not => PlaceContext::NonMutatingUse(
|
||||||
NonMutatingUseContext::AddressOf
|
NonMutatingUseContext::RawBorrow
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
self.visit_place(path, ctx, location);
|
self.visit_place(path, ctx, location);
|
||||||
@ -1299,8 +1299,8 @@ pub enum NonMutatingUseContext {
|
|||||||
/// FIXME: do we need to distinguish shallow and deep fake borrows? In fact, do we need to
|
/// FIXME: do we need to distinguish shallow and deep fake borrows? In fact, do we need to
|
||||||
/// distinguish fake and normal deep borrows?
|
/// distinguish fake and normal deep borrows?
|
||||||
FakeBorrow,
|
FakeBorrow,
|
||||||
/// AddressOf for *const pointer.
|
/// `&raw const`.
|
||||||
AddressOf,
|
RawBorrow,
|
||||||
/// PlaceMention statement.
|
/// PlaceMention statement.
|
||||||
///
|
///
|
||||||
/// This statement is executed as a check that the `Place` is live without reading from it,
|
/// This statement is executed as a check that the `Place` is live without reading from it,
|
||||||
@ -1333,8 +1333,8 @@ pub enum MutatingUseContext {
|
|||||||
Drop,
|
Drop,
|
||||||
/// Mutable borrow.
|
/// Mutable borrow.
|
||||||
Borrow,
|
Borrow,
|
||||||
/// AddressOf for *mut pointer.
|
/// `&raw mut`.
|
||||||
AddressOf,
|
RawBorrow,
|
||||||
/// Used as base for another place, e.g., `x` in `x.y`. Could potentially mutate the place.
|
/// Used as base for another place, e.g., `x` in `x.y`. Could potentially mutate the place.
|
||||||
/// For example, the projection `x.y` is marked as a mutation in these cases:
|
/// For example, the projection `x.y` is marked as a mutation in these cases:
|
||||||
/// ```ignore (illustrative)
|
/// ```ignore (illustrative)
|
||||||
@ -1386,8 +1386,8 @@ impl PlaceContext {
|
|||||||
pub fn is_address_of(&self) -> bool {
|
pub fn is_address_of(&self) -> bool {
|
||||||
matches!(
|
matches!(
|
||||||
self,
|
self,
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf)
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::RawBorrow)
|
||||||
| PlaceContext::MutatingUse(MutatingUseContext::AddressOf)
|
| PlaceContext::MutatingUse(MutatingUseContext::RawBorrow)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,7 +407,7 @@ pub enum ExprKind<'tcx> {
|
|||||||
arg: ExprId,
|
arg: ExprId,
|
||||||
},
|
},
|
||||||
/// A `&raw [const|mut] $place_expr` raw borrow resulting in type `*[const|mut] T`.
|
/// A `&raw [const|mut] $place_expr` raw borrow resulting in type `*[const|mut] T`.
|
||||||
AddressOf {
|
RawBorrow {
|
||||||
mutability: hir::Mutability,
|
mutability: hir::Mutability,
|
||||||
arg: ExprId,
|
arg: ExprId,
|
||||||
},
|
},
|
||||||
|
@ -92,7 +92,7 @@ pub fn walk_expr<'thir, 'tcx: 'thir, V: Visitor<'thir, 'tcx>>(
|
|||||||
}
|
}
|
||||||
VarRef { id: _ } | UpvarRef { closure_def_id: _, var_hir_id: _ } => {}
|
VarRef { id: _ } | UpvarRef { closure_def_id: _, var_hir_id: _ } => {}
|
||||||
Borrow { arg, borrow_kind: _ } => visitor.visit_expr(&visitor.thir()[arg]),
|
Borrow { arg, borrow_kind: _ } => visitor.visit_expr(&visitor.thir()[arg]),
|
||||||
AddressOf { arg, mutability: _ } => visitor.visit_expr(&visitor.thir()[arg]),
|
RawBorrow { arg, mutability: _ } => visitor.visit_expr(&visitor.thir()[arg]),
|
||||||
Break { value, label: _ } => {
|
Break { value, label: _ } => {
|
||||||
if let Some(value) = value {
|
if let Some(value) = value {
|
||||||
visitor.visit_expr(&visitor.thir()[value])
|
visitor.visit_expr(&visitor.thir()[value])
|
||||||
|
@ -244,8 +244,8 @@ impl<'tcx, 'body> ParseCtxt<'tcx, 'body> {
|
|||||||
ExprKind::Borrow { borrow_kind, arg } => Ok(
|
ExprKind::Borrow { borrow_kind, arg } => Ok(
|
||||||
Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
|
Rvalue::Ref(self.tcx.lifetimes.re_erased, *borrow_kind, self.parse_place(*arg)?)
|
||||||
),
|
),
|
||||||
ExprKind::AddressOf { mutability, arg } => Ok(
|
ExprKind::RawBorrow { mutability, arg } => Ok(
|
||||||
Rvalue::AddressOf(*mutability, self.parse_place(*arg)?)
|
Rvalue::RawPtr(*mutability, self.parse_place(*arg)?)
|
||||||
),
|
),
|
||||||
ExprKind::Binary { op, lhs, rhs } => Ok(
|
ExprKind::Binary { op, lhs, rhs } => Ok(
|
||||||
Rvalue::BinaryOp(*op, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?)))
|
Rvalue::BinaryOp(*op, Box::new((self.parse_operand(*lhs)?, self.parse_operand(*rhs)?)))
|
||||||
|
@ -542,7 +542,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
| ExprKind::PointerCoercion { .. }
|
| ExprKind::PointerCoercion { .. }
|
||||||
| ExprKind::Repeat { .. }
|
| ExprKind::Repeat { .. }
|
||||||
| ExprKind::Borrow { .. }
|
| ExprKind::Borrow { .. }
|
||||||
| ExprKind::AddressOf { .. }
|
| ExprKind::RawBorrow { .. }
|
||||||
| ExprKind::Match { .. }
|
| ExprKind::Match { .. }
|
||||||
| ExprKind::If { .. }
|
| ExprKind::If { .. }
|
||||||
| ExprKind::Loop { .. }
|
| ExprKind::Loop { .. }
|
||||||
|
@ -512,7 +512,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
| ExprKind::NeverToAny { .. }
|
| ExprKind::NeverToAny { .. }
|
||||||
| ExprKind::Use { .. }
|
| ExprKind::Use { .. }
|
||||||
| ExprKind::Borrow { .. }
|
| ExprKind::Borrow { .. }
|
||||||
| ExprKind::AddressOf { .. }
|
| ExprKind::RawBorrow { .. }
|
||||||
| ExprKind::Adt { .. }
|
| ExprKind::Adt { .. }
|
||||||
| ExprKind::Loop { .. }
|
| ExprKind::Loop { .. }
|
||||||
| ExprKind::LogicalOp { .. }
|
| ExprKind::LogicalOp { .. }
|
||||||
|
@ -51,7 +51,7 @@ impl Category {
|
|||||||
| ExprKind::Use { .. }
|
| ExprKind::Use { .. }
|
||||||
| ExprKind::Adt { .. }
|
| ExprKind::Adt { .. }
|
||||||
| ExprKind::Borrow { .. }
|
| ExprKind::Borrow { .. }
|
||||||
| ExprKind::AddressOf { .. }
|
| ExprKind::RawBorrow { .. }
|
||||||
| ExprKind::Yield { .. }
|
| ExprKind::Yield { .. }
|
||||||
| ExprKind::Call { .. }
|
| ExprKind::Call { .. }
|
||||||
| ExprKind::InlineAsm { .. } => Some(Category::Rvalue(RvalueFunc::Into)),
|
| ExprKind::InlineAsm { .. } => Some(Category::Rvalue(RvalueFunc::Into)),
|
||||||
|
@ -303,12 +303,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
|
|||||||
this.cfg.push_assign(block, source_info, destination, borrow);
|
this.cfg.push_assign(block, source_info, destination, borrow);
|
||||||
block.unit()
|
block.unit()
|
||||||
}
|
}
|
||||||
ExprKind::AddressOf { mutability, arg } => {
|
ExprKind::RawBorrow { mutability, arg } => {
|
||||||
let place = match mutability {
|
let place = match mutability {
|
||||||
hir::Mutability::Not => this.as_read_only_place(block, arg),
|
hir::Mutability::Not => this.as_read_only_place(block, arg),
|
||||||
hir::Mutability::Mut => this.as_place(block, arg),
|
hir::Mutability::Mut => this.as_place(block, arg),
|
||||||
};
|
};
|
||||||
let address_of = Rvalue::AddressOf(mutability, unpack!(block = place));
|
let address_of = Rvalue::RawPtr(mutability, unpack!(block = place));
|
||||||
this.cfg.push_assign(block, source_info, destination, address_of);
|
this.cfg.push_assign(block, source_info, destination, address_of);
|
||||||
block.unit()
|
block.unit()
|
||||||
}
|
}
|
||||||
|
@ -397,7 +397,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
|||||||
| ExprKind::Scope { .. }
|
| ExprKind::Scope { .. }
|
||||||
| ExprKind::Cast { .. } => {}
|
| ExprKind::Cast { .. } => {}
|
||||||
|
|
||||||
ExprKind::AddressOf { .. }
|
ExprKind::RawBorrow { .. }
|
||||||
| ExprKind::Adt { .. }
|
| ExprKind::Adt { .. }
|
||||||
| ExprKind::Array { .. }
|
| ExprKind::Array { .. }
|
||||||
| ExprKind::Binary { .. }
|
| ExprKind::Binary { .. }
|
||||||
@ -498,7 +498,7 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExprKind::AddressOf { arg, .. } => {
|
ExprKind::RawBorrow { arg, .. } => {
|
||||||
if let ExprKind::Scope { value: arg, .. } = self.thir[arg].kind
|
if let ExprKind::Scope { value: arg, .. } = self.thir[arg].kind
|
||||||
// THIR desugars UNSAFE_STATIC into *UNSAFE_STATIC_REF, where
|
// THIR desugars UNSAFE_STATIC into *UNSAFE_STATIC_REF, where
|
||||||
// UNSAFE_STATIC_REF holds the addr of the UNSAFE_STATIC, so: take two steps
|
// UNSAFE_STATIC_REF holds the addr of the UNSAFE_STATIC, so: take two steps
|
||||||
|
@ -143,7 +143,7 @@ impl<'tcx> Cx<'tcx> {
|
|||||||
arg: self.thir.exprs.push(expr),
|
arg: self.thir.exprs.push(expr),
|
||||||
},
|
},
|
||||||
Adjust::Borrow(AutoBorrow::RawPtr(mutability)) => {
|
Adjust::Borrow(AutoBorrow::RawPtr(mutability)) => {
|
||||||
ExprKind::AddressOf { mutability, arg: self.thir.exprs.push(expr) }
|
ExprKind::RawBorrow { mutability, arg: self.thir.exprs.push(expr) }
|
||||||
}
|
}
|
||||||
Adjust::DynStar => ExprKind::Cast { source: self.thir.exprs.push(expr) },
|
Adjust::DynStar => ExprKind::Cast { source: self.thir.exprs.push(expr) },
|
||||||
};
|
};
|
||||||
@ -396,7 +396,7 @@ impl<'tcx> Cx<'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hir::ExprKind::AddrOf(hir::BorrowKind::Raw, mutability, arg) => {
|
hir::ExprKind::AddrOf(hir::BorrowKind::Raw, mutability, arg) => {
|
||||||
ExprKind::AddressOf { mutability, arg: self.mirror_expr(arg) }
|
ExprKind::RawBorrow { mutability, arg: self.mirror_expr(arg) }
|
||||||
}
|
}
|
||||||
|
|
||||||
hir::ExprKind::Block(blk, _) => ExprKind::Block { block: self.mirror_block(blk) },
|
hir::ExprKind::Block(blk, _) => ExprKind::Block { block: self.mirror_block(blk) },
|
||||||
|
@ -325,7 +325,7 @@ impl<'p, 'tcx> MatchVisitor<'p, 'tcx> {
|
|||||||
Assign { .. } | AssignOp { .. } | InlineAsm { .. } | Let { .. } => true,
|
Assign { .. } | AssignOp { .. } | InlineAsm { .. } | Let { .. } => true,
|
||||||
|
|
||||||
// These evaluate to a value.
|
// These evaluate to a value.
|
||||||
AddressOf { .. }
|
RawBorrow { .. }
|
||||||
| Adt { .. }
|
| Adt { .. }
|
||||||
| Array { .. }
|
| Array { .. }
|
||||||
| Binary { .. }
|
| Binary { .. }
|
||||||
|
@ -379,8 +379,8 @@ impl<'a, 'tcx> ThirPrinter<'a, 'tcx> {
|
|||||||
self.print_expr(*arg, depth_lvl + 2);
|
self.print_expr(*arg, depth_lvl + 2);
|
||||||
print_indented!(self, ")", depth_lvl);
|
print_indented!(self, ")", depth_lvl);
|
||||||
}
|
}
|
||||||
AddressOf { mutability, arg } => {
|
RawBorrow { mutability, arg } => {
|
||||||
print_indented!(self, "AddressOf {", depth_lvl);
|
print_indented!(self, "RawBorrow {", depth_lvl);
|
||||||
print_indented!(self, format!("mutability: {:?}", mutability), depth_lvl + 1);
|
print_indented!(self, format!("mutability: {:?}", mutability), depth_lvl + 1);
|
||||||
print_indented!(self, "arg:", depth_lvl + 1);
|
print_indented!(self, "arg:", depth_lvl + 1);
|
||||||
self.print_expr(*arg, depth_lvl + 2);
|
self.print_expr(*arg, depth_lvl + 2);
|
||||||
|
@ -703,7 +703,7 @@ where
|
|||||||
statements: vec![
|
statements: vec![
|
||||||
self.assign(
|
self.assign(
|
||||||
ptr,
|
ptr,
|
||||||
Rvalue::AddressOf(Mutability::Mut, tcx.mk_place_index(self.place, cur)),
|
Rvalue::RawPtr(Mutability::Mut, tcx.mk_place_index(self.place, cur)),
|
||||||
),
|
),
|
||||||
self.assign(
|
self.assign(
|
||||||
cur.into(),
|
cur.into(),
|
||||||
|
@ -94,7 +94,7 @@ where
|
|||||||
match rvalue {
|
match rvalue {
|
||||||
// We ignore fake borrows as these get removed after analysis and shouldn't effect
|
// We ignore fake borrows as these get removed after analysis and shouldn't effect
|
||||||
// the layout of generators.
|
// the layout of generators.
|
||||||
Rvalue::AddressOf(_, borrowed_place)
|
Rvalue::RawPtr(_, borrowed_place)
|
||||||
| Rvalue::Ref(_, BorrowKind::Mut { .. } | BorrowKind::Shared, borrowed_place) => {
|
| Rvalue::Ref(_, BorrowKind::Mut { .. } | BorrowKind::Shared, borrowed_place) => {
|
||||||
if !borrowed_place.is_indirect() {
|
if !borrowed_place.is_indirect() {
|
||||||
self.trans.gen_(borrowed_place.local);
|
self.trans.gen_(borrowed_place.local);
|
||||||
|
@ -351,7 +351,7 @@ impl<'tcx> GenKillAnalysis<'tcx> for MaybeInitializedPlaces<'_, '_, 'tcx> {
|
|||||||
&& let Some((_, rvalue)) = statement.kind.as_assign()
|
&& let Some((_, rvalue)) = statement.kind.as_assign()
|
||||||
&& let mir::Rvalue::Ref(_, mir::BorrowKind::Mut { .. }, place)
|
&& let mir::Rvalue::Ref(_, mir::BorrowKind::Mut { .. }, place)
|
||||||
// FIXME: Does `&raw const foo` allow mutation? See #90413.
|
// FIXME: Does `&raw const foo` allow mutation? See #90413.
|
||||||
| mir::Rvalue::AddressOf(_, place) = rvalue
|
| mir::Rvalue::RawPtr(_, place) = rvalue
|
||||||
&& let LookupResult::Exact(mpi) = self.move_data().rev_lookup.find(place.as_ref())
|
&& let LookupResult::Exact(mpi) = self.move_data().rev_lookup.find(place.as_ref())
|
||||||
{
|
{
|
||||||
on_all_children_bits(self.move_data(), mpi, |child| {
|
on_all_children_bits(self.move_data(), mpi, |child| {
|
||||||
|
@ -189,13 +189,13 @@ impl DefUse {
|
|||||||
|
|
||||||
// All other contexts are uses...
|
// All other contexts are uses...
|
||||||
PlaceContext::MutatingUse(
|
PlaceContext::MutatingUse(
|
||||||
MutatingUseContext::AddressOf
|
MutatingUseContext::RawBorrow
|
||||||
| MutatingUseContext::Borrow
|
| MutatingUseContext::Borrow
|
||||||
| MutatingUseContext::Drop
|
| MutatingUseContext::Drop
|
||||||
| MutatingUseContext::Retag,
|
| MutatingUseContext::Retag,
|
||||||
)
|
)
|
||||||
| PlaceContext::NonMutatingUse(
|
| PlaceContext::NonMutatingUse(
|
||||||
NonMutatingUseContext::AddressOf
|
NonMutatingUseContext::RawBorrow
|
||||||
| NonMutatingUseContext::Copy
|
| NonMutatingUseContext::Copy
|
||||||
| NonMutatingUseContext::Inspect
|
| NonMutatingUseContext::Inspect
|
||||||
| NonMutatingUseContext::Move
|
| NonMutatingUseContext::Move
|
||||||
|
@ -432,7 +432,7 @@ impl<'b, 'a, 'tcx, F: Fn(Ty<'tcx>) -> bool> Gatherer<'b, 'a, 'tcx, F> {
|
|||||||
}
|
}
|
||||||
Rvalue::CopyForDeref(..) => unreachable!(),
|
Rvalue::CopyForDeref(..) => unreachable!(),
|
||||||
Rvalue::Ref(..)
|
Rvalue::Ref(..)
|
||||||
| Rvalue::AddressOf(..)
|
| Rvalue::RawPtr(..)
|
||||||
| Rvalue::Discriminant(..)
|
| Rvalue::Discriminant(..)
|
||||||
| Rvalue::Len(..)
|
| Rvalue::Len(..)
|
||||||
| Rvalue::NullaryOp(
|
| Rvalue::NullaryOp(
|
||||||
|
@ -177,7 +177,7 @@ pub trait ValueAnalysis<'tcx> {
|
|||||||
match rvalue {
|
match rvalue {
|
||||||
Rvalue::Use(operand) => self.handle_operand(operand, state),
|
Rvalue::Use(operand) => self.handle_operand(operand, state),
|
||||||
Rvalue::CopyForDeref(place) => self.handle_operand(&Operand::Copy(*place), state),
|
Rvalue::CopyForDeref(place) => self.handle_operand(&Operand::Copy(*place), state),
|
||||||
Rvalue::Ref(..) | Rvalue::AddressOf(..) => {
|
Rvalue::Ref(..) | Rvalue::RawPtr(..) => {
|
||||||
// We don't track such places.
|
// We don't track such places.
|
||||||
ValueOrPlace::TOP
|
ValueOrPlace::TOP
|
||||||
}
|
}
|
||||||
|
@ -131,9 +131,9 @@ impl<'tcx> MirPass<'tcx> for AddRetag {
|
|||||||
// Ptr-creating operations already do their own internal retagging, no
|
// Ptr-creating operations already do their own internal retagging, no
|
||||||
// need to also add a retag statement.
|
// need to also add a retag statement.
|
||||||
// *Except* if we are deref'ing a Box, because those get desugared to directly working
|
// *Except* if we are deref'ing a Box, because those get desugared to directly working
|
||||||
// with the inner raw pointer! That's relevant for `AddressOf` as Miri otherwise makes it
|
// with the inner raw pointer! That's relevant for `RawPtr` as Miri otherwise makes it
|
||||||
// a NOP when the original pointer is already raw.
|
// a NOP when the original pointer is already raw.
|
||||||
Rvalue::AddressOf(_mutbl, place) => {
|
Rvalue::RawPtr(_mutbl, place) => {
|
||||||
// Using `is_box_global` here is a bit sketchy: if this code is
|
// Using `is_box_global` here is a bit sketchy: if this code is
|
||||||
// generic over the allocator, we'll not add a retag! This is a hack
|
// generic over the allocator, we'll not add a retag! This is a hack
|
||||||
// to make Stacked Borrows compatible with custom allocator code.
|
// to make Stacked Borrows compatible with custom allocator code.
|
||||||
|
@ -71,7 +71,7 @@ struct PointerFinder<'tcx, 'a> {
|
|||||||
impl<'tcx, 'a> Visitor<'tcx> for PointerFinder<'tcx, 'a> {
|
impl<'tcx, 'a> Visitor<'tcx> for PointerFinder<'tcx, 'a> {
|
||||||
fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, location: Location) {
|
fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, location: Location) {
|
||||||
// We want to only check reads and writes to Places, so we specifically exclude
|
// We want to only check reads and writes to Places, so we specifically exclude
|
||||||
// Borrows and AddressOf.
|
// Borrow and RawBorrow.
|
||||||
match context {
|
match context {
|
||||||
PlaceContext::MutatingUse(
|
PlaceContext::MutatingUse(
|
||||||
MutatingUseContext::Store
|
MutatingUseContext::Store
|
||||||
|
@ -40,7 +40,7 @@ impl<'tcx> Visitor<'tcx> for DeduceReadOnly {
|
|||||||
// This is a mutation, so mark it as such.
|
// This is a mutation, so mark it as such.
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf) => {
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::RawBorrow) => {
|
||||||
// Whether mutating though a `&raw const` is allowed is still undecided, so we
|
// Whether mutating though a `&raw const` is allowed is still undecided, so we
|
||||||
// disable any sketchy `readonly` optimizations for now.
|
// disable any sketchy `readonly` optimizations for now.
|
||||||
// But we only need to do this if the pointer would point into the argument.
|
// But we only need to do this if the pointer would point into the argument.
|
||||||
|
@ -576,7 +576,7 @@ impl WriteInfo {
|
|||||||
Rvalue::ThreadLocalRef(_)
|
Rvalue::ThreadLocalRef(_)
|
||||||
| Rvalue::NullaryOp(_, _)
|
| Rvalue::NullaryOp(_, _)
|
||||||
| Rvalue::Ref(_, _, _)
|
| Rvalue::Ref(_, _, _)
|
||||||
| Rvalue::AddressOf(_, _)
|
| Rvalue::RawPtr(_, _)
|
||||||
| Rvalue::Len(_)
|
| Rvalue::Len(_)
|
||||||
| Rvalue::Discriminant(_)
|
| Rvalue::Discriminant(_)
|
||||||
| Rvalue::CopyForDeref(_) => (),
|
| Rvalue::CopyForDeref(_) => (),
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
//!
|
//!
|
||||||
//! # Handling of references
|
//! # Handling of references
|
||||||
//!
|
//!
|
||||||
//! We handle references by assigning a different "provenance" index to each Ref/AddressOf rvalue.
|
//! We handle references by assigning a different "provenance" index to each Ref/RawPtr rvalue.
|
||||||
//! This ensure that we do not spuriously merge borrows that should not be merged. Meanwhile, we
|
//! This ensure that we do not spuriously merge borrows that should not be merged. Meanwhile, we
|
||||||
//! consider all the derefs of an immutable reference to a freeze type to give the same value:
|
//! consider all the derefs of an immutable reference to a freeze type to give the same value:
|
||||||
//! ```ignore (MIR)
|
//! ```ignore (MIR)
|
||||||
@ -832,7 +832,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
|
|||||||
self.simplify_place_projection(place, location);
|
self.simplify_place_projection(place, location);
|
||||||
return self.new_pointer(*place, AddressKind::Ref(borrow_kind));
|
return self.new_pointer(*place, AddressKind::Ref(borrow_kind));
|
||||||
}
|
}
|
||||||
Rvalue::AddressOf(mutbl, ref mut place) => {
|
Rvalue::RawPtr(mutbl, ref mut place) => {
|
||||||
self.simplify_place_projection(place, location);
|
self.simplify_place_projection(place, location);
|
||||||
return self.new_pointer(*place, AddressKind::Address(mutbl));
|
return self.new_pointer(*place, AddressKind::Address(mutbl));
|
||||||
}
|
}
|
||||||
|
@ -141,7 +141,7 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
|
|||||||
|
|
||||||
/// Transform `&(*a)` ==> `a`.
|
/// Transform `&(*a)` ==> `a`.
|
||||||
fn simplify_ref_deref(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) {
|
fn simplify_ref_deref(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) {
|
||||||
if let Rvalue::Ref(_, _, place) | Rvalue::AddressOf(_, place) = rvalue {
|
if let Rvalue::Ref(_, _, place) | Rvalue::RawPtr(_, place) = rvalue {
|
||||||
if let Some((base, ProjectionElem::Deref)) = place.as_ref().last_projection() {
|
if let Some((base, ProjectionElem::Deref)) = place.as_ref().last_projection() {
|
||||||
if rvalue.ty(self.local_decls, self.tcx) != base.ty(self.local_decls, self.tcx).ty {
|
if rvalue.ty(self.local_decls, self.tcx) != base.ty(self.local_decls, self.tcx).ty {
|
||||||
return;
|
return;
|
||||||
|
@ -419,8 +419,8 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Do not try creating references (#67862)
|
// Do not try creating references (#67862)
|
||||||
Rvalue::AddressOf(_, place) | Rvalue::Ref(_, _, place) => {
|
Rvalue::RawPtr(_, place) | Rvalue::Ref(_, _, place) => {
|
||||||
trace!("skipping AddressOf | Ref for {:?}", place);
|
trace!("skipping RawPtr | Ref for {:?}", place);
|
||||||
|
|
||||||
// This may be creating mutable references or immutable references to cells.
|
// This may be creating mutable references or immutable references to cells.
|
||||||
// If that happens, the pointed to value could be mutated via that reference.
|
// If that happens, the pointed to value could be mutated via that reference.
|
||||||
@ -616,7 +616,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
|||||||
ImmTy::from_scalar(Scalar::from_target_usize(len, self), layout).into()
|
ImmTy::from_scalar(Scalar::from_target_usize(len, self), layout).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref(..) | AddressOf(..) => return None,
|
Ref(..) | RawPtr(..) => return None,
|
||||||
|
|
||||||
NullaryOp(ref null_op, ty) => {
|
NullaryOp(ref null_op, ty) => {
|
||||||
let op_layout = self.use_ecx(|this| this.ecx.layout_of(ty))?;
|
let op_layout = self.use_ecx(|this| this.ecx.layout_of(ty))?;
|
||||||
@ -969,9 +969,9 @@ impl<'tcx> Visitor<'tcx> for CanConstProp {
|
|||||||
// mutation.
|
// mutation.
|
||||||
| NonMutatingUse(NonMutatingUseContext::SharedBorrow)
|
| NonMutatingUse(NonMutatingUseContext::SharedBorrow)
|
||||||
| NonMutatingUse(NonMutatingUseContext::FakeBorrow)
|
| NonMutatingUse(NonMutatingUseContext::FakeBorrow)
|
||||||
| NonMutatingUse(NonMutatingUseContext::AddressOf)
|
| NonMutatingUse(NonMutatingUseContext::RawBorrow)
|
||||||
| MutatingUse(MutatingUseContext::Borrow)
|
| MutatingUse(MutatingUseContext::Borrow)
|
||||||
| MutatingUse(MutatingUseContext::AddressOf) => {
|
| MutatingUse(MutatingUseContext::RawBorrow) => {
|
||||||
trace!("local {:?} can't be propagated because it's used: {:?}", local, context);
|
trace!("local {:?} can't be propagated because it's used: {:?}", local, context);
|
||||||
self.can_const_prop[local] = ConstPropMode::NoPropagation;
|
self.can_const_prop[local] = ConstPropMode::NoPropagation;
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ impl EnumSizeOpt {
|
|||||||
source_info,
|
source_info,
|
||||||
kind: StatementKind::Assign(Box::new((
|
kind: StatementKind::Assign(Box::new((
|
||||||
dst,
|
dst,
|
||||||
Rvalue::AddressOf(Mutability::Mut, *lhs),
|
Rvalue::RawPtr(Mutability::Mut, *lhs),
|
||||||
))),
|
))),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -238,7 +238,7 @@ impl EnumSizeOpt {
|
|||||||
source_info,
|
source_info,
|
||||||
kind: StatementKind::Assign(Box::new((
|
kind: StatementKind::Assign(Box::new((
|
||||||
src,
|
src,
|
||||||
Rvalue::AddressOf(Mutability::Not, *rhs),
|
Rvalue::RawPtr(Mutability::Not, *rhs),
|
||||||
))),
|
))),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -551,7 +551,7 @@ impl<'tcx> Validator<'_, 'tcx> {
|
|||||||
self.validate_operand(rhs)?;
|
self.validate_operand(rhs)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rvalue::AddressOf(_, place) => {
|
Rvalue::RawPtr(_, place) => {
|
||||||
// We accept `&raw *`, i.e., raw reborrows -- creating a raw pointer is
|
// We accept `&raw *`, i.e., raw reborrows -- creating a raw pointer is
|
||||||
// no problem, only using it is.
|
// no problem, only using it is.
|
||||||
if let Some((place_base, ProjectionElem::Deref)) = place.as_ref().last_projection()
|
if let Some((place_base, ProjectionElem::Deref)) = place.as_ref().last_projection()
|
||||||
|
@ -227,7 +227,7 @@ fn compute_replacement<'tcx>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Rvalue::Ref(_, _, place) | Rvalue::AddressOf(_, place) => {
|
Rvalue::Ref(_, _, place) | Rvalue::RawPtr(_, place) => {
|
||||||
let mut place = *place;
|
let mut place = *place;
|
||||||
// Try to see through `place` in order to collapse reborrow chains.
|
// Try to see through `place` in order to collapse reborrow chains.
|
||||||
if place.projection.first() == Some(&PlaceElem::Deref)
|
if place.projection.first() == Some(&PlaceElem::Deref)
|
||||||
|
@ -343,7 +343,7 @@ impl<'tcx> AsyncDestructorCtorShimBuilder<'tcx> {
|
|||||||
.tcx
|
.tcx
|
||||||
.mk_place_elems(&[PlaceElem::Deref, PlaceElem::Field(field, field_ty)]),
|
.mk_place_elems(&[PlaceElem::Deref, PlaceElem::Field(field, field_ty)]),
|
||||||
};
|
};
|
||||||
self.put_temp_rvalue(Rvalue::AddressOf(Mutability::Mut, place))
|
self.put_temp_rvalue(Rvalue::RawPtr(Mutability::Mut, place))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If given Self is an enum puts `to_drop: *mut FieldTy` on top of
|
/// If given Self is an enum puts `to_drop: *mut FieldTy` on top of
|
||||||
@ -363,7 +363,7 @@ impl<'tcx> AsyncDestructorCtorShimBuilder<'tcx> {
|
|||||||
PlaceElem::Field(field, field_ty),
|
PlaceElem::Field(field, field_ty),
|
||||||
]),
|
]),
|
||||||
};
|
};
|
||||||
self.put_temp_rvalue(Rvalue::AddressOf(Mutability::Mut, place))
|
self.put_temp_rvalue(Rvalue::RawPtr(Mutability::Mut, place))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If given Self is an enum puts `to_drop: *mut FieldTy` on top of
|
/// If given Self is an enum puts `to_drop: *mut FieldTy` on top of
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
//! 1/ They are only assigned-to once, either as a function parameter, or in an assign statement;
|
//! 1/ They are only assigned-to once, either as a function parameter, or in an assign statement;
|
||||||
//! 2/ This single assignment dominates all uses;
|
//! 2/ This single assignment dominates all uses;
|
||||||
//!
|
//!
|
||||||
//! As we do not track indirect assignments, a local that has its address taken (either by
|
//! As we do not track indirect assignments, a local that has its address taken (via a borrow or raw
|
||||||
//! AddressOf or by borrowing) is considered non-SSA. However, it is UB to modify through an
|
//! borrow operator) is considered non-SSA. However, it is UB to modify through an immutable borrow
|
||||||
//! immutable borrow of a `Freeze` local. Those can still be considered to be SSA.
|
//! of a `Freeze` local. Those can still be considered to be SSA.
|
||||||
|
|
||||||
use rustc_data_structures::graph::dominators::Dominators;
|
use rustc_data_structures::graph::dominators::Dominators;
|
||||||
use rustc_index::bit_set::BitSet;
|
use rustc_index::bit_set::BitSet;
|
||||||
@ -262,7 +262,7 @@ impl<'tcx> Visitor<'tcx> for SsaVisitor<'tcx, '_> {
|
|||||||
PlaceContext::MutatingUse(MutatingUseContext::Projection)
|
PlaceContext::MutatingUse(MutatingUseContext::Projection)
|
||||||
| PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection) => bug!(),
|
| PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection) => bug!(),
|
||||||
// Anything can happen with raw pointers, so remove them.
|
// Anything can happen with raw pointers, so remove them.
|
||||||
PlaceContext::NonMutatingUse(NonMutatingUseContext::AddressOf)
|
PlaceContext::NonMutatingUse(NonMutatingUseContext::RawBorrow)
|
||||||
| PlaceContext::MutatingUse(_) => {
|
| PlaceContext::MutatingUse(_) => {
|
||||||
self.assignments[local] = Set1::Many;
|
self.assignments[local] = Set1::Many;
|
||||||
}
|
}
|
||||||
|
@ -1345,7 +1345,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
|
|||||||
}
|
}
|
||||||
Rvalue::Repeat(_, _)
|
Rvalue::Repeat(_, _)
|
||||||
| Rvalue::ThreadLocalRef(_)
|
| Rvalue::ThreadLocalRef(_)
|
||||||
| Rvalue::AddressOf(_, _)
|
| Rvalue::RawPtr(_, _)
|
||||||
| Rvalue::NullaryOp(NullOp::SizeOf | NullOp::AlignOf | NullOp::UbChecks, _)
|
| Rvalue::NullaryOp(NullOp::SizeOf | NullOp::AlignOf | NullOp::UbChecks, _)
|
||||||
| Rvalue::Discriminant(_) => {}
|
| Rvalue::Discriminant(_) => {}
|
||||||
}
|
}
|
||||||
|
@ -174,7 +174,7 @@ impl<'tcx> Stable<'tcx> for mir::Rvalue<'tcx> {
|
|||||||
ThreadLocalRef(def_id) => {
|
ThreadLocalRef(def_id) => {
|
||||||
stable_mir::mir::Rvalue::ThreadLocalRef(tables.crate_item(*def_id))
|
stable_mir::mir::Rvalue::ThreadLocalRef(tables.crate_item(*def_id))
|
||||||
}
|
}
|
||||||
AddressOf(mutability, place) => {
|
RawPtr(mutability, place) => {
|
||||||
stable_mir::mir::Rvalue::AddressOf(mutability.stable(tables), place.stable(tables))
|
stable_mir::mir::Rvalue::AddressOf(mutability.stable(tables), place.stable(tables))
|
||||||
}
|
}
|
||||||
Len(place) => stable_mir::mir::Rvalue::Len(place.stable(tables)),
|
Len(place) => stable_mir::mir::Rvalue::Len(place.stable(tables)),
|
||||||
|
@ -192,7 +192,7 @@ fn recurse_build<'tcx>(
|
|||||||
ExprKind::Borrow { arg, .. } => {
|
ExprKind::Borrow { arg, .. } => {
|
||||||
let arg_node = &body.exprs[*arg];
|
let arg_node = &body.exprs[*arg];
|
||||||
|
|
||||||
// Skip reborrows for now until we allow Deref/Borrow/AddressOf
|
// Skip reborrows for now until we allow Deref/Borrow/RawBorrow
|
||||||
// expressions.
|
// expressions.
|
||||||
// FIXME(generic_const_exprs): Verify/explain why this is sound
|
// FIXME(generic_const_exprs): Verify/explain why this is sound
|
||||||
if let ExprKind::Deref { arg } = arg_node.kind {
|
if let ExprKind::Deref { arg } = arg_node.kind {
|
||||||
@ -202,7 +202,7 @@ fn recurse_build<'tcx>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// FIXME(generic_const_exprs): We may want to support these.
|
// FIXME(generic_const_exprs): We may want to support these.
|
||||||
ExprKind::AddressOf { .. } | ExprKind::Deref { .. } => maybe_supported_error(
|
ExprKind::RawBorrow { .. } | ExprKind::Deref { .. } => maybe_supported_error(
|
||||||
GenericConstantTooComplexSub::AddressAndDerefNotSupported(node.span),
|
GenericConstantTooComplexSub::AddressAndDerefNotSupported(node.span),
|
||||||
)?,
|
)?,
|
||||||
ExprKind::Repeat { .. } | ExprKind::Array { .. } => {
|
ExprKind::Repeat { .. } | ExprKind::Array { .. } => {
|
||||||
@ -343,7 +343,7 @@ impl<'a, 'tcx> IsThirPolymorphic<'a, 'tcx> {
|
|||||||
| thir::ExprKind::VarRef { .. }
|
| thir::ExprKind::VarRef { .. }
|
||||||
| thir::ExprKind::UpvarRef { .. }
|
| thir::ExprKind::UpvarRef { .. }
|
||||||
| thir::ExprKind::Borrow { .. }
|
| thir::ExprKind::Borrow { .. }
|
||||||
| thir::ExprKind::AddressOf { .. }
|
| thir::ExprKind::RawBorrow { .. }
|
||||||
| thir::ExprKind::Break { .. }
|
| thir::ExprKind::Break { .. }
|
||||||
| thir::ExprKind::Continue { .. }
|
| thir::ExprKind::Continue { .. }
|
||||||
| thir::ExprKind::Return { .. }
|
| thir::ExprKind::Return { .. }
|
||||||
|
@ -110,7 +110,7 @@ fn check_rvalue<'tcx>(
|
|||||||
) -> McfResult {
|
) -> McfResult {
|
||||||
match rvalue {
|
match rvalue {
|
||||||
Rvalue::ThreadLocalRef(_) => Err((span, "cannot access thread local storage in const fn".into())),
|
Rvalue::ThreadLocalRef(_) => Err((span, "cannot access thread local storage in const fn".into())),
|
||||||
Rvalue::Len(place) | Rvalue::Discriminant(place) | Rvalue::Ref(_, _, place) | Rvalue::AddressOf(_, place) => {
|
Rvalue::Len(place) | Rvalue::Discriminant(place) | Rvalue::Ref(_, _, place) | Rvalue::RawPtr(_, place) => {
|
||||||
check_place(tcx, *place, span, body, msrv)
|
check_place(tcx, *place, span, body, msrv)
|
||||||
},
|
},
|
||||||
Rvalue::CopyForDeref(place) => check_place(tcx, *place, span, body, msrv),
|
Rvalue::CopyForDeref(place) => check_place(tcx, *place, span, body, msrv),
|
||||||
|
Loading…
Reference in New Issue
Block a user