summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorcooldome <ariabushenko@bk.ru>2020-05-12 12:45:34 +0100
committercooldome <ariabushenko@bk.ru>2020-05-12 12:45:34 +0100
commit4277ab470a20f429605fbf238e485ea24b01706a (patch)
tree748b108c9d9ebcf3674ba60365f5bfc8fa39cffa
parentdfae796ac3e0db69af40bec11a7d7ad7c4d00b4b (diff)
downloadNim-4277ab470a20f429605fbf238e485ea24b01706a.tar.gz
fix one motr dicriminator bug
-rw-r--r--compiler/liftdestructors.nim9
1 files changed, 7 insertions, 2 deletions
diff --git a/compiler/liftdestructors.nim b/compiler/liftdestructors.nim
index 6f7b285ed..5faba79f9 100644
--- a/compiler/liftdestructors.nim
+++ b/compiler/liftdestructors.nim
@@ -154,8 +154,9 @@ proc fillBodyObj(c: var TLiftCtx; n, body, x, y: PNode; enforceDefaultOp: bool)
       c.kind = prevKind
       localEnforceDefaultOp = true
 
-    # copy the selector:
-    fillBodyObj(c, n[0], body, x, y, enforceDefaultOp = false)
+    if c.kind != attachedDestructor:
+      # copy the selector before case stmt, but destroy after case stmt
+      fillBodyObj(c, n[0], body, x, y, enforceDefaultOp = false)
 
     let oldfilterDiscriminator = c.filterDiscriminator
     if c.filterDiscriminator == n[0].sym:
@@ -179,6 +180,10 @@ proc fillBodyObj(c: var TLiftCtx; n, body, x, y: PNode; enforceDefaultOp: bool)
       caseStmt.add(branch)
     if emptyBranches != n.len-1:
       body.add(caseStmt)
+
+    if c.kind == attachedDestructor:
+      # destructor for selector is done after case stmt
+      fillBodyObj(c, n[0], body, x, y, enforceDefaultOp = false)
     c.filterDiscriminator = oldfilterDiscriminator
   of nkRecList:
     for t in items(n): fillBodyObj(c, t, body, x, y, enforceDefaultOp)