summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semfold.nim18
-rw-r--r--compiler/types.nim4
-rw-r--r--tests/objvariant/tyaoption.nim47
3 files changed, 61 insertions, 8 deletions
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index 925a80832..caaab2291 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -113,12 +113,18 @@ proc pickMaxInt(n: PNode): BiggestInt =
     internalError(n.info, "pickMaxInt")
 
 proc makeRange(typ: PType, first, last: BiggestInt): PType = 
-  var n = newNode(nkRange)
-  addSon(n, newIntNode(nkIntLit, min(first, last)))
-  addSon(n, newIntNode(nkIntLit, max(first, last)))
-  result = newType(tyRange, typ.owner)
-  result.n = n
-  addSonSkipIntLit(result, skipTypes(typ, {tyRange}))
+  let minA = min(first, last)
+  let maxA = max(first, last)
+  let lowerNode = newIntNode(nkIntLit, minA)
+  if typ.kind == tyInt and minA == maxA:
+    result = getIntLitType(lowerNode)
+  else:
+    var n = newNode(nkRange)
+    addSon(n, lowerNode)
+    addSon(n, newIntNode(nkIntLit, maxA))
+    result = newType(tyRange, typ.owner)
+    result.n = n
+    addSonSkipIntLit(result, skipTypes(typ, {tyRange}))
 
 proc makeRangeF(typ: PType, first, last: BiggestFloat): PType =
   var n = newNode(nkRange)
diff --git a/compiler/types.nim b/compiler/types.nim
index ae31d24de..c80f6ff35 100644
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -385,8 +385,8 @@ proc mutateType(t: PType, iter: TTypeMutator, closure: PObject): PType =
 
 proc valueToString(a: PNode): string =
   case a.kind
-  of nkCharLit..nkUInt64Lit: result = $(a.intVal)
-  of nkFloatLit..nkFloat128Lit: result = $(a.floatVal)
+  of nkCharLit..nkUInt64Lit: result = $a.intVal
+  of nkFloatLit..nkFloat128Lit: result = $a.floatVal
   of nkStrLit..nkTripleStrLit: result = a.strVal
   else: result = "<invalid value>"
 
diff --git a/tests/objvariant/tyaoption.nim b/tests/objvariant/tyaoption.nim
new file mode 100644
index 000000000..635e60bb8
--- /dev/null
+++ b/tests/objvariant/tyaoption.nim
@@ -0,0 +1,47 @@
+discard """
+  output: '''some(str), some(5), none
+some(5!)
+some(10)'''
+"""
+
+import strutils
+
+type Option[A] = object
+  case isDefined*: Bool
+    of true:
+      value*: A
+    of false:
+      nil
+
+proc some[A](value: A): Option[A] =
+  Option[A](isDefined: true, value: value)
+
+proc none[A](): Option[A] =
+  Option[A](isDefined: false)
+
+proc `$`[A](o: Option[A]): String =
+  if o.isDefined:
+    "some($1)" % [$o.value]
+  else:
+    "none"
+
+let x = some("str")
+let y = some(5)
+let z = none[Int]()
+
+echo x, ", ", y, ", ", z
+
+proc intOrString[A : Int | String](o: Option[A]): Option[A] =
+  when A is Int:
+    some(o.value + 5)
+  elif A is String:
+    some(o.value & "!")
+  else:
+    o
+
+#let a1 = intOrString(none[String]())
+let a2 = intOrString(some("5"))
+let a3 = intOrString(some(5))
+#echo a1
+echo a2
+echo a3