authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-04 18:45:59-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-04 18:45:59-07:00
logaf7e945a7dc00a2a5055d9770b9ecda253d64a8e
treeeea75368e3cf4a065a0e261f99a584d3a9beea68
parent2f6a01d0c39542e7d88c9af14e869b820fd156cc

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


4 files changed, 15 insertions(+), 1 deletions(-)

src/type.zig+1-1
......@@ -5177,7 +5177,7 @@ pub const Type = extern union {
51775177
51785178 const field = it.struct_obj.fields.values()[it.field];
51795179 defer it.field += 1;
5180 if (!field.ty.hasRuntimeBits())
5180 if (!field.ty.hasRuntimeBits() or field.is_comptime)
51815181 return FieldOffset{ .field = it.field, .offset = it.offset };
51825182
51835183 const field_align = field.normalAlignment(it.target);
test/behavior/align.zig+4
......@@ -55,6 +55,10 @@ test "alignment of struct with pointer has same alignment as usize" {
5555}
5656
5757test "alignment and size of structs with 128-bit fields" {
58 if (builtin.zig_backend == .stage1) {
59 // stage1 gets the wrong answer for a lot of targets
60 return error.SkipZigTest;
61 }
5862 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
5963 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6064
test/behavior/bitcast.zig+4
......@@ -120,6 +120,10 @@ test "bitcast generates a temporary value" {
120120}
121121
122122test "@bitCast packed structs at runtime and comptime" {
123 if (builtin.zig_backend == .stage1) {
124 // stage1 gets the wrong answer for a lot of targets
125 return error.SkipZigTest;
126 }
123127 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
124128 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
125129 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
test/behavior/struct.zig+6
......@@ -500,6 +500,10 @@ const Bitfields = packed struct {
500500};
501501
502502test "packed struct fields are ordered from LSB to MSB" {
503 if (builtin.zig_backend == .stage1) {
504 // stage1 gets the wrong answer for a lot of targets
505 return error.SkipZigTest;
506 }
503507 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
504508 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
505509 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
......@@ -971,6 +975,8 @@ test "comptime struct field" {
971975 comptime b: i32 = 1234,
972976 };
973977
978 comptime std.debug.assert(@sizeOf(T) == 4);
979
974980 var foo: T = undefined;
975981 comptime try expect(foo.b == 1234);
976982}