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 {...@@ -5177,7 +5177,7 @@ pub const Type = extern union {
51775177
5178 const field = it.struct_obj.fields.values()[it.field];5178 const field = it.struct_obj.fields.values()[it.field];
5179 defer it.field += 1;5179 defer it.field += 1;
5180 if (!field.ty.hasRuntimeBits())5180 if (!field.ty.hasRuntimeBits() or field.is_comptime)
5181 return FieldOffset{ .field = it.field, .offset = it.offset };5181 return FieldOffset{ .field = it.field, .offset = it.offset };
51825182
5183 const field_align = field.normalAlignment(it.target);5183 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" {...@@ -55,6 +55,10 @@ test "alignment of struct with pointer has same alignment as usize" {
55}55}
5656
57test "alignment and size of structs with 128-bit fields" {57test "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 }
58 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO62 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
59 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO63 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" {...@@ -120,6 +120,10 @@ test "bitcast generates a temporary value" {
120}120}
121121
122test "@bitCast packed structs at runtime and comptime" {122test "@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 }
123 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;127 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
124 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;128 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
125 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;129 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
test/behavior/struct.zig+6
...@@ -500,6 +500,10 @@ const Bitfields = packed struct {...@@ -500,6 +500,10 @@ const Bitfields = packed struct {
500};500};
501501
502test "packed struct fields are ordered from LSB to MSB" {502test "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 }
503 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO507 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
504 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO508 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
505 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO509 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
...@@ -971,6 +975,8 @@ test "comptime struct field" {...@@ -971,6 +975,8 @@ test "comptime struct field" {
971 comptime b: i32 = 1234,975 comptime b: i32 = 1234,
972 };976 };
973977
978 comptime std.debug.assert(@sizeOf(T) == 4);
979
974 var foo: T = undefined;980 var foo: T = undefined;
975 comptime try expect(foo.b == 1234);981 comptime try expect(foo.b == 1234);
976}982}