@@ -694,8 +694,8 @@ mod cast_from_raw {
694694         /// `Src`'s alignment must not be smaller than `Dst`'s alignment. 
695695         #[ derive( Copy ,  Clone ) ]  
696696        struct  CastParams  { 
697-             offset_delta_elems :  usize , 
698-             elem_multiple :  usize , 
697+             offset_delta_elems :  Fraction , 
698+             elem_multiple :  Fraction , 
699699        } 
700700
701701        impl  CastParams  { 
@@ -718,32 +718,41 @@ mod cast_from_raw {
718718                    return  None ; 
719719                } ; 
720720
721+                 // TODO: When doing size-lossy casts, we can permit ZST trailing 
722+                 // slice elements in the destination type, although we'd need to 
723+                 // think carefully about what we promise about the metadata. 
721724                let  dst_elem_size = if  let  Some ( e)  = NonZeroUsize :: new ( dst. elem_size )  { 
722725                    e
723726                }  else  { 
724727                    return  None ; 
725728                } ; 
726729
727-                 // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
728-                 #[ allow( clippy:: arithmetic_side_effects) ]  
729-                 let  delta_mod_other_elem = offset_delta % dst_elem_size. get ( ) ; 
730+                 let  offset_delta_elems =
731+                     Fraction  {  num :  offset_delta,  denom :  dst_elem_size } . simplify ( ) ; 
730732
731-                 // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
732-                 #[ allow( clippy:: arithmetic_side_effects) ]  
733-                 let  elem_remainder = src. elem_size  % dst_elem_size. get ( ) ; 
733+                 let  elem_multiple =
734+                     Fraction  {  num :  src. elem_size ,  denom :  dst_elem_size } . simplify ( ) ; 
734735
735-                 if  delta_mod_other_elem != 0  || src. elem_size  < dst. elem_size  || elem_remainder != 0 
736-                 { 
737-                     return  None ; 
738-                 } 
736+                 // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
737+                 // #[allow(clippy::arithmetic_side_effects)] 
738+                 // let delta_mod_other_elem = offset_delta % dst_elem_size.get(); 
739739
740-                 // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
741-                 #[ allow( clippy:: arithmetic_side_effects) ]  
742-                 let  offset_delta_elems  = offset_delta /  dst_elem_size. get ( ) ; 
740+                 // //  PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
741+                 //  #[allow(clippy::arithmetic_side_effects)]
742+                 //  let elem_remainder  = src.elem_size %  dst_elem_size.get();
743743
744-                 // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
745-                 #[ allow( clippy:: arithmetic_side_effects) ]  
746-                 let  elem_multiple = src. elem_size  / dst_elem_size. get ( ) ; 
744+                 // if delta_mod_other_elem != 0 || src.elem_size < dst.elem_size || elem_remainder != 0 
745+                 // { 
746+                 //     return None; 
747+                 // } 
748+ 
749+                 // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
750+                 // #[allow(clippy::arithmetic_side_effects)] 
751+                 // let offset_delta_elems = offset_delta / dst_elem_size.get(); 
752+ 
753+                 // // PANICS: `dst_elem_size: NonZeroUsize`, so this won't div by zero. 
754+                 // #[allow(clippy::arithmetic_side_effects)] 
755+                 // let elem_multiple = src.elem_size / dst_elem_size.get(); 
747756
748757                // SAFETY: We checked above that `src.align >= dst.align`. 
749758                Some ( CastParams  { 
@@ -816,6 +825,24 @@ mod cast_from_raw {
816825        // subset of those bytes, and has provenance for those bytes. 
817826        unsafe  {  PtrInner :: new ( dst)  } 
818827    } 
828+ 
829+     #[ derive( Copy ,  Clone ) ]  
830+     struct  Fraction  { 
831+         num :  usize , 
832+         denom :  NonZeroUsize , 
833+     } 
834+ 
835+     impl  Fraction  { 
836+         const  fn  simplify ( self )  -> Fraction  { 
837+             todo ! ( )  // https://stackoverflow.com/a/7777146/836390 
838+         } 
839+ 
840+         const  fn  mul ( self ,  other :  usize )  -> Fraction  { 
841+             // TODO: How can we prove that it's sound to use `unchecked_mul` 
842+             // when the denom is 1? 
843+             todo ! ( ) 
844+         } 
845+     } 
819846} 
820847
821848// TODO(#67): For some reason, on our MSRV toolchain, this `allow` isn't 
0 commit comments