zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit a99ad52b362d966f772f29ad14ae1714218bc033 (tree)
parent 2fb78430dbff206af24ecd5e7be163e624fdbb6f
Author: mlugg <mlugg@mlugg.co.uk>
Date:   Tue, 20 Aug 2024 16:05:04 +0100

Sema: register correct dependencies for inline calls

And add a corresponding test case.

Diffstat:
Msrc/Sema.zig | 7+++++++
Atest/incremental/modify_inline_fn | 23+++++++++++++++++++++++
2 files changed, 30 insertions(+), 0 deletions(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -7598,6 +7598,9 @@ fn analyzeCall( const module_fn = zcu.funcInfo(module_fn_index); + // The call site definitely depends on the function's signature. + try sema.declareDependency(.{ .src_hash = module_fn.zir_body_inst }); + // This is not a function instance, so the function's `Nav` has a // `Cau` -- we don't need to check `generic_owner`. const fn_nav = ip.getNav(module_fn.owner_nav); @@ -7755,6 +7758,10 @@ fn analyzeCall( break :res Air.internedToRef(memoized_call.result); } + // Since we're doing an inline call, we depend on the source code of the whole + // function declaration. + try sema.declareDependency(.{ .src_hash = fn_cau.zir_index }); + new_fn_info.return_type = sema.fn_ret_ty.toIntern(); if (!is_comptime_call and !block.is_typeof) { const zir_tags = sema.code.instructions.items(.tag); diff --git a/test/incremental/modify_inline_fn b/test/incremental/modify_inline_fn @@ -0,0 +1,23 @@ +#target=x86_64-linux +#update=initial version +#file=main.zig +const std = @import("std"); +pub fn main() !void { + const str = getStr(); + try std.io.getStdOut().writeAll(str); +} +inline fn getStr() []const u8 { + return "foo\n"; +} +#expect_stdout="foo\n" +#update=change the string +#file=main.zig +const std = @import("std"); +pub fn main() !void { + const str = getStr(); + try std.io.getStdOut().writeAll(str); +} +inline fn getStr() []const u8 { + return "bar\n"; +} +#expect_stdout="bar\n"