Skip to content

Commit 50faeab

Browse files
author
bors-servo
authored
Auto merge of rust-lang#718 - photoszzt:fix_bitfield_constructor_const, r=emilio
Fix bitfield generation bug with const function Const function can't have variables or blocks. r? @fitzgen
2 parents 595b9a3 + 88342c9 commit 50faeab

12 files changed

+206
-588
lines changed

src/codegen/mod.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,19 +1106,16 @@ impl Bitfield {
11061106
quote_tokens!(ctx.ext_cx(), pub fn)
11071107
};
11081108

1109+
// Don't use variables or blocks because const function does not allow them.
11091110
quote_item!(
11101111
ctx.ext_cx(),
11111112
impl XxxUnused {
11121113
#[inline]
11131114
$fn_prefix $ctor_name($params $param_name : $bitfield_ty)
11141115
-> $unit_field_int_ty {
1115-
let bitfield_unit_val = $body;
1116-
let $param_name = $param_name
1117-
as $bitfield_int_ty
1118-
as $unit_field_int_ty;
1119-
let mask = $mask as $unit_field_int_ty;
1120-
let $param_name = ($param_name << $offset) & mask;
1121-
bitfield_unit_val | $param_name
1116+
($body |
1117+
(($param_name as $bitfield_int_ty as $unit_field_int_ty) << $offset) &
1118+
($mask as $unit_field_int_ty))
11221119
}
11231120
}
11241121
).unwrap()

tests/expectations/tests/bitfield-method-same-name.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,9 @@ impl Foo {
5555
#[inline]
5656
pub fn new_bitfield_1(type__bindgen_bitfield: ::std::os::raw::c_char)
5757
-> u8 {
58-
let bitfield_unit_val = { 0 };
59-
let type__bindgen_bitfield = type__bindgen_bitfield as u8 as u8;
60-
let mask = 7usize as u8;
61-
let type__bindgen_bitfield =
62-
(type__bindgen_bitfield << 0usize) & mask;
63-
bitfield_unit_val | type__bindgen_bitfield
58+
({ 0 } |
59+
((type__bindgen_bitfield as u8 as u8) << 0usize) &
60+
(7usize as u8))
6461
}
6562
#[inline]
6663
pub unsafe fn type_(&mut self) -> ::std::os::raw::c_char {

tests/expectations/tests/bitfield_align.rs

Lines changed: 53 additions & 188 deletions
Original file line numberDiff line numberDiff line change
@@ -222,122 +222,39 @@ impl A {
222222
b8: ::std::os::raw::c_uint,
223223
b9: ::std::os::raw::c_uint,
224224
b10: ::std::os::raw::c_uint) -> u16 {
225-
let bitfield_unit_val =
226-
{
227-
let bitfield_unit_val =
228-
{
229-
let bitfield_unit_val =
230-
{
231-
let bitfield_unit_val =
232-
{
233-
let bitfield_unit_val =
234-
{
235-
let bitfield_unit_val =
236-
{
237-
let bitfield_unit_val =
238-
{
239-
let bitfield_unit_val =
240-
{
241-
let bitfield_unit_val =
242-
{
243-
let bitfield_unit_val =
244-
{
245-
0
246-
};
247-
let b1 =
248-
b1
249-
as
250-
u32
251-
as
252-
u16;
253-
let mask =
254-
1usize
255-
as
256-
u16;
257-
let b1 =
258-
(b1
259-
<<
260-
0usize)
261-
&
262-
mask;
263-
bitfield_unit_val
264-
|
265-
b1
266-
};
267-
let b2 =
268-
b2
269-
as
270-
u32
271-
as
272-
u16;
273-
let mask =
274-
2usize
275-
as
276-
u16;
277-
let b2 =
278-
(b2
279-
<<
280-
1usize)
281-
&
282-
mask;
283-
bitfield_unit_val
284-
|
285-
b2
286-
};
287-
let b3 =
288-
b3 as u32
289-
as
290-
u16;
291-
let mask =
292-
4usize as
293-
u16;
294-
let b3 =
295-
(b3 <<
296-
2usize)
297-
&
298-
mask;
299-
bitfield_unit_val
300-
| b3
301-
};
302-
let b4 =
303-
b4 as u32 as u16;
304-
let mask =
305-
8usize as u16;
306-
let b4 =
307-
(b4 << 3usize) &
308-
mask;
309-
bitfield_unit_val | b4
310-
};
311-
let b5 = b5 as u32 as u16;
312-
let mask = 16usize as u16;
313-
let b5 =
314-
(b5 << 4usize) & mask;
315-
bitfield_unit_val | b5
316-
};
317-
let b6 = b6 as u32 as u16;
318-
let mask = 32usize as u16;
319-
let b6 = (b6 << 5usize) & mask;
320-
bitfield_unit_val | b6
321-
};
322-
let b7 = b7 as u32 as u16;
323-
let mask = 64usize as u16;
324-
let b7 = (b7 << 6usize) & mask;
325-
bitfield_unit_val | b7
326-
};
327-
let b8 = b8 as u32 as u16;
328-
let mask = 128usize as u16;
329-
let b8 = (b8 << 7usize) & mask;
330-
bitfield_unit_val | b8
331-
};
332-
let b9 = b9 as u32 as u16;
333-
let mask = 256usize as u16;
334-
let b9 = (b9 << 8usize) & mask;
335-
bitfield_unit_val | b9
336-
};
337-
let b10 = b10 as u32 as u16;
338-
let mask = 512usize as u16;
339-
let b10 = (b10 << 9usize) & mask;
340-
bitfield_unit_val | b10
225+
({
226+
({
227+
({
228+
({
229+
({
230+
({
231+
({
232+
({
233+
({
234+
({ 0 } |
235+
((b1 as u32 as u16)
236+
<< 0usize) &
237+
(1usize as u16))
238+
} |
239+
((b2 as u32 as u16) <<
240+
1usize) &
241+
(2usize as u16))
242+
} |
243+
((b3 as u32 as u16) << 2usize)
244+
& (4usize as u16))
245+
} |
246+
((b4 as u32 as u16) << 3usize) &
247+
(8usize as u16))
248+
} |
249+
((b5 as u32 as u16) << 4usize) &
250+
(16usize as u16))
251+
} |
252+
((b6 as u32 as u16) << 5usize) &
253+
(32usize as u16))
254+
} | ((b7 as u32 as u16) << 6usize) & (64usize as u16))
255+
} | ((b8 as u32 as u16) << 7usize) & (128usize as u16))
256+
} | ((b9 as u32 as u16) << 8usize) & (256usize as u16))
257+
} | ((b10 as u32 as u16) << 9usize) & (512usize as u16))
341258
}
342259
}
343260
#[repr(C)]
@@ -396,18 +313,10 @@ impl B {
396313
#[inline]
397314
pub fn new_bitfield_1(foo: ::std::os::raw::c_uint,
398315
bar: ::std::os::raw::c_uchar) -> u32 {
399-
let bitfield_unit_val =
400-
{
401-
let bitfield_unit_val = { 0 };
402-
let foo = foo as u32 as u32;
403-
let mask = 2147483647usize as u32;
404-
let foo = (foo << 0usize) & mask;
405-
bitfield_unit_val | foo
406-
};
407-
let bar = bar as u8 as u32;
408-
let mask = 2147483648usize as u32;
409-
let bar = (bar << 31usize) & mask;
410-
bitfield_unit_val | bar
316+
({
317+
({ 0 } |
318+
((foo as u32 as u32) << 0usize) & (2147483647usize as u32))
319+
} | ((bar as u8 as u32) << 31usize) & (2147483648usize as u32))
411320
}
412321
}
413322
#[repr(C)]
@@ -476,18 +385,8 @@ impl C {
476385
#[inline]
477386
pub fn new_bitfield_1(b1: ::std::os::raw::c_uint,
478387
b2: ::std::os::raw::c_uint) -> u8 {
479-
let bitfield_unit_val =
480-
{
481-
let bitfield_unit_val = { 0 };
482-
let b1 = b1 as u32 as u8;
483-
let mask = 1usize as u8;
484-
let b1 = (b1 << 0usize) & mask;
485-
bitfield_unit_val | b1
486-
};
487-
let b2 = b2 as u32 as u8;
488-
let mask = 2usize as u8;
489-
let b2 = (b2 << 1usize) & mask;
490-
bitfield_unit_val | b2
388+
({ ({ 0 } | ((b1 as u32 as u8) << 0usize) & (1usize as u8)) } |
389+
((b2 as u32 as u8) << 1usize) & (2usize as u8))
491390
}
492391
}
493392
#[repr(C)]
@@ -567,25 +466,12 @@ impl Date1 {
567466
pub fn new_bitfield_1(nWeekDay: ::std::os::raw::c_ushort,
568467
nMonthDay: ::std::os::raw::c_ushort,
569468
nMonth: ::std::os::raw::c_ushort) -> u16 {
570-
let bitfield_unit_val =
571-
{
572-
let bitfield_unit_val =
573-
{
574-
let bitfield_unit_val = { 0 };
575-
let nWeekDay = nWeekDay as u16 as u16;
576-
let mask = 7usize as u16;
577-
let nWeekDay = (nWeekDay << 0usize) & mask;
578-
bitfield_unit_val | nWeekDay
579-
};
580-
let nMonthDay = nMonthDay as u16 as u16;
581-
let mask = 504usize as u16;
582-
let nMonthDay = (nMonthDay << 3usize) & mask;
583-
bitfield_unit_val | nMonthDay
584-
};
585-
let nMonth = nMonth as u16 as u16;
586-
let mask = 15872usize as u16;
587-
let nMonth = (nMonth << 9usize) & mask;
588-
bitfield_unit_val | nMonth
469+
({
470+
({
471+
({ 0 } |
472+
((nWeekDay as u16 as u16) << 0usize) & (7usize as u16))
473+
} | ((nMonthDay as u16 as u16) << 3usize) & (504usize as u16))
474+
} | ((nMonth as u16 as u16) << 9usize) & (15872usize as u16))
589475
}
590476
#[inline]
591477
pub fn nYear(&self) -> ::std::os::raw::c_ushort {
@@ -607,11 +493,7 @@ impl Date1 {
607493
}
608494
#[inline]
609495
pub fn new_bitfield_2(nYear: ::std::os::raw::c_ushort) -> u8 {
610-
let bitfield_unit_val = { 0 };
611-
let nYear = nYear as u16 as u8;
612-
let mask = 255usize as u8;
613-
let nYear = (nYear << 0usize) & mask;
614-
bitfield_unit_val | nYear
496+
({ 0 } | ((nYear as u16 as u8) << 0usize) & (255usize as u8))
615497
}
616498
}
617499
#[repr(C)]
@@ -696,25 +578,12 @@ impl Date2 {
696578
pub fn new_bitfield_1(nWeekDay: ::std::os::raw::c_ushort,
697579
nMonthDay: ::std::os::raw::c_ushort,
698580
nMonth: ::std::os::raw::c_ushort) -> u16 {
699-
let bitfield_unit_val =
700-
{
701-
let bitfield_unit_val =
702-
{
703-
let bitfield_unit_val = { 0 };
704-
let nWeekDay = nWeekDay as u16 as u16;
705-
let mask = 7usize as u16;
706-
let nWeekDay = (nWeekDay << 0usize) & mask;
707-
bitfield_unit_val | nWeekDay
708-
};
709-
let nMonthDay = nMonthDay as u16 as u16;
710-
let mask = 504usize as u16;
711-
let nMonthDay = (nMonthDay << 3usize) & mask;
712-
bitfield_unit_val | nMonthDay
713-
};
714-
let nMonth = nMonth as u16 as u16;
715-
let mask = 15872usize as u16;
716-
let nMonth = (nMonth << 9usize) & mask;
717-
bitfield_unit_val | nMonth
581+
({
582+
({
583+
({ 0 } |
584+
((nWeekDay as u16 as u16) << 0usize) & (7usize as u16))
585+
} | ((nMonthDay as u16 as u16) << 3usize) & (504usize as u16))
586+
} | ((nMonth as u16 as u16) << 9usize) & (15872usize as u16))
718587
}
719588
#[inline]
720589
pub fn nYear(&self) -> ::std::os::raw::c_ushort {
@@ -736,10 +605,6 @@ impl Date2 {
736605
}
737606
#[inline]
738607
pub fn new_bitfield_2(nYear: ::std::os::raw::c_ushort) -> u8 {
739-
let bitfield_unit_val = { 0 };
740-
let nYear = nYear as u16 as u8;
741-
let mask = 255usize as u8;
742-
let nYear = (nYear << 0usize) & mask;
743-
bitfield_unit_val | nYear
608+
({ 0 } | ((nYear as u16 as u8) << 0usize) & (255usize as u8))
744609
}
745610
}

tests/expectations/tests/bitfield_method_mangling.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,9 @@ impl mach_msg_type_descriptor_t {
6363
#[inline]
6464
pub fn new_bitfield_1(pad3: ::std::os::raw::c_uint,
6565
type_: ::std::os::raw::c_uint) -> u32 {
66-
let bitfield_unit_val =
67-
{
68-
let bitfield_unit_val = { 0 };
69-
let pad3 = pad3 as u32 as u32;
70-
let mask = 16777215usize as u32;
71-
let pad3 = (pad3 << 0usize) & mask;
72-
bitfield_unit_val | pad3
73-
};
74-
let type_ = type_ as u32 as u32;
75-
let mask = 4278190080usize as u32;
76-
let type_ = (type_ << 24usize) & mask;
77-
bitfield_unit_val | type_
66+
({
67+
({ 0 } |
68+
((pad3 as u32 as u32) << 0usize) & (16777215usize as u32))
69+
} | ((type_ as u32 as u32) << 24usize) & (4278190080usize as u32))
7870
}
7971
}

tests/expectations/tests/jsval_layout_opaque.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -168,18 +168,13 @@ impl jsval_layout__bindgen_ty_1 {
168168
}
169169
#[inline]
170170
pub fn new_bitfield_1(payload47: u64, tag: JSValueTag) -> u64 {
171-
let bitfield_unit_val =
172-
{
173-
let bitfield_unit_val = { 0 };
174-
let payload47 = payload47 as u64 as u64;
175-
let mask = 140737488355327usize as u64;
176-
let payload47 = (payload47 << 0usize) & mask;
177-
bitfield_unit_val | payload47
178-
};
179-
let tag = tag as u32 as u64;
180-
let mask = 18446603336221196288usize as u64;
181-
let tag = (tag << 47usize) & mask;
182-
bitfield_unit_val | tag
171+
({
172+
({ 0 } |
173+
((payload47 as u64 as u64) << 0usize) &
174+
(140737488355327usize as u64))
175+
} |
176+
((tag as u32 as u64) << 47usize) &
177+
(18446603336221196288usize as u64))
183178
}
184179
}
185180
#[repr(C)]

0 commit comments

Comments
 (0)