summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2016-12-10 02:30:57 +0100
committerAraq <rumpf_a@web.de>2016-12-10 02:30:57 +0100
commit34143ee12285c55d0773ea8ebda38b95351c6592 (patch)
tree436d89470bc86d14a1f20f57d069820caa4e09e3
parent94e1488c242e8507beddf669b6ba776d016af0a6 (diff)
downloadNim-34143ee12285c55d0773ea8ebda38b95351c6592.tar.gz
fixes serious codegen regression that caused Nimble to misbehave
-rw-r--r--compiler/ccgtrav.nim2
-rw-r--r--tests/ccgbugs/tmarkerproc_regression.nim47
2 files changed, 48 insertions, 1 deletions
diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim
index 731dc55a0..6dab003fd 100644
--- a/compiler/ccgtrav.nim
+++ b/compiler/ccgtrav.nim
@@ -63,7 +63,7 @@ proc genTraverseProc(c: var TTraversalClosure, accessor: Rope, typ: PType) =
 
   var p = c.p
   case typ.kind
-  of tyGenericInst, tyGenericBody, tyTypeDesc, tyAlias:
+  of tyGenericInst, tyGenericBody, tyTypeDesc, tyAlias, tyDistinct:
     genTraverseProc(c, accessor, lastSon(typ))
   of tyArray:
     let arraySize = lengthOrd(typ.sons[0])
diff --git a/tests/ccgbugs/tmarkerproc_regression.nim b/tests/ccgbugs/tmarkerproc_regression.nim
new file mode 100644
index 000000000..261f746fc
--- /dev/null
+++ b/tests/ccgbugs/tmarkerproc_regression.nim
@@ -0,0 +1,47 @@
+discard """
+  output: "done"
+"""
+
+type
+  Version* = distinct string
+  Special* = distinct string
+
+  VersionRangeEnum* = enum
+    verLater, # > V
+    verEarlier, # < V
+    verEqLater, # >= V -- Equal or later
+    verEqEarlier, # <= V -- Equal or earlier
+    verIntersect, # > V & < V
+    verEq, # V
+    verAny, # *
+    verSpecial # #head
+
+  VersionRange* = ref VersionRangeObj
+  VersionRangeObj = object
+    case kind*: VersionRangeEnum
+    of verLater, verEarlier, verEqLater, verEqEarlier, verEq:
+      ver*: Version
+    of verSpecial:
+      spe*: Special
+    of verIntersect:
+      verILeft, verIRight: VersionRange
+    of verAny:
+      nil
+
+proc foo(x: string): VersionRange =
+  new(result)
+  result.kind = verEq
+  result.ver = Version(x)
+
+proc main =
+  var a: array[5000, VersionRange]
+  for i in 0 ..< 5000:
+    a[i] = foo($i & "some longer text here " & $i)
+  GC_fullcollect()
+  for i in 0 ..< 5000:
+    let expected = $i & "some longer text here " & $i
+    if a[i].ver.string != expected:
+      quit "bug!"
+  echo "done"
+
+main()