Range statement will mutate the key and value, so we should treat them as reassigned.
Fixes #59572
Change-Id: I9c6b67d938760a0c6a1d9739f2737c67af4a3a10
Reviewed-on: https://go-review.googlesource.com/c/go/+/483855
Run-TryBot: Wayne Zuo <wdvxdr@golangcn.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
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) {
--- /dev/null
+// 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")
+ },
+}