diff --git a/crates/rust/src/interface.rs b/crates/rust/src/interface.rs index 38caf7c14..c81c3271e 100644 --- a/crates/rust/src/interface.rs +++ b/crates/rust/src/interface.rs @@ -1887,6 +1887,11 @@ unsafe fn call_import(&mut self, _params: Self::ParamsLower, _results: *mut u8) return format!("{path}::{name}"); } } + // World-level aliases live at macro root. `path_to_root()` is + // `""` at root, `"super::super::"` in stream/future payload mode. + if let TypeOwner::World(_) = self.resolve.types[id].owner { + return format!("{}{name}", self.path_to_root()); + } name } diff --git a/crates/rust/tests/codegen.rs b/crates/rust/tests/codegen.rs index a6df22cf9..773b31b30 100644 --- a/crates/rust/tests/codegen.rs +++ b/crates/rust/tests/codegen.rs @@ -235,3 +235,25 @@ mod method_chaining { enable_method_chaining: true }); } + +// Regression for #1598: world-level `use t.{r};` inside +// `future>` used to emit unresolved bare `R` in vtable{N}. +#[allow(unused, reason = "testing codegen, not functionality")] +mod issue_1598_future_result_use { + wit_bindgen::generate!({ + inline: r#" + package a:b; + + world w { + use t.{r}; + export f: func() -> future>; + } + + interface t { + record r { + x: u32, + } + } + "#, + }); +}