From 773b1c4c5cdf9fde19cbf09d0f81f1bfe27ed7ca Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Mon, 20 Mar 2023 18:05:52 +0200 Subject: [PATCH] llvm: fix lowering packed union initiated to zero-bit value Closes #14980 --- src/codegen/llvm.zig | 2 ++ test/behavior/union.zig | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 11fc44747e..dd13087afe 100644 --- a/src/codegen/llvm.zig +++ b/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); diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 9b49f8bf47..ff3f0b7e54 100644 --- a/test/behavior/union.zig +++ b/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 }); +}