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