zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 6cbb732b59d1ded92c7272a8b06f645e1c8acfd2 (tree)
parent 4e81df12c3dae2ae67ef25fcfe65e8db724e84f3
Author: LemonBoy <thatlemon@gmail.com>
Date:   Thu, 10 Oct 2019 10:47:59 +0200

Extern unions should not trigger active field check

Fixes #3378

Diffstat:
Msrc/ir.cpp | 2+-
Mtest/stage1/behavior/union.zig | 10++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)

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