Auto merge of #117572 - RalfJung:addr_of, r=cuviper · rust-lang/rust@17d0a45 (original) (raw)

`@@ -1999,9 +1999,18 @@ impl<F: FnPtr> fmt::Debug for F {

`

1999

1999

`/// as all other references. This macro can create a raw pointer without creating

`

2000

2000

`/// a reference first.

`

2001

2001

`///

`

2002

``

`` -

/// Note, however, that the expr in addr_of!(expr) is still subject to all

``

2003

``

`` -

/// the usual rules. In particular, addr_of!(*ptr::null()) is Undefined

``

2004

``

`-

/// Behavior because it dereferences a null pointer.

`

``

2002

`` +

/// The expr in addr_of!(expr) is evaluated as a place expression, but never loads

``

``

2003

`+

/// from the place or requires the place to be dereferenceable. This means that

`

``

2004

`` +

/// addr_of!(*ptr) is defined behavior even if ptr is null, dangling, or misaligned.

``

``

2005

`` +

/// Note however that addr_of!((*ptr).field) still requires the projection to

``

``

2006

`` +

/// field to be in-bounds, using the same rules as [offset].

``

``

2007

`+

///

`

``

2008

`` +

/// Note that Deref/Index coercions (and their mutable counterparts) are applied inside

``

``

2009

`` +

/// addr_of! like everywhere else, in which case a reference is created to call Deref::deref or

``

``

2010

`` +

/// Index::index, respectively. The statements above only apply when no such coercions are

``

``

2011

`+

/// applied.

`

``

2012

`+

///

`

``

2013

`` +

/// [offset]: pointer::offset

``

2005

2014

`///

`

2006

2015

`/// # Example

`

2007

2016

`///

`

`@@ -2039,9 +2048,18 @@ pub macro addr_of($place:expr) {

`

2039

2048

`/// as all other references. This macro can create a raw pointer without creating

`

2040

2049

`/// a reference first.

`

2041

2050

`///

`

2042

``

`` -

/// Note, however, that the expr in addr_of_mut!(expr) is still subject to all

``

2043

``

`` -

/// the usual rules. In particular, addr_of_mut!(*ptr::null_mut()) is Undefined

``

2044

``

`-

/// Behavior because it dereferences a null pointer.

`

``

2051

`` +

/// The expr in addr_of_mut!(expr) is evaluated as a place expression, but never loads

``

``

2052

`+

/// from the place or requires the place to be dereferenceable. This means that

`

``

2053

`` +

/// addr_of_mut!(*ptr) is defined behavior even if ptr is null, dangling, or misaligned.

``

``

2054

`` +

/// Note however that addr_of_mut!((*ptr).field) still requires the projection to

``

``

2055

`` +

/// field to be in-bounds, using the same rules as [offset].

``

``

2056

`+

///

`

``

2057

`` +

/// Note that Deref/Index coercions (and their mutable counterparts) are applied inside

``

``

2058

`` +

/// addr_of_mut! like everywhere else, in which case a reference is created to call Deref::deref

``

``

2059

`` +

/// or Index::index, respectively. The statements above only apply when no such coercions are

``

``

2060

`+

/// applied.

`

``

2061

`+

///

`

``

2062

`` +

/// [offset]: pointer::offset

``

2045

2063

`///

`

2046

2064

`/// # Examples

`

2047

2065

`///

`