zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit af7e945a7dc00a2a5055d9770b9ecda253d64a8e (tree)
parent 2f6a01d0c39542e7d88c9af14e869b820fd156cc
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Wed,  4 May 2022 18:45:59 -0700

stage2: fix `@sizeOf` for structs with comptime fields

Diffstat:
Msrc/type.zig | 2+-
Mtest/behavior/align.zig | 4++++
Mtest/behavior/bitcast.zig | 4++++
Mtest/behavior/struct.zig | 6++++++
4 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/type.zig b/src/type.zig @@ -5177,7 +5177,7 @@ pub const Type = extern union { const field = it.struct_obj.fields.values()[it.field]; defer it.field += 1; - if (!field.ty.hasRuntimeBits()) + if (!field.ty.hasRuntimeBits() or field.is_comptime) return FieldOffset{ .field = it.field, .offset = it.offset }; const field_align = field.normalAlignment(it.target); diff --git a/test/behavior/align.zig b/test/behavior/align.zig @@ -55,6 +55,10 @@ test "alignment of struct with pointer has same alignment as usize" { } test "alignment and size of structs with 128-bit fields" { + if (builtin.zig_backend == .stage1) { + // stage1 gets the wrong answer for a lot of targets + return error.SkipZigTest; + } if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO diff --git a/test/behavior/bitcast.zig b/test/behavior/bitcast.zig @@ -120,6 +120,10 @@ test "bitcast generates a temporary value" { } test "@bitCast packed structs at runtime and comptime" { + if (builtin.zig_backend == .stage1) { + // stage1 gets the wrong answer for a lot of targets + return error.SkipZigTest; + } if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig @@ -500,6 +500,10 @@ const Bitfields = packed struct { }; test "packed struct fields are ordered from LSB to MSB" { + if (builtin.zig_backend == .stage1) { + // stage1 gets the wrong answer for a lot of targets + return error.SkipZigTest; + } if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO @@ -971,6 +975,8 @@ test "comptime struct field" { comptime b: i32 = 1234, }; + comptime std.debug.assert(@sizeOf(T) == 4); + var foo: T = undefined; comptime try expect(foo.b == 1234); }