bytecodealliance / bytecodealliance/wit-bindgen
C++ bindgen: function with two `own<resource>` args returns an error handle
- Dominant language
- Rust
- Stars
- 1.5k
- Forks
- 286
- Avg merge
- 6h 32m
- Merged PRs (30d)
- 19
Description
Summary: C++ provider component lifts a non-empty string return value as an empty string.
A wit-bindgen-cpp bug where a C++ provider component returns an empty string in place of the actual string value (e.g. "temres26"), observed consistently across all consumer languages.
## Environment
| component | version |
|---|---|
| OS | macOS 15.7 (Darwin 24.6.0), x86_64 |
| jco | 1.16.1 (source checkout, tag jco-v1.16.1) |
| Node.js | v22.22.2 |
| wac | wac-cli 0.8.1 |
| wasi-sdk | 27.0 (wasm32-wasip2-clang/clang++) |
## Steps to reproduce
The full chain is: compile the guest sources into a provider component and a consumer component, compose them with `wac`, then run the composed component. Prebuilt copies of every artifact are included (`components/provider.wasm`, `components/consumer.wasm`, `composed.wasm`), so you can also skip straight to step 5.
**Github repo:https://github.com/xiaozzzZZzzz240/G051-Cplusplus-string-return-from-a-resource-method-comes-back-empty**
1. Clone this repository:
```console
git clone
cd
```
2. Compile the provider component from the **C++** sources in `src/provider-Cpp/` (toolchain versions in the table above; the WIT package is in `wit/`):
```console
wasm32-wasip2-clang++ -std=c++23 -fno-exceptions -o components/provider.wasm -mexec-model=reactor src/provider-Cpp/world69-uvfx7r7j_generated.cpp src/provider-Cpp/world69_uvfx7r7j.cpp src/provider-Cpp/world69_uvfx7r7j_component_type.o
```
3. Compile the consumer component from the **C** sources in `src/consumer-C/`:
```console
wasm32-wasip2-clang -o components/consumer.wasm -mexec-model=reactor src/consumer-C/world69b-myhp0jr6_generated.c src/consumer-C/world69b_myhp0jr6.c src/consumer-C/world69b_myhp0jr6_component_type.o
```
4. Compose the two components into one runnable component with wac 0.8.1:
```console
wac plug components/consumer.wasm --plug components/provider.wasm -o composed.wasm
```
5. Run the composed component with jco:
```console
npm install -g @bytecodealliance/jco@1.16.1
jco run composed.wasm
```
## Expected result
The composed component should print exactly the following, then exit 0:
```text
"resinst0"
"resinst0"
"foo"
true
true
"temres132"
resource("temres26")
([resource("temres28")], "foo")
true
resource("temres160")
resource("temres161")
true
"temres26"
"temres32"
7
"p"
```
## Actual result
Under **jco** the same `composed.wasm` exits with rc=0. stdout:
```text
"resinst0"
"resinst0"
"foo"
true
true
"temres132"
resource("temres26")
([resource("temres28")], "foo")
true
resource("temres160")
resource("temres161")
true
""
"temres32"
7
"p"
```
stderr:
```text
(empty)
```
wasmtime on the exact same file: rc=1
```text
"resinst0"
"resinst0"
"foo"
true
true
"temres132"
resource("temres26")
([resource("temres28")], "foo")
true
resource("temres160")
resource("temres161")
true
--- stderr ---
Error: failed to run main module `/Users/myuser/WASM/myProject/Wasm_component_testing/mycode/execute/reportrepo/G051-wit-bindgen-cpp-returns-empty-string-instead-of-original-value/composed.wasm`
Caused by:
0: failed to invoke `run` function
1: error while executing at wasm backtrace:
0: 0x5fe - !
1: 0xa18f9 - wit-component:shim!indirect-mydefined:package3hl16smu1p/itf-n3bcdaqpyw-f-ywm7quh
2: 0x64eca - consumer.wasm!mydefined_package3hl16smu1p_itf_n3bcdaqpyw_f_ywm7quh
3: 0x642eb - consumer.wasm!exports_wasi_cli_run_run
4: 0x64fd1 - consumer.wasm!__wasm_export_exports_wasi_cli_run_run
note: using the `WASMTIME_BACKTRACE_DETAILS=1` environment variable may show more debugging information
2: unknown handle index 521124
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.