From c89bb3e141ee215add0b52930d48bffd8dae8342 Mon Sep 17 00:00:00 2001 From: PanSashko <155240273+PanSashko@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:03:15 +0100 Subject: [PATCH] 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. --- lib/std/enums.zig | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/std/enums.zig b/lib/std/enums.zig index d0eb77e5f9..839781ffb7 100644 --- a/lib/std/enums.zig +++ b/lib/std/enums.zig @@ -35,8 +35,8 @@ pub fn EnumFieldStruct(comptime E: type, comptime Data: type, comptime field_def pub inline fn valuesFromFields(comptime E: type, comptime fields: []const EnumField) []const E { comptime { var result: [fields.len]E = undefined; - for (fields, 0..) |f, i| { - result[i] = @field(E, f.name); + for (&result, fields) |*r, f| { + r.* = @enumFromInt(f.value); } return &result; } @@ -1534,3 +1534,13 @@ test "std.enums.EnumIndexer empty" { try testing.expectEqual(E, Indexer.Key); try testing.expectEqual(0, Indexer.count); } + +test "enumValues" { + const E = enum { + X, + Y, + Z, + pub const X = 1; + }; + try testing.expectEqualSlices(E, &.{ .X, .Y, .Z }, values(E)); +}