commit 8bd94759bf48c3247d4de14806ff2f510cb36591 (tree)
parent 1b79a42da096fcdeac22b56f17f82b0c7ec22a9b
Author: John Schmidt <john.schmidt.h@gmail.com>
Date: Sun, 18 Feb 2024 01:06:13 +0100
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.
Diffstat:
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/src/Sema.zig b/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,
diff --git a/test/behavior/generics.zig b/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]);
+}