Skip to content

Commit b9e1a24

Browse files
committed
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 <[email protected]> Run-TryBot: Dan Scales <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Cuong Manh Le <[email protected]> Reviewed-by: Matthew Dempsky <[email protected]> Reviewed-by: Robert Griesemer <[email protected]>
1 parent f9271e4 commit b9e1a24

File tree

3 files changed

+34
-4
lines changed

3 files changed

+34
-4
lines changed

src/cmd/compile/internal/noder/transform.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,7 @@ func transformSelect(sel *ir.SelectStmt) {
554554
}
555555
selrecv.Def = def
556556
selrecv.SetTypecheck(1)
557+
selrecv.SetInit(n.Init())
557558
ncase.Comm = selrecv
558559
}
559560
switch n.Op() {

src/cmd/compile/internal/typecheck/stmt.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,10 +395,11 @@ func tcSelect(sel *ir.SelectStmt) {
395395
n := Stmt(ncase.Comm)
396396
ncase.Comm = n
397397
oselrecv2 := func(dst, recv ir.Node, def bool) {
398-
n := ir.NewAssignListStmt(n.Pos(), ir.OSELRECV2, []ir.Node{dst, ir.BlankNode}, []ir.Node{recv})
399-
n.Def = def
400-
n.SetTypecheck(1)
401-
ncase.Comm = n
398+
selrecv := ir.NewAssignListStmt(n.Pos(), ir.OSELRECV2, []ir.Node{dst, ir.BlankNode}, []ir.Node{recv})
399+
selrecv.Def = def
400+
selrecv.SetTypecheck(1)
401+
selrecv.SetInit(n.Init())
402+
ncase.Comm = selrecv
402403
}
403404
switch n.Op() {
404405
default:

test/fixedbugs/issue48289.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// run
2+
3+
// Copyright 2021 The Go Authors. All rights reserved.
4+
// Use of this source code is governed by a BSD-style
5+
// license that can be found in the LICENSE file.
6+
7+
package main
8+
9+
import "fmt"
10+
11+
func main() {
12+
ch := make(chan int, 1)
13+
14+
var ptrs [2]*int
15+
for i := range ptrs {
16+
ch <- i
17+
select {
18+
case x := <-ch:
19+
ptrs[i] = &x
20+
}
21+
}
22+
23+
for i, ptr := range ptrs {
24+
if *ptr != i {
25+
panic(fmt.Sprintf("got *ptr %d, want %d", *ptr, i))
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)