Rollup merge of #124870 - Lokathor:update-result-docs, r=dtolnay · model-checking/verify-rust-std@3578f42 (original) (raw)

Original file line number Diff line number Diff line change
@@ -228,6 +228,27 @@
228 228 //! [`Err(E)`]: Err
229 229 //! [io::Error]: ../../std/io/struct.Error.html "io::Error"
230 230 //!
231 +//! # Representation
232 +//!
233 +//! In some cases, [`Result<T, E>`] will gain the same size, alignment, and ABI
234 +//! guarantees as [`Option`] has. One of either the `T` or `E` type must be a
235 +//! type that qualifies for the `Option` [representation guarantees][opt-rep],
236 +//! and the *other* type must meet all of the following conditions:
237 +//! * Is a zero-sized type with alignment 1 (a "1-ZST").
238 +//! * Has no fields.
239 +//! * Does not have the `#[non_exhaustive]` attribute.
240 +//!
241 +//! For example, `NonZeroI32` qualifies for the `Option` representation
242 +//! guarantees, and `()` is a zero-sized type with alignment 1, no fields, and
243 +//! it isn't `non_exhaustive`. This means that both `Result<NonZeroI32, ()>` and
244 +//! `Result<(), NonZeroI32>` have the same size, alignment, and ABI guarantees
245 +//! as `Option`. The only difference is the implied semantics:
246 +//! * `Option` is "a non-zero i32 might be present"
247 +//! * `Result<NonZeroI32, ()>` is "a non-zero i32 success result, if any"
248 +//! * `Result<(), NonZeroI32>` is "a non-zero i32 error result, if any"
249 +//!
250 +//! [opt-rep]: ../option/index.html#representation "Option Representation"
251 +//!
231 252 //! # Method overview
232 253 //!
233 254 //! In addition to working with pattern matching, [`Result`] provides a