- Notifications
You must be signed in to change notification settings - Fork758
Open
Description
Input C/C++ Header
#include<cstdint>structFoo {size_t data;};structBar {size_t data;~Bar() { data =0; }};FooMakeFoo();// { return Foo(); }BarMakeBar();// { return Bar(); }
Bindgen Invocation
bindgen::Builder::default().clang_args(&["-x","c++","-std=c++11"]).header("input.h").generate().unwrap()
Actual Results
#[repr(C)]#[derive(Debug,Copy)]pubstructFoo{pubdata:usize,}implCloneforFoo{fnclone(&self) ->Self{*self}}#[repr(C)]#[derive(Debug)]pubstructBar{pubdata:usize,}extern"C"{#[link_name ="_ZN3BarD1Ev"]pubfnBar_Bar_destructor(this:*mutBar);}implBar{#[inline]pubunsafefndestruct(&mutself){Bar_Bar_destructor(self)}}extern"C"{#[link_name ="_Z7MakeFoov"]pubfnMakeFoo() ->Foo;}extern"C"{#[link_name ="_Z7MakeBarv"]pubfnMakeBar() ->Bar;}
Expected Results
Not sure...
Discussion
MakeFoo
andMakeBar
look very similar, however in C++ they use different ABIs, at least on Linux.
Here's a quote fromSystem V AMD64 ABI spec (page 20):
If a C++ object has either a non-trivial copy constructor or a non-trivial
destructor11, it is passed by invisible reference (the object is replaced in the
parameter list by a pointer that has class POINTER)12
This means that whileFoo
get returned by-value in therax
register,Bar
must be returned by-pointer to a caller allocated memory. To Rust compiler, however, these look identical, so it expects both to be returned inrax
.