v2 / vlib / v / checker / tests / generics_struct_init_err.vv
69 lines · 57 sloc · 1.12 KB · ef5be22f81005b2237311a79b6383138084b0c53
Raw
1fn neg(a int) int {
2 return -a
3}
4
5struct FnHolder1[T] {
6 func T
7}
8
9fn (self FnHolder1[T]) call(a int) int {
10 return self.func(a)
11}
12
13struct FnHolder2[T] {
14 func fn (int) int
15}
16
17fn (self FnHolder2[T]) call(a int) int {
18 return self.func(a)
19}
20
21fn holder_call_1[T](func T, a int) int {
22 h := FnHolder1{func}
23 return h.call(a)
24}
25
26fn holder_call_2[T](func T, a int) int {
27 h := FnHolder2{func}
28 return h.call(a)
29}
30
31fn holder_call_11[T](func T, a int) int {
32 f := func
33 h := FnHolder1{f}
34 return h.call(a)
35}
36
37fn holder_call_21[T](func T, a int) int {
38 f := func
39 h := FnHolder2{f}
40 return h.call(a)
41}
42
43fn holder_call_12[T](func T, a int) int {
44 return FnHolder1{func}.call(a)
45}
46
47fn holder_call_22[T](func T, a int) int {
48 return FnHolder2{func}.call(a)
49}
50
51fn main() {
52 mut ret := holder_call_1(neg, 1)
53 assert ret == -1
54 ret = holder_call_11(neg, 2)
55 assert ret == -2
56 ret = holder_call_12(neg, 3)
57 assert ret == -3
58 ret = FnHolder1{neg}.call(4)
59 assert ret == -4
60
61 ret = holder_call_2(neg, 3)
62 assert ret == -3
63 ret = holder_call_21(neg, 4)
64 assert ret == -4
65 ret = holder_call_22(neg, 5)
66 assert ret == -5
67 ret = FnHolder2{neg}.call(6)
68 assert ret == -6
69}
70