summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ir/context.rs8
-rw-r--r--src/ir/function.rs10
-rw-r--r--tests/expectations/tests/libclang-3.9/wasm-constructor-returns.rs37
-rw-r--r--tests/expectations/tests/libclang-4/wasm-constructor-returns.rs37
-rw-r--r--tests/expectations/tests/wasm-constructor-returns.rs40
-rw-r--r--tests/headers/wasm-constructor-returns.hpp7
6 files changed, 138 insertions, 1 deletions
diff --git a/src/ir/context.rs b/src/ir/context.rs
index 79c682e0..bb0c3f9d 100644
--- a/src/ir/context.rs
+++ b/src/ir/context.rs
@@ -577,6 +577,14 @@ If you encounter an error missing from this list, please file an issue or a PR!"
}
}
+ /// Returns `true` if the target architecture is wasm32
+ pub fn is_target_wasm32(&self) -> bool {
+ match self.target_info {
+ Some(ref ti) => ti.triple.starts_with("wasm32-"),
+ None => false,
+ }
+ }
+
/// Creates a timer for the current bindgen phase. If time_phases is `true`,
/// the timer will print to stderr when it is dropped, otherwise it will do
/// nothing.
diff --git a/src/ir/function.rs b/src/ir/function.rs
index 93a8d89f..a6f63a64 100644
--- a/src/ir/function.rs
+++ b/src/ir/function.rs
@@ -495,7 +495,15 @@ impl FunctionSig {
} else {
ty.ret_type().ok_or(ParseError::Continue)?
};
- let ret = Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx);
+
+ let ret = if is_constructor && ctx.is_target_wasm32() {
+ // Constructors in Clang wasm32 target return a pointer to the object
+ // being constructed.
+ let void = Item::builtin_type(TypeKind::Void, false, ctx);
+ Item::builtin_type(TypeKind::Pointer(void), false, ctx)
+ } else {
+ Item::from_ty_or_ref(ty_ret_type, cursor, None, ctx)
+ };
// Clang plays with us at "find the calling convention", see #549 and
// co. This seems to be a better fix than that commit.
diff --git a/tests/expectations/tests/libclang-3.9/wasm-constructor-returns.rs b/tests/expectations/tests/libclang-3.9/wasm-constructor-returns.rs
new file mode 100644
index 00000000..f207d0d8
--- /dev/null
+++ b/tests/expectations/tests/libclang-3.9/wasm-constructor-returns.rs
@@ -0,0 +1,37 @@
+#![allow(
+ dead_code,
+ non_snake_case,
+ non_camel_case_types,
+ non_upper_case_globals
+)]
+
+#[repr(C)]
+#[derive(Debug, Default, Copy, Clone)]
+pub struct Foo {
+ pub _address: u8,
+}
+#[test]
+fn bindgen_test_layout_Foo() {
+ assert_eq!(
+ ::std::mem::size_of::<Foo>(),
+ 1usize,
+ concat!("Size of: ", stringify!(Foo))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<Foo>(),
+ 1usize,
+ concat!("Alignment of ", stringify!(Foo))
+ );
+}
+extern "C" {
+ #[link_name = "\u{1}_ZN3FooC1Ei"]
+ pub fn Foo_Foo(this: *mut Foo, var: ::std::os::raw::c_int);
+}
+impl Foo {
+ #[inline]
+ pub unsafe fn new(var: ::std::os::raw::c_int) -> Self {
+ let mut __bindgen_tmp = ::std::mem::MaybeUninit::uninit();
+ Foo_Foo(__bindgen_tmp.as_mut_ptr(), var);
+ __bindgen_tmp.assume_init()
+ }
+}
diff --git a/tests/expectations/tests/libclang-4/wasm-constructor-returns.rs b/tests/expectations/tests/libclang-4/wasm-constructor-returns.rs
new file mode 100644
index 00000000..f207d0d8
--- /dev/null
+++ b/tests/expectations/tests/libclang-4/wasm-constructor-returns.rs
@@ -0,0 +1,37 @@
+#![allow(
+ dead_code,
+ non_snake_case,
+ non_camel_case_types,
+ non_upper_case_globals
+)]
+
+#[repr(C)]
+#[derive(Debug, Default, Copy, Clone)]
+pub struct Foo {
+ pub _address: u8,
+}
+#[test]
+fn bindgen_test_layout_Foo() {
+ assert_eq!(
+ ::std::mem::size_of::<Foo>(),
+ 1usize,
+ concat!("Size of: ", stringify!(Foo))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<Foo>(),
+ 1usize,
+ concat!("Alignment of ", stringify!(Foo))
+ );
+}
+extern "C" {
+ #[link_name = "\u{1}_ZN3FooC1Ei"]
+ pub fn Foo_Foo(this: *mut Foo, var: ::std::os::raw::c_int);
+}
+impl Foo {
+ #[inline]
+ pub unsafe fn new(var: ::std::os::raw::c_int) -> Self {
+ let mut __bindgen_tmp = ::std::mem::MaybeUninit::uninit();
+ Foo_Foo(__bindgen_tmp.as_mut_ptr(), var);
+ __bindgen_tmp.assume_init()
+ }
+}
diff --git a/tests/expectations/tests/wasm-constructor-returns.rs b/tests/expectations/tests/wasm-constructor-returns.rs
new file mode 100644
index 00000000..6d15c51f
--- /dev/null
+++ b/tests/expectations/tests/wasm-constructor-returns.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 Foo {
+ pub _address: u8,
+}
+#[test]
+fn bindgen_test_layout_Foo() {
+ assert_eq!(
+ ::std::mem::size_of::<Foo>(),
+ 1usize,
+ concat!("Size of: ", stringify!(Foo))
+ );
+ assert_eq!(
+ ::std::mem::align_of::<Foo>(),
+ 1usize,
+ concat!("Alignment of ", stringify!(Foo))
+ );
+}
+extern "C" {
+ #[link_name = "\u{1}_ZN3FooC1Ei"]
+ pub fn Foo_Foo(
+ this: *mut Foo,
+ var: ::std::os::raw::c_int,
+ ) -> *mut ::std::os::raw::c_void;
+}
+impl Foo {
+ #[inline]
+ pub unsafe fn new(var: ::std::os::raw::c_int) -> Self {
+ let mut __bindgen_tmp = ::std::mem::MaybeUninit::uninit();
+ Foo_Foo(__bindgen_tmp.as_mut_ptr(), var);
+ __bindgen_tmp.assume_init()
+ }
+}
diff --git a/tests/headers/wasm-constructor-returns.hpp b/tests/headers/wasm-constructor-returns.hpp
new file mode 100644
index 00000000..9e470327
--- /dev/null
+++ b/tests/headers/wasm-constructor-returns.hpp
@@ -0,0 +1,7 @@
+// bindgen-flags: --generate constructors,types -- -fvisibility=default --target=wasm32-unknown-emscripten
+
+class Foo {
+public:
+ Foo(int var);
+};
+