// 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 // The core type of M2 unifies with the type of m1 // during function argument type inference. // M2's constraint is unnamed. func f1[K1 comparable, E1 any](m1 map[K1]E1) {} func f2[M2 map[string]int](m2 M2) { f1(m2) } // The core type of M3 unifies with the type of m1 // during function argument type inference. // M3's constraint is named. type Map3 map[string]int func f3[M3 Map3](m3 M3) { f1(m3) } // The core type of M5 unifies with the core type of M4 // during constraint type inference. func f4[M4 map[K4]int, K4 comparable](m4 M4) {} func f5[M5 map[K5]int, K5 comparable](m5 M5) { f4(m5) } // test case from issue func Copy[MC ~map[KC]VC, KC comparable, VC any](dst, src MC) { for k, v := range src { dst[k] = v } } func Merge[MM ~map[KM]VM, KM comparable, VM any](ms ...MM) MM { result := MM{} for _, m := range ms { Copy(result, m) } return result }