@@ -1989,9 +1989,18 @@ impl<F: FnPtr> fmt::Debug for F {
1989
1989
/// as all other references. This macro can create a raw pointer *without* creating
1990
1990
/// a reference first.
1991
1991
///
1992
- /// Note, however, that the `expr` in `addr_of!(expr)` is still subject to all
1993
- /// the usual rules. In particular, `addr_of!(*ptr::null())` is Undefined
1994
- /// Behavior because it dereferences a null pointer.
1992
+ /// The `expr` in `addr_of!(expr)` is evaluated as a place expression, but never loads
1993
+ /// from the place or requires the place to be dereferenceable. This means that
1994
+ /// `addr_of!(*ptr)` is defined behavior even if `ptr` is dangling or misaligned.
1995
+ /// Note however that `addr_of!((*ptr).field)` still requires the projection to
1996
+ /// `field` to be in-bounds, using the same rules as [`offset`].
1997
+ ///
1998
+ /// Note that `Deref`/`Index` coercions (and their mutable counterparts) are applied inside
1999
+ /// `addr_of!` like everywhere else, in which case a reference is created to call `Deref::deref` or
2000
+ /// `Index::index`, respectively. The statements above only apply when no such coercions are
2001
+ /// applied.
2002
+ ///
2003
+ /// [`offset`]: pointer::offset
1995
2004
///
1996
2005
/// # Example
1997
2006
///
@@ -2029,9 +2038,18 @@ pub macro addr_of($place:expr) {
2029
2038
/// as all other references. This macro can create a raw pointer *without* creating
2030
2039
/// a reference first.
2031
2040
///
2032
- /// Note, however, that the `expr` in `addr_of_mut!(expr)` is still subject to all
2033
- /// the usual rules. In particular, `addr_of_mut!(*ptr::null_mut())` is Undefined
2034
- /// Behavior because it dereferences a null pointer.
2041
+ /// The `expr` in `addr_of_mut!(expr)` is evaluated as a place expression, but never loads
2042
+ /// from the place or requires the place to be dereferenceable. This means that
2043
+ /// `addr_of_mut!(*ptr)` is defined behavior even if `ptr` is dangling or misaligned.
2044
+ /// Note however that `addr_of_mut!((*ptr).field)` still requires the projection to
2045
+ /// `field` to be in-bounds, using the same rules as [`offset`].
2046
+ ///
2047
+ /// Note that `Deref`/`Index` coercions (and their mutable counterparts) are applied inside
2048
+ /// `addr_of_mut!` like everywhere else, in which case a reference is created to call `Deref::deref`
2049
+ /// or `Index::index`, respectively. The statements above only apply when no such coercions are
2050
+ /// applied.
2051
+ ///
2052
+ /// [`offset`]: pointer::offset
2035
2053
///
2036
2054
/// # Examples
2037
2055
///
0 commit comments