Skip to content

Commit b2b4a28

Browse files
committed
Merge pull request #1 from ecoal95/sm-hacks
gen: Allow empty union bitfield members
2 parents 949151a + 6d372e0 commit b2b4a28

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

src/gen.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,7 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: String, ci: CompInfo) -> Vec<P<ast::Ite
759759
ast::Public,
760760
),
761761
id: ast::DUMMY_NODE_ID,
762-
ty: quote_ty!(&ctx.ext_cx, PhantomData<$inner_type>),
762+
ty: quote_ty!(&ctx.ext_cx, ::std::marker::PhantomData<$inner_type>),
763763
attrs: vec!(),
764764
}));
765765
}
@@ -1246,17 +1246,25 @@ fn gen_bitfield_method(ctx: &mut GenCtx, bindgen_name: &String,
12461246
}
12471247

12481248
fn gen_fullbitfield_method(ctx: &mut GenCtx, bindgen_name: &String,
1249-
field_type: &Type, bitfields: &Vec<(String, u32)>) -> ast::ImplItem {
1249+
field_type: &Type, bitfields: &[(String, u32)]) -> ast::ImplItem {
12501250
let field_type = cty_to_rs(ctx, field_type, false);
12511251
let mut args = vec!();
1252+
let mut unnamed: usize = 0;
12521253
for &(ref name, width) in bitfields.iter() {
1254+
let ident = if name.is_empty() {
1255+
unnamed += 1;
1256+
let dummy = format!("unnamed_bitfield{}", unnamed);
1257+
ctx.ext_cx.ident_of(&dummy)
1258+
} else {
1259+
ctx.ext_cx.ident_of(name)
1260+
};
12531261
args.push(ast::Arg {
12541262
ty: P(type_for_bitfield_width(ctx, width)),
12551263
pat: P(ast::Pat {
12561264
id: ast::DUMMY_NODE_ID,
12571265
node: ast::PatIdent(
12581266
ast::BindingMode::ByValue(ast::MutImmutable),
1259-
respan(ctx.span, ctx.ext_cx.ident_of(name)),
1267+
respan(ctx.span, ident),
12601268
None
12611269
),
12621270
span: ctx.span
@@ -1275,8 +1283,15 @@ fn gen_fullbitfield_method(ctx: &mut GenCtx, bindgen_name: &String,
12751283

12761284
let mut offset = 0;
12771285
let mut exprs = quote_expr!(&ctx.ext_cx, 0);
1286+
let mut unnamed: usize = 0;
12781287
for &(ref name, width) in bitfields.iter() {
1279-
let name_ident = ctx.ext_cx.ident_of(&name);
1288+
let name_ident = if name.is_empty() {
1289+
unnamed += 1;
1290+
let dummy = format!("unnamed_bitfield{}", unnamed);
1291+
ctx.ext_cx.ident_of(&dummy)
1292+
} else {
1293+
ctx.ext_cx.ident_of(name)
1294+
};
12801295
exprs = quote_expr!(&ctx.ext_cx,
12811296
$exprs | (($name_ident as $field_type) << $offset)
12821297
);

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)