-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initial (incomplete) implementation of transmutability trait.
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
Showing
2 changed files
with
43 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
} |