@@ -322,7 +322,7 @@ use core::{
322
322
} ,
323
323
} ;
324
324
325
- use crate :: pointer:: invariant;
325
+ use crate :: pointer:: { invariant, BecauseExclusive , BecauseImmutable } ;
326
326
327
327
#[ cfg( any( feature = "alloc" , test) ) ]
328
328
extern crate alloc;
@@ -1177,7 +1177,7 @@ pub unsafe trait TryFromBytes {
1177
1177
Self : KnownLayout + Immutable ,
1178
1178
{
1179
1179
util:: assert_dst_is_not_zst :: < Self > ( ) ;
1180
- match Ptr :: from_ref ( candidate) . try_cast_into_no_leftover :: < Self > ( ) {
1180
+ match Ptr :: from_ref ( candidate) . try_cast_into_no_leftover :: < Self , BecauseImmutable > ( ) {
1181
1181
Ok ( candidate) => {
1182
1182
// This call may panic. If that happens, it doesn't cause any soundness
1183
1183
// issues, as we have not generated any invalid state which we need to
@@ -1189,7 +1189,9 @@ pub unsafe trait TryFromBytes {
1189
1189
// condition will not happen.
1190
1190
match candidate. try_into_valid ( ) {
1191
1191
Ok ( valid) => Ok ( valid. as_ref ( ) ) ,
1192
- Err ( e) => Err ( e. map_src ( |src| src. as_bytes ( ) . as_ref ( ) ) . into ( ) ) ,
1192
+ Err ( e) => {
1193
+ Err ( e. map_src ( |src| src. as_bytes :: < BecauseImmutable > ( ) . as_ref ( ) ) . into ( ) )
1194
+ }
1193
1195
}
1194
1196
}
1195
1197
Err ( e) => Err ( e. map_src ( Ptr :: as_ref) . into ( ) ) ,
@@ -1428,7 +1430,7 @@ pub unsafe trait TryFromBytes {
1428
1430
Self : KnownLayout + Immutable , // TODO(#251): Remove the `Immutable` bound.
1429
1431
{
1430
1432
util:: assert_dst_is_not_zst :: < Self > ( ) ;
1431
- match Ptr :: from_mut ( bytes) . try_cast_into_no_leftover :: < Self > ( ) {
1433
+ match Ptr :: from_mut ( bytes) . try_cast_into_no_leftover :: < Self , BecauseExclusive > ( ) {
1432
1434
Ok ( candidate) => {
1433
1435
// This call may panic. If that happens, it doesn't cause any soundness
1434
1436
// issues, as we have not generated any invalid state which we need to
@@ -1440,7 +1442,9 @@ pub unsafe trait TryFromBytes {
1440
1442
// condition will not happen.
1441
1443
match candidate. try_into_valid ( ) {
1442
1444
Ok ( candidate) => Ok ( candidate. as_mut ( ) ) ,
1443
- Err ( e) => Err ( e. map_src ( |src| src. as_bytes ( ) . as_mut ( ) ) . into ( ) ) ,
1445
+ Err ( e) => {
1446
+ Err ( e. map_src ( |src| src. as_bytes :: < BecauseExclusive > ( ) . as_mut ( ) ) . into ( ) )
1447
+ }
1444
1448
}
1445
1449
}
1446
1450
Err ( e) => Err ( e. map_src ( Ptr :: as_mut) . into ( ) ) ,
@@ -1707,7 +1711,7 @@ fn try_ref_from_prefix_suffix<T: TryFromBytes + KnownLayout + Immutable + ?Sized
1707
1711
candidate : & [ u8 ] ,
1708
1712
cast_type : CastType ,
1709
1713
) -> Result < ( & T , & [ u8 ] ) , TryCastError < & [ u8 ] , T > > {
1710
- match Ptr :: from_ref ( candidate) . try_cast_into :: < T > ( cast_type) {
1714
+ match Ptr :: from_ref ( candidate) . try_cast_into :: < T , BecauseImmutable > ( cast_type) {
1711
1715
Ok ( ( candidate, prefix_suffix) ) => {
1712
1716
// This call may panic. If that happens, it doesn't cause any soundness
1713
1717
// issues, as we have not generated any invalid state which we need to
@@ -1719,19 +1723,19 @@ fn try_ref_from_prefix_suffix<T: TryFromBytes + KnownLayout + Immutable + ?Sized
1719
1723
// condition will not happen.
1720
1724
match candidate. try_into_valid ( ) {
1721
1725
Ok ( valid) => Ok ( ( valid. as_ref ( ) , prefix_suffix. as_ref ( ) ) ) ,
1722
- Err ( e) => Err ( e. map_src ( |src| src. as_bytes ( ) . as_ref ( ) ) . into ( ) ) ,
1726
+ Err ( e) => Err ( e. map_src ( |src| src. as_bytes :: < BecauseImmutable > ( ) . as_ref ( ) ) . into ( ) ) ,
1723
1727
}
1724
1728
}
1725
1729
Err ( e) => Err ( e. map_src ( Ptr :: as_ref) . into ( ) ) ,
1726
1730
}
1727
1731
}
1728
1732
1729
1733
#[ inline( always) ]
1730
- fn try_mut_from_prefix_suffix < T : TryFromBytes + KnownLayout + Immutable + ?Sized > (
1734
+ fn try_mut_from_prefix_suffix < T : TryFromBytes + KnownLayout + ?Sized > (
1731
1735
candidate : & mut [ u8 ] ,
1732
1736
cast_type : CastType ,
1733
1737
) -> Result < ( & mut T , & mut [ u8 ] ) , TryCastError < & mut [ u8 ] , T > > {
1734
- match Ptr :: from_mut ( candidate) . try_cast_into :: < T > ( cast_type) {
1738
+ match Ptr :: from_mut ( candidate) . try_cast_into :: < T , BecauseExclusive > ( cast_type) {
1735
1739
Ok ( ( candidate, prefix_suffix) ) => {
1736
1740
// This call may panic. If that happens, it doesn't cause any soundness
1737
1741
// issues, as we have not generated any invalid state which we need to
@@ -1743,7 +1747,7 @@ fn try_mut_from_prefix_suffix<T: TryFromBytes + KnownLayout + Immutable + ?Sized
1743
1747
// condition will not happen.
1744
1748
match candidate. try_into_valid ( ) {
1745
1749
Ok ( valid) => Ok ( ( valid. as_mut ( ) , prefix_suffix. as_mut ( ) ) ) ,
1746
- Err ( e) => Err ( e. map_src ( |src| src. as_bytes ( ) . as_mut ( ) ) . into ( ) ) ,
1750
+ Err ( e) => Err ( e. map_src ( |src| src. as_bytes :: < BecauseExclusive > ( ) . as_mut ( ) ) . into ( ) ) ,
1747
1751
}
1748
1752
}
1749
1753
Err ( e) => Err ( e. map_src ( Ptr :: as_mut) . into ( ) ) ,
@@ -2332,7 +2336,7 @@ pub unsafe trait FromBytes: FromZeros {
2332
2336
Self : KnownLayout + Immutable ,
2333
2337
{
2334
2338
util:: assert_dst_is_not_zst :: < Self > ( ) ;
2335
- match Ptr :: from_ref ( bytes) . try_cast_into_no_leftover ( ) {
2339
+ match Ptr :: from_ref ( bytes) . try_cast_into_no_leftover :: < _ , BecauseImmutable > ( ) {
2336
2340
Ok ( ptr) => Ok ( ptr. bikeshed_recall_valid ( ) . as_ref ( ) ) ,
2337
2341
Err ( err) => Err ( err. map_src ( |src| src. as_ref ( ) ) ) ,
2338
2342
}
@@ -2407,7 +2411,7 @@ pub unsafe trait FromBytes: FromZeros {
2407
2411
{
2408
2412
util:: assert_dst_is_not_zst :: < Self > ( ) ;
2409
2413
let ( slf, suffix) = Ptr :: from_ref ( bytes)
2410
- . try_cast_into ( CastType :: Prefix )
2414
+ . try_cast_into :: < _ , BecauseImmutable > ( CastType :: Prefix )
2411
2415
. map_err ( |err| err. map_src ( |s| s. as_ref ( ) ) ) ?;
2412
2416
Ok ( ( slf. bikeshed_recall_valid ( ) . as_ref ( ) , suffix. as_ref ( ) ) )
2413
2417
}
@@ -2467,7 +2471,7 @@ pub unsafe trait FromBytes: FromZeros {
2467
2471
{
2468
2472
util:: assert_dst_is_not_zst :: < Self > ( ) ;
2469
2473
let ( slf, prefix) = Ptr :: from_ref ( bytes)
2470
- . try_cast_into ( CastType :: Suffix )
2474
+ . try_cast_into :: < _ , BecauseImmutable > ( CastType :: Suffix )
2471
2475
. map_err ( |err| err. map_src ( |s| s. as_ref ( ) ) ) ?;
2472
2476
Ok ( ( prefix. as_ref ( ) , slf. bikeshed_recall_valid ( ) . as_ref ( ) ) )
2473
2477
}
@@ -2534,7 +2538,7 @@ pub unsafe trait FromBytes: FromZeros {
2534
2538
Self : IntoBytes + KnownLayout + Immutable ,
2535
2539
{
2536
2540
util:: assert_dst_is_not_zst :: < Self > ( ) ;
2537
- match Ptr :: from_mut ( bytes) . try_cast_into_no_leftover ( ) {
2541
+ match Ptr :: from_mut ( bytes) . try_cast_into_no_leftover :: < _ , BecauseExclusive > ( ) {
2538
2542
Ok ( ptr) => Ok ( ptr. bikeshed_recall_valid ( ) . as_mut ( ) ) ,
2539
2543
Err ( err) => Err ( err. map_src ( |src| src. as_mut ( ) ) ) ,
2540
2544
}
@@ -2610,7 +2614,7 @@ pub unsafe trait FromBytes: FromZeros {
2610
2614
{
2611
2615
util:: assert_dst_is_not_zst :: < Self > ( ) ;
2612
2616
let ( slf, suffix) = Ptr :: from_mut ( bytes)
2613
- . try_cast_into ( CastType :: Prefix )
2617
+ . try_cast_into :: < _ , BecauseExclusive > ( CastType :: Prefix )
2614
2618
. map_err ( |err| err. map_src ( |s| s. as_mut ( ) ) ) ?;
2615
2619
Ok ( ( slf. bikeshed_recall_valid ( ) . as_mut ( ) , suffix. as_mut ( ) ) )
2616
2620
}
@@ -2679,7 +2683,7 @@ pub unsafe trait FromBytes: FromZeros {
2679
2683
{
2680
2684
util:: assert_dst_is_not_zst :: < Self > ( ) ;
2681
2685
let ( slf, prefix) = Ptr :: from_mut ( bytes)
2682
- . try_cast_into ( CastType :: Suffix )
2686
+ . try_cast_into :: < _ , BecauseExclusive > ( CastType :: Suffix )
2683
2687
. map_err ( |err| err. map_src ( |s| s. as_mut ( ) ) ) ?;
2684
2688
Ok ( ( prefix. as_mut ( ) , slf. bikeshed_recall_valid ( ) . as_mut ( ) ) )
2685
2689
}
0 commit comments