// compile // Copyright 2021 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 main import "fmt" type Fn[T any] func(T) type FnErr[T any] func(T) error // Test that local generic types across functions don't conflict, and they also don't // conflict with local non-generic types and local variables. func caller0() { type X[T any] struct { fn Fn[int] } x := X[int]{func(v int) { fmt.Println(v) }} x.fn(0) } func caller1(val int) { type X[T any] struct { fn FnErr[int] } x := X[int]{func(v int) error { fmt.Println(v); return nil }} x.fn(0) } func caller1a(val int) { type X struct { fn func(float64) error } x := X{func(v float64) error { fmt.Println(v); return nil }} x.fn(float64(3.2)) } func caller1b(val int) { type Y struct { fn func(float64) error } X := Y{func(v float64) error { fmt.Println(v); return nil }} X.fn(float64(3.2)) } // Test that local generic types within different if clauses don't conflict. func caller2(val int) { if val > 2 { type X[T any] struct { fn func(v int) float64 } x := X[int]{func(v int) float64 { fmt.Println(v); return 1.5 }} x.fn(0) } else { type X[T any] struct { fn func(v int) int } x := X[int]{func(v int) int { fmt.Println(v); return 5 }} x.fn(0) } } // Test that local generic types within different cases don't conflict with each // other or with local non-generic types or local variables. func caller3(val int) { switch val { case 0: type X[T any] struct { fn func(v int) float64 } x := X[int]{func(v int) float64 { fmt.Println(v); return 1.5 }} x.fn(0) case 1: type X[T any] struct { fn func(v int) int } x := X[int]{func(v int) int { fmt.Println(v); return 5 }} x.fn(0) case 2: type X struct { fn func(v int) bool } x := X{func(v int) bool { fmt.Println(v); return false }} x.fn(0) case 3: type Y struct { fn func(v int) bool } X := Y{func(v int) bool { fmt.Println(v); return false }} X.fn(0) } }