aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-05-31 12:17:48 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-05-31 12:17:48 -0700
commit282437c7538e3e70ce06cfee7affe976de28a780 (patch)
tree3d04a4c1f6949c567816d7484fe09572ab0c657c /src
parent56608cbb3d5577d8931830fa02d3e2920925ceab (diff)
downloadzig-282437c7538e3e70ce06cfee7affe976de28a780.tar.gz
zig-282437c7538e3e70ce06cfee7affe976de28a780.zip
stage2: fix hash/eql on function types
to account for generic callconv and generic alignment.
Diffstat (limited to 'src')
-rw-r--r--src/type.zig16
1 files changed, 10 insertions, 6 deletions
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);