Rollup merge of #135748 - compiler-errors:len-2, r=RalfJung,oli-obk
Lower index bounds checking to `PtrMetadata`, this time with the right fake borrow semantics 😸
Change `Rvalue::RawRef` to take a `RawRefKind` instead of just a `Mutability`. Then introduce `RawRefKind::FakeForPtrMetadata` and use that for lowering index bounds checking to a `PtrMetadata`. This new `RawRefKind::FakeForPtrMetadata` acts like a shallow fake borrow in borrowck, which mimics the semantics of the old `Rvalue::Len` operation we're replacing.
We can then use this `RawRefKind` instead of using a span desugaring hack in CTFE.
cc ``@scottmcm`` ``@RalfJung``
This commit is contained in:
commit
21ddd7ab89
117 changed files with 1591 additions and 1704 deletions
|
@ -180,6 +180,59 @@ pub enum BorrowKind {
|
|||
Mut { kind: MutBorrowKind },
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, TyEncodable, TyDecodable)]
|
||||
#[derive(Hash, HashStable)]
|
||||
pub enum RawPtrKind {
|
||||
Mut,
|
||||
Const,
|
||||
/// Creates a raw pointer to a place that will only be used to access its metadata,
|
||||
/// not the data behind the pointer. Note that this limitation is *not* enforced
|
||||
/// by the validator.
|
||||
///
|
||||
/// The borrow checker allows overlap of these raw pointers with references to the
|
||||
/// data. This is sound even if the pointer is "misused" since any such use is anyway
|
||||
/// unsafe. In terms of the operational semantics (i.e., Miri), this is equivalent
|
||||
/// to `RawPtrKind::Mut`, but will never incur a retag.
|
||||
FakeForPtrMetadata,
|
||||
}
|
||||
|
||||
impl From<Mutability> for RawPtrKind {
|
||||
fn from(other: Mutability) -> Self {
|
||||
match other {
|
||||
Mutability::Mut => RawPtrKind::Mut,
|
||||
Mutability::Not => RawPtrKind::Const,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl RawPtrKind {
|
||||
pub fn is_fake(self) -> bool {
|
||||
match self {
|
||||
RawPtrKind::Mut | RawPtrKind::Const => false,
|
||||
RawPtrKind::FakeForPtrMetadata => true,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn to_mutbl_lossy(self) -> Mutability {
|
||||
match self {
|
||||
RawPtrKind::Mut => Mutability::Mut,
|
||||
RawPtrKind::Const => Mutability::Not,
|
||||
|
||||
// We have no type corresponding to a fake borrow, so use
|
||||
// `*const` as an approximation.
|
||||
RawPtrKind::FakeForPtrMetadata => Mutability::Not,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn ptr_str(self) -> &'static str {
|
||||
match self {
|
||||
RawPtrKind::Mut => "mut",
|
||||
RawPtrKind::Const => "const",
|
||||
RawPtrKind::FakeForPtrMetadata => "const (fake)",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, TyEncodable, TyDecodable)]
|
||||
#[derive(Hash, HashStable)]
|
||||
pub enum MutBorrowKind {
|
||||
|
@ -1356,7 +1409,7 @@ pub enum Rvalue<'tcx> {
|
|||
///
|
||||
/// Like with references, the semantics of this operation are heavily dependent on the aliasing
|
||||
/// model.
|
||||
RawPtr(Mutability, Place<'tcx>),
|
||||
RawPtr(RawPtrKind, Place<'tcx>),
|
||||
|
||||
/// Yields the length of the place, as a `usize`.
|
||||
///
|
||||
|
|
|
@ -206,9 +206,9 @@ impl<'tcx> Rvalue<'tcx> {
|
|||
let place_ty = place.ty(local_decls, tcx).ty;
|
||||
Ty::new_ref(tcx, reg, place_ty, bk.to_mutbl_lossy())
|
||||
}
|
||||
Rvalue::RawPtr(mutability, ref place) => {
|
||||
Rvalue::RawPtr(kind, ref place) => {
|
||||
let place_ty = place.ty(local_decls, tcx).ty;
|
||||
Ty::new_ptr(tcx, place_ty, mutability)
|
||||
Ty::new_ptr(tcx, place_ty, kind.to_mutbl_lossy())
|
||||
}
|
||||
Rvalue::Len(..) => tcx.types.usize,
|
||||
Rvalue::Cast(.., ty) => ty,
|
||||
|
|
|
@ -15,6 +15,7 @@ TrivialTypeTraversalImpls! {
|
|||
SourceScopeLocalData,
|
||||
UserTypeAnnotationIndex,
|
||||
BorrowKind,
|
||||
RawPtrKind,
|
||||
CastKind,
|
||||
BasicBlock,
|
||||
SwitchTargets,
|
||||
|
|
|
@ -685,12 +685,15 @@ macro_rules! make_mir_visitor {
|
|||
|
||||
Rvalue::RawPtr(m, path) => {
|
||||
let ctx = match m {
|
||||
Mutability::Mut => PlaceContext::MutatingUse(
|
||||
RawPtrKind::Mut => PlaceContext::MutatingUse(
|
||||
MutatingUseContext::RawBorrow
|
||||
),
|
||||
Mutability::Not => PlaceContext::NonMutatingUse(
|
||||
RawPtrKind::Const => PlaceContext::NonMutatingUse(
|
||||
NonMutatingUseContext::RawBorrow
|
||||
),
|
||||
RawPtrKind::FakeForPtrMetadata => PlaceContext::NonMutatingUse(
|
||||
NonMutatingUseContext::Inspect
|
||||
),
|
||||
};
|
||||
self.visit_place(path, ctx, location);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue