You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#pragma pack(push, 1)
structStruct {
unsignedchar a : 1;
unsignedchar b : 1;
unsignedchar c : 6;
unsignedshortint d : 16;
unsignedchar e : 8;
};
#pragma pack(pop)
Bindgen Invocation
bindgen::Builder::default().header("test.h").parse_callbacks(Box::new(bindgen::CargoCallbacks)).generate().expect("Unable to generate bindings");
Actual Results
#[repr(C, packed)]#[derive(Debug,Copy,Clone)]pubstructStruct{pub_bitfield_align_1:[u16;0],pub_bitfield_1:__BindgenBitfieldUnit<[u8;5usize]>,}#[test]fnbindgen_test_layout_Struct(){assert_eq!(::std::mem::size_of::<Struct>(),4usize,
concat!("Size of: ", stringify!(Struct)));assert_eq!(::std::mem::align_of::<Struct>(),1usize,
concat!("Alignment of ", stringify!(Struct)));}implStruct{#[inline]pubfna(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(0usize,1u8)asu8)}}#[inline]pubfnset_a(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(0usize,1u8, val asu64)}}#[inline]pubfnb(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(1usize,1u8)asu8)}}#[inline]pubfnset_b(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(1usize,1u8, val asu64)}}#[inline]pubfnc(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(2usize,6u8)asu8)}}#[inline]pubfnset_c(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(2usize,6u8, val asu64)}}#[inline]pubfnd(&self) -> ::std::os::raw::c_ushort{unsafe{::std::mem::transmute(self._bitfield_1.get(16usize,16u8)asu16)}}#[inline]pubfnset_d(&mutself,val:::std::os::raw::c_ushort){unsafe{let val:u16 = ::std::mem::transmute(val);self._bitfield_1.set(16usize,16u8, val asu64)}}#[inline]pubfne(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(32usize,8u8)asu8)}}#[inline]pubfnset_e(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(32usize,8u8, val asu64)}}#[inline]pubfnnew_bitfield_1(a:::std::os::raw::c_uchar,b:::std::os::raw::c_uchar,c:::std::os::raw::c_uchar,d:::std::os::raw::c_ushort,e:::std::os::raw::c_uchar,) -> __BindgenBitfieldUnit<[u8;5usize]>{letmut __bindgen_bitfield_unit:__BindgenBitfieldUnit<[u8;5usize]> = Default::default();
__bindgen_bitfield_unit.set(0usize,1u8,{let a:u8 = unsafe{::std::mem::transmute(a)};
a asu64});
__bindgen_bitfield_unit.set(1usize,1u8,{let b:u8 = unsafe{::std::mem::transmute(b)};
b asu64});
__bindgen_bitfield_unit.set(2usize,6u8,{let c:u8 = unsafe{::std::mem::transmute(c)};
c asu64});
__bindgen_bitfield_unit.set(16usize,16u8,{let d:u16 = unsafe{::std::mem::transmute(d)};
d asu64});
__bindgen_bitfield_unit.set(32usize,8u8,{let e:u8 = unsafe{::std::mem::transmute(e)};
e asu64});
__bindgen_bitfield_unit
}}
and/or
running 1 test
test bindgen_test_layout___fsid_t ... ok
test bindgen_test_layout_Struct ... FAILED
failures:
---- bindgen_test_layout_Struct stdout ----
thread 'bindgen_test_layout_Struct' panicked at 'assertion failed: `(left == right)`
left: `5`,
right: `4`: Size of: Struct', /home/thomas.burghout/Documents/impinj-e710/target/debug/build/mwe-47b414b04acb1316/out/bindings.rs:289:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
failures:
bindgen_test_layout_Struct
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
Expected Results
I expect a Rust struct with a bitfield of size 4 ([u8; 4usize]) instead of 5, with correct accessors for all fields. It is worth noting that using __attribute__((packed)) over #pragma pack(push, 1) does yield the correct results (and passing tests).
#[repr(C, packed)]#[derive(Debug,Copy,Clone)]pubstructStruct{pub_bitfield_align_1:[u8;0],pub_bitfield_1:__BindgenBitfieldUnit<[u8;4usize]>,}#[test]fnbindgen_test_layout_Struct(){assert_eq!(::std::mem::size_of::<Struct>(),4usize,
concat!("Size of: ", stringify!(Struct)));assert_eq!(::std::mem::align_of::<Struct>(),1usize,
concat!("Alignment of ", stringify!(Struct)));}implStruct{#[inline]pubfna(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(0usize,1u8)asu8)}}#[inline]pubfnset_a(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(0usize,1u8, val asu64)}}#[inline]pubfnb(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(1usize,1u8)asu8)}}#[inline]pubfnset_b(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(1usize,1u8, val asu64)}}#[inline]pubfnc(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(2usize,6u8)asu8)}}#[inline]pubfnset_c(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(2usize,6u8, val asu64)}}#[inline]pubfnd(&self) -> ::std::os::raw::c_ushort{unsafe{::std::mem::transmute(self._bitfield_1.get(8usize,16u8)asu16)}}#[inline]pubfnset_d(&mutself,val:::std::os::raw::c_ushort){unsafe{let val:u16 = ::std::mem::transmute(val);self._bitfield_1.set(8usize,16u8, val asu64)}}#[inline]pubfne(&self) -> ::std::os::raw::c_uchar{unsafe{::std::mem::transmute(self._bitfield_1.get(24usize,8u8)asu8)}}#[inline]pubfnset_e(&mutself,val:::std::os::raw::c_uchar){unsafe{let val:u8 = ::std::mem::transmute(val);self._bitfield_1.set(24usize,8u8, val asu64)}}#[inline]pubfnnew_bitfield_1(a:::std::os::raw::c_uchar,b:::std::os::raw::c_uchar,c:::std::os::raw::c_uchar,d:::std::os::raw::c_ushort,e:::std::os::raw::c_uchar,) -> __BindgenBitfieldUnit<[u8;4usize]>{letmut __bindgen_bitfield_unit:__BindgenBitfieldUnit<[u8;4usize]> = Default::default();
__bindgen_bitfield_unit.set(0usize,1u8,{let a:u8 = unsafe{::std::mem::transmute(a)};
a asu64});
__bindgen_bitfield_unit.set(1usize,1u8,{let b:u8 = unsafe{::std::mem::transmute(b)};
b asu64});
__bindgen_bitfield_unit.set(2usize,6u8,{let c:u8 = unsafe{::std::mem::transmute(c)};
c asu64});
__bindgen_bitfield_unit.set(8usize,16u8,{let d:u16 = unsafe{::std::mem::transmute(d)};
d asu64});
__bindgen_bitfield_unit.set(24usize,8u8,{let e:u8 = unsafe{::std::mem::transmute(e)};
e asu64});
__bindgen_bitfield_unit
}}
The text was updated successfully, but these errors were encountered:
Input C/C++ Header
Bindgen Invocation
Actual Results
and/or
Expected Results
I expect a Rust struct with a bitfield of size 4 (
[u8; 4usize]
) instead of 5, with correct accessors for all fields. It is worth noting that using__attribute__((packed))
over#pragma pack(push, 1)
does yield the correct results (and passing tests).The text was updated successfully, but these errors were encountered: