summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semfold.nim1
-rw-r--r--compiler/types.nim6
-rw-r--r--tests/misc/tunsignedconv.nim12
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