// 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 import "fmt" type Interface[T any] interface { m(Interface[T]) } func f[S []Interface[T], T any](S) {} func _() { var s []Interface[int] f(s) // panic here } // Larger example from issue type InterfaceA[T comparable] interface { setData(string) InterfaceA[T] } type ImplA[T comparable] struct { data string args []any } func NewInterfaceA[T comparable](args ...any) InterfaceA[T] { return &ImplA[T]{ data: fmt.Sprintf("%v", args...), args: args, } } func (k *ImplA[T]) setData(data string) InterfaceA[T] { k.data = data return k } func Foo[M ~map[InterfaceA[T]]V, T comparable, V any](m M) { // DO SOMETHING HERE return } func Bar() { keys := make([]InterfaceA[int], 0, 10) m := make(map[InterfaceA[int]]int) for i := 0; i < 10; i++ { keys = append(keys, NewInterfaceA[int](i)) m[keys[i]] = i } Foo(m) // panic here }