aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cmd/compile/internal/gc/inl.go8
-rw-r--r--test/fixedbugs/issue43292.go59
2 files changed, 65 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/gc/inl.go b/src/cmd/compile/internal/gc/inl.go
index 419056985f..600d12b59b 100644
--- a/src/cmd/compile/internal/gc/inl.go
+++ b/src/cmd/compile/internal/gc/inl.go
@@ -832,16 +832,20 @@ func (v *reassignVisitor) visit(n *Node) *Node {
return nil
}
switch n.Op {
- case OAS:
+ case OAS, OSELRECV:
if n.Left == v.name && n != v.name.Name.Defn {
return n
}
- case OAS2, OAS2FUNC, OAS2MAPR, OAS2DOTTYPE:
+ case OAS2, OAS2FUNC, OAS2MAPR, OAS2DOTTYPE, OAS2RECV:
for _, p := range n.List.Slice() {
if p == v.name && n != v.name.Name.Defn {
return n
}
}
+ case OSELRECV2:
+ if (n.Left == v.name || n.List.First() == v.name) && n != v.name.Name.Defn {
+ return n
+ }
}
if a := v.visit(n.Left); a != nil {
return a
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 }