diff --git a/lib/std/math/nextafter.zig b/lib/std/math/nextafter.zig index 6780d6089f..717cbf4700 100644 --- a/lib/std/math/nextafter.zig +++ b/lib/std/math/nextafter.zig @@ -144,7 +144,7 @@ test "int" { } test "float" { - @setEvalBranchQuota(2000); + @setEvalBranchQuota(3000); // normal -> normal try expect(nextAfter(f16, 0x1.234p0, 2.0) == 0x1.238p0); diff --git a/src/Sema.zig b/src/Sema.zig index 39d687c18a..fa55876cc3 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -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: { diff --git a/test/behavior/fn.zig b/test/behavior/fn.zig index 8a008d987d..373a29f844 100644 --- a/test/behavior/fn.zig +++ b/test/behavior/fn.zig @@ -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); +}