From 71937f75d83d960e0ec61eb697e4e3420685f9ca Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sat, 26 Nov 2022 18:04:07 +0200 Subject: [PATCH] Sema: correctly detect union target in `zirSwitchBlock` Closes #13655 --- src/Sema.zig | 4 +++- test/behavior/union.zig | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index f056164f80..3476024222 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -9698,10 +9698,12 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError }; const maybe_union_ty = blk: { + const zir_tags = sema.code.instructions.items(.tag); const zir_data = sema.code.instructions.items(.data); const cond_index = Zir.refToIndex(extra.data.operand).?; const raw_operand = sema.resolveInst(zir_data[cond_index].un_node.operand) catch unreachable; - break :blk sema.typeOf(raw_operand); + const target_ty = sema.typeOf(raw_operand); + break :blk if (zir_tags[cond_index] == .switch_cond_ref) target_ty.elemType() else target_ty; }; const union_originally = maybe_union_ty.zigTypeTag() == .Union; diff --git a/test/behavior/union.zig b/test/behavior/union.zig index 37cd72e319..aaeb586cdf 100644 --- a/test/behavior/union.zig +++ b/test/behavior/union.zig @@ -1287,7 +1287,14 @@ test "noreturn field in union" { try expect(a == .a); }, } - try expect(count == 5); + switch (a) { + .a => count += 1, + .b, .c => |*val| { + _ = val; + @compileError("bad"); + }, + } + try expect(count == 6); } test "union and enum field order doesn't match" {