diff --git a/src/InternPool.zig b/src/InternPool.zig index 221b56b88a..a385702c43 100644 --- a/src/InternPool.zig +++ b/src/InternPool.zig @@ -448,7 +448,11 @@ pub const Key = union(enum) { if (x >= self.names.len) return null; return @intCast(u32, x); }, - .i64, .big_int => return null, // out of range + .i64 => |x| { + if (x >= self.names.len or x < 0) return null; + return @intCast(u32, x); + }, + .big_int => return null, // out of range .lazy_align, .lazy_size => unreachable, } } diff --git a/test/behavior/enum.zig b/test/behavior/enum.zig index 12926800e3..4280a954dc 100644 --- a/test/behavior/enum.zig +++ b/test/behavior/enum.zig @@ -812,6 +812,11 @@ test "signed integer as enum tag" { try expect(@intFromEnum(SignedEnum.A2) == 1); } +test "int to enum with signed tag type" { + const E = enum(i32) { a, b, c }; + try expect(@intToEnum(E, 0) == .a); +} + test "enum with one member and custom tag type" { const E = enum(u2) { One,