mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 23:04:33 +00:00
Auto merge of #115333 - joshlf:patch-5, r=RalfJung
Guarantee representation of None in NPO This allows users to soundly transmute zeroes into `Option` types subject to the null pointer optimization (NPO). It unblocks https://github.com/google/zerocopy/issues/293.
This commit is contained in:
commit
1bb6553b96
@ -119,15 +119,21 @@
|
||||
//! # Representation
|
||||
//!
|
||||
//! Rust guarantees to optimize the following types `T` such that
|
||||
//! [`Option<T>`] has the same size and alignment as `T`:
|
||||
//! [`Option<T>`] has the same size and alignment as `T`. In some
|
||||
//! of these cases, Rust further guarantees that
|
||||
//! `transmute::<_, Option<T>>([0u8; size_of::<T>()])` is sound and
|
||||
//! produces `Option::<T>::None`. These cases are identified by the
|
||||
//! second column:
|
||||
//!
|
||||
//! * [`Box<U>`]
|
||||
//! * `&U`
|
||||
//! * `&mut U`
|
||||
//! * `fn`, `extern "C" fn`[^extern_fn]
|
||||
//! * [`num::NonZero*`]
|
||||
//! * [`ptr::NonNull<U>`]
|
||||
//! * `#[repr(transparent)]` struct around one of the types in this list.
|
||||
//! | `T` | `transmute::<_, Option<T>>([0u8; size_of::<T>()])` sound? |
|
||||
//! |---------------------------------------------------------------------|----------------------------------------------------------------------|
|
||||
//! | [`Box<U>`] | when `U: Sized` |
|
||||
//! | `&U` | when `U: Sized` |
|
||||
//! | `&mut U` | when `U: Sized` |
|
||||
//! | `fn`, `extern "C" fn`[^extern_fn] | always |
|
||||
//! | [`num::NonZero*`] | always |
|
||||
//! | [`ptr::NonNull<U>`] | when `U: Sized` |
|
||||
//! | `#[repr(transparent)]` struct around one of the types in this list. | when it holds for the inner type |
|
||||
//!
|
||||
//! [^extern_fn]: this remains true for any other ABI: `extern "abi" fn` (_e.g._, `extern "system" fn`)
|
||||
//!
|
||||
|
Loading…
Reference in New Issue
Block a user