master
1const builtin = @import("builtin");
2const std = @import("std");
3const expect = std.testing.expect;
4
5const HasFuncs = struct {
6 state: u32,
7 func_field: *const fn (u32) u32,
8
9 fn inc(self: *HasFuncs) void {
10 self.state += 1;
11 }
12
13 fn get(self: HasFuncs) u32 {
14 return self.state;
15 }
16
17 fn getPtr(self: *const HasFuncs) *const u32 {
18 return &self.state;
19 }
20
21 fn one(_: u32) u32 {
22 return 1;
23 }
24 fn two(_: u32) u32 {
25 return 2;
26 }
27};
28
29test "standard field calls" {
30 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
31 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
33
34 try expect(HasFuncs.one(0) == 1);
35 try expect(HasFuncs.two(0) == 2);
36
37 var v: HasFuncs = undefined;
38 v.state = 0;
39 v.func_field = HasFuncs.one;
40
41 const pv = &v;
42 const pcv: *const HasFuncs = pv;
43
44 try expect(v.get() == 0);
45 v.inc();
46 try expect(v.state == 1);
47 try expect(v.get() == 1);
48
49 pv.inc();
50 try expect(v.state == 2);
51 try expect(pv.get() == 2);
52 try expect(v.getPtr().* == 2);
53 try expect(pcv.get() == 2);
54 try expect(pcv.getPtr().* == 2);
55
56 v.func_field = HasFuncs.one;
57 try expect(v.func_field(0) == 1);
58 try expect(pv.func_field(0) == 1);
59 try expect(pcv.func_field(0) == 1);
60
61 try expect(pcv.func_field(blk: {
62 pv.func_field = HasFuncs.two;
63 break :blk 0;
64 }) == 1);
65
66 v.func_field = HasFuncs.two;
67 try expect(v.func_field(0) == 2);
68 try expect(pv.func_field(0) == 2);
69 try expect(pcv.func_field(0) == 2);
70}
71
72test "@field field calls" {
73 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
74 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
75 if (builtin.zig_backend == .stage2_spirv) return error.SkipZigTest;
76
77 try expect(@field(HasFuncs, "one")(0) == 1);
78 try expect(@field(HasFuncs, "two")(0) == 2);
79
80 var v: HasFuncs = undefined;
81 v.state = 0;
82 v.func_field = HasFuncs.one;
83
84 const pv = &v;
85 const pcv: *const HasFuncs = pv;
86
87 v.func_field = HasFuncs.one;
88 try expect(@field(v, "func_field")(0) == 1);
89 try expect(@field(pv, "func_field")(0) == 1);
90 try expect(@field(pcv, "func_field")(0) == 1);
91
92 try expect(@field(pcv, "func_field")(blk: {
93 pv.func_field = HasFuncs.two;
94 break :blk 0;
95 }) == 1);
96
97 v.func_field = HasFuncs.two;
98 try expect(@field(v, "func_field")(0) == 2);
99 try expect(@field(pv, "func_field")(0) == 2);
100 try expect(@field(pcv, "func_field")(0) == 2);
101}