aboutsummaryrefslogtreecommitdiff
path: root/test/typeparam/dictionaryCapture-noinline.go
blob: ad5bfa008e9004aa6360d05cf7cc7c1991991d0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// run -gcflags="-G=3 -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())
}