mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
TypedValue: fix handling of tuples represented as empty_struct_value
This commit is contained in:
parent
7826e28bd3
commit
ee9fc54cd0
4 changed files with 17 additions and 13 deletions
|
|
@ -142,12 +142,10 @@ pub fn print(
|
||||||
.extern_options_type => return writer.writeAll("std.builtin.ExternOptions"),
|
.extern_options_type => return writer.writeAll("std.builtin.ExternOptions"),
|
||||||
.type_info_type => return writer.writeAll("std.builtin.Type"),
|
.type_info_type => return writer.writeAll("std.builtin.Type"),
|
||||||
|
|
||||||
.empty_struct_value => return writer.writeAll(".{}"),
|
.empty_struct_value, .aggregate => {
|
||||||
.aggregate => {
|
|
||||||
if (level == 0) {
|
if (level == 0) {
|
||||||
return writer.writeAll(".{ ... }");
|
return writer.writeAll(".{ ... }");
|
||||||
}
|
}
|
||||||
const values = val.castTag(.aggregate).?;
|
|
||||||
if (ty.zigTypeTag() == .Struct) {
|
if (ty.zigTypeTag() == .Struct) {
|
||||||
try writer.writeAll(".{");
|
try writer.writeAll(".{");
|
||||||
const max_len = std.math.min(ty.structFieldCount(), max_aggregate_items);
|
const max_len = std.math.min(ty.structFieldCount(), max_aggregate_items);
|
||||||
|
|
@ -161,13 +159,7 @@ pub fn print(
|
||||||
}
|
}
|
||||||
try print(.{
|
try print(.{
|
||||||
.ty = ty.structFieldType(i),
|
.ty = ty.structFieldType(i),
|
||||||
.val = switch (ty.containerLayout()) {
|
.val = val.fieldValue(ty, i),
|
||||||
.Packed => values.data[i],
|
|
||||||
else => ty.structFieldValueComptime(i) orelse b: {
|
|
||||||
const vals = values.data;
|
|
||||||
break :b vals[i];
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, writer, level - 1, mod);
|
}, writer, level - 1, mod);
|
||||||
}
|
}
|
||||||
if (ty.structFieldCount() > max_aggregate_items) {
|
if (ty.structFieldCount() > max_aggregate_items) {
|
||||||
|
|
@ -184,7 +176,7 @@ pub fn print(
|
||||||
|
|
||||||
var i: u32 = 0;
|
var i: u32 = 0;
|
||||||
while (i < max_len) : (i += 1) {
|
while (i < max_len) : (i += 1) {
|
||||||
buf[i] = std.math.cast(u8, values.data[i].toUnsignedInt(target)) orelse break :str;
|
buf[i] = std.math.cast(u8, val.fieldValue(ty, i).toUnsignedInt(target)) orelse break :str;
|
||||||
}
|
}
|
||||||
|
|
||||||
const truncated = if (len > max_string_len) " (truncated)" else "";
|
const truncated = if (len > max_string_len) " (truncated)" else "";
|
||||||
|
|
@ -199,7 +191,7 @@ pub fn print(
|
||||||
if (i != 0) try writer.writeAll(", ");
|
if (i != 0) try writer.writeAll(", ");
|
||||||
try print(.{
|
try print(.{
|
||||||
.ty = elem_ty,
|
.ty = elem_ty,
|
||||||
.val = values.data[i],
|
.val = val.fieldValue(ty, i),
|
||||||
}, writer, level - 1, mod);
|
}, writer, level - 1, mod);
|
||||||
}
|
}
|
||||||
if (len > max_aggregate_items) {
|
if (len > max_aggregate_items) {
|
||||||
|
|
|
||||||
|
|
@ -5670,7 +5670,6 @@ pub const Type = extern union {
|
||||||
switch (ty.tag()) {
|
switch (ty.tag()) {
|
||||||
.@"struct" => {
|
.@"struct" => {
|
||||||
const struct_obj = ty.castTag(.@"struct").?.data;
|
const struct_obj = ty.castTag(.@"struct").?.data;
|
||||||
assert(struct_obj.layout != .Packed);
|
|
||||||
const field = struct_obj.fields.values()[index];
|
const field = struct_obj.fields.values()[index];
|
||||||
if (field.is_comptime) {
|
if (field.is_comptime) {
|
||||||
return field.default_val;
|
return field.default_val;
|
||||||
|
|
|
||||||
|
|
@ -120,6 +120,7 @@ test {
|
||||||
_ = @import("behavior/bugs/13435.zig");
|
_ = @import("behavior/bugs/13435.zig");
|
||||||
_ = @import("behavior/bugs/13664.zig");
|
_ = @import("behavior/bugs/13664.zig");
|
||||||
_ = @import("behavior/bugs/13714.zig");
|
_ = @import("behavior/bugs/13714.zig");
|
||||||
|
_ = @import("behavior/bugs/13785.zig");
|
||||||
_ = @import("behavior/byteswap.zig");
|
_ = @import("behavior/byteswap.zig");
|
||||||
_ = @import("behavior/byval_arg_var.zig");
|
_ = @import("behavior/byval_arg_var.zig");
|
||||||
_ = @import("behavior/call.zig");
|
_ = @import("behavior/call.zig");
|
||||||
|
|
|
||||||
12
test/behavior/bugs/13785.zig
Normal file
12
test/behavior/bugs/13785.zig
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
const builtin = @import("builtin");
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const S = packed struct { a: u0 = 0 };
|
||||||
|
test {
|
||||||
|
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||||
|
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||||
|
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||||
|
|
||||||
|
var a: u8 = 0;
|
||||||
|
try std.io.null_writer.print("\n{} {}\n", .{ a, S{} });
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue