authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-08 22:21:49+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-12-08 22:21:49+02:00
logee9fc54cd032b6ac0fcaa422aa9c2826fa370bfa
tree27572b3b063b780f3b82970c04f94981a017409d
parent7826e28bd38876e253f5842f53177dd9f45caa9a

TypedValue: fix handling of tuples represented as empty_struct_value


4 files changed, 17 insertions(+), 13 deletions(-)

src/TypedValue.zig+4-12
...@@ -142,12 +142,10 @@ pub fn print(...@@ -142,12 +142,10 @@ pub fn print(
142 .extern_options_type => return writer.writeAll("std.builtin.ExternOptions"),142 .extern_options_type => return writer.writeAll("std.builtin.ExternOptions"),
143 .type_info_type => return writer.writeAll("std.builtin.Type"),143 .type_info_type => return writer.writeAll("std.builtin.Type"),
144144
145 .empty_struct_value => return writer.writeAll(".{}"),145 .empty_struct_value, .aggregate => {
146 .aggregate => {
147 if (level == 0) {146 if (level == 0) {
148 return writer.writeAll(".{ ... }");147 return writer.writeAll(".{ ... }");
149 }148 }
150 const values = val.castTag(.aggregate).?;
151 if (ty.zigTypeTag() == .Struct) {149 if (ty.zigTypeTag() == .Struct) {
152 try writer.writeAll(".{");150 try writer.writeAll(".{");
153 const max_len = std.math.min(ty.structFieldCount(), max_aggregate_items);151 const max_len = std.math.min(ty.structFieldCount(), max_aggregate_items);
...@@ -161,13 +159,7 @@ pub fn print(...@@ -161,13 +159,7 @@ pub fn print(
161 }159 }
162 try print(.{160 try print(.{
163 .ty = ty.structFieldType(i),161 .ty = ty.structFieldType(i),
164 .val = switch (ty.containerLayout()) {162 .val = val.fieldValue(ty, i),
165 .Packed => values.data[i],
166 else => ty.structFieldValueComptime(i) orelse b: {
167 const vals = values.data;
168 break :b vals[i];
169 },
170 },
171 }, writer, level - 1, mod);163 }, writer, level - 1, mod);
172 }164 }
173 if (ty.structFieldCount() > max_aggregate_items) {165 if (ty.structFieldCount() > max_aggregate_items) {
...@@ -184,7 +176,7 @@ pub fn print(...@@ -184,7 +176,7 @@ pub fn print(
184176
185 var i: u32 = 0;177 var i: u32 = 0;
186 while (i < max_len) : (i += 1) {178 while (i < max_len) : (i += 1) {
187 buf[i] = std.math.cast(u8, values.data[i].toUnsignedInt(target)) orelse break :str;179 buf[i] = std.math.cast(u8, val.fieldValue(ty, i).toUnsignedInt(target)) orelse break :str;
188 }180 }
189181
190 const truncated = if (len > max_string_len) " (truncated)" else "";182 const truncated = if (len > max_string_len) " (truncated)" else "";
...@@ -199,7 +191,7 @@ pub fn print(...@@ -199,7 +191,7 @@ pub fn print(
199 if (i != 0) try writer.writeAll(", ");191 if (i != 0) try writer.writeAll(", ");
200 try print(.{192 try print(.{
201 .ty = elem_ty,193 .ty = elem_ty,
202 .val = values.data[i],194 .val = val.fieldValue(ty, i),
203 }, writer, level - 1, mod);195 }, writer, level - 1, mod);
204 }196 }
205 if (len > max_aggregate_items) {197 if (len > max_aggregate_items) {
src/type.zig-1
...@@ -5670,7 +5670,6 @@ pub const Type = extern union {...@@ -5670,7 +5670,6 @@ pub const Type = extern union {
5670 switch (ty.tag()) {5670 switch (ty.tag()) {
5671 .@"struct" => {5671 .@"struct" => {
5672 const struct_obj = ty.castTag(.@"struct").?.data;5672 const struct_obj = ty.castTag(.@"struct").?.data;
5673 assert(struct_obj.layout != .Packed);
5674 const field = struct_obj.fields.values()[index];5673 const field = struct_obj.fields.values()[index];
5675 if (field.is_comptime) {5674 if (field.is_comptime) {
5676 return field.default_val;5675 return field.default_val;
test/behavior.zig+1
...@@ -120,6 +120,7 @@ test {...@@ -120,6 +120,7 @@ test {
120 _ = @import("behavior/bugs/13435.zig");120 _ = @import("behavior/bugs/13435.zig");
121 _ = @import("behavior/bugs/13664.zig");121 _ = @import("behavior/bugs/13664.zig");
122 _ = @import("behavior/bugs/13714.zig");122 _ = @import("behavior/bugs/13714.zig");
123 _ = @import("behavior/bugs/13785.zig");
123 _ = @import("behavior/byteswap.zig");124 _ = @import("behavior/byteswap.zig");
124 _ = @import("behavior/byval_arg_var.zig");125 _ = @import("behavior/byval_arg_var.zig");
125 _ = @import("behavior/call.zig");126 _ = @import("behavior/call.zig");
test/behavior/bugs/13785.zig created+12
...@@ -0,0 +1,12 @@
1const builtin = @import("builtin");
2const std = @import("std");
3
4const S = packed struct { a: u0 = 0 };
5test {
6 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
7 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9
10 var a: u8 = 0;
11 try std.io.null_writer.print("\n{} {}\n", .{ a, S{} });
12}