From 36df79cd3779b27a63f449618459603ce549660a Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Tue, 31 May 2022 16:43:58 +0300 Subject: stage2: ignore generic return type when hashing function type Generic parameter types are already ignored. --- src/type.zig | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/type.zig') diff --git a/src/type.zig b/src/type.zig index ebb8bfd7c3..638145e8b1 100644 --- 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); -- cgit v1.2.3 From 282437c7538e3e70ce06cfee7affe976de28a780 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 31 May 2022 12:17:48 -0700 Subject: stage2: fix hash/eql on function types to account for generic callconv and generic alignment. --- src/type.zig | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/type.zig') diff --git a/src/type.zig b/src/type.zig index 638145e8b1..9a072fa911 100644 --- a/src/type.zig +++ b/src/type.zig @@ -640,16 +640,16 @@ pub const Type = extern union { if (!eql(a_info.return_type, b_info.return_type, mod)) return false; - if (a_info.cc != b_info.cc) + if (a_info.is_var_args != b_info.is_var_args) return false; - if (a_info.alignment != b_info.alignment) + if (a_info.is_generic != b_info.is_generic) return false; - if (a_info.is_var_args != b_info.is_var_args) + if (!a_info.cc_is_generic and a_info.cc != b_info.cc) return false; - if (a_info.is_generic != b_info.is_generic) + if (!a_info.align_is_generic and a_info.alignment != b_info.alignment) return false; if (a_info.param_types.len != b_info.param_types.len) @@ -1039,8 +1039,12 @@ pub const Type = extern union { 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); + if (!fn_info.align_is_generic) { + std.hash.autoHash(hasher, fn_info.alignment); + } + if (!fn_info.cc_is_generic) { + std.hash.autoHash(hasher, fn_info.cc); + } std.hash.autoHash(hasher, fn_info.is_var_args); std.hash.autoHash(hasher, fn_info.is_generic); -- cgit v1.2.3