]> Cypherpunks.ru repositories - gostls13.git/commitdiff
test: test method expressions promoted to derived types
authorMatthew Dempsky <mdempsky@google.com>
Tue, 9 Aug 2022 05:00:30 +0000 (22:00 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 9 Aug 2022 16:42:12 +0000 (16:42 +0000)
This CL adds a test that method expressions where the receiver type is
a derived type and embeds a promoted method work correctly.

Change-Id: I2e7c96007b6d9e6f942dc14228970ac508ff5c15
Reviewed-on: https://go-review.googlesource.com/c/go/+/422199
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

test/run.go
test/typeparam/mdempsky/20.go [new file with mode: 0644]

index 8c8c87a46d4428692d010d2720caedcb8c93a1c7..c263a41877e8ab14d4a4180898461a4c8756d030 100644 (file)
@@ -1986,6 +1986,7 @@ var go118Failures = setOf(
        "typeparam/mdempsky/16.go", // 1.18 compiler uses interface shape type in failed type assertions
        "typeparam/mdempsky/17.go", // 1.18 compiler mishandles implicit conversions from range loops
        "typeparam/mdempsky/18.go", // 1.18 compiler mishandles implicit conversions in select statements
+       "typeparam/mdempsky/20.go", // 1.18 compiler crashes on method expressions promoted to derived types
 )
 
 // In all of these cases, the 1.17 compiler reports reasonable errors, but either the
diff --git a/test/typeparam/mdempsky/20.go b/test/typeparam/mdempsky/20.go
new file mode 100644 (file)
index 0000000..6b97ca1
--- /dev/null
@@ -0,0 +1,38 @@
+// run
+
+// Copyright 2022 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.
+
+// Test that method expressions with a derived receiver type and
+// promoted methods work correctly.
+
+package main
+
+func main() {
+       F[int]()
+       F[string]()
+}
+
+func F[X any]() {
+       call(T[X].M, T[X].N)
+}
+
+func call[X any](fns ...func(T[X]) int) {
+       for want, fn := range fns {
+               if have := fn(T[X]{}); have != want {
+                       println("FAIL:", have, "!=", want)
+               }
+       }
+}
+
+type T[X any] struct {
+       E1
+       *E2[*X]
+}
+
+type E1 struct{}
+type E2[_ any] struct{}
+
+func (E1) M() int     { return 0 }
+func (*E2[_]) N() int { return 1 }