fixes #22844; uses arrays to store holeyenums for iterations; much more efficient than sets and reasonable for holeyenums (#22845)

fixes #22844
This commit is contained in:
ringabout
2023-10-21 00:38:42 +08:00
committed by GitHub
parent 27deacecaa
commit e10878085e
2 changed files with 17 additions and 1 deletions

View File

@@ -82,7 +82,7 @@ macro genEnumCaseStmt*(typ: typedesc, argSym: typed, default: typed,
result.add nnkElse.newTree(default)
macro enumFullRange(a: typed): untyped =
newNimNode(nnkCurly).add(a.getType[1][1..^1])
newNimNode(nnkBracket).add(a.getType[1][1..^1])
macro enumNames(a: typed): untyped =
# this could be exported too; in particular this could be useful for enum with holes.

View File

@@ -2,6 +2,9 @@ discard """
matrix: "--warningAsError:EnumConv --warningAsError:CStringConv"
"""
from std/enumutils import items # missing from the example code
from std/sequtils import toSeq
template reject(x) =
static: doAssert(not compiles(x))
template accept(x) =
@@ -117,4 +120,17 @@ reject:
var va = 2
var vb = va.Hole
block: # bug #22844
type
A = enum
a0 = 2
a1 = 4
a2
B[T] = enum
b0 = 2
b1 = 4
doAssert A.toSeq == [a0, a1, a2]
doAssert B[float].toSeq == [B[float].b0, B[float].b1]
{.pop.}