Skip to content

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

@alexcrichton

Description

@alexcrichton

This input:

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    gen-rustRelated to bindings for Rust-compiled-to-WebAssembly

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions