]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: allow importing and exporting of ODYANMICDOTTYPE[2]
authorKeith Randall <khr@golang.org>
Mon, 18 Oct 2021 17:26:18 +0000 (10:26 -0700)
committerKeith Randall <khr@golang.org>
Mon, 18 Oct 2021 19:46:27 +0000 (19:46 +0000)
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>
src/cmd/compile/internal/typecheck/iexport.go
src/cmd/compile/internal/typecheck/iimport.go
test/typeparam/issue49027.dir/a.go [new file with mode: 0644]
test/typeparam/issue49027.dir/main.go [new file with mode: 0644]
test/typeparam/issue49027.go [new file with mode: 0644]

index 3c0b8bc3198b9a500201b0501fcf5381d2af22c3..e3dd10a56b17ae6ae68abaa721292cb6f9aa1e56 100644 (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 {
index df49d74a4018421b67d6dd7c9ea3c9ff510f74a4..52236ce837bf01cc35e00d1b6bd91ecd9447e757 100644 (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 {
diff --git a/test/typeparam/issue49027.dir/a.go b/test/typeparam/issue49027.dir/a.go
new file mode 100644 (file)
index 0000000..d3ec27d
--- /dev/null
@@ -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
+}
diff --git a/test/typeparam/issue49027.dir/main.go b/test/typeparam/issue49027.dir/main.go
new file mode 100644 (file)
index 0000000..d0dc33d
--- /dev/null
@@ -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))
+       }
+}
diff --git a/test/typeparam/issue49027.go b/test/typeparam/issue49027.go
new file mode 100644 (file)
index 0000000..76930e5
--- /dev/null
@@ -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