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