| ... | ... | @@ -6500,7 +6500,8 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref |
| 6500 | 6500 | }, |
| 6501 | 6501 | .always => { |
| 6502 | 6502 | // Value is always an error. Emit both error defers and regular defers. |
| 6503 | | const err_code = try gz.addUnNode(.err_union_code, operand, node); |
| 6503 | const result = if (rl == .ptr) try gz.addUnNode(.load, rl.ptr, node) else operand; |
| 6504 | const err_code = try gz.addUnNode(.err_union_code, result, node); |
| 6504 | 6505 | try genDefers(gz, defer_outer, scope, .{ .both = err_code }); |
| 6505 | 6506 | try gz.addRet(rl, operand, node); |
| 6506 | 6507 | return Zir.Inst.Ref.unreachable_value; |
| ... | ... | @@ -6515,7 +6516,8 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref |
| 6515 | 6516 | } |
| 6516 | 6517 | |
| 6517 | 6518 | // Emit conditional branch for generating errdefers. |
| 6518 | | const is_non_err = try gz.addUnNode(.is_non_err, operand, node); |
| 6519 | const result = if (rl == .ptr) try gz.addUnNode(.load, rl.ptr, node) else operand; |
| 6520 | const is_non_err = try gz.addUnNode(.is_non_err, result, node); |
| 6519 | 6521 | const condbr = try gz.addCondBr(.condbr, node); |
| 6520 | 6522 | |
| 6521 | 6523 | var then_scope = gz.makeSubBlock(scope); |
| ... | ... | @@ -6528,7 +6530,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref |
| 6528 | 6530 | defer else_scope.instructions.deinit(astgen.gpa); |
| 6529 | 6531 | |
| 6530 | 6532 | const which_ones: DefersToEmit = if (!defer_counts.need_err_code) .both_sans_err else .{ |
| 6531 | | .both = try else_scope.addUnNode(.err_union_code, operand, node), |
| 6533 | .both = try else_scope.addUnNode(.err_union_code, result, node), |
| 6532 | 6534 | }; |
| 6533 | 6535 | try genDefers(&else_scope, defer_outer, scope, which_ones); |
| 6534 | 6536 | try else_scope.addRet(rl, operand, node); |