@@ -436,7 +436,10 @@ pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
436
436
#[ inline]
437
437
fn try_transmute_ptr < Src , Dst , I , R > (
438
438
mut src : Ptr < ' _ , Src , I > ,
439
- ) -> Result < Ptr < ' _ , Dst , ( I :: Aliasing , invariant:: Any , invariant:: Valid ) > , Ptr < ' _ , Src , I > >
439
+ ) -> Result <
440
+ Ptr < ' _ , Dst , ( I :: Aliasing , invariant:: Any , invariant:: Valid ) > ,
441
+ ValidityError < Ptr < ' _ , Src , I > , Dst > ,
442
+ >
440
443
where
441
444
Src : IntoBytes ,
442
445
Dst : TryFromBytes + AliasingSafe < Src , I :: Aliasing , R > ,
@@ -463,14 +466,28 @@ where
463
466
// initialized bytes.
464
467
let mut c_ptr = unsafe { c_ptr. assume_initialized ( ) } ;
465
468
466
- if Dst :: is_bit_valid ( c_ptr) {
467
- // SAFETY: TODO
468
- let ptr = unsafe { c_ptr. assume_valid ( ) } ;
469
+ c_ptr. try_into_valid ( ) . map_err ( |err| {
470
+ err. map_src ( |src| {
471
+ // SAFETY: TODO
472
+ let src = unsafe { src. cast_unsized ( |p| p as * mut Src ) } ;
473
+ // SAFETY: `src` is the same pointer that was passed to this method,
474
+ // which had validity `invariant::Valid`. `try_into_valid` promises not
475
+ // to modify its receiver's referent, so `src`'s referent is still a
476
+ // valid `Src`.
477
+ let src = unsafe { src. assume_valid ( ) } ;
478
+
479
+ src. foobar ( )
480
+ } )
481
+ } )
469
482
470
- Ok ( ptr)
471
- } else {
472
- Err ( src)
473
- }
483
+ // if Dst::is_bit_valid(c_ptr.reborrow()) {
484
+ // // SAFETY: TODO
485
+ // let ptr = unsafe { c_ptr.assume_valid() };
486
+
487
+ // Ok(ptr)
488
+ // } else {
489
+ // Err(src)
490
+ // }
474
491
}
475
492
476
493
/// Attempts to transmute `Src` into `Dst`.
0 commit comments