From: Matthew Dempsky Date: Tue, 9 Aug 2022 05:00:30 +0000 (-0700) Subject: test: test method expressions promoted to derived types X-Git-Tag: go1.20rc1~1729 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=60d3276a944c3a6a65a8e462bc432d1e9cb040ee;p=gostls13.git test: test method expressions promoted to derived types 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 Reviewed-by: David Chase TryBot-Result: Gopher Robot --- diff --git a/test/run.go b/test/run.go index 8c8c87a46d..c263a41877 100644 --- a/test/run.go +++ b/test/run.go @@ -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 index 0000000000..6b97ca102c --- /dev/null +++ b/test/typeparam/mdempsky/20.go @@ -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 }