commit 36df79cd3779b27a63f449618459603ce549660a (tree)
parent febc7d3cd63eefe91c7aaa95e3a274a0b44e353e
Author: Veikka Tuominen <git@vexu.eu>
Date: Tue, 31 May 2022 16:43:58 +0300
stage2: ignore generic return type when hashing function type
Generic parameter types are already ignored.
Diffstat:
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/type.zig b/src/type.zig
@@ -1036,7 +1036,9 @@ pub const Type = extern union {
std.hash.autoHash(hasher, std.builtin.TypeId.Fn);
const fn_info = ty.fnInfo();
- hashWithHasher(fn_info.return_type, hasher, mod);
+ if (fn_info.return_type.tag() != .generic_poison) {
+ hashWithHasher(fn_info.return_type, hasher, mod);
+ }
std.hash.autoHash(hasher, fn_info.alignment);
std.hash.autoHash(hasher, fn_info.cc);
std.hash.autoHash(hasher, fn_info.is_var_args);
diff --git a/test/behavior/basic.zig b/test/behavior/basic.zig
@@ -987,3 +987,21 @@ test "array type comes from generic function" {
const args = [_]S.A(){.{}};
_ = args;
}
+
+test "generic function uses return type of other generic function" {
+ if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
+
+ const S = struct {
+ fn call(
+ f: anytype,
+ args: anytype,
+ ) @TypeOf(@call(.{}, f, @as(@TypeOf(args), undefined))) {
+ return @call(.{}, f, args);
+ }
+
+ fn func(arg: anytype) @TypeOf(arg) {
+ return arg;
+ }
+ };
+ try std.testing.expect(S.call(S.func, .{@as(u8, 1)}) == 1);
+}