| author | |
| committer | |
| log | 50cc3b91a5b325b645b0c5c81f3401600b15c92a |
| tree | 15c6a5de8f98b64d43e8e082092fdb24710d806d |
| parent | 22c4fbdf16ce67bdcffc33a5319e3734f880e002 |
| signature |
2 files changed, 22 insertions(+), 1 deletions(-)
src/Sema.zig+5-1| ... | ... | @@ -7194,7 +7194,11 @@ fn analyzeCall( |
| 7194 | 7194 | .pointer => func_or_ptr_ty.childType(zcu), |
| 7195 | 7195 | else => unreachable, |
| 7196 | 7196 | }; |
| 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); | |
| 7198 | 7202 | } |
| 7199 | 7203 | |
| 7200 | 7204 | switch (actual_ret_ty.classify(zcu)) { |
test/cases/compile_errors/tail_call_through_inline.zig created+17| ... | ... | @@ -0,0 +1,17 @@ |
| 1 | export fn f() u32 { | |
| 2 | return bad(); | |
| 3 | } | |
| 4 | ||
| 5 | inline fn bad() bool { | |
| 6 | return @call(.always_tail, g, .{}); | |
| 7 | } | |
| 8 | ||
| 9 | fn 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 |