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}