mirror of
https://github.com/golang/go
synced 2024-11-17 11:14:46 -07:00
cmd/compile: fix case where init info of OAS node is dropped
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>
This commit is contained in:
parent
f9271e4f85
commit
b9e1a24581
@ -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() {
|
||||
|
@ -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:
|
||||
|
28
test/fixedbugs/issue48289.go
Normal file
28
test/fixedbugs/issue48289.go
Normal file
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user