Initial commit: Go 1.23 release state
This commit is contained in:
83
test/typeparam/ifaceconv.go
Normal file
83
test/typeparam/ifaceconv.go
Normal file
@@ -0,0 +1,83 @@
|
||||
// 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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user