Commit 773b1c4c5c

Veikka Tuominen <git@vexu.eu>
2023-03-20 17:05:52
llvm: fix lowering packed union initiated to zero-bit value
Closes #14980
1 parent 0c16912
Changed files (2)
src
codegen
test
behavior
src/codegen/llvm.zig
@@ -3815,6 +3815,8 @@ pub const DeclGen = struct {
 
                 const field_ty = union_obj.fields.values()[field_index].ty;
                 if (union_obj.layout == .Packed) {
+                    if (!field_ty.hasRuntimeBits())
+                        return llvm_union_ty.constNull();
                     const non_int_val = try lowerValue(dg, .{ .ty = field_ty, .val = tag_and_val.val });
                     const ty_bit_size = @intCast(u16, field_ty.bitSize(target));
                     const small_int_ty = dg.context.intType(ty_bit_size);
test/behavior/union.zig
@@ -1493,3 +1493,23 @@ test "union reassignment can use previous value" {
     a = U{ .b = a.a };
     try expect(a.b == 32);
 }
+
+test "packed union with zero-bit field" {
+    if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+    if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+
+    const S = packed struct {
+        nested: packed union {
+            zero: void,
+            sized: u32,
+        },
+        bar: u32,
+
+        fn doTest(self: @This()) !void {
+            try expect(self.bar == 42);
+        }
+    };
+    try S.doTest(.{ .nested = .{ .zero = {} }, .bar = 42 });
+}