aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2022-08-05 16:09:22 -0700
committerThan McIntosh <thanm@google.com>2022-08-11 12:53:59 +0000
commit3c200d6c81e75348e583297b1295f8e34b07b61c (patch)
treee0ae98c16eb06c0e33a32509482ca049ac727bd6
parent43456202a1e55da55666fac9d56ace7654a65b64 (diff)
downloadgo-3c200d6c81e75348e583297b1295f8e34b07b61c.tar.gz
go-3c200d6c81e75348e583297b1295f8e34b07b61c.zip
[release-branch.go1.19] cmd/compile: fix import/export of ODYNAMICDOTTYPE
The RType field isn't needed when performing type assertions from non-empty interface types, because we use the ITab field instead. But the inline body exporter didn't know to expect this. It's possible we could use a single bool to distinguish whether we're serializing the RType or ITab field, but using two is simpler and seems safer. Fixes #54309. Change-Id: I9ddac72784fb2241fee0a0dee30493d868a2c259 Reviewed-on: https://go-review.googlesource.com/c/go/+/421755 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Reviewed-by: Keith Randall <khr@google.com> Auto-Submit: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Keith Randall <khr@golang.org> (cherry picked from commit 0c4db1e347dc51589e5289388305b02108ca0aa1) Reviewed-on: https://go-review.googlesource.com/c/go/+/421715 Reviewed-by: Than McIntosh <thanm@google.com>
-rw-r--r--src/cmd/compile/internal/typecheck/iexport.go4
-rw-r--r--src/cmd/compile/internal/typecheck/iimport.go5
-rw-r--r--test/typeparam/issue54302.dir/a.go20
-rw-r--r--test/typeparam/issue54302.dir/main.go11
-rw-r--r--test/typeparam/issue54302.go7
5 files changed, 45 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/typecheck/iexport.go b/src/cmd/compile/internal/typecheck/iexport.go
index d5c4b8e1e8..91a8e7c77d 100644
--- a/src/cmd/compile/internal/typecheck/iexport.go
+++ b/src/cmd/compile/internal/typecheck/iexport.go
@@ -1928,7 +1928,9 @@ func (w *exportWriter) expr(n ir.Node) {
w.op(n.Op())
w.pos(n.Pos())
w.expr(n.X)
- w.expr(n.RType)
+ if w.bool(n.RType != nil) {
+ w.expr(n.RType)
+ }
if w.bool(n.ITab != nil) {
w.expr(n.ITab)
}
diff --git a/src/cmd/compile/internal/typecheck/iimport.go b/src/cmd/compile/internal/typecheck/iimport.go
index 3a51f781f0..270d33a717 100644
--- a/src/cmd/compile/internal/typecheck/iimport.go
+++ b/src/cmd/compile/internal/typecheck/iimport.go
@@ -1465,7 +1465,10 @@ func (r *importReader) node() ir.Node {
return n
case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2:
- n := ir.NewDynamicTypeAssertExpr(r.pos(), op, r.expr(), r.expr())
+ n := ir.NewDynamicTypeAssertExpr(r.pos(), op, r.expr(), nil)
+ if r.bool() {
+ n.RType = r.expr()
+ }
if r.bool() {
n.ITab = r.expr()
}
diff --git a/test/typeparam/issue54302.dir/a.go b/test/typeparam/issue54302.dir/a.go
new file mode 100644
index 0000000000..52875ab5e1
--- /dev/null
+++ b/test/typeparam/issue54302.dir/a.go
@@ -0,0 +1,20 @@
+// Copyright 2022 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 a
+
+func A() {
+ B[int](new(G[int]))
+}
+
+func B[T any](iface interface{ M(T) }) {
+ x, ok := iface.(*G[T])
+ if !ok || iface != x {
+ panic("FAIL")
+ }
+}
+
+type G[T any] struct{}
+
+func (*G[T]) M(T) {}
diff --git a/test/typeparam/issue54302.dir/main.go b/test/typeparam/issue54302.dir/main.go
new file mode 100644
index 0000000000..b4c6cd142d
--- /dev/null
+++ b/test/typeparam/issue54302.dir/main.go
@@ -0,0 +1,11 @@
+// Copyright 2022 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 "./a"
+
+func main() {
+ a.A()
+}
diff --git a/test/typeparam/issue54302.go b/test/typeparam/issue54302.go
new file mode 100644
index 0000000000..f132421c84
--- /dev/null
+++ b/test/typeparam/issue54302.go
@@ -0,0 +1,7 @@
+// rundir
+
+// Copyright 2022 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 p