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:
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);
+}