authorgravatar for 155240273+PanSashko@users.noreply.github.comPanSashko <155240273+PanSashko@users.noreply.github.com> 2023-12-30 15:03:15+01:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2024-01-02 20:28:55+02:00
logc89bb3e141ee215add0b52930d48bffd8dae8342
tree20e48509e12bb8b39ebef879856d124b34e0dc47
parente19219fa0e0a563dfda4a5f00737e0aadd7ca44e

Fix std.enums.values

Current implementation fails to handle the following enum ```zig const E = enum { X, pub const X = 1; } ``` because `@field(type, name)` prefers declarations over enum fields.

1 files changed, 12 insertions(+), 2 deletions(-)

lib/std/enums.zig+12-2
...@@ -35,8 +35,8 @@ pub fn EnumFieldStruct(comptime E: type, comptime Data: type, comptime field_def...@@ -35,8 +35,8 @@ pub fn EnumFieldStruct(comptime E: type, comptime Data: type, comptime field_def
35pub inline fn valuesFromFields(comptime E: type, comptime fields: []const EnumField) []const E {35pub inline fn valuesFromFields(comptime E: type, comptime fields: []const EnumField) []const E {
36 comptime {36 comptime {
37 var result: [fields.len]E = undefined;37 var result: [fields.len]E = undefined;
38 for (fields, 0..) |f, i| {38 for (&result, fields) |*r, f| {
39 result[i] = @field(E, f.name);39 r.* = @enumFromInt(f.value);
40 }40 }
41 return &result;41 return &result;
42 }42 }
...@@ -1534,3 +1534,13 @@ test "std.enums.EnumIndexer empty" {...@@ -1534,3 +1534,13 @@ test "std.enums.EnumIndexer empty" {
1534 try testing.expectEqual(E, Indexer.Key);1534 try testing.expectEqual(E, Indexer.Key);
1535 try testing.expectEqual(0, Indexer.count);1535 try testing.expectEqual(0, Indexer.count);
1536}1536}
1537
1538test "enumValues" {
1539 const E = enum {
1540 X,
1541 Y,
1542 Z,
1543 pub const X = 1;
1544 };
1545 try testing.expectEqualSlices(E, &.{ .X, .Y, .Z }, values(E));
1546}