authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-03-06 18:40:21+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-04-04 06:08:10+02:00
log7415739e36cf16574b754dda5ce03c0026b6907c
treee5a46f37de3cff3df28c4f4c441e1763ee9e7dea
parent82b9d9c0f6adf471543b160e15eaeb2a14c722cb
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

Sema: Prevent tail calls of std.builtin.returnError().

LLVM 20 started tail-calling it in some of our test cases, resulting in: error: AndMyCarIsOutOfGas /home/alexrp/Source/ziglang/zig-llvm20/repro.zig:2:5: 0x103ef9d in main (repro) return error.TheSkyIsFalling; ^ /home/alexrp/Source/ziglang/zig-llvm20/repro.zig:6:5: 0x103efa5 in main (repro) return error.AndMyCarIsOutOfGas; ^ /home/alexrp/Source/ziglang/zig-llvm20/lib/std/start.zig:656:37: 0x103ee83 in posixCallMainAndExit (repro) const result = root.main() catch |err| { ^ instead of the expected: error: AndMyCarIsOutOfGas /home/alexrp/Source/ziglang/zig-llvm20/repro.zig:2:5: 0x103f00d in main (repro) return error.TheSkyIsFalling; ^ /home/alexrp/Source/ziglang/zig-llvm20/repro.zig:6:5: 0x103f015 in main (repro) return error.AndMyCarIsOutOfGas; ^ /home/alexrp/Source/ziglang/zig-llvm20/repro.zig:11:9: 0x103f01d in main (repro) try bar(); ^

1 files changed, 2 insertions(+), 2 deletions(-)

src/Sema.zig+2-2
...@@ -19226,7 +19226,7 @@ fn retWithErrTracing(...@@ -19226,7 +19226,7 @@ fn retWithErrTracing(
19226 const return_err_fn = Air.internedToRef(try sema.getBuiltin(src, .returnError));19226 const return_err_fn = Air.internedToRef(try sema.getBuiltin(src, .returnError));
1922719227
19228 if (!need_check) {19228 if (!need_check) {
19229 try sema.callBuiltin(block, src, return_err_fn, .never_inline, &.{}, .@"error return");19229 try sema.callBuiltin(block, src, return_err_fn, .never_tail, &.{}, .@"error return");
19230 _ = try block.addUnOp(ret_tag, operand);19230 _ = try block.addUnOp(ret_tag, operand);
19231 return;19231 return;
19232 }19232 }
...@@ -19237,7 +19237,7 @@ fn retWithErrTracing(...@@ -19237,7 +19237,7 @@ fn retWithErrTracing(
1923719237
19238 var else_block = block.makeSubBlock();19238 var else_block = block.makeSubBlock();
19239 defer else_block.instructions.deinit(gpa);19239 defer else_block.instructions.deinit(gpa);
19240 try sema.callBuiltin(&else_block, src, return_err_fn, .never_inline, &.{}, .@"error return");19240 try sema.callBuiltin(&else_block, src, return_err_fn, .never_tail, &.{}, .@"error return");
19241 _ = try else_block.addUnOp(ret_tag, operand);19241 _ = try else_block.addUnOp(ret_tag, operand);
1924219242
19243 try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).@"struct".fields.len +19243 try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).@"struct".fields.len +