diff --git a/src/clang.rs b/src/clang.rs index 96f772540b..db6467e398 100644 --- a/src/clang.rs +++ b/src/clang.rs @@ -241,7 +241,7 @@ impl Cursor { self.x.kind } - /// Returns true is the cursor is a definition + /// Returns true if the cursor is a definition pub fn is_definition(&self) -> bool { unsafe { clang_isCursorDefinition(self.x) != 0 } } diff --git a/src/ir/comp.rs b/src/ir/comp.rs index 52dcddd555..d57c272a30 100644 --- a/src/ir/comp.rs +++ b/src/ir/comp.rs @@ -1249,6 +1249,7 @@ impl CompInfo { let mut ci = CompInfo::new(kind); ci.is_forward_declaration = location.map_or(true, |cur| match cur.kind() { + CXCursor_ParmDecl => true, CXCursor_StructDecl | CXCursor_UnionDecl | CXCursor_ClassDecl => !cur.is_definition(), _ => false, diff --git a/tests/expectations/tests/parm-union.rs b/tests/expectations/tests/parm-union.rs new file mode 100644 index 0000000000..9f7dd20ad9 --- /dev/null +++ b/tests/expectations/tests/parm-union.rs @@ -0,0 +1,40 @@ +#![allow( + dead_code, + non_snake_case, + non_camel_case_types, + non_upper_case_globals +)] + +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct Struct { + pub _address: u8, +} +#[test] +fn bindgen_test_layout_Struct() { + assert_eq!( + ::std::mem::size_of::(), + 1usize, + concat!("Size of: ", stringify!(Struct)) + ); + assert_eq!( + ::std::mem::align_of::(), + 1usize, + concat!("Alignment of ", stringify!(Struct)) + ); +} +extern "C" { + #[link_name = "\u{1}_ZN6Struct8FunctionER5Union"] + pub fn Struct_Function(this: *mut Struct, arg1: *mut Union); +} +impl Struct { + #[inline] + pub unsafe fn Function(&mut self, arg1: *mut Union) { + Struct_Function(self, arg1) + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub struct Union { + _unused: [u8; 0], +} diff --git a/tests/headers/parm-union.hpp b/tests/headers/parm-union.hpp new file mode 100644 index 0000000000..e36df69120 --- /dev/null +++ b/tests/headers/parm-union.hpp @@ -0,0 +1,4 @@ +struct Struct +{ + void Function(union Union&); +};