diff options
author | Matthew Dempsky <mdempsky@google.com> | 2020-12-20 01:15:46 -0800 |
---|---|---|
committer | Matthew Dempsky <mdempsky@google.com> | 2020-12-20 09:43:29 +0000 |
commit | 89b44b4e2bb2f88474d6b8476f5c28ea2aea9b28 (patch) | |
tree | 7226ca815c07dcab272ec63d38552ea20c7464f4 /test | |
parent | 55b58018f41e6de63bdaa8f3d9a284077d4e88c1 (diff) | |
download | go-89b44b4e2bb2f88474d6b8476f5c28ea2aea9b28.tar.gz go-89b44b4e2bb2f88474d6b8476f5c28ea2aea9b28.zip |
cmd/compile: recognize reassignments involving receives
Previously, reassigned was failing to detect reassignments due to
channel receives in select statements (OSELRECV, OSELRECV2), or due to
standalone 2-value receive assignments (OAS2RECV). This was reported
as a devirtualization panic, but could have caused mis-inlining as
well.
Fixes #43292.
Change-Id: Ic8079c20c0587aeacff9596697fdeba80a697b12
Reviewed-on: https://go-review.googlesource.com/c/go/+/279352
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Diffstat (limited to 'test')
-rw-r--r-- | test/fixedbugs/issue43292.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/test/fixedbugs/issue43292.go b/test/fixedbugs/issue43292.go new file mode 100644 index 0000000000..02f1c69bd1 --- /dev/null +++ b/test/fixedbugs/issue43292.go @@ -0,0 +1,59 @@ +// run + +// Copyright 2020 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 main() { + { + i := I(A{}) + + b := make(chan I, 1) + b <- B{} + + var ok bool + i, ok = <-b + _ = ok + + i.M() + } + + { + i := I(A{}) + + b := make(chan I, 1) + b <- B{} + + select { + case i = <-b: + } + + i.M() + } + + { + i := I(A{}) + + b := make(chan I, 1) + b <- B{} + + var ok bool + select { + case i, ok = <-b: + } + _ = ok + + i.M() + } +} + +type I interface{ M() int } + +type T int + +func (T) M() int { return 0 } + +type A struct{ T } +type B struct{ T } |