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:
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);
}