You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
let bindings = bindgen::Builder::default().header("header.hpp").opaque_type("std::.*").whitelist_type("example_type").rust_target(bindgen::RustTarget::Nightly).parse_callbacks(Box::new(bindgen::CargoCallbacks)).generate().expect("Unable to generate bindings");
Output binding:
pubtypeexample_type = [u128;3usize];
With just a plain typedef like this all is well, but in many situations bindgen also needs to use this type (possibly indirectly) in an extern "C" {...} block, resulting in warnings like this:
warning: `extern` block uses type`[u128; 3usize]`, which is not FFI-safe
--> src/../bindings.rs:9772:18
|
9772 | root::example_type;| ^^^^^^^^^^^^^^^^^^ not FFI-safe
|
= help: consider passing a pointer to the array
= note: passing raw arrays by value is not FFI-safe
warning: `extern` block uses type`u128`, which is not FFI-safe
--> src/../bindings.rs:1230:27
|
1230 | this: *const root::example_type,
| ^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe
|
= note: 128-bit integers don't currently have a known stable ABI
While not strictly an error, it makes me uneasy that function pointers may or may not be interpreted correctly between the C++ library I need to use and my own code.
Is there a way to get bindgen to generate, say, &[u64; 6usize] or something for std::functions instead? Is this intended behavior or unexpected?
I have a feeling this could be related to the use of .opaque_type("std::.*"), but whitelisting std::function doesn't seem to change anything and I'd greatly prefer not to generate bindings for all of std.
The text was updated successfully, but these errors were encountered:
Yes, this is what opaque_type causes when used on this kind of stuff... That being said, it seems to me it's a rust bug to complain that *const root::example_type is not FFI-safe...
Out of curiosity, why is this mapping happening? Does this array represent multiple pointers (context, parameters and return value?) or what does it mean semantically?
This related issue #2071 (comment) states that basically the example_type should not be translated by bindgen, but since bindgen does it anyway, the user should blocklist it manually.
header.hpp
:bindgen
invocation:Output binding:
With just a plain
typedef
like this all is well, but in many situationsbindgen
also needs to use this type (possibly indirectly) in anextern "C" {...}
block, resulting in warnings like this:While not strictly an error, it makes me uneasy that function pointers may or may not be interpreted correctly between the C++ library I need to use and my own code.
Is there a way to get
bindgen
to generate, say,&[u64; 6usize]
or something forstd::function
s instead? Is this intended behavior or unexpected?I have a feeling this could be related to the use of
.opaque_type("std::.*")
, but whitelistingstd::function
doesn't seem to change anything and I'd greatly prefer not to generate bindings for all ofstd
.The text was updated successfully, but these errors were encountered: