Commit 8bd94759bf

John Schmidt <john.schmidt.h@gmail.com>
2024-02-18 01:06:13
Sema: evaluate generic instantiations in fn decls capture scope
The generic call `S.foo()` was evaluated with the capture scope of the owner decl (i.e the `test` block), when it should use the capture scope of the function declaration.
1 parent 1b79a42
Changed files (2)
src
test
behavior
src/Sema.zig
@@ -7951,7 +7951,7 @@ fn instantiateGenericCall(
         .sema = &child_sema,
         .src_decl = generic_owner_func.owner_decl,
         .namespace = namespace_index,
-        .wip_capture_scope = try mod.createCaptureScope(sema.owner_decl.src_scope),
+        .wip_capture_scope = try mod.createCaptureScope(fn_owner_decl.src_scope),
         .instructions = .{},
         .inlining = null,
         .is_comptime = true,
test/behavior/generics.zig
@@ -558,3 +558,19 @@ test "call generic function with from function called by the generic function" {
 
     ArgSerializer.serializeCommand(GET{ .key = "banana" });
 }
+
+fn StructCapture(comptime T: type) type {
+    return struct {
+        pub fn foo(comptime x: usize) struct { T } {
+            return .{x};
+        }
+    };
+}
+
+test "call generic function that uses capture from function declaration's scope" {
+    if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf and builtin.target.ofmt != .macho) return error.SkipZigTest;
+
+    const S = StructCapture(f64);
+    const s = S.foo(123);
+    try expectEqual(123.0, s[0]);
+}