Skip to content

Commit

Permalink
Initial (incomplete) implementation of transmutability trait.
Browse files Browse the repository at this point in the history
This initial implementation handles transmutations between types with specified layouts, except when references are involved.

Co-authored-by: Igor null <[email protected]>
  • Loading branch information
jswrenn and m1el committed Jul 27, 2022
1 parent 59c7b33 commit 8251b9b
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
4 changes: 4 additions & 0 deletions core/src/mem/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ mod valid_align;
// alignment as a parameter, such as `Layout::padding_needed_for`.
pub(crate) use valid_align::ValidAlign;

mod transmutability;
#[unstable(feature = "transmutability", issue = "none")]
pub use transmutability::{Assume, BikeshedIntrinsicFrom};

#[stable(feature = "rust1", since = "1.0.0")]
#[doc(inline)]
pub use crate::intrinsics::transmute;
Expand Down
39 changes: 39 additions & 0 deletions core/src/mem/transmutability.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/// Are values of a type transmutable into values of another type?
///
/// This trait is implemented on-the-fly by the compiler for types `Src` and `Self` when the bits of
/// any value of type `Self` are safely transmutable into a value of type `Dst`, in a given `Context`,
/// notwithstanding whatever safety checks you have asked the compiler to [`Assume`] are satisfied.
#[unstable(feature = "transmutability", issue = "none")]
#[cfg_attr(not(bootstrap), lang = "transmute_trait")]
pub unsafe trait BikeshedIntrinsicFrom<
Src,
Context,
const ASSUME_ALIGNMENT: bool,
const ASSUME_LIFETIMES: bool,
const ASSUME_VALIDITY: bool,
const ASSUME_VISIBILITY: bool,
> where
Src: ?Sized,
{
}

/// What transmutation safety conditions shall the compiler assume that *you* are checking?
#[unstable(feature = "transmutability", issue = "none")]
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
pub struct Assume {
/// When `true`, the compiler assumes that *you* are ensuring (either dynamically or statically) that
/// destination referents do not have stricter alignment requirements than source referents.
pub alignment: bool,

/// When `true`, the compiler assume that *you* are ensuring that lifetimes are not extended in a manner
/// that violates Rust's memory model.
pub lifetimes: bool,

/// When `true`, the compiler assumes that *you* are ensuring that the source type is actually a valid
/// instance of the destination type.
pub validity: bool,

/// When `true`, the compiler assumes that *you* have ensured that it is safe for you to violate the
/// type and field privacy of the destination type (and sometimes of the source type, too).
pub visibility: bool,
}

0 comments on commit 8251b9b

Please sign in to comment.