Skip to content

Commit c0fd7ea

Browse files
Fix recursive DekuSize impl (#628)
1 parent e54297c commit c0fd7ea

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

deku-derive/src/macros/deku_size.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
105105
let DekuDataStruct {
106106
imp: _,
107107
wher: _,
108-
ident,
108+
ident: _,
109109
fields,
110110
} = DekuDataStruct::try_from(input)?;
111111

@@ -116,6 +116,8 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
116116
let mut where_clause = where_clause.cloned();
117117
add_field_bounds(&mut where_clause, fields.iter().copied(), &crate_);
118118

119+
let ident = &input.ident;
120+
119121
let tokens = quote! {
120122
impl #imp_generics ::#crate_::DekuSize for #ident #ty_generics #where_clause {
121123
const SIZE_BITS: usize = #size_calculation;
@@ -132,7 +134,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
132134
imp: _,
133135
wher: _,
134136
variants,
135-
ident,
137+
ident: _,
136138
id,
137139
id_type,
138140
id_args: _,
@@ -165,6 +167,8 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
165167
add_field_bounds(&mut where_clause, variant.fields.iter(), &crate_);
166168
}
167169

170+
let ident = &input.ident;
171+
168172
let tokens = quote! {
169173
impl #imp_generics ::#crate_::DekuSize for #ident #ty_generics #where_clause {
170174
const SIZE_BITS: usize = #discriminant_size + #max_variant_size;

tests/test_size.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,3 +430,18 @@ fn test_enum_with_bits_discriminant_and_data() {
430430
assert_eq!(SmallDiscriminant::SIZE_BITS, 28);
431431
assert_eq!(SmallDiscriminant::SIZE_BYTES, None);
432432
}
433+
434+
#[test]
435+
fn test_generic_struct_with_deku_size() {
436+
#[derive(Debug, DekuRead, DekuWrite, DekuSize)]
437+
struct GenericStruct<T>
438+
where
439+
T: DekuSize + for<'a> DekuReader<'a> + DekuWriter,
440+
{
441+
value: T,
442+
}
443+
444+
assert_eq!(GenericStruct::<u8>::SIZE_BYTES, Some(1));
445+
assert_eq!(GenericStruct::<u16>::SIZE_BYTES, Some(2));
446+
assert_eq!(GenericStruct::<u32>::SIZE_BYTES, Some(4));
447+
}

0 commit comments

Comments
 (0)