summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/destroyer.nim10
-rw-r--r--compiler/semasgn.nim1
-rw-r--r--tests/destructor/tcustomseqs.nim14
3 files changed, 21 insertions, 4 deletions
diff --git a/compiler/destroyer.nim b/compiler/destroyer.nim
index d87e648db..fde592f52 100644
--- a/compiler/destroyer.nim
+++ b/compiler/destroyer.nim
@@ -165,15 +165,18 @@ template interestingSym(s: PSym): bool =
   s.owner == c.owner and s.kind in InterestingSyms and hasDestructor(s.typ)
 
 proc genSink(t: PType; dest: PNode): PNode =
+  let t = t.skipTypes({tyGenericInst, tyAlias})
   let op = if t.sink != nil: t.sink else: t.assignment
   assert op != nil
   result = newTree(nkCall, newSymNode(op), newTree(nkHiddenAddr, dest))
 
 proc genCopy(t: PType; dest: PNode): PNode =
+  let t = t.skipTypes({tyGenericInst, tyAlias})
   assert t.assignment != nil
   result = newTree(nkCall, newSymNode(t.assignment), newTree(nkHiddenAddr, dest))
 
 proc genDestroy(t: PType; dest: PNode): PNode =
+  let t = t.skipTypes({tyGenericInst, tyAlias})
   assert t.destructor != nil
   result = newTree(nkCall, newSymNode(t.destructor), newTree(nkHiddenAddr, dest))
 
@@ -289,6 +292,7 @@ proc injectDestructorCalls*(owner: PSym; n: PNode): PNode =
     result.add body
 
   when defined(nimDebugDestroys):
-    echo "------------------------------------"
-    echo owner.name.s, " transformed to: "
-    echo result
+    if owner.name.s == "createSeq":
+      echo "------------------------------------"
+      echo owner.name.s, " transformed to: "
+      echo result
diff --git a/compiler/semasgn.nim b/compiler/semasgn.nim
index 835da55ac..857c9a1e0 100644
--- a/compiler/semasgn.nim
+++ b/compiler/semasgn.nim
@@ -320,6 +320,7 @@ proc liftTypeBoundOps*(c: PContext; typ: PType; info: TLineInfo) =
   ## to ensure we lift assignment, destructors and moves properly.
   ## The later 'destroyer' pass depends on it.
   if not newDestructors or not hasDestructor(typ): return
+  let typ = typ.skipTypes({tyGenericInst, tyAlias})
   # we generate the destructor first so that other operators can depend on it:
   if typ.destructor == nil: liftBody(c, typ, attachedDestructor, info)
   if typ.assignment == nil: liftBody(c, typ, attachedAsgn, info)
diff --git a/tests/destructor/tcustomseqs.nim b/tests/destructor/tcustomseqs.nim
index a58602d46..97d7c07b6 100644
--- a/tests/destructor/tcustomseqs.nim
+++ b/tests/destructor/tcustomseqs.nim
@@ -8,7 +8,14 @@ discard """
 89
 90
 90
-after 1 1'''
+0 0 1
+0 1 2
+0 2 3
+1 0 4
+1 1 5
+1 2 6
+1 3 7
+after 6 6'''
   cmd: '''nim c --newruntime $file'''
 """
 
@@ -127,5 +134,10 @@ proc main =
   for i in 0 ..< s.len:
     echo s[i]
 
+  var nested = createSeq(createSeq(1, 2, 3), createSeq(4, 5, 6, 7))
+  for i in 0 ..< nested.len:
+    for j in 0 ..< nested[i].len:
+      echo i, " ", j, " ", nested[i][j]
+
 main()
 echo "after ", allocCount, " ", deallocCount