Using mem::transmute for outer/inner structs in enums?

use std::marker::PhantomData;
use std::num::NonZeroU32;

#[repr(transparent)]
pub struct Outer<A> {
    value: Inner,
    _p: PhantomData<fn() -> A>,
}

pub struct Inner {
    a: NonZeroU32,
    b: u32,
}

pub enum EnumOuter<A> {
    First(Outer<A>),
    Second(Outer<A>),
}

pub enum EnumInner {
    First(Inner),
    Second(Inner),
}

impl<'a, A> From<&'a EnumOuter<A>> for &'a EnumInner {
    fn from(value: &'a EnumOuter<A>) -> Self {
        unsafe { std::mem::transmute(value) }
    }
}

Is this a sound usage of mem::transmute?

You need some sort of deterministic repr on both enums too.

https://doc.rust-lang.org/reference/type-layout.html

2 Likes