diff options
author | Adrian Taylor <adetaylor@chromium.org> | 2021-05-18 06:51:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-18 15:51:52 +0200 |
commit | b60339ece3994868a55889b7f1f6043ab29ba30e (patch) | |
tree | e2663e59f133f79c5f776f6630e2fed4dcd65e0e | |
parent | e6684dc5c56d0283b9c14b34f68d445e9d5a580f (diff) |
Identify forward declarations in params. (#2052)
-rw-r--r-- | src/clang.rs | 2 | ||||
-rw-r--r-- | src/ir/comp.rs | 1 | ||||
-rw-r--r-- | tests/expectations/tests/parm-union.rs | 40 | ||||
-rw-r--r-- | tests/headers/parm-union.hpp | 4 |
4 files changed, 46 insertions, 1 deletions
diff --git a/src/clang.rs b/src/clang.rs index 96f77254..db6467e3 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 52dcddd5..d57c272a 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 00000000..9f7dd20a --- /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::<Struct>(), + 1usize, + concat!("Size of: ", stringify!(Struct)) + ); + assert_eq!( + ::std::mem::align_of::<Struct>(), + 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 00000000..e36df691 --- /dev/null +++ b/tests/headers/parm-union.hpp @@ -0,0 +1,4 @@ +struct Struct +{ + void Function(union Union&); +}; |