Sema: complete the Type.hash function

Similar to how Type.eql was reworked in the previous commit, this commit
reworks Type.hash to check all the different kinds of tags that a Type
can be represented with. It also completes the implementation for all
types except error sets, which need to have Type.eql enhanced as well.
This commit is contained in:
Andrew Kelley
2022-02-28 20:05:21 -07:00
parent 157f66ec07
commit d5131e91eb
3 changed files with 249 additions and 61 deletions

View File

@@ -2040,9 +2040,19 @@ pub const Value = extern union {
}
const fields = ty.structFields().values();
if (fields.len == 0) return;
const field_values = val.castTag(.@"struct").?.data;
for (field_values) |field_val, i| {
field_val.hash(fields[i].ty, hasher);
switch (val.tag()) {
.empty_struct_value => {
for (fields) |field| {
field.default_val.hash(field.ty, hasher);
}
},
.@"struct" => {
const field_values = val.castTag(.@"struct").?.data;
for (field_values) |field_val, i| {
field_val.hash(fields[i].ty, hasher);
}
},
else => unreachable,
}
},
.Optional => {