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:
parent
d75e186e2c
commit
0c4db1e347
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
20
test/typeparam/issue54302.dir/a.go
Normal file
20
test/typeparam/issue54302.dir/a.go
Normal 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) {}
|
11
test/typeparam/issue54302.dir/main.go
Normal file
11
test/typeparam/issue54302.dir/main.go
Normal 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()
|
||||||
|
}
|
7
test/typeparam/issue54302.go
Normal file
7
test/typeparam/issue54302.go
Normal 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
|
Loading…
Reference in New Issue
Block a user