Sema: fix runtime call of inline fn with comptime-known comptime-only ret type

This commit is contained in:
Carl Åstholm 2024-02-18 13:17:48 +01:00
parent 129de47a71
commit 9181ecd951
3 changed files with 18 additions and 4 deletions

View File

@ -144,7 +144,7 @@ test "int" {
}
test "float" {
@setEvalBranchQuota(2000);
@setEvalBranchQuota(3000);
// normal -> normal
try expect(nextAfter(f16, 0x1.234p0, 2.0) == 0x1.238p0);

View File

@ -7525,10 +7525,12 @@ fn analyzeCall(
var is_generic_call = func_ty_info.is_generic;
var is_comptime_call = block.is_comptime or modifier == .compile_time;
var is_inline_call = is_comptime_call or modifier == .always_inline or func_ty_info.cc == .Inline;
var comptime_reason: ?*const Block.ComptimeReason = null;
if (!is_comptime_call) {
if (!is_inline_call and !is_comptime_call) {
if (sema.typeRequiresComptime(Type.fromInterned(func_ty_info.return_type))) |ct| {
is_comptime_call = ct;
is_inline_call = ct;
if (ct) {
comptime_reason = &.{ .comptime_ret_ty = .{
.block = block,
@ -7542,8 +7544,6 @@ fn analyzeCall(
else => |e| return e,
}
}
var is_inline_call = is_comptime_call or modifier == .always_inline or
func_ty_info.cc == .Inline;
if (sema.func_is_naked and !is_inline_call and !is_comptime_call) {
const msg = msg: {

View File

@ -604,3 +604,17 @@ test "comptime parameters don't have to be marked comptime if only called at com
};
comptime std.debug.assert(S.foo(5, 6) == 11);
}
test "inline function with comptime-known comptime-only return type called at runtime" {
const S = struct {
inline fn foo(x: *i32, y: *const i32) type {
x.* = y.*;
return f32;
}
};
var a: i32 = 0;
const b: i32 = 111;
const T = S.foo(&a, &b);
try expectEqual(111, a);
try expectEqual(f32, T);
}