File tree 3 files changed +16
-0
lines changed
3 files changed +16
-0
lines changed Original file line number Diff line number Diff line change @@ -1660,6 +1660,11 @@ mod prim_ref {}
1660
1660
/// * [`UnwindSafe`]
1661
1661
/// * [`RefUnwindSafe`]
1662
1662
///
1663
+ /// Note that while this type implements `PartialEq`, comparing function pointers is unreliable:
1664
+ /// pointers to the same function can compare inequal (because functions are duplicated in multiple
1665
+ /// codegen units), and pointers to *different* functions can compare equal (since identical
1666
+ /// functions can be deduplicated within a codegen unit).
1667
+ ///
1663
1668
/// [`Hash`]: hash::Hash
1664
1669
/// [`Pointer`]: fmt::Pointer
1665
1670
/// [`UnwindSafe`]: panic::UnwindSafe
Original file line number Diff line number Diff line change @@ -175,6 +175,11 @@ impl<T: ?Sized> Clone for PtrComponents<T> {
175
175
///
176
176
/// It is possible to name this struct with a type parameter that is not a `dyn` trait object
177
177
/// (for example `DynMetadata<u64>`) but not to obtain a meaningful value of that struct.
178
+ ///
179
+ /// Note that while this type implements `PartialEq`, comparing vtable pointers is unreliable:
180
+ /// pointers to vtables of the same type for the same trait can compare inequal (because vtables are
181
+ /// duplicated in multiple codegen units), and pointers to vtables of *different* types/traits can
182
+ /// compare equal (since identical vtables can be deduplicated within a codegen unit).
178
183
#[ lang = "dyn_metadata" ]
179
184
pub struct DynMetadata < Dyn : ?Sized > {
180
185
vtable_ptr : & ' static VTable ,
Original file line number Diff line number Diff line change @@ -99,6 +99,12 @@ impl RawWaker {
99
99
/// [`RawWaker`] implementation. Calling one of the contained functions using
100
100
/// any other `data` pointer will cause undefined behavior.
101
101
///
102
+ /// Note that while this type implements `PartialEq`, comparing function pointers, and hence
103
+ /// comparing structs like this that contain function pointers, is unreliable: pointers to the same
104
+ /// function can compare inequal (because functions are duplicated in multiple codegen units), and
105
+ /// pointers to *different* functions can compare equal (since identical functions can be
106
+ /// deduplicated within a codegen unit).
107
+ ///
102
108
/// # Thread safety
103
109
/// If the [`RawWaker`] will be used to construct a [`Waker`] then
104
110
/// these functions must all be thread-safe (even though [`RawWaker`] is
You can’t perform that action at this time.
0 commit comments