Skip to content

Commit 271eeb0

Browse files
committed
codegen: Don't check large_arrays to generate bitfield ctors because they use the Default trait.
Fixes #2082
1 parent 6714007 commit 271eeb0

File tree

3 files changed

+152
-7
lines changed

3 files changed

+152
-7
lines changed

src/codegen/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1502,9 +1502,11 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
15021502
let mut ctor_impl = quote! {};
15031503

15041504
// We cannot generate any constructor if the underlying storage can't
1505-
// implement AsRef<[u8]> / AsMut<[u8]> / etc.
1506-
let mut generate_ctor = layout.size <= RUST_DERIVE_IN_ARRAY_LIMIT ||
1507-
ctx.options().rust_features().larger_arrays;
1505+
// implement AsRef<[u8]> / AsMut<[u8]> / etc, or can't derive Default.
1506+
//
1507+
// We don't check `larger_arrays` here because Default does still have
1508+
// the 32 items limitation.
1509+
let mut generate_ctor = layout.size <= RUST_DERIVE_IN_ARRAY_LIMIT;
15081510

15091511
let mut access_spec = !fields_should_be_private;
15101512
for bf in self.bitfields() {

tests/expectations/tests/timex.rs

+147-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ where
9292
}
9393
}
9494
#[repr(C)]
95-
#[derive(Copy, Clone)]
95+
#[derive(Debug, Copy, Clone)]
9696
pub struct timex {
9797
pub tai: ::std::os::raw::c_int,
9898
pub _bitfield_align_1: [u8; 0],
@@ -131,7 +131,7 @@ impl Default for timex {
131131
}
132132
}
133133
#[repr(C)]
134-
#[derive(Copy, Clone)]
134+
#[derive(Debug, Copy, Clone)]
135135
pub struct timex_named {
136136
pub tai: ::std::os::raw::c_int,
137137
pub _bitfield_align_1: [u32; 0],
@@ -171,3 +171,148 @@ impl Default for timex_named {
171171
}
172172
}
173173
}
174+
impl timex_named {
175+
#[inline]
176+
pub fn a(&self) -> ::std::os::raw::c_int {
177+
unsafe {
178+
::std::mem::transmute(self._bitfield_1.get(0usize, 32u8) as u32)
179+
}
180+
}
181+
#[inline]
182+
pub fn set_a(&mut self, val: ::std::os::raw::c_int) {
183+
unsafe {
184+
let val: u32 = ::std::mem::transmute(val);
185+
self._bitfield_1.set(0usize, 32u8, val as u64)
186+
}
187+
}
188+
#[inline]
189+
pub fn b(&self) -> ::std::os::raw::c_int {
190+
unsafe {
191+
::std::mem::transmute(self._bitfield_1.get(32usize, 32u8) as u32)
192+
}
193+
}
194+
#[inline]
195+
pub fn set_b(&mut self, val: ::std::os::raw::c_int) {
196+
unsafe {
197+
let val: u32 = ::std::mem::transmute(val);
198+
self._bitfield_1.set(32usize, 32u8, val as u64)
199+
}
200+
}
201+
#[inline]
202+
pub fn c(&self) -> ::std::os::raw::c_int {
203+
unsafe {
204+
::std::mem::transmute(self._bitfield_1.get(64usize, 32u8) as u32)
205+
}
206+
}
207+
#[inline]
208+
pub fn set_c(&mut self, val: ::std::os::raw::c_int) {
209+
unsafe {
210+
let val: u32 = ::std::mem::transmute(val);
211+
self._bitfield_1.set(64usize, 32u8, val as u64)
212+
}
213+
}
214+
#[inline]
215+
pub fn d(&self) -> ::std::os::raw::c_int {
216+
unsafe {
217+
::std::mem::transmute(self._bitfield_1.get(96usize, 32u8) as u32)
218+
}
219+
}
220+
#[inline]
221+
pub fn set_d(&mut self, val: ::std::os::raw::c_int) {
222+
unsafe {
223+
let val: u32 = ::std::mem::transmute(val);
224+
self._bitfield_1.set(96usize, 32u8, val as u64)
225+
}
226+
}
227+
#[inline]
228+
pub fn e(&self) -> ::std::os::raw::c_int {
229+
unsafe {
230+
::std::mem::transmute(self._bitfield_1.get(128usize, 32u8) as u32)
231+
}
232+
}
233+
#[inline]
234+
pub fn set_e(&mut self, val: ::std::os::raw::c_int) {
235+
unsafe {
236+
let val: u32 = ::std::mem::transmute(val);
237+
self._bitfield_1.set(128usize, 32u8, val as u64)
238+
}
239+
}
240+
#[inline]
241+
pub fn f(&self) -> ::std::os::raw::c_int {
242+
unsafe {
243+
::std::mem::transmute(self._bitfield_1.get(160usize, 32u8) as u32)
244+
}
245+
}
246+
#[inline]
247+
pub fn set_f(&mut self, val: ::std::os::raw::c_int) {
248+
unsafe {
249+
let val: u32 = ::std::mem::transmute(val);
250+
self._bitfield_1.set(160usize, 32u8, val as u64)
251+
}
252+
}
253+
#[inline]
254+
pub fn g(&self) -> ::std::os::raw::c_int {
255+
unsafe {
256+
::std::mem::transmute(self._bitfield_1.get(192usize, 32u8) as u32)
257+
}
258+
}
259+
#[inline]
260+
pub fn set_g(&mut self, val: ::std::os::raw::c_int) {
261+
unsafe {
262+
let val: u32 = ::std::mem::transmute(val);
263+
self._bitfield_1.set(192usize, 32u8, val as u64)
264+
}
265+
}
266+
#[inline]
267+
pub fn h(&self) -> ::std::os::raw::c_int {
268+
unsafe {
269+
::std::mem::transmute(self._bitfield_1.get(224usize, 32u8) as u32)
270+
}
271+
}
272+
#[inline]
273+
pub fn set_h(&mut self, val: ::std::os::raw::c_int) {
274+
unsafe {
275+
let val: u32 = ::std::mem::transmute(val);
276+
self._bitfield_1.set(224usize, 32u8, val as u64)
277+
}
278+
}
279+
#[inline]
280+
pub fn i(&self) -> ::std::os::raw::c_int {
281+
unsafe {
282+
::std::mem::transmute(self._bitfield_1.get(256usize, 32u8) as u32)
283+
}
284+
}
285+
#[inline]
286+
pub fn set_i(&mut self, val: ::std::os::raw::c_int) {
287+
unsafe {
288+
let val: u32 = ::std::mem::transmute(val);
289+
self._bitfield_1.set(256usize, 32u8, val as u64)
290+
}
291+
}
292+
#[inline]
293+
pub fn j(&self) -> ::std::os::raw::c_int {
294+
unsafe {
295+
::std::mem::transmute(self._bitfield_1.get(288usize, 32u8) as u32)
296+
}
297+
}
298+
#[inline]
299+
pub fn set_j(&mut self, val: ::std::os::raw::c_int) {
300+
unsafe {
301+
let val: u32 = ::std::mem::transmute(val);
302+
self._bitfield_1.set(288usize, 32u8, val as u64)
303+
}
304+
}
305+
#[inline]
306+
pub fn k(&self) -> ::std::os::raw::c_int {
307+
unsafe {
308+
::std::mem::transmute(self._bitfield_1.get(320usize, 32u8) as u32)
309+
}
310+
}
311+
#[inline]
312+
pub fn set_k(&mut self, val: ::std::os::raw::c_int) {
313+
unsafe {
314+
let val: u32 = ::std::mem::transmute(val);
315+
self._bitfield_1.set(320usize, 32u8, val as u64)
316+
}
317+
}
318+
}

tests/headers/timex.h

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
// bindgen-flags: --rust-target 1.40
2-
31
struct timex {
42
int tai;
53

0 commit comments

Comments
 (0)