github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/types/testdata/fixedbugs/issue61879.go (about)

     1  // Copyright 2023 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package p
     6  
     7  import "fmt"
     8  
     9  type Interface[T any] interface {
    10  	m(Interface[T])
    11  }
    12  
    13  func f[S []Interface[T], T any](S) {}
    14  
    15  func _() {
    16  	var s []Interface[int]
    17  	f(s) // panic here
    18  }
    19  
    20  // Larger example from issue
    21  
    22  type InterfaceA[T comparable] interface {
    23  	setData(string) InterfaceA[T]
    24  }
    25  
    26  type ImplA[T comparable] struct {
    27  	data string
    28  	args []any
    29  }
    30  
    31  func NewInterfaceA[T comparable](args ...any) InterfaceA[T] {
    32  	return &ImplA[T]{
    33  		data: fmt.Sprintf("%v", args...),
    34  		args: args,
    35  	}
    36  }
    37  
    38  func (k *ImplA[T]) setData(data string) InterfaceA[T] {
    39  	k.data = data
    40  	return k
    41  }
    42  
    43  func Foo[M ~map[InterfaceA[T]]V, T comparable, V any](m M) {
    44  	// DO SOMETHING HERE
    45  	return
    46  }
    47  
    48  func Bar() {
    49  	keys := make([]InterfaceA[int], 0, 10)
    50  	m := make(map[InterfaceA[int]]int)
    51  	for i := 0; i < 10; i++ {
    52  		keys = append(keys, NewInterfaceA[int](i))
    53  		m[keys[i]] = i
    54  	}
    55  
    56  	Foo(m) // panic here
    57  }