@@ -296,14 +296,9 @@ where
296296/// ## By-value transmutation 
297297/// 
298298/// If `Src: Sized` and `Dst: Sized`, then it must be sound to transmute an 
299- /// `SV`-valid `Src` into a `DV`-valid `Dst` by value via union transmute. In 
300- /// particular: 
301- /// - If `size_of::<Src>() >= size_of::<Dst>()`, then the first 
302- ///   `size_of::<Dst>()` bytes of any `SV`-valid `Src` must be a `DV`-valid 
303- ///   `Dst`. 
304- /// - If `size_of::<Src>() < size_of::<Dst>()`, then any `SV`-valid `Src` 
305- ///   followed by `size_of::<Dst>() - size_of::<Src>()` uninitialized bytes must 
306- ///   be a `DV`-valid `Dst`. 
299+ /// `SV`-valid `Src` into a `DV`-valid `Dst` by value via size-preserving or 
300+ /// size-shrinking transmute. In particular, the first `size_of::<Dst>()` bytes 
301+ /// of any `SV`-valid `Src` must be a `DV`-valid `Dst`. 
307302/// 
308303/// If either `Src: !Sized` or `Dst: !Sized`, then this condition does not need 
309304/// to hold. 
@@ -372,12 +367,18 @@ unsafe impl<T: ?Sized> SizeCompat<T> for T {
372367    } 
373368} 
374369
375- // TODO: Update all `TransmuteFrom` safety proofs. 
376- 
377370/// `Valid<Src: IntoBytes> → Initialized<Dst>` 
378- // SAFETY: Since `Src: IntoBytes`, the set of valid `Src`'s is the set of 
379- // initialized bit patterns, which is exactly the set allowed in the referent of 
380- // any `Initialized` `Ptr`. 
371+ // SAFETY: 
372+ // - By-value: Since `Src: IntoBytes`, the set of valid `Src`'s is the set of 
373+ //   initialized bit patterns, which is exactly the set allowed in the referent 
374+ //   of any `Initialized` `Ptr`. This holds for both size-preserving and 
375+ //   size-shrinking transmutes. 
376+ // - By-reference: 
377+ //   - Shrinking: See above. 
378+ //   - Tearing: Let `src` be a `Valid` `Src` and `dst` be an `Initialized` 
379+ //     `Dst`. The trailing bytes of `dst` have bit validity `[u8; N]`. `src` has 
380+ //     bit validity `[u8; M]`. Thus, `dst' = src + trailing_bytes_of(dst)` has 
381+ //     bit validity `[u8; N + M]`, which is a valid `Initialized` value. 
381382unsafe  impl < Src ,  Dst >  TransmuteFrom < Src ,  Valid ,  Initialized >  for  Dst 
382383where 
383384    Src :  IntoBytes  + ?Sized , 
@@ -389,6 +390,8 @@ where
389390// SAFETY: Since `Dst: FromBytes`, any initialized bit pattern may appear in the 
390391// referent of a `Ptr<Dst, (_, _, Valid)>`. This is exactly equal to the set of 
391392// bit patterns which may appear in the referent of any `Initialized` `Ptr`. 
393+ // 
394+ // TODO: Prove `TransmuteFrom` reference transmutation conditions. 
392395unsafe  impl < Src ,  Dst >  TransmuteFrom < Src ,  Initialized ,  Valid >  for  Dst 
393396where 
394397    Src :  ?Sized , 
@@ -403,6 +406,8 @@ where
403406/// `Initialized<Src> → Initialized<Dst>` 
404407// SAFETY: The set of allowed bit patterns in the referent of any `Initialized` 
405408// `Ptr` is the same regardless of referent type. 
409+ // 
410+ // TODO: Prove `TransmuteFrom` reference transmutation conditions. 
406411unsafe  impl < Src ,  Dst >  TransmuteFrom < Src ,  Initialized ,  Initialized >  for  Dst 
407412where 
408413    Src :  ?Sized , 
@@ -417,6 +422,8 @@ where
417422/// `V<Src> → Uninit<Dst>` 
418423// SAFETY: A `Dst` with validity `Uninit` permits any byte sequence, and 
419424// therefore can be transmuted from any value. 
425+ // 
426+ // TODO: Prove `TransmuteFrom` reference transmutation conditions. 
420427unsafe  impl < Src ,  Dst ,  V >  TransmuteFrom < Src ,  V ,  Uninit >  for  Dst 
421428where 
422429    Src :  ?Sized , 
@@ -520,6 +527,8 @@ impl_transitive_transmute_from!(T: ?Sized => UnsafeCell<T> => T => Cell<T>);
520527// explicitly guaranteed, but it's obvious from `MaybeUninit`'s documentation 
521528// that this is the intention: 
522529// https://doc.rust-lang.org/1.85.0/core/mem/union.MaybeUninit.html 
530+ // 
531+ // TODO: Prove `TransmuteFrom` reference transmutation conditions. 
523532unsafe  impl < Src ,  Dst >  TransmuteFrom < Src ,  Uninit ,  Valid >  for  MaybeUninit < Dst >  { } 
524533
525534// SAFETY: `MaybeUninit<T>` has the same size as `T` [1]. Thus, a pointer cast 
0 commit comments