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:
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"