From 6cbb732b59d1ded92c7272a8b06f645e1c8acfd2 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Thu, 10 Oct 2019 10:47:59 +0200 Subject: [PATCH] Extern unions should not trigger active field check Fixes #3378 --- src/ir.cpp | 2 +- test/stage1/behavior/union.zig | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/ir.cpp b/src/ir.cpp index 8fecbf7a18..7dd141423c 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -17951,7 +17951,7 @@ static IrInstruction *ir_analyze_container_field_ptr(IrAnalyze *ira, Buf *field_ union_val->special = ConstValSpecialStatic; bigint_init_bigint(&union_val->data.x_union.tag, &field->enum_field->value); union_val->data.x_union.payload = payload_val; - } else { + } else if (bare_type->data.unionation.layout != ContainerLayoutExtern) { TypeUnionField *actual_field = find_union_field_by_tag(bare_type, &union_val->data.x_union.tag); if (actual_field == nullptr) zig_unreachable(); diff --git a/test/stage1/behavior/union.zig b/test/stage1/behavior/union.zig index d340a52d1e..f5e9ec09a8 100644 --- a/test/stage1/behavior/union.zig +++ b/test/stage1/behavior/union.zig @@ -511,3 +511,13 @@ test "union with comptime_int tag" { }; comptime expect(@TagType(@TagType(Union)) == comptime_int); } + +test "extern union doesn't trigger field check at comptime" { + const U = extern union { + x: u32, + y: u8, + }; + + const x = U{ .x = 0x55AAAA55 }; + comptime expect(x.y == 0x55); +}