Commit 3919afcad2

Andrew Kelley <superjoe30@gmail.com>
2018-02-09 17:16:04
fix crash with error peer type resolution
closes #765
1 parent 2c697e5
Changed files (2)
src
test
cases
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)) {
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;
+}