Skip to content

Commit c446555

Browse files
committed
Type: check return_type for generic poison before comparing
Closes #13423
1 parent cacfb0c commit c446555

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/type.zig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,9 @@ pub const Type = extern union {
640640
const a_info = a.fnInfo();
641641
const b_info = b.fnInfo();
642642

643-
if (!eql(a_info.return_type, b_info.return_type, mod))
643+
if (a_info.return_type.tag() != .generic_poison and
644+
b_info.return_type.tag() != .generic_poison and
645+
!eql(a_info.return_type, b_info.return_type, mod))
644646
return false;
645647

646648
if (a_info.is_var_args != b_info.is_var_args)

test/behavior/generics.zig

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,3 +405,15 @@ test "null sentinel pointer passed as generic argument" {
405405
};
406406
try S.doTheTest((@intToPtr([*:null]const [*c]const u8, 8)));
407407
}
408+
409+
test "generic function passed as comptime argument" {
410+
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
411+
412+
const S = struct {
413+
fn doMath(comptime f: fn (type, i32, i32) error{Overflow}!i32, a: i32, b: i32) !void {
414+
const result = try f(i32, a, b);
415+
try expect(result == 11);
416+
}
417+
};
418+
try S.doMath(std.math.add, 5, 6);
419+
}

0 commit comments

Comments
 (0)