| // run |
| |
| // 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. |
| |
| // Test that we can convert type parameters to both empty |
| // and nonempty interfaces, and named and nonnamed versions |
| // thereof. |
| |
| package main |
| |
| import "fmt" |
| |
| type E interface{} |
| |
| func f[T any](x T) interface{} { |
| var i interface{} = x |
| return i |
| } |
| |
| func fs[T any](x T) interface{} { |
| y := []T{x} |
| var i interface{} = y |
| return i |
| } |
| |
| func g[T any](x T) E { |
| var i E = x |
| return i |
| } |
| |
| type C interface { |
| foo() int |
| } |
| |
| type myInt int |
| |
| func (x myInt) foo() int { |
| return int(x + 1) |
| } |
| |
| func h[T C](x T) interface{ foo() int } { |
| var i interface{ foo() int } = x |
| return i |
| } |
| func i[T C](x T) C { |
| var i C = x // conversion in assignment |
| return i |
| } |
| |
| func j[T C](t T) C { |
| return C(t) // explicit conversion |
| } |
| |
| func js[T any](x T) interface{} { |
| y := []T{x} |
| return interface{}(y) |
| } |
| |
| func main() { |
| if got, want := f[int](7), 7; got != want { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| if got, want := fs[int](7), []int{7}; got.([]int)[0] != want[0] { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| if got, want := g[int](7), 7; got != want { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| if got, want := h[myInt](7).foo(), 8; got != want { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| if got, want := i[myInt](7).foo(), 8; got != want { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| if got, want := j[myInt](7).foo(), 8; got != want { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| if got, want := js[int](7), []int{7}; got.([]int)[0] != want[0] { |
| panic(fmt.Sprintf("got %d want %d", got, want)) |
| } |
| } |