Yes. (I found this issue in the latest release.)
I tried to run the program below.
package main
// multivalued function that one of the results is generic
func aaa[T any]() (T, error) {
var t T
return t, nil
}
// returns results of function call directly
func ng[T any]() (T, error) {
return aaa[T]()
}
// first assigns results of function call to temporary variables, then return them
func ok[T any]() (T, error) {
t, err := aaa[T]()
return t, err
}
func main() {
ng[string]()
// ok[string]()
}
The program compiles and runs successfully.
Compiler panic.
$ go run -gcflags=-G=3 main.go
# command-line-arguments
panic: cannot SetOp XXX on XXX
goroutine 1 [running]:
cmd/compile/internal/ir.(*ConvExpr).SetOp(0xc0000a5bd0, 0x40)
/usr/local/go/src/cmd/compile/internal/ir/expr.go:279 +0xd9
cmd/compile/internal/ir.NewConvExpr({0xb50a0, 0xc0}, 0x10, 0xc0003ca310, {0xe4d2f8, 0xc0000c8360})
/usr/local/go/src/cmd/compile/internal/ir/expr.go:267 +0xae
cmd/compile/internal/noder.assignconvfn({0xe4d2f8, 0xc0000c8360}, 0xc0003ca310)
/usr/local/go/src/cmd/compile/internal/noder/transform.go:421 +0xb3
cmd/compile/internal/noder.typecheckaste(0x18, {0xc0000a59a0, 0xc0000c8360}, 0x0, 0xc000123158, {0xc00009c440, 0x1, 0xc000123158})
/usr/local/go/src/cmd/compile/internal/noder/transform.go:467 +0x179
cmd/compile/internal/noder.transformReturn(0xc0000a59a0)
/usr/local/go/src/cmd/compile/internal/noder/transform.go:488 +0xa8
cmd/compile/internal/noder.(*subster).node.func1({0xe4ebf8, 0xc0000a4730})
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:413 +0x7cb
cmd/compile/internal/noder.(*subster).node(0xc0000a58b0, {0xe4ebf8, 0xc0000a4730})
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:548 +0xa5
cmd/compile/internal/noder.(*subster).list(0xc00009c420, {0xc00009c310, 0x1, 0xc00007c5a0})
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:568 +0x8e
cmd/compile/internal/noder.(*irgen).genericSubst(0xc0000c8000, 0xc0000a5860, 0xc0000aeb60, {0xc00009c3b0, 0x1, 0x1}, 0x0)
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:318 +0x7a5
cmd/compile/internal/noder.(*irgen).getInstantiation(0xc0000c8000, 0xc0000aeb60, {0xc00009c3b0, 0x1, 0x1}, 0xf0)
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:191 +0xc9
cmd/compile/internal/noder.(*irgen).getInstantiationForNode(0xc00009b620, 0xc000094ff0)
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:178 +0x9f
cmd/compile/internal/noder.(*irgen).stencil.func1({0xe4d2f8, 0xc0000c8240})
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:89 +0xda
cmd/compile/internal/ir.Visit.func1({0xe4d2f8, 0xc0000c8240})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:105 +0x30
cmd/compile/internal/ir.doNodes({0xc00009c3d0, 0x1, 0xc0000a6090}, 0xc0000a02a0)
/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1440 +0x67
cmd/compile/internal/ir.(*Func).doChildren(0xe4dac8, 0xc00009e6e0)
/usr/local/go/src/cmd/compile/internal/ir/func.go:151 +0x2e
cmd/compile/internal/ir.DoChildren(...)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0xe4dac8, 0xc00009e6e0})
/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.Visit({0xe4dac8, 0xc00009e6e0}, 0xc0000a8a20)
/usr/local/go/src/cmd/compile/internal/ir/visit.go:108 +0xb8
cmd/compile/internal/noder.(*irgen).stencil(0xc0000c8000)
/usr/local/go/src/cmd/compile/internal/noder/stencil.go:76 +0x1a5
cmd/compile/internal/noder.(*irgen).generate(0xc0000c8000, {0xc000064820, 0x2, 0xc00009c0b0})
/usr/local/go/src/cmd/compile/internal/noder/irgen.go:185 +0x25d
cmd/compile/internal/noder.check2({0xc000064820, 0x0, 0x2})
/usr/local/go/src/cmd/compile/internal/noder/irgen.go:78 +0x5da
cmd/compile/internal/noder.LoadPackage({0xc00001e2a0, 0x2, 0x0})
/usr/local/go/src/cmd/compile/internal/noder/noder.go:80 +0x30b
cmd/compile/internal/gc.Main(0xd16450)
/usr/local/go/src/cmd/compile/internal/gc/main.go:192 +0xb2e
main.main()
/usr/local/go/src/cmd/compile/main.go:55 +0xdd
What version of Go are you using (
go version)?Does this issue reproduce with the latest release?
Yes. (I found this issue in the latest release.)
What operating system and processor architecture are you using (
go env)?go envOutputWhat did you do?
I tried to run the program below.
What did you expect to see?
The program compiles and runs successfully.
What did you see instead?
Compiler panic.
notes
ng) is actually called. If that call is commented out, the program compiles normally.ngbut returns result indirectly (okin the code above) doesn't cause a compiler panic.errorin the code above) are irrelevant to this issue.