1
0
mirror of https://github.com/golang/go synced 2024-11-26 09:08:07 -07:00

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 #54302.

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>
This commit is contained in:
Matthew Dempsky 2022-08-05 16:09:22 -07:00 committed by Gopher Robot
parent d75e186e2c
commit 0c4db1e347
5 changed files with 45 additions and 2 deletions

View File

@ -1928,7 +1928,9 @@ func (w *exportWriter) expr(n ir.Node) {
w.op(n.Op()) w.op(n.Op())
w.pos(n.Pos()) w.pos(n.Pos())
w.expr(n.X) w.expr(n.X)
w.expr(n.RType) if w.bool(n.RType != nil) {
w.expr(n.RType)
}
if w.bool(n.ITab != nil) { if w.bool(n.ITab != nil) {
w.expr(n.ITab) w.expr(n.ITab)
} }

View File

@ -1460,7 +1460,10 @@ func (r *importReader) node() ir.Node {
return n return n
case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2: 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() { if r.bool() {
n.ITab = r.expr() n.ITab = r.expr()
} }

View File

@ -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) {}

View File

@ -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()
}

View File

@ -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