Initial commit: Go 1.23 release state
This commit is contained in:
203
test/typeparam/dictionaryCapture.go
Normal file
203
test/typeparam/dictionaryCapture.go
Normal file
@@ -0,0 +1,203 @@
|
||||
// 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 situations where functions/methods are not
|
||||
// immediately called and we need to capture the dictionary
|
||||
// required for later invocation.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func main() {
|
||||
functions()
|
||||
methodExpressions()
|
||||
genMethodExpressions[int](7)
|
||||
methodValues()
|
||||
genMethodValues[int](7)
|
||||
interfaceMethods()
|
||||
globals()
|
||||
recursive()
|
||||
}
|
||||
|
||||
func g0[T any](x T) {
|
||||
}
|
||||
func g1[T any](x T) T {
|
||||
return x
|
||||
}
|
||||
func g2[T any](x T) (T, T) {
|
||||
return x, x
|
||||
}
|
||||
|
||||
func functions() {
|
||||
f0 := g0[int]
|
||||
f0(7)
|
||||
f1 := g1[int]
|
||||
is7(f1(7))
|
||||
f2 := g2[int]
|
||||
is77(f2(7))
|
||||
}
|
||||
|
||||
func is7(x int) {
|
||||
if x != 7 {
|
||||
println(x)
|
||||
panic("assertion failed")
|
||||
}
|
||||
}
|
||||
func is77(x, y int) {
|
||||
if x != 7 || y != 7 {
|
||||
println(x, y)
|
||||
panic("assertion failed")
|
||||
}
|
||||
}
|
||||
|
||||
type s[T any] struct {
|
||||
a T
|
||||
}
|
||||
|
||||
func (x s[T]) g0() {
|
||||
}
|
||||
func (x s[T]) g1() T {
|
||||
return x.a
|
||||
}
|
||||
func (x s[T]) g2() (T, T) {
|
||||
return x.a, x.a
|
||||
}
|
||||
|
||||
func methodExpressions() {
|
||||
x := s[int]{a: 7}
|
||||
f0 := s[int].g0
|
||||
f0(x)
|
||||
f0p := (*s[int]).g0
|
||||
f0p(&x)
|
||||
f1 := s[int].g1
|
||||
is7(f1(x))
|
||||
f1p := (*s[int]).g1
|
||||
is7(f1p(&x))
|
||||
f2 := s[int].g2
|
||||
is77(f2(x))
|
||||
f2p := (*s[int]).g2
|
||||
is77(f2p(&x))
|
||||
}
|
||||
|
||||
func genMethodExpressions[T comparable](want T) {
|
||||
x := s[T]{a: want}
|
||||
f0 := s[T].g0
|
||||
f0(x)
|
||||
f0p := (*s[T]).g0
|
||||
f0p(&x)
|
||||
f1 := s[T].g1
|
||||
if got := f1(x); got != want {
|
||||
panic(fmt.Sprintf("f1(x) == %d, want %d", got, want))
|
||||
}
|
||||
f1p := (*s[T]).g1
|
||||
if got := f1p(&x); got != want {
|
||||
panic(fmt.Sprintf("f1p(&x) == %d, want %d", got, want))
|
||||
}
|
||||
f2 := s[T].g2
|
||||
if got1, got2 := f2(x); got1 != want || got2 != want {
|
||||
panic(fmt.Sprintf("f2(x) == %d, %d, want %d, %d", got1, got2, want, want))
|
||||
}
|
||||
}
|
||||
|
||||
func methodValues() {
|
||||
x := s[int]{a: 7}
|
||||
f0 := x.g0
|
||||
f0()
|
||||
f1 := x.g1
|
||||
is7(f1())
|
||||
f2 := x.g2
|
||||
is77(f2())
|
||||
}
|
||||
|
||||
func genMethodValues[T comparable](want T) {
|
||||
x := s[T]{a: want}
|
||||
f0 := x.g0
|
||||
f0()
|
||||
f1 := x.g1
|
||||
if got := f1(); got != want {
|
||||
panic(fmt.Sprintf("f1() == %d, want %d", got, want))
|
||||
}
|
||||
f2 := x.g2
|
||||
if got1, got2 := f2(); got1 != want || got2 != want {
|
||||
panic(fmt.Sprintf("f2() == %d, %d, want %d, %d", got1, got2, want, want))
|
||||
}
|
||||
}
|
||||
|
||||
var x interface {
|
||||
g0()
|
||||
g1() int
|
||||
g2() (int, int)
|
||||
} = s[int]{a: 7}
|
||||
var y interface{} = s[int]{a: 7}
|
||||
|
||||
func interfaceMethods() {
|
||||
x.g0()
|
||||
is7(x.g1())
|
||||
is77(x.g2())
|
||||
y.(interface{ g0() }).g0()
|
||||
is7(y.(interface{ g1() int }).g1())
|
||||
is77(y.(interface{ g2() (int, int) }).g2())
|
||||
}
|
||||
|
||||
// Also check for instantiations outside functions.
|
||||
var gg0 = g0[int]
|
||||
var gg1 = g1[int]
|
||||
var gg2 = g2[int]
|
||||
|
||||
var hh0 = s[int].g0
|
||||
var hh1 = s[int].g1
|
||||
var hh2 = s[int].g2
|
||||
|
||||
var xtop = s[int]{a: 7}
|
||||
var ii0 = x.g0
|
||||
var ii1 = x.g1
|
||||
var ii2 = x.g2
|
||||
|
||||
func globals() {
|
||||
gg0(7)
|
||||
is7(gg1(7))
|
||||
is77(gg2(7))
|
||||
x := s[int]{a: 7}
|
||||
hh0(x)
|
||||
is7(hh1(x))
|
||||
is77(hh2(x))
|
||||
ii0()
|
||||
is7(ii1())
|
||||
is77(ii2())
|
||||
}
|
||||
|
||||
func recursive() {
|
||||
if got, want := recur1[int](5), 110; got != want {
|
||||
panic(fmt.Sprintf("recur1[int](5) = %d, want = %d", got, want))
|
||||
}
|
||||
}
|
||||
|
||||
type Integer interface {
|
||||
int | int32 | int64
|
||||
}
|
||||
|
||||
func recur1[T Integer](n T) T {
|
||||
if n == 0 || n == 1 {
|
||||
return T(1)
|
||||
} else {
|
||||
return n * recur2(n-1)
|
||||
}
|
||||
}
|
||||
|
||||
func recur2[T Integer](n T) T {
|
||||
list := make([]T, n)
|
||||
for i, _ := range list {
|
||||
list[i] = T(i + 1)
|
||||
}
|
||||
var sum T
|
||||
for _, elt := range list {
|
||||
sum += elt
|
||||
}
|
||||
return sum + recur1(n-1)
|
||||
}
|
||||
Reference in New Issue
Block a user