]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.17] 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)
committerHeschi Kreinick <heschi@google.com>
Wed, 24 Nov 2021 19:38:31 +0000 (19:38 +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().

Cherry-picked from https://go-review.googlesource.com/c/go/+/348569

Fixes #49511

Change-Id: Id5b736daa8e90afda88aaa3769dde801db294c0d
Reviewed-on: https://go-review.googlesource.com/c/go/+/363664
Trust: Dan Scales <danscales@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
src/cmd/compile/internal/noder/transform.go
src/cmd/compile/internal/typecheck/stmt.go
test/fixedbugs/issue48289.go [new file with mode: 0644]

index 2859089e69b91386010db02268764a66aa2de7aa..1a0c4d94c7e3f594a87578a0cb557054b6e88b08 100644 (file)
@@ -495,10 +495,11 @@ func transformSelect(sel *ir.SelectStmt) {
                if ncase.Comm != nil {
                        n := ncase.Comm
                        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() {
                        case ir.OAS:
index 922a01bfbe9aa7d6dea6ab34e03e5955ef883105..2fc6d04e854786eaef02223c18d2a40c11c6fea2 100644 (file)
@@ -383,10 +383,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))
+               }
+       }
+}