aboutsummaryrefslogtreecommitdiff
path: root/test/typeparam/interfacearg.go
diff options
context:
space:
mode:
authorDan Scales <danscales@google.com>2021-03-10 15:25:21 -0800
committerDan Scales <danscales@google.com>2021-03-30 04:48:27 +0000
commit032ef4bbfc5b976085c561eb4a134b780625f410 (patch)
treef227b8a1a6b63259d31bb3e4bd3cfae7e5080eaf /test/typeparam/interfacearg.go
parentbb2fc21c3b818c45fad23fdf5f8bd83bbc074dce (diff)
downloadgo-032ef4bbfc5b976085c561eb4a134b780625f410.tar.gz
go-032ef4bbfc5b976085c561eb4a134b780625f410.zip
cmd/compile: fix creation of named generic types (setting of t.nod)
The correct setting of t.nod is needed when exporting types. Make sure we create instantiated named types correctly so t.nod is set. New test file interfacearg.go that tests this (by instantiating a type with an interface). Also has tests for various kinds of method expressions. Change-Id: Ia7fd9debd495336b73788af9e35d72331bb7d2b5 Reviewed-on: https://go-review.googlesource.com/c/go/+/305730 Run-TryBot: Dan Scales <danscales@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: Dan Scales <danscales@google.com> Trust: Robert Griesemer <gri@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
Diffstat (limited to 'test/typeparam/interfacearg.go')
-rw-r--r--test/typeparam/interfacearg.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/test/typeparam/interfacearg.go b/test/typeparam/interfacearg.go
new file mode 100644
index 0000000000..e2d85e3647
--- /dev/null
+++ b/test/typeparam/interfacearg.go
@@ -0,0 +1,44 @@
+// 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 I interface{}
+
+type _S[T any] struct {
+ *T
+}
+
+// F is a non-generic function, but has a type _S[I] which is instantiated from a
+// generic type. Test that _S[I] is successfully exported.
+func F() {
+ v := _S[I]{}
+ if v.T != nil {
+ panic(v)
+ }
+}
+
+// Testing the various combinations of method expressions.
+type S1 struct{}
+func (*S1) M() {}
+
+type S2 struct{}
+func (S2) M() {}
+
+func _F1[T interface{ M() }](t T) {
+ _ = T.M
+}
+
+func F2() {
+ _F1(&S1{})
+ _F1(S2{})
+ _F1(&S2{})
+}
+
+func main() {
+ F()
+ F2()
+}