From c4465556fdf14d87f718a7aced5210ec457c1f5a Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Tue, 8 Nov 2022 19:03:47 +0200 Subject: [PATCH] Type: check return_type for generic poison before comparing Closes #13423 --- src/type.zig | 4 +++- test/behavior/generics.zig | 12 ++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/type.zig b/src/type.zig index f24c89ef6f..cd3943a286 100644 --- a/src/type.zig +++ b/src/type.zig @@ -640,7 +640,9 @@ pub const Type = extern union { const a_info = a.fnInfo(); const b_info = b.fnInfo(); - if (!eql(a_info.return_type, b_info.return_type, mod)) + if (a_info.return_type.tag() != .generic_poison and + b_info.return_type.tag() != .generic_poison and + !eql(a_info.return_type, b_info.return_type, mod)) return false; if (a_info.is_var_args != b_info.is_var_args) diff --git a/test/behavior/generics.zig b/test/behavior/generics.zig index 02070cb933..0d704d9680 100644 --- a/test/behavior/generics.zig +++ b/test/behavior/generics.zig @@ -405,3 +405,15 @@ test "null sentinel pointer passed as generic argument" { }; try S.doTheTest((@intToPtr([*:null]const [*c]const u8, 8))); } + +test "generic function passed as comptime argument" { + if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO + + const S = struct { + fn doMath(comptime f: fn (type, i32, i32) error{Overflow}!i32, a: i32, b: i32) !void { + const result = try f(i32, a, b); + try expect(result == 11); + } + }; + try S.doMath(std.math.add, 5, 6); +}