diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 0637d2bc81..6c0563b18a 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -1072,6 +1072,12 @@ impl CompInfo { return None; } + // By definition, we don't have the right layout information here if + // we're a forward declaration. + if self.is_forward_declaration() { + return None; + } + let mut max_size = 0; let mut max_align = 0; for field in self.fields() { diff --git a/tests/expectations/tests/forward_declared_complex_types_1_0.rs b/tests/expectations/tests/forward_declared_complex_types_1_0.rs index 0a6a32be81..011ab35e9a 100644 --- a/tests/expectations/tests/forward_declared_complex_types_1_0.rs +++ b/tests/expectations/tests/forward_declared_complex_types_1_0.rs @@ -1,6 +1,11 @@ /* automatically generated by rust-bindgen */ -#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)] +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] #[repr(C)] #[derive(Debug, Default, Copy)] @@ -73,7 +78,7 @@ extern "C" { pub fn baz_struct(f: *mut Foo); } #[repr(C)] -#[derive(Copy)] +#[derive(Debug, Copy)] pub struct Union { _unused: [u8; 0], } diff --git a/tests/expectations/tests/forward_declared_opaque.rs b/tests/expectations/tests/forward_declared_opaque.rs new file mode 100644 index 0000000000..44aff91f49 --- /dev/null +++ b/tests/expectations/tests/forward_declared_opaque.rs @@ -0,0 +1,19 @@ +/* automatically generated by rust-bindgen */ + +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] + +#[repr(C)] +#[derive(Copy, Clone)] +pub struct a { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct b { + _unused: [u8; 0], +} diff --git a/tests/headers/forward_declared_opaque.h b/tests/headers/forward_declared_opaque.h new file mode 100644 index 0000000000..1b58edb9a8 --- /dev/null +++ b/tests/headers/forward_declared_opaque.h @@ -0,0 +1,4 @@ +// bindgen-flags: --opaque-type "*" + +union a; +struct b; \ No newline at end of file