From 3919afcad26d2359efe52f98cd4f2f0573527369 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Fri, 9 Feb 2018 11:16:04 -0500 Subject: [PATCH] fix crash with error peer type resolution closes #765 --- src/ir.cpp | 2 +- test/cases/error.zig | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) 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; +} -- 2.54.0