stage2: fix @sizeOf for structs with comptime fields

This commit is contained in:
Andrew Kelley 2022-05-04 18:45:59 -07:00
parent 2f6a01d0c3
commit af7e945a7d
4 changed files with 15 additions and 1 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

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