diff --git a/src/Sema.zig b/src/Sema.zig index 8f53c167397ded40e8a80f1d07629175afa2b16f..0da5808eac22d9c76fdde9fc3f219779c9939388 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -7194,7 +7194,11 @@ fn analyzeCall( .pointer => func_or_ptr_ty.childType(zcu), else => unreachable, }; - return sema.handleTailCall(block, call_src, runtime_func_ty, call_ref); + const result = sema.coerceExtra(block, sema.fn_ret_ty, call_ref, call_src, .{ .is_ret = true }) catch |err| switch (err) { + error.NotCoercible => unreachable, + else => |e| return e, + }; + return sema.handleTailCall(block, call_src, runtime_func_ty, result); } switch (actual_ret_ty.classify(zcu)) { diff --git a/test/cases/compile_errors/tail_call_through_inline.zig b/test/cases/compile_errors/tail_call_through_inline.zig new file mode 100644 index 0000000000000000000000000000000000000000..0559211f095599db8df2f314ffcd5b8e15f09dc6 --- /dev/null +++ b/test/cases/compile_errors/tail_call_through_inline.zig @@ -0,0 +1,17 @@ +export fn f() u32 { + return bad(); +} + +inline fn bad() bool { + return @call(.always_tail, g, .{}); +} + +fn g() u32 { + return 123; +} + +// error +// +// :6:12: error: expected type 'bool', found 'u32' +// :5:17: note: function return type declared here +// :2:15: note: called inline here