@@ -109,7 +109,8 @@ const _: () = unsafe {
109
109
* byte. unaligned_as_ref( ) < 2
110
110
} )
111
111
} ;
112
- impl_size_eq ! ( bool , u8 ) ;
112
+
113
+ impl_size_compat ! ( bool , u8 ) ;
113
114
114
115
// SAFETY:
115
116
// - `Immutable`: `char` self-evidently does not contain any `UnsafeCell`s.
@@ -140,7 +141,7 @@ const _: () = unsafe {
140
141
} ) ;
141
142
} ;
142
143
143
- impl_size_eq ! ( char , Unalign <u32 >) ;
144
+ impl_size_compat ! ( char , Unalign <u32 >) ;
144
145
145
146
// SAFETY: Per the Reference [1], `str` has the same layout as `[u8]`.
146
147
// - `Immutable`: `[u8]` does not contain any `UnsafeCell`s.
@@ -173,14 +174,13 @@ const _: () = unsafe {
173
174
} )
174
175
} ;
175
176
176
- impl_size_eq ! ( str , [ u8 ] ) ;
177
+ impl_size_compat ! ( str , [ u8 ] ) ;
177
178
178
179
macro_rules! unsafe_impl_try_from_bytes_for_nonzero {
179
180
( $( $nonzero: ident[ $prim: ty] ) ,* ) => {
180
181
$(
181
182
unsafe_impl!( => TryFromBytes for $nonzero; |n| {
182
- impl_size_eq!( $nonzero, Unalign <$prim>) ;
183
-
183
+ impl_size_compat!( $nonzero, Unalign <$prim>) ;
184
184
let n = n. transmute:: <Unalign <$prim>, invariant:: Valid , _>( ) ;
185
185
$nonzero:: new( n. read_unaligned( ) . into_inner( ) ) . is_some( )
186
186
} ) ;
@@ -396,63 +396,72 @@ mod atomics {
396
396
( $( $( $tyvar: ident) ? => $atomic: ty [ $prim: ty] ) ,* ) => { {
397
397
crate :: util:: macros:: __unsafe( ) ;
398
398
399
- use core:: cell:: UnsafeCell ;
400
- use crate :: pointer:: { PtrInner , SizeEq , TransmuteFrom , invariant:: Valid } ;
399
+ use core:: { cell:: UnsafeCell } ;
400
+ use crate :: pointer:: { TransmuteFrom , PtrInner , SizeCompat , invariant:: Valid } ;
401
401
402
402
$(
403
- // SAFETY: The caller promised that `$atomic` and `$prim` have
404
- // the same size and bit validity.
403
+ // SAFETY: The caller promised that `$atomic` and `$prim`
404
+ // have the same size and bit validity. As a result of size
405
+ // equality, both impls of `SizeCompat::cast_from_raw`
406
+ // preserve referent size exactly.
405
407
unsafe impl <$( $tyvar) ?> TransmuteFrom <$atomic, Valid , Valid > for $prim { }
406
- // SAFETY: The caller promised that `$atomic` and `$prim` have
407
- // the same size and bit validity.
408
+ // SAFETY: The caller promised that `$atomic` and `$prim`
409
+ // have the same size and bit validity. As a result of size
410
+ // equality, both impls of `SizeCompat::cast_from_raw`
411
+ // preserve referent size exactly.
408
412
unsafe impl <$( $tyvar) ?> TransmuteFrom <$prim, Valid , Valid > for $atomic { }
409
413
410
- // SAFETY: The caller promised that `$atomic` and `$prim` have
411
- // the same size.
412
- unsafe impl <$( $tyvar) ?> SizeEq <$atomic> for $prim {
414
+ // SAFETY: See inline safety comment.
415
+ unsafe impl <$( $tyvar) ?> SizeCompat <$atomic> for $prim {
413
416
#[ inline]
414
417
fn cast_from_raw( a: PtrInner <' _, $atomic>) -> PtrInner <' _, $prim> {
415
- // SAFETY: The caller promised that `$atomic` and
416
- // `$prim` have the same size. Thus, this cast preserves
418
+ // SAFETY: The caller promised that `$atomic` and `$prim`
419
+ // have the same size. Thus, this cast preserves
417
420
// address, referent size, and provenance.
418
421
unsafe { cast!( a) }
419
422
}
420
423
}
421
424
// SAFETY: See previous safety comment.
422
- unsafe impl <$( $tyvar) ?> SizeEq <$prim> for $atomic {
425
+ unsafe impl <$( $tyvar) ?> SizeCompat <$prim> for $atomic {
423
426
#[ inline]
424
427
fn cast_from_raw( p: PtrInner <' _, $prim>) -> PtrInner <' _, $atomic> {
425
428
// SAFETY: See previous safety comment.
426
429
unsafe { cast!( p) }
427
430
}
428
431
}
429
- // SAFETY: The caller promised that `$atomic` and `$prim` have
430
- // the same size. `UnsafeCell<T>` has the same size as `T` [1].
432
+
433
+ // SAFETY: The caller promised that `$atomic` and `$prim`
434
+ // have the same size. `UnsafeCell<T>` has the same size as
435
+ // `T` [1]. Thus, this cast preserves address, referent
436
+ // size, and provenance.
431
437
//
432
438
// [1] Per https://doc.rust-lang.org/1.85.0/std/cell/struct.UnsafeCell.html#memory-layout:
433
439
//
434
440
// `UnsafeCell<T>` has the same in-memory representation as
435
441
// its inner type `T`. A consequence of this guarantee is that
436
442
// it is possible to convert between `T` and `UnsafeCell<T>`.
437
- unsafe impl <$( $tyvar) ?> SizeEq <$atomic> for UnsafeCell <$prim> {
443
+ unsafe impl <$( $tyvar) ?> SizeCompat <$atomic> for UnsafeCell <$prim> {
438
444
#[ inline]
439
445
fn cast_from_raw( a: PtrInner <' _, $atomic>) -> PtrInner <' _, UnsafeCell <$prim>> {
440
446
// SAFETY: See previous safety comment.
441
447
unsafe { cast!( a) }
442
448
}
443
449
}
444
450
// SAFETY: See previous safety comment.
445
- unsafe impl <$( $tyvar) ?> SizeEq <UnsafeCell <$prim>> for $atomic {
451
+ unsafe impl <$( $tyvar) ?> SizeCompat <UnsafeCell <$prim>> for $atomic {
446
452
#[ inline]
447
453
fn cast_from_raw( p: PtrInner <' _, UnsafeCell <$prim>>) -> PtrInner <' _, $atomic> {
448
454
// SAFETY: See previous safety comment.
449
455
unsafe { cast!( p) }
450
456
}
451
457
}
452
458
453
- // SAFETY: The caller promised that `$atomic` and `$prim` have
454
- // the same bit validity. `UnsafeCell<T>` has the same bit
455
- // validity as `T` [1].
459
+ // SAFETY: The caller promised that `$atomic` and `$prim`
460
+ // have the same bit validity. `UnsafeCell<T>` has the same
461
+ // bit validity as `T` [1]. `UnsafeCell<T>` also has the
462
+ // same size as `T` [1], and so both impls of
463
+ // `SizeCompat::cast_from_raw` preserve referent size
464
+ // exactly.
456
465
//
457
466
// [1] Per https://doc.rust-lang.org/1.85.0/std/cell/struct.UnsafeCell.html#memory-layout:
458
467
//
0 commit comments