blob: 542bc2d68a1643ec00c8caa8d2372773265a0ed9 [file] [log] [blame]
// 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
}