authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2026-03-14 05:14:42-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2026-03-14 05:23:13-07:00
log50cc3b91a5b325b645b0c5c81f3401600b15c92a
tree15c6a5de8f98b64d43e8e082092fdb24710d806d
parent22c4fbdf16ce67bdcffc33a5319e3734f880e002
signaturelock-open Commit is signed but in an unrecognized format.

Sema: coerce tail call result to immediate function


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

src/Sema.zig+5-1
......@@ -7194,7 +7194,11 @@ fn analyzeCall(
71947194 .pointer => func_or_ptr_ty.childType(zcu),
71957195 else => unreachable,
71967196 };
7197 return sema.handleTailCall(block, call_src, runtime_func_ty, call_ref);
7197 const result = sema.coerceExtra(block, sema.fn_ret_ty, call_ref, call_src, .{ .is_ret = true }) catch |err| switch (err) {
7198 error.NotCoercible => unreachable,
7199 else => |e| return e,
7200 };
7201 return sema.handleTailCall(block, call_src, runtime_func_ty, result);
71987202 }
71997203
72007204 switch (actual_ret_ty.classify(zcu)) {
test/cases/compile_errors/tail_call_through_inline.zig created+17
......@@ -0,0 +1,17 @@
1export fn f() u32 {
2 return bad();
3}
4
5inline fn bad() bool {
6 return @call(.always_tail, g, .{});
7}
8
9fn g() u32 {
10 return 123;
11}
12
13// error
14//
15// :6:12: error: expected type 'bool', found 'u32'
16// :5:17: note: function return type declared here
17// :2:15: note: called inline here