From af7e945a7dc00a2a5055d9770b9ecda253d64a8e Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 4 May 2022 18:45:59 -0700 Subject: [PATCH] stage2: fix `@sizeOf` for structs with comptime fields --- src/type.zig | 2 +- test/behavior/align.zig | 4 ++++ test/behavior/bitcast.zig | 4 ++++ test/behavior/struct.zig | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/type.zig b/src/type.zig index 44432b95f6..ddeec596e1 100644 --- 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 index 393908d5bd..5a3a76beb2 100644 --- 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 index e74a4c44f4..4922b9473e 100644 --- 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 index ed75268f7d..24365d49b7 100644 --- 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); }