1
0
mirror of https://github.com/golang/go synced 2024-11-23 07:50:05 -07:00

cmd/compile: allow importing and exporting of ODYNAMICTYPE

Change-Id: I2fca7a801c85ed93c002c23bfcb0cf9593f1bdf4
Reviewed-on: https://go-review.googlesource.com/c/go/+/356571
Trust: Keith Randall <khr@golang.org>
Trust: Dan Scales <danscales@google.com>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
Keith Randall 2021-10-18 10:59:29 -07:00
parent 9fa85518ff
commit 2be5b84665
4 changed files with 63 additions and 0 deletions

View File

@ -1763,6 +1763,19 @@ func (w *exportWriter) expr(n ir.Node) {
w.op(ir.OTYPE) w.op(ir.OTYPE)
w.typ(n.Type()) w.typ(n.Type())
case ir.ODYNAMICTYPE:
n := n.(*ir.DynamicType)
w.op(ir.ODYNAMICTYPE)
w.pos(n.Pos())
w.expr(n.X)
if n.ITab != nil {
w.bool(true)
w.expr(n.ITab)
} else {
w.bool(false)
}
w.typ(n.Type())
case ir.OTYPESW: case ir.OTYPESW:
n := n.(*ir.TypeSwitchGuard) n := n.(*ir.TypeSwitchGuard)
w.op(ir.OTYPESW) w.op(ir.OTYPESW)

View File

@ -1312,6 +1312,14 @@ func (r *importReader) node() ir.Node {
case ir.OTYPE: case ir.OTYPE:
return ir.TypeNode(r.typ()) return ir.TypeNode(r.typ())
case ir.ODYNAMICTYPE:
n := ir.NewDynamicType(r.pos(), r.expr())
if r.bool() {
n.ITab = r.expr()
}
n.SetType(r.typ())
return n
case ir.OTYPESW: case ir.OTYPESW:
pos := r.pos() pos := r.pos()
var tag *ir.Ident var tag *ir.Ident

View File

@ -15,7 +15,41 @@ func conv[T any](v interface{}) T {
func Conv2(v interface{}) (string, bool) { func Conv2(v interface{}) (string, bool) {
return conv2[string](v) return conv2[string](v)
} }
func conv2[T any](v interface{}) (T, bool) { func conv2[T any](v interface{}) (T, bool) {
x, ok := v.(T) x, ok := v.(T)
return x, ok return x, ok
} }
func Conv3(v interface{}) string {
return conv3[string](v)
}
func conv3[T any](v interface{}) T {
switch v := v.(type) {
case T:
return v
default:
var z T
return z
}
}
type Mystring string
func (Mystring) Foo() {
}
func Conv4(v interface{Foo()}) Mystring {
return conv4[Mystring](v)
}
func conv4[T interface{Foo()}](v interface{Foo()}) T {
switch v := v.(type) {
case T:
return v
default:
var z T
return z
}
}

View File

@ -22,4 +22,12 @@ func main() {
if y != s { if y != s {
panic(fmt.Sprintf("got %s wanted %s", y, s)) panic(fmt.Sprintf("got %s wanted %s", y, s))
} }
z := a.Conv3(s)
if z != s {
panic(fmt.Sprintf("got %s wanted %s", z, s))
}
w := a.Conv4(a.Mystring(s))
if w != a.Mystring(s) {
panic(fmt.Sprintf("got %s wanted %s", w, s))
}
} }