From: Cherry Mui Date: Thu, 5 Sep 2024 22:56:26 +0000 (-0400) Subject: cmd/compile: correct wasmexport result type checking X-Git-Tag: go1.24rc1~928 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=eb975601a07ad25a47fdcb0cc6166ec695973d3e;p=gostls13.git cmd/compile: correct wasmexport result type checking The function resultsToWasmFields was originally for only wasmimport. I adopted it for wasmexport as well, but forgot to update a few places that were wasmimport-specific. This leads to compiler panic if an invalid result type is passed, and also unsafe.Pointer not actually supported. This CL fixes it. Updates #65199. Change-Id: I9bbd7154b70422504994840ff541c39ee596ee8f Reviewed-on: https://go-review.googlesource.com/c/go/+/611315 Reviewed-by: Michael Knyszek Reviewed-by: Achille Roussel LUCI-TryBot-Result: Go LUCI --- diff --git a/src/cmd/compile/internal/ssagen/abi.go b/src/cmd/compile/internal/ssagen/abi.go index 9e89da90c9..6b6adff81f 100644 --- a/src/cmd/compile/internal/ssagen/abi.go +++ b/src/cmd/compile/internal/ssagen/abi.go @@ -451,8 +451,10 @@ func resultsToWasmFields(f *ir.Func, pragma string, result *abi.ABIParamResultIn wfs[i].Type = obj.WasmF32 case types.TFLOAT64: wfs[i].Type = obj.WasmF64 + case types.TUNSAFEPTR: + wfs[i].Type = obj.WasmPtr default: - base.ErrorfAt(f.Pos(), 0, "go:wasmimport %s %s: unsupported result type %s", f.WasmImport.Module, f.WasmImport.Name, t.String()) + base.ErrorfAt(f.Pos(), 0, "%s: unsupported result type %s", pragma, t.String()) } wfs[i].Offset = p.FrameOffset(result) } diff --git a/test/wasmexport2.go b/test/wasmexport2.go index c7c0fa2ec8..e3b3bbed6e 100644 --- a/test/wasmexport2.go +++ b/test/wasmexport2.go @@ -24,6 +24,9 @@ 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 bad1 func bad1(string) {} // ERROR "go:wasmexport: unsupported parameter type" @@ -54,5 +57,11 @@ func bad7(*S) {} // ERROR "go:wasmexport: unsupported parameter type" //go:wasmexport bad8 func bad8([4]int32) {} // ERROR "go:wasmexport: unsupported parameter type" +//go:wasmexport bad9 +func bad9() bool { return false } // ERROR "go:wasmexport: unsupported result type" + +//go:wasmexport bad10 +func bad10() *byte { return nil } // ERROR "go:wasmexport: unsupported result type" + //go:wasmexport toomanyresults func toomanyresults() (int32, int32) { return 0, 0 } // ERROR "go:wasmexport: too many return values"