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(
1922619226 const return_err_fn = Air.internedToRef(try sema.getBuiltin(src, .returnError));
1922719227
1922819228 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");
1923019230 _ = try block.addUnOp(ret_tag, operand);
1923119231 return;
1923219232 }
......@@ -19237,7 +19237,7 @@ fn retWithErrTracing(
1923719237
1923819238 var else_block = block.makeSubBlock();
1923919239 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");
1924119241 _ = try else_block.addUnOp(ret_tag, operand);
1924219242
1924319243 try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.CondBr).@"struct".fields.len +