1
0
mirror of https://github.com/golang/go synced 2024-11-26 21:11:57 -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:
Keith Randall 2021-10-18 10:26:18 -07:00
parent 4d550727f8
commit 394a1ad295
5 changed files with 66 additions and 0 deletions

View File

@ -1888,6 +1888,14 @@ func (w *exportWriter) expr(n ir.Node) {
w.expr(n.X)
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:
n := n.(*ir.IndexExpr)
if go117ExportTypes {

View File

@ -1457,6 +1457,11 @@ func (r *importReader) node() ir.Node {
}
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:
n := ir.NewIndexExpr(r.pos(), r.expr(), r.expr())
if go117ExportTypes {

View 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
}

View 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))
}
}

View 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