bytecodealliance / bytecodealliance/wit-bindgen

Cannot generate Rust bindings for worlds with overlapping exports in the same crate using `pub_export_macro: true`

Open
#1,502 1 comment 0 reactions 0 assignees View on GitHub
gen-rust
Dominant language
Rust
Stars
1.5k
Forks
286
Avg merge
6h 32m
Merged PRs (30d)
19

Description

This input:

```rust
mod a {
wit_bindgen::generate!({
inline: r#"
package a:b;

interface foo {
x: func();
}

world a {
export foo;
}
"#,
world: "a",
pub_export_macro: true,
});
}

mod b {
wit_bindgen::generate!({
inline: r#"
package a:b;

interface foo {
x: func();
}

interface bar {
x: func();
}

world b {
export foo;
export bar;
}
"#,
world: "b",
pub_export_macro: true,
});
}

fn main() {}
```

fails with:

```
error[E0428]: the name `__export_a_b_foo_cabi` is defined multiple times
--> src/main.rs:20:5
|
2 | wit_bindgen::generate!({
| ----------------------- previous definition of the macro `__export_a_b_foo_cabi` here
...
20 | wit_bindgen::generate!({
| ^^^^^^^^^^^^^^^^^^^^^^^ `__export_a_b_foo_cabi` redefined here
|
= note: `__export_a_b_foo_cabi` must be defined only once in the macro namespace of this module
= note: this error originates in the macro `wit_bindgen::generate` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0428`.
error: could not compile `wat` (bin "wat") due to 1 previous error
```

Basically we need to do more namespacing/scoping of macros that avoids `#[macro_export]`. I couldn't figure it out earlier but it's probably possible nowadays.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.