diff options
| author | bors <bors@rust-lang.org> | 2023-11-03 20:29:13 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-11-03 20:29:13 +0000 |
| commit | 1bb6553b967b69eed9ed8147e78b4f65cfc48e11 (patch) | |
| tree | 67bf52ffaafe64dedf9ddc511e4449d434bb70ca | |
| parent | 9c20ddd956426d577d77cb3f57a7db2227a3c6e9 (diff) | |
| parent | 9703cb2deb45b2901e6a13708ba18201ee021383 (diff) | |
| download | rust-1bb6553b967b69eed9ed8147e78b4f65cfc48e11.tar.gz rust-1bb6553b967b69eed9ed8147e78b4f65cfc48e11.zip | |
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.
| -rw-r--r-- | library/core/src/option.rs | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 12de349d22b..acf3dfbdf4c 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -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`: -//! -//! * [`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. +//! [`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: +//! +//! | `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`) //! |
