Expand set_ptr_value / with_metadata_of docs · qinheping/verify-rust-std@61eff8f (original) (raw)
`@@ -63,21 +63,22 @@ impl<T: ?Sized> *const T {
`
63
63
`self as _
`
64
64
`}
`
65
65
``
66
``
`-
/// Uses the pointer value in a new pointer of another type.
`
``
66
`+
/// Uses the address value in a new pointer of another type.
`
67
67
`///
`
68
``
`` -
/// In case meta
is a (fat) pointer to an unsized type, this operation
``
69
``
`-
/// will ignore the pointer part, whereas for (thin) pointers to sized
`
70
``
`-
/// types, this has the same effect as a simple cast.
`
``
68
`` +
/// This operation will ignore the address part of its meta
operand and discard existing
``
``
69
`` +
/// metadata of self
. For pointers to a sized types (thin pointers), this has the same effect
``
``
70
`+
/// as a simple cast. For pointers to an unsized type (fat pointers) this recombines the address
`
``
71
`` +
/// with new metadata such as slice lengths or dyn
-vtable.
``
71
72
`///
`
72
``
`` -
/// The resulting pointer will have provenance of self
, i.e., for a fat
``
73
``
`-
/// pointer, this operation is semantically the same as creating a new
`
74
``
`` -
/// fat pointer with the data pointer value of self
but the metadata of
``
75
``
`` -
/// meta
.
``
``
73
`` +
/// The resulting pointer will have provenance of self
. This operation is semantically the
``
``
74
`` +
/// same as creating a new pointer with the data pointer value of self
but the metadata of
``
``
75
`` +
/// meta
, being fat or thing depending on the meta
operand.
``
76
76
`///
`
77
77
`/// # Examples
`
78
78
`///
`
79
``
`-
/// This function is primarily useful for allowing byte-wise pointer
`
80
``
`-
/// arithmetic on potentially fat pointers:
`
``
79
`+
/// This function is primarily useful for enabling pointer arithmetic on potentially fat
`
``
80
`+
/// pointers. The pointer is cast to a sized pointee to utilize offset operations and then
`
``
81
`+
/// recombined with its own original metadata.
`
81
82
`///
`
82
83
```` /// ```
`83`
`84`
`/// #![feature(set_ptr_value)]
`
`@@ -91,6 +92,26 @@ impl<T: ?Sized> *const T {
`
`91`
`92`
`/// println!("{:?}", &*ptr); // will print "3"
`
`92`
`93`
`/// }
`
`93`
`94`
```` /// ```
``
95
`+
///
`
``
96
`+
/// # Incorrect usage
`
``
97
`+
///
`
``
98
`+
/// The provenance from pointers is not combined. The result must only be used to refer to the
`
``
99
`` +
/// address allowed by self
.
``
``
100
`+
///
`
``
101
/// ```rust,no_run
``
102
`+
/// #![feature(set_ptr_value)]
`
``
103
`+
/// let x = 0u32;
`
``
104
`+
/// let y = 1u32;
`
``
105
`+
///
`
``
106
`+
/// let x = (&x) as *const u32;
`
``
107
`+
/// let y = (&y) as *const u32;
`
``
108
`+
///
`
``
109
`+
/// let offset = (x as usize - y as usize) / 4;
`
``
110
`+
/// let bad = x.wrapping_add(offset).with_metadata_of(y);
`
``
111
`+
///
`
``
112
`` +
/// // This dereference is UB. The pointer only has provenance for x
but points to y
.
``
``
113
`+
/// println!("{:?}", unsafe { &*bad });
`
``
114
/// ```
94
115
`#[unstable(feature = "set_ptr_value", issue = "75091")]
`
95
116
`#[rustc_const_stable(feature = "ptr_metadata_const", since = "CURRENT_RUSTC_VERSION")]
`
96
117
`#[must_use = "returns a new pointer rather than modifying its argument"]
`