]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix case where init info of OAS node is dropped
authorDan Scales <danscales@google.com>
Wed, 8 Sep 2021 15:41:54 +0000 (08:41 -0700)
committerDan Scales <danscales@google.com>
Thu, 9 Sep 2021 19:17:02 +0000 (19:17 +0000)
When an OAS node is converted to an OSELRECV2 node in tcSelect(), the
possible DCL node in the Init field was being dropped, since a
completely new node was being created and the Init field was not set. I
don't expect n.Init() to be set for the ORECV case, but the code now
deals with that too.

Fixed bug in both tcSelect() and transformSelect().

Fixes #48289

Change-Id: I09918a70f7cbaa4aa9a17546169f908a8787df15
Reviewed-on: https://go-review.googlesource.com/c/go/+/348569
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Dan Scales <danscales@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
src/cmd/compile/internal/noder/transform.go
src/cmd/compile/internal/typecheck/stmt.go
test/fixedbugs/issue48289.go [new file with mode: 0644]

index b278f3db09c7db4a8a4b4e65472ca5e57d44b260..8173bfc747f20ce59f8f36a858d0a0b1eb035e8b 100644 (file)
@@ -554,6 +554,7 @@ func transformSelect(sel *ir.SelectStmt) {
                                }
                                selrecv.Def = def
                                selrecv.SetTypecheck(1)
+                               selrecv.SetInit(n.Init())
                                ncase.Comm = selrecv
                        }
                        switch n.Op() {
index c322d490e5b2a07ac6524afd40900b182bd18392..9a02c1752caf13f6c89e26866e01ba553a767e62 100644 (file)
@@ -395,10 +395,11 @@ func tcSelect(sel *ir.SelectStmt) {
                        n := Stmt(ncase.Comm)
                        ncase.Comm = n
                        oselrecv2 := func(dst, recv ir.Node, def bool) {
-                               n := ir.NewAssignListStmt(n.Pos(), ir.OSELRECV2, []ir.Node{dst, ir.BlankNode}, []ir.Node{recv})
-                               n.Def = def
-                               n.SetTypecheck(1)
-                               ncase.Comm = n
+                               selrecv := ir.NewAssignListStmt(n.Pos(), ir.OSELRECV2, []ir.Node{dst, ir.BlankNode}, []ir.Node{recv})
+                               selrecv.Def = def
+                               selrecv.SetTypecheck(1)
+                               selrecv.SetInit(n.Init())
+                               ncase.Comm = selrecv
                        }
                        switch n.Op() {
                        default:
diff --git a/test/fixedbugs/issue48289.go b/test/fixedbugs/issue48289.go
new file mode 100644 (file)
index 0000000..94dbeee
--- /dev/null
@@ -0,0 +1,28 @@
+// run
+
+// Copyright 2021 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
+
+import "fmt"
+
+func main() {
+       ch := make(chan int, 1)
+
+       var ptrs [2]*int
+       for i := range ptrs {
+               ch <- i
+               select {
+               case x := <-ch:
+                       ptrs[i] = &x
+               }
+       }
+
+       for i, ptr := range ptrs {
+               if *ptr != i {
+                       panic(fmt.Sprintf("got *ptr %d, want %d", *ptr, i))
+               }
+       }
+}