Skip to content

Commit 8d4b7ba

Browse files
committed
Merge pull request #11 from ecoal95/mwu-sm-hacks
Empty union bitfield members
2 parents 6127e02 + 3e2d931 commit 8d4b7ba

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

src/gen.rs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1291,17 +1291,25 @@ fn gen_bitfield_method(ctx: &mut GenCtx, bindgen_name: &String,
12911291
}
12921292

12931293
fn gen_fullbitfield_method(ctx: &mut GenCtx, bindgen_name: &String,
1294-
field_type: &Type, bitfields: &Vec<(String, u32)>) -> ast::ImplItem {
1294+
field_type: &Type, bitfields: &[(String, u32)]) -> ast::ImplItem {
12951295
let field_type = cty_to_rs(ctx, field_type, false);
12961296
let mut args = vec!();
1297+
let mut unnamed: usize = 0;
12971298
for &(ref name, width) in bitfields.iter() {
1299+
let ident = if name.is_empty() {
1300+
unnamed += 1;
1301+
let dummy = format!("unnamed_bitfield{}", unnamed);
1302+
ctx.ext_cx.ident_of(&dummy)
1303+
} else {
1304+
ctx.ext_cx.ident_of(name)
1305+
};
12981306
args.push(ast::Arg {
12991307
ty: P(type_for_bitfield_width(ctx, width)),
13001308
pat: P(ast::Pat {
13011309
id: ast::DUMMY_NODE_ID,
13021310
node: ast::PatIdent(
13031311
ast::BindingMode::ByValue(ast::MutImmutable),
1304-
respan(ctx.span, ctx.ext_cx.ident_of(name)),
1312+
respan(ctx.span, ident),
13051313
None
13061314
),
13071315
span: ctx.span
@@ -1320,8 +1328,15 @@ fn gen_fullbitfield_method(ctx: &mut GenCtx, bindgen_name: &String,
13201328

13211329
let mut offset = 0;
13221330
let mut exprs = quote_expr!(&ctx.ext_cx, 0);
1331+
let mut unnamed: usize = 0;
13231332
for &(ref name, width) in bitfields.iter() {
1324-
let name_ident = ctx.ext_cx.ident_of(&name);
1333+
let name_ident = if name.is_empty() {
1334+
unnamed += 1;
1335+
let dummy = format!("unnamed_bitfield{}", unnamed);
1336+
ctx.ext_cx.ident_of(&dummy)
1337+
} else {
1338+
ctx.ext_cx.ident_of(name)
1339+
};
13251340
exprs = quote_expr!(&ctx.ext_cx,
13261341
$exprs | (($name_ident as $field_type) << $offset)
13271342
);

tests/support.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub fn assert_bind_eq(filename: &str, reference_items_str: &str)
3838

3939
let mut parser = parse::new_parser_from_source_str(ext_cx.parse_sess(), ext_cx.cfg(), "".to_string(), reference_items_str.to_string());
4040
let mut reference_items = Vec::new();
41-
while let Some(item) = parser.parse_item() {
41+
while let Ok(Some(item)) = parser.parse_item() {
4242
reference_items.push(item);
4343
}
4444

@@ -47,7 +47,7 @@ pub fn assert_bind_eq(filename: &str, reference_items_str: &str)
4747
// rendered versions, which is not beautiful, but should work.
4848
let reference_rendered = render_items(&reference_items);
4949
let generated_rendered = render_items(&generated_items);
50-
50+
5151
if reference_rendered != generated_rendered {
5252
println!("Generated bindings for {} do not match the reference bindings.", filename);
5353
println!("");

0 commit comments

Comments
 (0)