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