]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.20] cmd/compile: fix ir.StaticValue for ORANGE
authorJunwei Zuo <zuojunwei.2023@bytedance.com>
Wed, 12 Apr 2023 10:53:51 +0000 (18:53 +0800)
committerMatthew Dempsky <mdempsky@google.com>
Wed, 12 Apr 2023 20:25:12 +0000 (20:25 +0000)
Range statement will mutate the key and value, so we should treat them as reassigned.

Fixes #59580

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>
(cherry picked from commit 89567a35c11c343cf765d6fb1270e1250e50d83f)
Reviewed-on: https://go-review.googlesource.com/c/go/+/484136
Run-TryBot: Matthew Dempsky <mdempsky@google.com>

src/cmd/compile/internal/ir/expr.go
test/fixedbugs/issue59572.go [new file with mode: 0644]
test/fixedbugs/issue59572.out [new file with mode: 0644]

index a481b14f8b94c0751aa416fe04cdb6e1077f5f3d..e549c08d0c14474b34873068129161d40642ea23 100644 (file)
@@ -959,6 +959,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 (file)
index 0000000..a16817a
--- /dev/null
@@ -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 (file)
index 0000000..01e79c3
--- /dev/null
@@ -0,0 +1,3 @@
+1
+2
+3