Commit 5fb7af26ab

LemonBoy <thatlemon@gmail.com>
2019-09-13 09:29:35
Fix result loc unwrapping with optional in error union
Fixes #2899
1 parent 93367ad
Changed files (2)
src
test
stage1
behavior
src/ir.cpp
@@ -15496,7 +15496,8 @@ static IrInstruction *ir_resolve_result(IrAnalyze *ira, IrInstruction *suspend_s
             IrInstruction *unwrapped_err_ptr = ir_analyze_unwrap_error_payload(ira, suspend_source_instr,
                     result_loc, false, true);
             ZigType *actual_payload_type = actual_elem_type->data.error_union.payload_type;
-            if (actual_payload_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional) {
+            if (actual_payload_type->id == ZigTypeIdOptional && value_type->id != ZigTypeIdOptional &&
+                value_type->id != ZigTypeIdNull) {
                 return ir_analyze_unwrap_optional_payload(ira, suspend_source_instr, unwrapped_err_ptr, false, true);
             } else {
                 return unwrapped_err_ptr;
test/stage1/behavior/misc.zig
@@ -754,3 +754,15 @@ test "nested optional field in struct" {
     };
     expect(s.x.?.y == 127);
 }
+
+fn maybe(x: bool) anyerror!?u32 {
+    return switch (x) {
+        true => u32(42),
+        else => null,
+    };
+}
+
+test "result location is optional inside error union" {
+    const x = maybe(true) catch unreachable;
+    expect(x.? == 42);
+}