fieldParentPtr.zig

Working version(s):
0.13.00.14.1

Failing version(s):
0.15.20.16.0-dev.2637+6a9510c0e

Code

const std = @import("std");

const Bread = struct {
    proteins: u32,
    carbs: u32,
    fat: u16,
    calories: u8,
};

test {
    const mr_bread = Bread{
        .calories = 66,
        .fat = 820,
        .proteins = 1900,
        .carbs = 12650,
    };

    const good_bread: *const Bread = @fieldParentPtr("carbs", &mr_bread.carbs);
    try std.testing.expectEqual(good_bread, &mr_bread);

    try std.testing.expectEqual(&mr_bread.carbs, &good_bread.carbs);
    try std.testing.expectEqual(&mr_bread.proteins, &good_bread.proteins);
    try std.testing.expectEqual(&mr_bread.fat, &good_bread.fat);
    try std.testing.expectEqual(&mr_bread.calories, &good_bread.calories);

    try std.testing.expectEqual(&mr_bread.carbs, @as(*u32, @ptrFromInt(@intFromPtr(&mr_bread) + @offsetOf(Bread, "carbs"))));
    try std.testing.expectEqual(&mr_bread.proteins, @as(*u32, @ptrFromInt(@intFromPtr(&mr_bread) + @offsetOf(Bread, "proteins"))));
    try std.testing.expectEqual(&mr_bread.fat, @as(*u16, @ptrFromInt(@intFromPtr(&mr_bread) + @offsetOf(Bread, "fat"))));
    try std.testing.expectEqual(&mr_bread.calories, @as(*u8, @ptrFromInt(@intFromPtr(&mr_bread) + @offsetOf(Bread, "calories"))));
}