aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-11-08 19:03:47 +0200
committerVeikka Tuominen <git@vexu.eu>2022-11-11 17:59:53 +0200
commitc4465556fdf14d87f718a7aced5210ec457c1f5a (patch)
tree4873404b890e9a97aa972b14561a268688b9b9db
parentcacfb0cfe4217a19872d62e248389bc522b36bf8 (diff)
downloadzig-c4465556fdf14d87f718a7aced5210ec457c1f5a.tar.gz
zig-c4465556fdf14d87f718a7aced5210ec457c1f5a.zip
Type: check return_type for generic poison before comparing
Closes #13423
-rw-r--r--src/type.zig4
-rw-r--r--test/behavior/generics.zig12
2 files changed, 15 insertions, 1 deletions
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);
+}