pub unsafe trait TransmuteFrom<Src, const ASSUME: Assume = core::::mem::transmutability::TransmuteFrom::{constant#0}>where
Src: ?Sized,{
// Provided method
unsafe fn transmute(src: Src) -> Self
where Self: Sized { ... }
}
transmutability
)Expand description
Marks that Src
is transmutable into Self
.
§Implementation
This trait cannot be implemented explicitly. It is implemented on-the-fly by
the compiler for all types Src
and Self
such that, given a set of safety
obligations on the programmer (see Assume
), the compiler has proved that
the bits of a value of type Src
can be soundly reinterpreted as a Self
.
§Safety
If Dst: TransmuteFrom<Src, ASSUMPTIONS>
, the compiler guarantees that
Src
is soundly union-transmutable into a value of type Dst
, provided
that the programmer has guaranteed that the given ASSUMPTIONS
are satisfied.
A union-transmute is any bit-reinterpretation conversion in the form of:
pub unsafe fn transmute_via_union<Src, Dst>(src: Src) -> Dst {
use core::mem::ManuallyDrop;
#[repr(C)]
union Transmute<Src, Dst> {
src: ManuallyDrop<Src>,
dst: ManuallyDrop<Dst>,
}
let transmute = Transmute {
src: ManuallyDrop::new(src),
};
let dst = transmute.dst;
ManuallyDrop::into_inner(dst)
}
Note that this construction is more permissive than
mem::transmute_copy
; union-transmutes permit
conversions that extend the bits of Src
with trailing padding to fill
trailing uninitialized bytes of Self
; e.g.:
#![feature(transmutability)]
use core::mem::{Assume, TransmuteFrom};
let src = 42u8; // size = 1
#[repr(C, align(2))]
struct Dst(u8); // size = 2
let _ = unsafe {
<Dst as TransmuteFrom<u8, { Assume::SAFETY }>>::transmute(src)
};
§Caveats
§Portability
Implementations of this trait do not provide any guarantee of portability
across toolchains, targets or compilations. This trait may be implemented
for certain combinations of Src
, Self
and ASSUME
on some toolchains,
targets or compilations, but not others. For example, if the layouts of
Src
or Self