aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2020-12-20 01:15:46 -0800
committerMatthew Dempsky <mdempsky@google.com>2020-12-20 09:43:29 +0000
commit89b44b4e2bb2f88474d6b8476f5c28ea2aea9b28 (patch)
tree7226ca815c07dcab272ec63d38552ea20c7464f4 /test
parent55b58018f41e6de63bdaa8f3d9a284077d4e88c1 (diff)
downloadgo-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.go59
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 }