// run -gcflags="-l" | |
// 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 | |
func main() { | |
functions() | |
methodExpressions() | |
methodValues() | |
interfaceMethods() | |
globals() | |
} | |
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) | |
f1 := s[int].g1 | |
is7(f1(x)) | |
f2 := s[int].g2 | |
is77(f2(x)) | |
} | |
func methodValues() { | |
x := s[int]{a: 7} | |
f0 := x.g0 | |
f0() | |
f1 := x.g1 | |
is7(f1()) | |
f2 := x.g2 | |
is77(f2()) | |
} | |
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()) | |
} |