authorgravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-10-23 20:05:47-04:00
committergravatar for matthew.h.borkowski@gmail.comMatthew Borkowski <matthew.h.borkowski@gmail.com> 2021-10-23 20:48:31-04:00
log8a95bac593ce9aa36b76229a9f2f4aba8c8d30dd
tree2ee7d2731b958a00163401e4b9c23ded6e0bc4cc
parent096763de9808efa996d248815d4ac913381aa1b4

astgen.zig: when ret's operand ResultLoc is .ptr, load from ret_ptr before is_non_err or err_union_code


1 files changed, 5 insertions(+), 3 deletions(-)

src/AstGen.zig+5-3
...@@ -6500,7 +6500,8 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref...@@ -6500,7 +6500,8 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
6500 },6500 },
6501 .always => {6501 .always => {
6502 // Value is always an error. Emit both error defers and regular defers.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 try genDefers(gz, defer_outer, scope, .{ .both = err_code });6505 try genDefers(gz, defer_outer, scope, .{ .both = err_code });
6505 try gz.addRet(rl, operand, node);6506 try gz.addRet(rl, operand, node);
6506 return Zir.Inst.Ref.unreachable_value;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,7 +6516,8 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
6515 }6516 }
65166517
6517 // Emit conditional branch for generating errdefers.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 const condbr = try gz.addCondBr(.condbr, node);6521 const condbr = try gz.addCondBr(.condbr, node);
65206522
6521 var then_scope = gz.makeSubBlock(scope);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,7 +6530,7 @@ fn ret(gz: *GenZir, scope: *Scope, node: Ast.Node.Index) InnerError!Zir.Inst.Ref
6528 defer else_scope.instructions.deinit(astgen.gpa);6530 defer else_scope.instructions.deinit(astgen.gpa);
65296531
6530 const which_ones: DefersToEmit = if (!defer_counts.need_err_code) .both_sans_err else .{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 try genDefers(&else_scope, defer_outer, scope, which_ones);6535 try genDefers(&else_scope, defer_outer, scope, which_ones);
6534 try else_scope.addRet(rl, operand, node);6536 try else_scope.addRet(rl, operand, node);