bytecodealliance / bytecodealliance/wit-bindgen
C: handling of `@deprecated` items results in breaking changes
- Dominant language
- Rust
- Stars
- 1.5k
- Forks
- 286
- Avg merge
- 6h 32m
- Merged PRs (30d)
- 19
Description
In https://github.com/WebAssembly/wasi-http/issues/133 @brendanburns reported that upgrading from `wasi/http@0.2.1` to `wasi/http@0.2.2` resulted in breaking changes in `wit-bindgen`'s C output, causing the following error:
```html
/usr/local/lib/wasi-sdk-22.0/bin/clang -c wasi_http.c -o wasi_http.o
wasi_http.c:48:5: error: unknown type name 'client_tuple2_field_key_field_value_t'; did you mean 'client_tuple2_field_name_field_value_t'?
48 | client_tuple2_field_key_field_value_t *headers = malloc(sizeof(client_tuple2_field_key_field_value_t) * wasi_response.headers.len);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| client_tuple2_field_name_field_value_t
./client.h:418:3: note: 'client_tuple2_field_name_field_value_t' declared here
418 | } client_tuple2_field_name_field_value_t;
| ^
wasi_http.c:48:68: error: use of undeclared identifier 'client_tuple2_field_key_field_value_t'
48 | client_tuple2_field_key_field_value_t *headers = malloc(sizeof(client_tuple2_field_key_field_value_t) * wasi_response.headers.len);
| ^
wasi_http.c:56:5: error: unknown type name 'client_list_tuple2_field_key_field_value_t'; did you mean 'client_list_tuple2_field_name_field_value_t'?
56 | client_list_tuple2_field_key_field_value_t header_list = {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| client_list_tuple2_field_name_field_value_t
./client.h:423:3: note: 'client_list_tuple2_field_name_field_value_t' declared here
423 | } client_list_tuple2_field_name_field_value_t;
| ^
wasi_http.c:106:5: error: unknown type name 'client_tuple2_field_key_field_value_t'; did you mean 'client_tuple2_field_name_field_value_t'?
106 | client_tuple2_field_key_field_value_t content_type[] = {{
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| client_tuple2_field_name_field_value_t
./client.h:418:3: note: 'client_tuple2_field_name_field_value_t' declared here
418 | } client_tuple2_field_name_field_value_t;
| ^
wasi_http.c:114:5: error: unknown type name 'client_list_tuple2_field_key_field_value_t'; did you mean 'client_list_tuple2_field_name_field_value_t'?
114 | client_list_tuple2_field_key_field_value_t headers_list = {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| client_list_tuple2_field_name_field_value_t
./client.h:423:3: note: 'client_list_tuple2_field_name_field_value_t' declared here
423 | } client_list_tuple2_field_name_field_value_t;
| ^
wasi_http.c:194:5: error: unknown type name 'client_list_tuple2_field_key_field_value_t'; did you mean 'client_list_tuple2_field_name_field_value_t'?
194 | client_list_tuple2_field_key_field_value_t header_list;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| client_list_tuple2_field_name_field_value_t
./client.h:423:3: note: 'client_list_tuple2_field_name_field_value_t' declared here
423 | } client_list_tuple2_field_name_field_value_t;
| ^
6 errors generated.
make: *** [Makefile:17: wasi_http.o] Error 1
```
This seems to point at an issue handling `@deprecated` in WIT. Specifically https://github.com/WebAssembly/wasi-http/pull/127 which marked `field-key` as deprecated:
```diff
+ @deprecated(version = 0.2.2)
type field-key = string;
```
The intent of the `@deprecated` tag is to enable both tooling and host runtimes to alert users an API should no longer be used. But crucially: the API is still considered a required part of the WIT document and is part of the public contract. `@deprecated` types not being generated by wit-bindgen targeting C strikes me as a bug we should fix.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.