commit e4f46e7e7ac63d87319189f130629074e366164d (tree)
parent f3544a707941269ec3ed9145ee1432df5a01a10a
Author: Mason Remaley <mason@gamesbymason.com>
Date: Tue, 23 Jun 2026 23:13:43 -0700
Asserts InternPool keys have unique representations
I also asserted that these types are extern compatible, so as to
guarantee stability across compilations.
`SpirvType` was failing both of these assertions. I resolved this by
making it extern, and adding explicitly zeroed padding.
I didn't yet add test coverage that type equality works on reified SPIRV
types, as `zirReifySpirvType` returns unique values for each type
regardless of the hash. I will file a followup issue for this after
posting this PR.
Diffstat:
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/InternPool.zig b/src/InternPool.zig
@@ -2147,9 +2147,11 @@ pub const Key = union(enum) {
};
};
- pub const SpirvType = struct {
+ pub const SpirvType = extern struct {
/// A `spirv_reify` instruction.
zir_index: TrackedInst.Index,
+ /// Always 0.
+ padding: u32 = 0,
/// A hash of this type's attributes generated by Sema.
type_hash: u64,
};
@@ -2591,7 +2593,6 @@ pub const Key = union(enum) {
const KeyTag = @typeInfo(Key).@"union".tag_type.?;
const seed = @intFromEnum(@as(KeyTag, key));
return switch (key) {
- // TODO: assert no padding in these types
inline .ptr_type,
.array_type,
.vector_type,
@@ -2608,7 +2609,11 @@ pub const Key = union(enum) {
.enum_tag,
.inferred_error_set_type,
.un,
- => |x| Hash.hash(seed, asBytes(&x)),
+ => |x| {
+ _ = extern struct { is_extern: @TypeOf(x) };
+ comptime assert(std.meta.hasUniqueRepresentation(@TypeOf(x)));
+ return Hash.hash(seed, asBytes(&x));
+ },
.int_type => |x| Hash.hash(seed + @intFromEnum(x.signedness), asBytes(&x.bits)),