aboutsummaryrefslogtreecommitdiff
path: root/test/typeparam
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-09-28 21:14:17 -0700
committerDan Scales <danscales@google.com>2021-09-29 16:09:04 +0000
commitc2de759581aef5d14fd07b843caf76db3c8a115b (patch)
tree3ef78f3bff904fdcaffa8a72c256083b527f0bd5 /test/typeparam
parentaeb4fbabc0aaa5293dd34821c450855e9ff82230 (diff)
downloadgo-c2de759581aef5d14fd07b843caf76db3c8a115b.tar.xz
cmd/compile: make sure shapes have proper indexes for sub-instantiation
The computation for determining the shapes to use at the top of getInstantation was not always creating shapes with the proper indexes. If an instantiation is being called from another instantiated function, we cannot just copy the shape types unchanged, because their indexes may have changed. So, for type args that already shapes, we still call Shapify() with the correct index. Fixes #48645 Change-Id: Ibb61c6f9a3c317220fb85135ca87eb5ad4dcff9e Reviewed-on: https://go-review.googlesource.com/c/go/+/353030 Trust: Dan Scales <danscales@google.com> Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'test/typeparam')
-rw-r--r--test/typeparam/issue48645a.go31
-rw-r--r--test/typeparam/issue48645a.out1
-rw-r--r--test/typeparam/issue48645b.go81
3 files changed, 113 insertions, 0 deletions
diff --git a/test/typeparam/issue48645a.go b/test/typeparam/issue48645a.go
new file mode 100644
index 0000000000..8d5aac94c6
--- /dev/null
+++ b/test/typeparam/issue48645a.go
@@ -0,0 +1,31 @@
+// run -gcflags=-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 main
+
+import (
+ "fmt"
+ "reflect"
+)
+
+type Stream[T any] struct {
+}
+
+func (s Stream[T]) DropWhile() Stream[T] {
+ return Pipe[T, T](s)
+}
+
+func Pipe[T, R any](s Stream[T]) Stream[R] {
+ it := func(fn func(R) bool) {
+ }
+ fmt.Println(reflect.TypeOf(it).String())
+ return Stream[R]{}
+}
+
+func main() {
+ s := Stream[int]{}
+ s = s.DropWhile()
+}
diff --git a/test/typeparam/issue48645a.out b/test/typeparam/issue48645a.out
new file mode 100644
index 0000000000..5093d0f0ff
--- /dev/null
+++ b/test/typeparam/issue48645a.out
@@ -0,0 +1 @@
+func(func(int) bool)
diff --git a/test/typeparam/issue48645b.go b/test/typeparam/issue48645b.go
new file mode 100644
index 0000000000..0f3a7f230a
--- /dev/null
+++ b/test/typeparam/issue48645b.go
@@ -0,0 +1,81 @@
+// run -gcflags=-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 main
+
+type Iterator[T any] interface {
+ Iterate(fn func(T) bool)
+}
+
+type IteratorFunc[T any] func(fn func(T) bool)
+
+func (f IteratorFunc[T]) Iterate(fn func(T) bool) {
+ f(fn)
+}
+
+type Stream[T any] struct {
+ it Iterator[T]
+}
+
+func (s Stream[T]) Iterate(fn func(T) bool) {
+ if s.it == nil {
+ return
+ }
+ s.it.Iterate(fn)
+}
+
+func FromIterator[T any](it Iterator[T]) Stream[T] {
+ return Stream[T]{it: it}
+}
+
+func (s Stream[T]) DropWhile(fn func(T) bool) Stream[T] {
+ return Pipe[T, T](s, func(t T) (T, bool) {
+ return t, true
+ })
+}
+
+func Pipe[T, R any](s Stream[T], op func(d T) (R, bool)) Stream[R] {
+ it := func(fn func(R) bool) {
+ // XXX Not getting the closure right when converting to interface.
+ // s.it.Iterate(func(t T) bool {
+ // r, ok := op(t)
+ // if !ok {
+ // return true
+ // }
+
+ // return fn(r)
+ // })
+ }
+
+ return FromIterator[R](IteratorFunc[R](it))
+}
+
+func Reduce[T, U any](s Stream[T], identity U, acc func(U, T) U) (r U) {
+ r = identity
+ s.Iterate(func(t T) bool {
+ r = acc(r, t)
+ return true
+ })
+
+ return r
+}
+
+type myIterator struct {
+}
+
+func (myIterator) Iterate(fn func(int) bool) {
+}
+
+func main() {
+ s := Stream[int]{}
+ s.it = myIterator{}
+ s = s.DropWhile(func(i int) bool {
+ return false
+ })
+ Reduce(s, nil, func(acc []int, e int) []int {
+ return append(acc, e)
+ })
+}