| // errorcheck | |
| // Copyright 2024 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Verify that wasmexport supports allowed types and rejects | |
| // unallowed types. | |
| //go:build wasm | |
| package p | |
| import ( | |
| "structs" | |
| "unsafe" | |
| ) | |
| //go:wasmexport good1 | |
| func good1(int32, uint32, int64, uint64, float32, float64, unsafe.Pointer) {} // allowed types | |
| type MyInt32 int32 | |
| //go:wasmexport good2 | |
| func good2(MyInt32) {} // named type is ok | |
| //go:wasmexport good3 | |
| func good3() int32 { return 0 } // one result is ok | |
| //go:wasmexport good4 | |
| func good4() unsafe.Pointer { return nil } // one result is ok | |
| //go:wasmexport good5 | |
| func good5(string, uintptr) bool { return false } // bool, string, and uintptr are allowed | |
| //go:wasmexport bad1 | |
| func bad1(any) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| //go:wasmexport bad2 | |
| func bad2(func()) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| //go:wasmexport bad3 | |
| func bad3(uint8) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| //go:wasmexport bad4 | |
| func bad4(int) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| // Struct and array types are also not allowed. | |
| type S struct { x, y int32 } | |
| type H struct { _ structs.HostLayout; x, y int32 } | |
| type A = structs.HostLayout | |
| type AH struct { _ A; x, y int32 } | |
| //go:wasmexport bad5 | |
| func bad5(S) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| //go:wasmexport bad6 | |
| func bad6(H) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| //go:wasmexport bad7 | |
| func bad7([4]int32) {} // ERROR "go:wasmexport: unsupported parameter type" | |
| // Pointer types are not allowed, with resitrictions on | |
| // the element type. | |
| //go:wasmexport good6 | |
| func good6(*int32, *uint8, *bool) {} | |
| //go:wasmexport bad8 | |
| func bad8(*S) {} // ERROR "go:wasmexport: unsupported parameter type" // without HostLayout, not allowed | |
| //go:wasmexport bad9 | |
| func bad9() *S { return nil } // ERROR "go:wasmexport: unsupported result type" | |
| //go:wasmexport good7 | |
| func good7(*H, *AH) {} // pointer to struct with HostLayout is allowed | |
| //go:wasmexport good8 | |
| func good8(*struct{}) {} // pointer to empty struct is allowed | |
| //go:wasmexport good9 | |
| func good9(*[4]int32, *[2]H) {} // pointer to array is allowed, if the element type is okay | |
| //go:wasmexport toomanyresults | |
| func toomanyresults() (int32, int32) { return 0, 0 } // ERROR "go:wasmexport: too many return values" | |
| //go:wasmexport bad10 | |
| func bad10() string { return "" } // ERROR "go:wasmexport: unsupported result type" // string cannot be a result |