// 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 // Simplified (representative) test case. func _() { f(R1{}) } func f[T any](R[T]) {} type R[T any] interface { m(R[T]) } type R1 struct{} func (R1) m(R[int]) {} // Test case from issue. func _() { r := newTestRules() NewSet(r) r2 := newTestRules2() NewSet(r2) } type Set[T any] struct { rules Rules[T] } func NewSet[T any](rules Rules[T]) Set[T] { return Set[T]{ rules: rules, } } func (s Set[T]) Copy() Set[T] { return NewSet(s.rules) } type Rules[T any] interface { Hash(T) int Equivalent(T, T) bool SameRules(Rules[T]) bool } type testRules struct{} func newTestRules() Rules[int] { return testRules{} } func (r testRules) Hash(val int) int { return val % 16 } func (r testRules) Equivalent(val1 int, val2 int) bool { return val1 == val2 } func (r testRules) SameRules(other Rules[int]) bool { _, ok := other.(testRules) return ok } type testRules2 struct{} func newTestRules2() Rules[string] { return testRules2{} } func (r testRules2) Hash(val string) int { return 16 } func (r testRules2) Equivalent(val1 string, val2 string) bool { return val1 == val2 } func (r testRules2) SameRules(other Rules[string]) bool { _, ok := other.(testRules2) return ok }