authorgravatar for wrongnull@gmail.comBogdan Romanyuk <wrongnull@gmail.com> 2023-11-27 15:35:29+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2023-11-27 12:35:29+00:00
log7fbbeae617ad9c30605a78377888c284e5d9ccdc
tree3e56b1535d3930ff7cb621630c64008ceb42261d
parent89572c63424eb8d9da90f2676b55c660ece57688
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

value: handle lazy_align and lazy_size in writeToPackedMemory


2 files changed, 18 insertions(+), 1 deletions(-)

src/value.zig+8-1
......@@ -803,7 +803,14 @@ pub const Value = struct {
803803 switch (ip.indexToKey((try val.intFromEnum(ty, mod)).toIntern()).int.storage) {
804804 inline .u64, .i64 => |int| std.mem.writeVarPackedInt(buffer, bit_offset, bits, int, endian),
805805 .big_int => |bigint| bigint.writePackedTwosComplement(buffer, bit_offset, bits, endian),
806 else => unreachable,
806 .lazy_align => |lazy_align| {
807 const num = Type.fromInterned(lazy_align).abiAlignment(mod).toByteUnits(0);
808 std.mem.writeVarPackedInt(buffer, bit_offset, bits, num, endian);
809 },
810 .lazy_size => |lazy_size| {
811 const num = Type.fromInterned(lazy_size).abiSize(mod);
812 std.mem.writeVarPackedInt(buffer, bit_offset, bits, num, endian);
813 },
807814 }
808815 },
809816 .Float => switch (ty.floatBits(target)) {
test/behavior/enum.zig+10
......@@ -1225,3 +1225,13 @@ test "auto-numbered enum with signed tag type" {
12251225 try std.testing.expectEqualStrings("a", @tagName(E.a));
12261226 try std.testing.expectEqualStrings("b", @tagName(E.b));
12271227}
1228
1229test "lazy initialized field" {
1230 try std.testing.expectEqual(@as(u8, @alignOf(struct {})), getLazyInitialized(.a));
1231}
1232
1233fn getLazyInitialized(param: enum(u8) {
1234 a = @bitCast(packed struct(u8) { a: u8 }{ .a = @alignOf(struct {}) }),
1235}) u8 {
1236 return @intFromEnum(param);
1237}