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