diff --git a/src/ir.cpp b/src/ir.cpp index 5f7e02848ad96115c8ee9cca07563a1bd98e6911..61c26cb5ae2579d5fab6bbce187d7c3acec22ffd 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -7279,7 +7279,7 @@ static TypeTableEntry *ir_resolve_peer_types(IrAnalyze *ira, AstNode *source_nod prev_inst = cur_inst; } - TypeTableEntry *prev_err_set_type = prev_type->data.error_union.err_set_type; + TypeTableEntry *prev_err_set_type = (err_set_type == nullptr) ? prev_type->data.error_union.err_set_type : err_set_type; TypeTableEntry *cur_err_set_type = cur_type->data.error_union.err_set_type; if (!resolve_inferred_error_set(ira, prev_err_set_type, cur_inst->source_node)) { diff --git a/test/cases/error.zig b/test/cases/error.zig index bb1366429bebaa309a494929aede206d07ffe5f2..e64bf02c9147d750c1d01697490edb493c48ea9d 100644 --- a/test/cases/error.zig +++ b/test/cases/error.zig @@ -150,3 +150,28 @@ fn testErrToIntWithOnePossibleValue(x: error{A}, comptime value: u32) void { @compileError("bad"); } } + +test "error union peer type resolution" { + testErrorUnionPeerTypeResolution(1); + comptime testErrorUnionPeerTypeResolution(1); +} + +fn testErrorUnionPeerTypeResolution(x: i32) void { + const y = switch (x) { + 1 => bar_1(), + 2 => baz_1(), + else => quux_1(), + }; +} + +fn bar_1() error { + return error.A; +} + +fn baz_1() !i32 { + return error.B; +} + +fn quux_1() !i32 { + return error.C; +}