Skip to content

Commit 867ed28

Browse files
author
Per Larsen
committed
Test repr(C) rustified enums
Add basic testing of repr-c enums assuming input is C++11. Signed-off-by: Per Larsen <perlarsen@google.com>
1 parent efacc83 commit 867ed28

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

bindgen-tests/tests/expectations/tests/enum-doc-rusty-repr-c.rs

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/short-enums-repr-c.rs

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// bindgen-flags: --rustified-repr-c-enum ".*" -- -std=c++11 -fshort-enums
2+
3+
typedef enum {
4+
SOME_VALUE = 0x1,
5+
} one_byte_t;
6+
7+
static_assert(sizeof(one_byte_t) == 1, "Short enums should work");
8+
9+
typedef enum {
10+
SOME_OTHER_VALUE = 0x100,
11+
} two_byte_t;
12+
13+
static_assert(sizeof(two_byte_t) == 2, "");
14+
15+
typedef enum {
16+
SOME_BIGGER_VALUE = 0x1000000,
17+
} four_byte_t;
18+
19+
static_assert(sizeof(four_byte_t) == 4, "");

bindgen/codegen/mod.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4060,6 +4060,49 @@ impl CodeGenerator for Enum {
40604060

40614061
let item = builder.build(ctx, &enum_rust_ty);
40624062
result.push(item);
4063+
4064+
if ctx.options().layout_tests &&
4065+
matches!(variation, EnumVariation::Rust { repr_c: true, .. })
4066+
{
4067+
if let Some(layout) = layout {
4068+
let compile_time = ctx.options().rust_features().offset_of;
4069+
let fn_name = if compile_time {
4070+
None
4071+
} else {
4072+
let fn_name = format!("bindgen_test_layout_{ident}");
4073+
Some(ctx.rust_ident_raw(fn_name))
4074+
};
4075+
let prefix = ctx.trait_prefix();
4076+
let size_of_expr = quote! {
4077+
::#prefix::mem::size_of::<#ident>()
4078+
};
4079+
let align_of_expr = quote! {
4080+
::#prefix::mem::align_of::<#ident>()
4081+
};
4082+
let size = layout.size;
4083+
let align = layout.align;
4084+
let size_of_err = format!("Size of {ident}");
4085+
let align_of_err = format!("Alignment of {ident}");
4086+
4087+
if compile_time {
4088+
result.push(quote! {
4089+
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
4090+
const _: () = {
4091+
[#size_of_err][#size_of_expr - #size];
4092+
[#align_of_err][#align_of_expr - #align];
4093+
};
4094+
});
4095+
} else {
4096+
result.push(quote! {
4097+
#[test]
4098+
fn #fn_name() {
4099+
assert_eq!(#size_of_expr, #size, #size_of_err);
4100+
assert_eq!(#align_of_expr, #align, #align_of_err);
4101+
}
4102+
});
4103+
}
4104+
}
4105+
}
40634106
}
40644107
}
40654108

0 commit comments

Comments
 (0)