diff --git a/src/cmd/compile/internal/ir/expr.go b/src/cmd/compile/internal/ir/expr.go index 39ebc37634..3cf52debf9 100644 --- a/src/cmd/compile/internal/ir/expr.go +++ b/src/cmd/compile/internal/ir/expr.go @@ -958,6 +958,11 @@ func reassigned(name *Name) bool { if isName(OuterValue(n.X)) { return true } + case ORANGE: + n := n.(*RangeStmt) + if isName(n.Key) || isName(n.Value) { + return true + } case OCLOSURE: n := n.(*ClosureExpr) if Any(n.Func, do) { diff --git a/test/fixedbugs/issue59572.go b/test/fixedbugs/issue59572.go new file mode 100644 index 0000000000..a16817aec0 --- /dev/null +++ b/test/fixedbugs/issue59572.go @@ -0,0 +1,30 @@ +// run + +// 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 main + +func foo() { + println("foo") +} + +func main() { + fn := foo + for _, fn = range list { + fn() + } +} + +var list = []func(){ + func() { + println("1") + }, + func() { + println("2") + }, + func() { + println("3") + }, +} diff --git a/test/fixedbugs/issue59572.out b/test/fixedbugs/issue59572.out new file mode 100644 index 0000000000..01e79c32a8 --- /dev/null +++ b/test/fixedbugs/issue59572.out @@ -0,0 +1,3 @@ +1 +2 +3