summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gen.rs49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/gen.rs b/src/gen.rs
index c3b4cc2f..4bba708c 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -2195,37 +2195,48 @@ fn mk_fnty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: Abi) -> ast::Ty {
fn mk_test_fn(ctx: &GenCtx, name: &str, layout: &Layout) -> P<ast::Item> {
let size = layout.size;
+ let align = layout.align;
let struct_name = ctx.ext_cx.ident_of(name);
let fn_name = ctx.ext_cx.ident_of(&format!("bindgen_test_layout_{}", name));
+ let size_of_expr = quote_expr!(&ctx.ext_cx, ::std::mem::size_of::<$struct_name>());
+ let align_of_expr = quote_expr!(&ctx.ext_cx, ::std::mem::align_of::<$struct_name>());
let item = quote_item!(&ctx.ext_cx,
#[test]
fn $fn_name() {
- assert_eq!(::std::mem::size_of::<$struct_name>(), $size);
+ assert_eq!($size_of_expr, $size);
+ assert_eq!($align_of_expr, $align);
}).unwrap();
item
}
fn mk_opaque_struct(ctx: &GenCtx, name: &str, layout: &Layout) -> P<ast::Item> {
- let (size, ty_name) = if layout.size % 8 == 0 {
- (layout.size / 8, "u64")
- } else if layout.size % 4 == 0 {
- (layout.size / 4, "u32")
- } else if layout.size % 2 == 0 {
- (layout.size / 2, "u16")
+ let struct_name = ctx.ext_cx.ident_of(name);
+ // XXX prevent this spurious clone
+ let blob_field = mk_blob_field(ctx, "_bindgen_opaque_blob", layout.clone());
+ let variant_data = if layout.size == 0 {
+ ast::VariantData::Unit(ast::DUMMY_NODE_ID)
} else {
- (layout.size, "u8")
+ ast::VariantData::Struct(vec![blob_field], ast::DUMMY_NODE_ID)
};
- let struct_name = ctx.ext_cx.ident_of(name);
- let ty_name = ctx.ext_cx.ident_of(ty_name);
-
-
- let item = quote_item!(&ctx.ext_cx,
- #[repr(C)]
- #[derive(Copy, Clone, Debug)]
- pub struct $struct_name {
- _bindgen_opaque_blob: [$ty_name; $size]
+ let def = ast::ItemKind::Struct(
+ variant_data,
+ ast::Generics {
+ lifetimes: vec!(),
+ ty_params: OwnedSlice::empty(),
+ where_clause: ast::WhereClause {
+ id: ast::DUMMY_NODE_ID,
+ predicates: vec!()
+ }
}
- ).unwrap();
- item
+ );
+
+ P(ast::Item {
+ ident: ctx.ext_cx.ident_of(&name),
+ attrs: vec![],
+ id: ast::DUMMY_NODE_ID,
+ node: def,
+ vis: ast::Visibility::Public,
+ span: ctx.span
+ })
}