Don't try and get enum value if its invalid (#22997)

Currently running `nimsuggest`/`check` on this code causes the compiler
to raise an exception

```nim
type
  Test = enum
    A = 9.0 
```

```
assertions.nim(34)       raiseAssert
Error: unhandled exception: int128.nim(69, 11) `arg.sdata(3) == 0` out of range [AssertionDefect]
```

Issue was the compiler still trying to get the ordinal value even if it
wasn't an ordinal
This commit is contained in:
Jake Leahy
2023-11-28 19:38:10 +11:00
committed by GitHub
parent c31bbb07fb
commit 8cad6ac048
2 changed files with 12 additions and 3 deletions

View File

@@ -113,10 +113,11 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType =
strVal = v
x = counter
else:
if not isOrdinalType(v.typ, allowEnumWithHoles=true):
if isOrdinalType(v.typ, allowEnumWithHoles=true):
x = toInt64(getOrdValue(v))
n[i][1] = newIntTypeNode(x, getSysType(c.graph, unknownLineInfo, tyInt))
else:
localError(c.config, v.info, errOrdinalTypeExpected % typeToString(v.typ, preferDesc))
x = toInt64(getOrdValue(v))
n[i][1] = newIntTypeNode(x, getSysType(c.graph, unknownLineInfo, tyInt))
if i != 1:
if x != counter: incl(result.flags, tfEnumHasHoles)
if x < counter:

View File

@@ -0,0 +1,8 @@
discard """
cmd: "nim check $file"
"""
type
Test = enum
A = 9.0 #[tt.Error
^ ordinal type expected; given: float]#