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:
parent
9fa85518ff
commit
2be5b84665
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user