mirror of
https://github.com/golang/go
synced 2024-11-23 08:10:03 -07:00
cmd/compile: allow importing and exporting of ODYANMICDOTTYPE[2]
Fixes #49027 Change-Id: I4520b5c754027bfffbc5cd92c9c27002b248c99a Reviewed-on: https://go-review.googlesource.com/c/go/+/356569 Trust: Keith Randall <khr@golang.org> Trust: Dan Scales <danscales@google.com> Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: Dan Scales <danscales@google.com>
This commit is contained in:
parent
4d550727f8
commit
394a1ad295
@ -1888,6 +1888,14 @@ func (w *exportWriter) expr(n ir.Node) {
|
|||||||
w.expr(n.X)
|
w.expr(n.X)
|
||||||
w.typ(n.Type())
|
w.typ(n.Type())
|
||||||
|
|
||||||
|
case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2:
|
||||||
|
n := n.(*ir.DynamicTypeAssertExpr)
|
||||||
|
w.op(n.Op())
|
||||||
|
w.pos(n.Pos())
|
||||||
|
w.expr(n.X)
|
||||||
|
w.expr(n.T)
|
||||||
|
w.typ(n.Type())
|
||||||
|
|
||||||
case ir.OINDEX, ir.OINDEXMAP:
|
case ir.OINDEX, ir.OINDEXMAP:
|
||||||
n := n.(*ir.IndexExpr)
|
n := n.(*ir.IndexExpr)
|
||||||
if go117ExportTypes {
|
if go117ExportTypes {
|
||||||
|
@ -1457,6 +1457,11 @@ func (r *importReader) node() ir.Node {
|
|||||||
}
|
}
|
||||||
return n
|
return n
|
||||||
|
|
||||||
|
case ir.ODYNAMICDOTTYPE, ir.ODYNAMICDOTTYPE2:
|
||||||
|
n := ir.NewDynamicTypeAssertExpr(r.pos(), op, r.expr(), r.expr())
|
||||||
|
n.SetType(r.typ())
|
||||||
|
return n
|
||||||
|
|
||||||
case ir.OINDEX, ir.OINDEXMAP:
|
case ir.OINDEX, ir.OINDEXMAP:
|
||||||
n := ir.NewIndexExpr(r.pos(), r.expr(), r.expr())
|
n := ir.NewIndexExpr(r.pos(), r.expr(), r.expr())
|
||||||
if go117ExportTypes {
|
if go117ExportTypes {
|
||||||
|
21
test/typeparam/issue49027.dir/a.go
Normal file
21
test/typeparam/issue49027.dir/a.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// Copyright 2021 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 Conv(v interface{}) string {
|
||||||
|
return conv[string](v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func conv[T any](v interface{}) T {
|
||||||
|
return v.(T)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Conv2(v interface{}) (string, bool) {
|
||||||
|
return conv2[string](v)
|
||||||
|
}
|
||||||
|
func conv2[T any](v interface{}) (T, bool) {
|
||||||
|
x, ok := v.(T)
|
||||||
|
return x, ok
|
||||||
|
}
|
25
test/typeparam/issue49027.dir/main.go
Normal file
25
test/typeparam/issue49027.dir/main.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Copyright 2021 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"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := "foo"
|
||||||
|
x := a.Conv(s)
|
||||||
|
if x != s {
|
||||||
|
panic(fmt.Sprintf("got %s wanted %s", x, s))
|
||||||
|
}
|
||||||
|
y, ok := a.Conv2(s)
|
||||||
|
if !ok {
|
||||||
|
panic("conversion failed")
|
||||||
|
}
|
||||||
|
if y != s {
|
||||||
|
panic(fmt.Sprintf("got %s wanted %s", y, s))
|
||||||
|
}
|
||||||
|
}
|
7
test/typeparam/issue49027.go
Normal file
7
test/typeparam/issue49027.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
// rundir -G=3
|
||||||
|
|
||||||
|
// Copyright 2021 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 ignored
|
Loading…
Reference in New Issue
Block a user