Skip to content

Commit

Permalink
🐛 Fix fallback initializer generation for repr types
Browse files Browse the repository at this point in the history
  • Loading branch information
wrenger committed Oct 13, 2024
1 parent be73c6a commit 3f48bdc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -418,9 +418,17 @@ impl Member {
return quote!(this = this.#with_ident(#default););
}
}

// fallback when there is no setter
let offset = self.offset;
let base_ty = &self.base_ty;
quote!(this.0 |= (#default as #base_ty) << #offset;)
let repr_into = &self.repr_into;
let repr_from = &self.repr_from;
let bits = self.bits as u32;
quote!{
let mask = #base_ty::MAX >> (#base_ty::BITS - #bits);
this.0 = #repr_from(#repr_into(this.0) | (((#default as #base_ty) & mask) << #offset));
}
}
}

Expand Down
14 changes: 14 additions & 0 deletions tests/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -551,3 +551,17 @@ fn custom_inner() {
assert_eq!(my_bitfield, MyBitfield::from_bits(CustomInner(0)));
assert_eq!(my_bitfield.into_bits(), CustomInner(0));
}

#[test]
fn default_without_setter() {
use endian_num::le16;

#[bitfield(u16, repr = le16, from = le16::from_ne, into = le16::to_ne)]
struct Test {
#[bits(14)]
f3: u16,
_reserved: bool, // no setter
#[bits(1, access = RO)] // no setter
reserved: bool
}
}

0 comments on commit 3f48bdc

Please sign in to comment.