diff options
author | Emilio Cobos Álvarez <me@emiliocobos.me> | 2016-04-02 21:43:30 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <me@emiliocobos.me> | 2016-04-02 21:43:30 +0200 |
commit | 6b9c662672e04045c8c65aeddcf32abf8a2d9772 (patch) | |
tree | 8a3560d75499688c974d93e9eb0e0c5e975fd5c3 | |
parent | 332fb3993dfb192e1dff1f0dc385f16cd8d60e6e (diff) |
gen: Generate an enum with appropiate repr for declarations.
-rw-r--r-- | src/gen.rs | 18 |
1 files changed, 10 insertions, 8 deletions
@@ -457,7 +457,7 @@ fn gen_global(mut ctx: &mut GenCtx, let c = ci.borrow().clone(); let name = comp_name(&ctx, c.kind, &c.name); - defs.push(opaque_to_rs(&mut ctx, &name)); + defs.push(opaque_to_rs(&mut ctx, &name, c.layout)); }, GComp(ci) => { let c = ci.borrow().clone(); @@ -467,13 +467,14 @@ fn gen_global(mut ctx: &mut GenCtx, GEnumDecl(ei) => { let e = ei.borrow().clone(); let name = enum_name(&ctx, &e.name); + let dummy = EnumItem::new("_BindgenOpaqueEnum".to_owned(), "".to_owned(), 0); - defs.push(opaque_to_rs(&mut ctx, &name)); + defs.extend(cenum_to_rs(&mut ctx, &name, e.kind, e.comment, &[dummy], e.layout).into_iter()) }, GEnum(ei) => { let e = ei.borrow().clone(); let name = enum_name(&ctx, &e.name); - defs.extend(cenum_to_rs(&mut ctx, name, e.kind, e.comment, &e.items, e.layout).into_iter()) + defs.extend(cenum_to_rs(&mut ctx, &name, e.kind, e.comment, &e.items, e.layout).into_iter()) }, GVar(vi) => { let v = vi.borrow(); @@ -989,7 +990,7 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item> } let e = ei.borrow().clone(); - extra.extend(cenum_to_rs(ctx, e.name, e.kind, e.comment, &e.items, e.layout).into_iter()); + extra.extend(cenum_to_rs(ctx, &e.name, e.kind, e.comment, &e.items, e.layout).into_iter()); continue; } @@ -1266,7 +1267,7 @@ fn cstruct_to_rs(ctx: &mut GenCtx, name: &str, ci: CompInfo) -> Vec<P<ast::Item> items } -fn opaque_to_rs(ctx: &mut GenCtx, name: &str) -> P<ast::Item> { +fn opaque_to_rs(ctx: &mut GenCtx, name: &str, _layout: Layout) -> P<ast::Item> { let def = ast::ItemKind::Enum( ast::EnumDef { variants: vec!() @@ -1274,10 +1275,11 @@ fn opaque_to_rs(ctx: &mut GenCtx, name: &str) -> P<ast::Item> { empty_generics() ); + // XXX can't repr(C) an empty enum let id = rust_type_id(ctx, name); P(ast::Item { ident: ctx.ext_cx.ident_of(&id), - attrs: Vec::new(), + attrs: vec![], id: ast::DUMMY_NODE_ID, node: def, vis: ast::Visibility::Public, @@ -1429,12 +1431,12 @@ fn cenum_value_to_int_lit(ctx: &mut GenCtx, } fn cenum_to_rs(ctx: &mut GenCtx, - name: String, + name: &str, kind: IKind, comment: String, enum_items: &[EnumItem], layout: Layout) -> Vec<P<ast::Item>> { - let enum_name = ctx.ext_cx.ident_of(&name); + let enum_name = ctx.ext_cx.ident_of(name); let enum_ty = ctx.ext_cx.ty_ident(ctx.span, enum_name); let enum_is_signed = kind.is_signed(); let enum_repr = enum_size_to_rust_type_name(enum_is_signed, layout.size); |