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
|
// run
// Copyright 2022 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.
package main
var ok = false
func f() func(int, int) int {
ok = true
return func(int, int) int { return 0 }
}
func g() (int, int) {
if !ok {
panic("FAIL")
}
return 0, 0
}
var _ = f()(g())
func main() {
f1()
f2()
f3()
f4()
}
func f1() {
ok := false
f := func() func(int, int) {
ok = true
return func(int, int) {}
}
g := func() (int, int) {
if !ok {
panic("FAIL")
}
return 0, 0
}
f()(g())
}
type S struct{}
func (S) f(int, int) {}
func f2() {
ok := false
f := func() S {
ok = true
return S{}
}
g := func() (int, int) {
if !ok {
panic("FAIL")
}
return 0, 0
}
f().f(g())
}
func f3() {
ok := false
f := func() []func(int, int) {
ok = true
return []func(int, int){func(int, int) {}}
}
g := func() (int, int) {
if !ok {
panic("FAIL")
}
return 0, 0
}
f()[0](g())
}
type G[T any] struct{}
func (G[T]) f(int, int) {}
func f4() {
ok := false
f := func() G[int] {
ok = true
return G[int]{}
}
g := func() (int, int) {
if !ok {
panic("FAIL")
}
return 0, 0
}
f().f(g())
}
|