diff --git a/src/cmd/compile/internal/walk/order.go b/src/cmd/compile/internal/walk/order.go index 1e76761de3..057e0b75b8 100644 --- a/src/cmd/compile/internal/walk/order.go +++ b/src/cmd/compile/internal/walk/order.go @@ -755,7 +755,7 @@ func (o *orderState) stmt(n ir.Node) { o.out = append(o.out, n) o.popTemp(t) - case ir.OMAX, ir.OMIN, ir.OPRINT, ir.OPRINTN, ir.ORECOVERFP: + case ir.OPRINT, ir.OPRINTN, ir.ORECOVERFP: n := n.(*ir.CallExpr) t := o.markTemp() o.call(n) @@ -1247,6 +1247,8 @@ func (o *orderState) expr1(n, lhs ir.Node) ir.Node { ir.OMAKEMAP, ir.OMAKESLICE, ir.OMAKESLICECOPY, + ir.OMAX, + ir.OMIN, ir.ONEW, ir.OREAL, ir.ORECOVERFP, diff --git a/test/fixedbugs/issue60990.go b/test/fixedbugs/issue60990.go new file mode 100644 index 0000000000..ce94fa7197 --- /dev/null +++ b/test/fixedbugs/issue60990.go @@ -0,0 +1,31 @@ +// compile + +// Copyright 2023 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. + +package p + +type T struct{ _, _ []int } + +func F[_ int]() { + var f0, f1 float64 + var b bool + _ = func(T, float64) bool { + b = deepEqual(0, 1) + return func() bool { + f1 = min(f0, 0) + return b + }() + }(T{nil, nil}, min(0, f1)) + f0 = min(0, 1) +} + +//go:noinline +func deepEqual(x, y any) bool { + return x == y +} + +func init() { + F[int]() +}