Fix result loc unwrapping with optional in error union

Fixes #2899
master
LemonBoy 2019-09-13 09:29:35 +02:00 committed by Andrew Kelley
parent 93367adaa7
commit 5fb7af26ab
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9
2 changed files with 14 additions and 1 deletions

View File

@ -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;

View File

@ -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);
}