@@ -179,39 +179,13 @@ safety_comment! {
179
179
} ) ;
180
180
}
181
181
182
- // SAFETY: `str` and `[u8]` have the same layout [1].
183
- //
184
- // [1] Per https://doc.rust-lang.org/1.81.0/reference/type-layout.html#str-layout:
185
- //
186
- // String slices are a UTF-8 representation of characters that have the same
187
- // layout as slices of type `[u8]`.
188
- unsafe impl pointer:: SizeEq < str > for [ u8 ] {
189
- fn cast_from_raw ( s : NonNull < str > ) -> NonNull < [ u8 ] > {
190
- cast ! ( s)
191
- }
192
- }
193
- // SAFETY: See previous safety comment.
194
- unsafe impl pointer:: SizeEq < [ u8 ] > for str {
195
- fn cast_from_raw ( bytes : NonNull < [ u8 ] > ) -> NonNull < str > {
196
- cast ! ( bytes)
197
- }
198
- }
182
+ impl_size_eq ! ( str , [ u8 ] ) ;
199
183
200
184
macro_rules! unsafe_impl_try_from_bytes_for_nonzero {
201
185
( $( $nonzero: ident[ $prim: ty] ) ,* ) => {
202
186
$(
203
187
unsafe_impl!( => TryFromBytes for $nonzero; |n| {
204
- unsafe impl pointer:: SizeEq <$nonzero> for Unalign <$prim> {
205
- fn cast_from_raw( n: NonNull <$nonzero>) -> NonNull <Unalign <$prim>> {
206
- cast!( n)
207
- }
208
- }
209
- unsafe impl pointer:: SizeEq <Unalign <$prim>> for $nonzero {
210
- fn cast_from_raw( p: NonNull <Unalign <$prim>>) -> NonNull <$nonzero> {
211
- cast!( p)
212
- }
213
- }
214
-
188
+ impl_size_eq!( $nonzero, Unalign <$prim>) ;
215
189
let n = n. transmute:: <Unalign <$prim>, invariant:: Valid , _>( ) ;
216
190
$nonzero:: new( n. read_unaligned( ) . into_inner( ) ) . is_some( )
217
191
} ) ;
@@ -430,7 +404,7 @@ mod atomics {
430
404
( $( $( $tyvar: ident) ? => $atomic: ty [ $prim: ty] ) ,* ) => {
431
405
const _: ( ) = {
432
406
use core:: { cell:: UnsafeCell , ptr:: NonNull } ;
433
- use crate :: pointer:: { TransmuteFrom , SizeEq , invariant:: Valid } ;
407
+ use crate :: pointer:: { TransmuteFrom , SizeCompat , invariant:: Valid } ;
434
408
435
409
$(
436
410
#[ allow( unused_unsafe) ] // Force the caller to call this macro inside `safety_comment!`.
@@ -443,36 +417,38 @@ mod atomics {
443
417
// the same size and bit validity.
444
418
unsafe impl <$( $tyvar) ?> TransmuteFrom <$prim, Valid , Valid > for $atomic { }
445
419
446
- // SAFETY: THe caller promised that `$atomic` and `$prim`
447
- // have the same size.
448
- unsafe impl <$( $tyvar) ?> SizeEq <$atomic> for $prim {
420
+ // SAFETY: The caller promised that `$atomic` and `$prim`
421
+ // have the same size. Thus, this cast preserves address,
422
+ // referent size, and provenance.
423
+ unsafe impl <$( $tyvar) ?> SizeCompat <$atomic> for $prim {
449
424
fn cast_from_raw( a: NonNull <$atomic>) -> NonNull <$prim> {
450
425
cast!( a)
451
426
}
452
427
}
453
- // SAFETY: THe caller promised that `$atomic` and `$prim`
454
- // have the same size.
455
- unsafe impl <$( $tyvar) ?> SizeEq <$prim> for $atomic {
428
+ // SAFETY: See previous safety comment.
429
+ unsafe impl <$( $tyvar) ?> SizeCompat <$prim> for $atomic {
456
430
fn cast_from_raw( p: NonNull <$prim>) -> NonNull <$atomic> {
457
431
cast!( p)
458
432
}
459
433
}
434
+
460
435
// SAFETY: The caller promised that `$atomic` and `$prim`
461
436
// have the same size. `UnsafeCell<T>` has the same size as
462
- // `T` [1].
437
+ // `T` [1]. Thus, this cast preserves address, referent
438
+ // size, and provenance.
463
439
//
464
440
// [1] Per https://doc.rust-lang.org/1.85.0/std/cell/struct.UnsafeCell.html#memory-layout:
465
441
//
466
442
// `UnsafeCell<T>` has the same in-memory representation as
467
443
// its inner type `T`. A consequence of this guarantee is that
468
444
// it is possible to convert between `T` and `UnsafeCell<T>`.
469
- unsafe impl <$( $tyvar) ?> SizeEq <$atomic> for UnsafeCell <$prim> {
445
+ unsafe impl <$( $tyvar) ?> SizeCompat <$atomic> for UnsafeCell <$prim> {
470
446
fn cast_from_raw( a: NonNull <$atomic>) -> NonNull <UnsafeCell <$prim>> {
471
447
cast!( a)
472
448
}
473
449
}
474
450
// SAFETY: See previous safety comment.
475
- unsafe impl <$( $tyvar) ?> SizeEq <UnsafeCell <$prim>> for $atomic {
451
+ unsafe impl <$( $tyvar) ?> SizeCompat <UnsafeCell <$prim>> for $atomic {
476
452
fn cast_from_raw( p: NonNull <UnsafeCell <$prim>>) -> NonNull <$atomic> {
477
453
cast!( p)
478
454
}
0 commit comments