diff --git a/src/Sema.zig b/src/Sema.zig index aa624e06e7..89a5ba0920 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -11255,10 +11255,18 @@ fn zirSwitchBlockErrUnion(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Comp defer seen_errors.deinit(); const operand_ty = sema.typeOf(raw_operand_val); - const operand_err_set_ty = if (extra.data.bits.payload_is_ref) - operand_ty.childType(mod).errorUnionSet(mod) + const operand_err_set = if (extra.data.bits.payload_is_ref) + operand_ty.childType(mod) else - operand_ty.errorUnionSet(mod); + operand_ty; + + if (operand_err_set.zigTypeTag(mod) != .ErrorUnion) { + return sema.fail(block, switch_src, "expected error union type, found '{}'", .{ + operand_ty.fmt(mod), + }); + } + + const operand_err_set_ty = operand_err_set.errorUnionSet(mod); const block_inst: Air.Inst.Index = @enumFromInt(sema.air_instructions.len); try sema.air_instructions.append(gpa, .{ diff --git a/test/cases/compile_errors/switch_on_non_err_union.zig b/test/cases/compile_errors/switch_on_non_err_union.zig new file mode 100644 index 0000000000..87624b21dc --- /dev/null +++ b/test/cases/compile_errors/switch_on_non_err_union.zig @@ -0,0 +1,11 @@ +pub fn main() void { + false catch |err| switch (err) { + else => {}, + }; +} + +// error +// backend=stage2 +// target=native +// +// :2:23: error: expected error union type, found 'bool'