diff options
-rw-r--r-- | src/ir/context.rs | 8 | ||||
-rw-r--r-- | src/ir/function.rs | 10 |
2 files changed, 17 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..0eecf960 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 ctx.is_target_wasm32() && is_constructor { + // 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. |