diff --git a/bilge-impl/src/bitsize_internal/struct_gen.rs b/bilge-impl/src/bitsize_internal/struct_gen.rs index 02cbe85..474f0ac 100644 --- a/bilge-impl/src/bitsize_internal/struct_gen.rs +++ b/bilge-impl/src/bitsize_internal/struct_gen.rs @@ -165,7 +165,7 @@ pub(crate) fn generate_getter_inner(ty: &Type, is_getter: bool) -> TokenStream { // generate the real value from the arbint `elem_value` quote! { #elem_value - match #ty::try_from(elem_value) { + match <#ty>::try_from(elem_value) { Ok(v) => v, Err(_) => panic!("unreachable"), } @@ -186,7 +186,7 @@ pub(crate) fn generate_getter_inner(ty: &Type, is_getter: bool) -> TokenStream { #elem_value // so, has try_from impl // note this is available even if the type is `From` - #ty::try_from(elem_value).is_ok() + <#ty>::try_from(elem_value).is_ok() } } } } diff --git a/tests/struct.rs b/tests/struct.rs index 0aaf450..a948ad9 100644 --- a/tests/struct.rs +++ b/tests/struct.rs @@ -468,3 +468,48 @@ fn default_bits() { let default = ArrayTupleDefault::default(); assert_eq!(default, ArrayTupleDefault::from(u34::new(0b1000_1000_1000_10_10_1000_01000_1000_01000))); } + +// quick 'n dirty -- consider something more robust if more manual implementations are needed +#[cfg(not(feature = "nightly"))] +macro_rules! impl_from ( + ($($generic:ident),*; $from_ty:ty => $to_ty:ty; |$name:ident| $expr:expr) => { + impl<$($generic),*> From<$from_ty> for $to_ty { + fn from($name: $from_ty) -> $to_ty { + $expr + } + } + } +); +#[cfg(feature = "nightly")] +macro_rules! impl_from ( + ($($generic:ident),*; $from_ty:ty => $to_ty:ty; |$name:ident| $expr:expr) => { + impl<$($generic),*> const From<$from_ty> for $to_ty { + fn from($name: $from_ty) -> $to_ty { + $expr + } + } + } +); + +// do we want to be able to derive automatically on structs where the user has specified phantomdata? +// #[bitsize(2)] +// #[derive(DefaultBits, PartialEq, DebugBits, FromBits)] +#[derive(Default, Debug)] +struct Generic(u2, std::marker::PhantomData); + +impl Bitsized for Generic { + type ArbitraryInt = u2; + const BITS: usize = u2::BITS; + const MAX: Self::ArbitraryInt = ::MAX; +} + +impl_from!(T; u2 => Generic; |val| Self(val, std::marker::PhantomData)); +impl_from!(T; Generic => u2; |val| val.0); + +#[bitsize(2)] +#[derive(DefaultBits, PartialEq, DebugBits, FromBits)] +struct UsingGeneric(Generic<()>); + +#[bitsize(2)] +#[derive(DefaultBits, PartialEq, DebugBits, TryFromBits)] +struct UsingGenericUnfilled(Generic<()>);