From 60d3276a944c3a6a65a8e462bc432d1e9cb040ee Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 8 Aug 2022 22:00:30 -0700 Subject: [PATCH] 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 --- test/run.go | 1 + test/typeparam/mdempsky/20.go | 38 +++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 test/typeparam/mdempsky/20.go 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 } -- 2.50.0