| // Copyright 2023 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 p |
| |
| type S[T any] struct{} |
| |
| func (S[T]) m(T) {} |
| |
| func f0[T any](chan S[T]) {} |
| |
| func _() { |
| var x chan interface{ m(int) } |
| f0(x /* ERROR "type chan interface{m(int)} of x does not match chan S[T] (cannot infer T)" */) |
| } |
| |
| // variants of the theme |
| |
| func f1[T any]([]S[T]) {} |
| |
| func _() { |
| var x []interface{ m(int) } |
| f1(x /* ERROR "type []interface{m(int)} of x does not match []S[T] (cannot infer T)" */) |
| } |
| |
| type I[T any] interface { |
| m(T) |
| } |
| |
| func f2[T any](func(I[T])) {} |
| |
| func _() { |
| var x func(interface{ m(int) }) |
| f2(x /* ERROR "type func(interface{m(int)}) of x does not match func(I[T]) (cannot infer T)" */) |
| } |
| |
| func f3[T any](func(I[T])) {} |
| |
| func _() { |
| var x func(I[int]) |
| f3(x) // but this is correct: I[T] and I[int] can be made identical with T == int |
| } |
| |
| func f4[T any]([10]I[T]) {} |
| |
| func _() { |
| var x [10]interface{ I[int] } |
| f4(x /* ERROR "type [10]interface{I[int]} of x does not match [10]I[T] (cannot infer T)" */) |
| } |
| |
| func f5[T any](I[T]) {} |
| |
| func _() { |
| var x interface { |
| m(int) |
| n() |
| } |
| f5(x) |
| f5[int](x) // ok |
| } |