@@ -105,12 +105,13 @@ assert_unaligned!(bool);
105
105
// pattern 0x01.
106
106
const _: ( ) = unsafe {
107
107
unsafe_impl ! ( => TryFromBytes for bool ; |byte| {
108
- let byte = byte. transmute:: <u8 , invariant:: Valid , _>( ) ;
108
+ let mut byte = byte;
109
+ let byte = byte. reborrow( ) . into_shared( ) . transmute:: <u8 , invariant:: Valid , _>( ) ;
109
110
* byte. unaligned_as_ref( ) < 2
110
111
} )
111
112
} ;
112
113
113
- impl_size_compat ! ( bool , u8 ) ;
114
+ impl_size_from ! ( bool , u8 ) ;
114
115
115
116
// SAFETY:
116
117
// - `Immutable`: `char` self-evidently does not contain any `UnsafeCell`s.
@@ -135,13 +136,14 @@ const _: () = unsafe { unsafe_impl!(char: Immutable, FromZeros, IntoBytes) };
135
136
// `char`.
136
137
const _: ( ) = unsafe {
137
138
unsafe_impl ! ( => TryFromBytes for char ; |c| {
138
- let c = c. transmute:: <Unalign <u32 >, invariant:: Valid , _>( ) ;
139
+ let mut c = c;
140
+ let c = c. reborrow( ) . into_shared( ) . transmute:: <Unalign <u32 >, invariant:: Valid , _>( ) ;
139
141
let c = c. read_unaligned( ) . into_inner( ) ;
140
142
char :: from_u32( c) . is_some( )
141
143
} ) ;
142
144
} ;
143
145
144
- impl_size_compat ! ( char , Unalign <u32 >) ;
146
+ impl_size_from ! ( char , Unalign <u32 >) ;
145
147
146
148
// SAFETY: Per the Reference [1], `str` has the same layout as `[u8]`.
147
149
// - `Immutable`: `[u8]` does not contain any `UnsafeCell`s.
@@ -168,20 +170,22 @@ const _: () = unsafe { unsafe_impl!(str: Immutable, FromZeros, IntoBytes, Unalig
168
170
// Returns `Err` if the slice is not UTF-8.
169
171
const _: ( ) = unsafe {
170
172
unsafe_impl ! ( => TryFromBytes for str ; |c| {
171
- let c = c. transmute:: <[ u8 ] , invariant:: Valid , _>( ) ;
173
+ let mut c = c;
174
+ let c = c. reborrow( ) . into_shared( ) . transmute:: <[ u8 ] , invariant:: Valid , _>( ) ;
172
175
let c = c. unaligned_as_ref( ) ;
173
176
core:: str :: from_utf8( c) . is_ok( )
174
177
} )
175
178
} ;
176
179
177
- impl_size_compat ! ( str , [ u8 ] ) ;
180
+ impl_size_from ! ( str , [ u8 ] ) ;
178
181
179
182
macro_rules! unsafe_impl_try_from_bytes_for_nonzero {
180
183
( $( $nonzero: ident[ $prim: ty] ) ,* ) => {
181
184
$(
182
185
unsafe_impl!( => TryFromBytes for $nonzero; |n| {
183
- impl_size_compat!( $nonzero, Unalign <$prim>) ;
184
- let n = n. transmute:: <Unalign <$prim>, invariant:: Valid , _>( ) ;
186
+ impl_size_from!( $nonzero, Unalign <$prim>) ;
187
+ let mut n = n;
188
+ let n = n. reborrow( ) . into_shared( ) . transmute:: <Unalign <$prim>, invariant:: Valid , _>( ) ;
185
189
$nonzero:: new( n. read_unaligned( ) . into_inner( ) ) . is_some( )
186
190
} ) ;
187
191
) *
@@ -397,22 +401,22 @@ mod atomics {
397
401
crate :: util:: macros:: __unsafe( ) ;
398
402
399
403
use core:: { cell:: UnsafeCell } ;
400
- use crate :: pointer:: { TransmuteFrom , PtrInner , SizeCompat , invariant:: Valid } ;
404
+ use crate :: pointer:: { TransmuteFrom , PtrInner , SizeFrom , invariant:: Valid } ;
401
405
402
406
$(
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.
407
+ // SAFETY: The caller promised that `$atomic` and `$prim` have
408
+ // the same size and bit validity. As a result of size equality,
409
+ // both impls of `SizeFrom ::cast_from_raw` preserve referent
410
+ // size exactly.
407
411
unsafe impl <$( $tyvar) ?> TransmuteFrom <$atomic, Valid , Valid > for $prim { }
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.
412
+ // SAFETY: The caller promised that `$atomic` and `$prim` have
413
+ // the same size and bit validity. As a result of size equality,
414
+ // both impls of `SizeFrom ::cast_from_raw` preserve referent
415
+ // size exactly.
412
416
unsafe impl <$( $tyvar) ?> TransmuteFrom <$prim, Valid , Valid > for $atomic { }
413
417
414
418
// SAFETY: See inline safety comment.
415
- unsafe impl <$( $tyvar) ?> SizeCompat <$atomic> for $prim {
419
+ unsafe impl <$( $tyvar) ?> SizeFrom <$atomic> for $prim {
416
420
#[ inline]
417
421
fn cast_from_raw( a: PtrInner <' _, $atomic>) -> PtrInner <' _, $prim> {
418
422
// SAFETY: The caller promised that `$atomic` and `$prim`
@@ -422,7 +426,7 @@ mod atomics {
422
426
}
423
427
}
424
428
// SAFETY: See previous safety comment.
425
- unsafe impl <$( $tyvar) ?> SizeCompat <$prim> for $atomic {
429
+ unsafe impl <$( $tyvar) ?> SizeFrom <$prim> for $atomic {
426
430
#[ inline]
427
431
fn cast_from_raw( p: PtrInner <' _, $prim>) -> PtrInner <' _, $atomic> {
428
432
// SAFETY: See previous safety comment.
@@ -440,28 +444,27 @@ mod atomics {
440
444
// `UnsafeCell<T>` has the same in-memory representation as
441
445
// its inner type `T`. A consequence of this guarantee is that
442
446
// it is possible to convert between `T` and `UnsafeCell<T>`.
443
- unsafe impl <$( $tyvar) ?> SizeCompat <$atomic> for UnsafeCell <$prim> {
447
+ unsafe impl <$( $tyvar) ?> SizeFrom <$atomic> for UnsafeCell <$prim> {
444
448
#[ inline]
445
449
fn cast_from_raw( a: PtrInner <' _, $atomic>) -> PtrInner <' _, UnsafeCell <$prim>> {
446
450
// SAFETY: See previous safety comment.
447
451
unsafe { cast!( a) }
448
452
}
449
453
}
450
454
// SAFETY: See previous safety comment.
451
- unsafe impl <$( $tyvar) ?> SizeCompat <UnsafeCell <$prim>> for $atomic {
455
+ unsafe impl <$( $tyvar) ?> SizeFrom <UnsafeCell <$prim>> for $atomic {
452
456
#[ inline]
453
457
fn cast_from_raw( p: PtrInner <' _, UnsafeCell <$prim>>) -> PtrInner <' _, $atomic> {
454
458
// SAFETY: See previous safety comment.
455
459
unsafe { cast!( p) }
456
460
}
457
461
}
458
462
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.
463
+ // SAFETY: The caller promised that `$atomic` and `$prim` have
464
+ // the same bit validity. `UnsafeCell<T>` has the same bit
465
+ // validity as `T` [1]. `UnsafeCell<T>` also has the same size
466
+ // as `T` [1], and so both impls of `SizeFrom::cast_from_raw`
467
+ // preserve referent size exactly.
465
468
//
466
469
// [1] Per https://doc.rust-lang.org/1.85.0/std/cell/struct.UnsafeCell.html#memory-layout:
467
470
//
0 commit comments