diff options
-rw-r--r-- | compiler/semfold.nim | 1 | ||||
-rw-r--r-- | compiler/types.nim | 6 | ||||
-rw-r--r-- | tests/misc/tunsignedconv.nim | 12 |
3 files changed, 17 insertions, 2 deletions
diff --git a/compiler/semfold.nim b/compiler/semfold.nim index 54850fcfe..a8d42fe7a 100644 --- a/compiler/semfold.nim +++ b/compiler/semfold.nim @@ -439,7 +439,6 @@ proc foldConv(n, a: PNode; g: ModuleGraph; check = false): PNode = result = newIntNodeT(toInt128(getFloat(a)), n, g) of tyChar, tyUInt..tyUInt64, tyInt..tyInt64: var val = a.getOrdValue - if check: rangeCheck(n, val, g) result = newIntNodeT(val, n, g) if dstTyp.kind in {tyUInt..tyUInt64}: diff --git a/compiler/types.nim b/compiler/types.nim index fe7a60a12..c7fe529e1 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -87,7 +87,11 @@ proc isUnsigned*(t: PType): bool = t.skipTypes(abstractInst).kind in {tyChar, tyUInt..tyUInt64} proc getOrdValue*(n: PNode; onError = high(Int128)): Int128 = - case n.kind + var k = n.kind + if n.typ != nil and n.typ.skipTypes(abstractInst).kind in {tyChar, tyUInt..tyUInt64}: + k = nkUIntLit + + case k of nkCharLit, nkUIntLit..nkUInt64Lit: # XXX: enable this assert #assert n.typ == nil or isUnsigned(n.typ), $n.typ diff --git a/tests/misc/tunsignedconv.nim b/tests/misc/tunsignedconv.nim index 17d137947..af334dd19 100644 --- a/tests/misc/tunsignedconv.nim +++ b/tests/misc/tunsignedconv.nim @@ -1,3 +1,6 @@ +discard """ + output: '''uint''' +""" # Tests unsigned literals and implicit conversion between uints and ints # Passes if it compiles @@ -43,3 +46,12 @@ block t4176: var yyy: uint8 = 0 yyy = yyy - 127 doAssert type(yyy) is uint8 + +# bug #13661 + +proc fun(): uint = cast[uint](-1) +const x0 = fun() + +echo typeof(x0) + +discard $x0 |