From b55b8e7745316a8e3acd4be8f2e3651d6225c710 Mon Sep 17 00:00:00 2001 From: kcbanner Date: Sat, 22 Apr 2023 19:02:18 -0400 Subject: [PATCH] add support for .field_ptr in elemValueAdvanced This fixes a crash when @compileLog is passed a slice backed by an aggregate field at comptime. --- src/value.zig | 9 +++++++ test/cases/comptime_aggregate_print.zig | 32 +++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 test/cases/comptime_aggregate_print.zig diff --git a/src/value.zig b/src/value.zig index bbe2659317..05e9d24ee2 100644 --- a/src/value.zig +++ b/src/value.zig @@ -3002,6 +3002,15 @@ pub const Value = extern union { const data = val.castTag(.elem_ptr).?.data; return data.array_ptr.elemValueAdvanced(mod, index + data.index, arena, buffer); }, + .field_ptr => { + const data = val.castTag(.field_ptr).?.data; + if (data.container_ptr.pointerDecl()) |decl_index| { + const container_decl = mod.declPtr(decl_index); + const field_type = data.container_ty.structFieldType(data.field_index); + const field_val = container_decl.val.fieldValue(field_type, data.field_index); + return field_val.elemValueAdvanced(mod, index, arena, buffer); + } else unreachable; + }, // The child type of arrays which have only one possible value need // to have only one possible value itself. diff --git a/test/cases/comptime_aggregate_print.zig b/test/cases/comptime_aggregate_print.zig new file mode 100644 index 0000000000..0cb21acb1f --- /dev/null +++ b/test/cases/comptime_aggregate_print.zig @@ -0,0 +1,32 @@ +const UnionContainer = union { + buf: [2]i32, +}; + +fn getUnionSlice() []i32 { + var c = UnionContainer{ .buf = .{ 1, 2 } }; + return c.buf[0..2]; +} + +const StructContainer = struct { + buf: [2]i32, +}; + +fn getStructSlice() []i32 { + var c = StructContainer{ .buf = .{ 3, 4 } }; + return c.buf[0..2]; +} + +comptime { + @compileLog(getUnionSlice()); + @compileLog(getStructSlice()); +} + +pub fn main() !void {} + +// error +// +// :20:5: error: found compile log statement +// +// Compile Log Output: +// @as([]i32, .{ 1, 2 }) +// @as([]i32, .{ 3, 4 })