// Copyright 2022 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 A1 [2]uint64 type A2 [2]uint64 func (a A1) m() A1 { return a } func (a A2) m() A2 { return a } func f[B any, T interface { A1 | A2 m() T }](v T) { } func _() { var v A2 // Use function type inference to infer type A2 for T. // Don't use constraint type inference before function // type inference for typed arguments, otherwise it would // infer type [2]uint64 for T which doesn't have method m // (was the bug). f[int](v) } // Keep using constraint type inference before function type // inference for untyped arguments so we infer type float64 // for E below, and not int (which would not work). func g[S ~[]E, E any](S, E) {} func _() { var s []float64 g[[]float64](s, 0) } // Keep using constraint type inference after function // type inference for untyped arguments so we infer // missing type arguments for which we only have the // untyped arguments as starting point. func h[E any, R []E](v E) R { return R{v} } func _() []int { return h(0) }