| // 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) | |
| } | |
| } |