Skip to content

Commit

Permalink
fixes #21280; Enum with int64.high() value crashes compiler (#21285)
Browse files Browse the repository at this point in the history
* fixes #21280; Enum with int64.high() value crashes compiler

* Update tests/enum/tenum.nim

* Update tests/enum/tenum.nim

* fixes tests

* Update tests/enum/tenum.nim

---------

Co-authored-by: Andreas Rumpf <[email protected]>
  • Loading branch information
ringabout and Araq authored May 6, 2023
1 parent b562e1e commit 8cf5643
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
7 changes: 6 additions & 1 deletion compiler/semtypes.nim
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const
errIntLiteralExpected = "integer literal expected"
errWrongNumberOfVariables = "wrong number of variables"
errInvalidOrderInEnumX = "invalid order in enum '$1'"
errOverflowInEnumX = "The enum '$1' exceeds its maximum value ($2)"
errOrdinalTypeExpected = "ordinal type expected; given: $1"
errSetTooBig = "set is too large; use `std/sets` for ordinal types with more than 2^16 elements"
errBaseTypeMustBeOrdinal = "base type of a set must be an ordinal"
Expand Down Expand Up @@ -147,7 +148,11 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType =
declarePureEnumField(c, e)
if (let conflict = strTableInclReportConflict(symbols, e); conflict != nil):
wrongRedefinition(c, e.info, e.name.s, conflict.info)
inc(counter)
if counter == high(typeof(counter)):
if i > 1 and result.n[i-2].sym.position == high(int):
localError(c.config, n[i].info, errOverflowInEnumX % [e.name.s, $high(typeof(counter))])
else:
inc(counter)
if isPure and sfExported in result.sym.flags:
addPureEnum(c, LazySym(sym: result.sym))
if tfNotNil in e.typ.flags and not hasNull:
Expand Down
8 changes: 8 additions & 0 deletions tests/enum/tenum.nim
Original file line number Diff line number Diff line change
Expand Up @@ -176,3 +176,11 @@ block: # bug #12589

when not defined(gcRefc):
doAssert $typ() == "wkbPoint25D"

block: # bug #21280
type
Test = enum
B = 19
A = int64.high()

doAssert ord(A) == int64.high()

0 comments on commit 8cf5643

Please sign in to comment.