summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndrii Riabushenko <cdome@bk.ru>2019-08-31 09:49:47 +0100
committerAndrii Riabushenko <cdome@bk.ru>2019-08-31 09:49:47 +0100
commita055f628f4354f6125e97c42bcf83f8e20149fac (patch)
tree1b8b17324c9e0837d8502c4821af05aabc862d9c
parent9ae0dd611f77c4cd7122e6ac77e0278c1bafbbd7 (diff)
downloadNim-a055f628f4354f6125e97c42bcf83f8e20149fac.tar.gz
fixes #12092
-rw-r--r--compiler/semstmts.nim4
-rw-r--r--tests/destructor/tdestructor_too_late.nim14
2 files changed, 16 insertions, 2 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index 5a0aac40e..dff67f175 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -1595,7 +1595,7 @@ proc semOverride(c: PContext, s: PSym, n: PNode) =
         else: break
       if obj.kind in {tyObject, tyDistinct, tySequence, tyString}:
         obj = canonType(c, obj)
-        if obj.destructor.isNil:
+        if obj.destructor.isNil and tfCheckedForDestructor notin obj.flags:
           obj.attachedOps[attachedDestructor] = s
         else:
           prevDestructor(c, obj.destructor, obj, n.info)
@@ -1660,7 +1660,7 @@ proc semOverride(c: PContext, s: PSym, n: PNode) =
         obj = canonType(c, obj)
         #echo "ATTACHING TO ", obj.id, " ", s.name.s, " ", cast[int](obj)
         let k = if name == "=": attachedAsgn else: attachedSink
-        if obj.attachedOps[k].isNil:
+        if obj.attachedOps[k].isNil and tfCheckedForDestructor notin obj.flags:
           obj.attachedOps[k] = s
         else:
           prevDestructor(c, obj.attachedOps[k], obj, n.info)
diff --git a/tests/destructor/tdestructor_too_late.nim b/tests/destructor/tdestructor_too_late.nim
new file mode 100644
index 000000000..d279280ba
--- /dev/null
+++ b/tests/destructor/tdestructor_too_late.nim
@@ -0,0 +1,14 @@
+discard """
+  errmsg: "cannot bind another '=destroy' to: Obj; previous declaration was constructed here implicitly: tdestructor_too_late.nim(7, 16)"
+"""
+type Obj* = object
+  v*: int
+
+proc something(this: sink Obj) = 
+  discard
+
+proc `=destroy`(this: var Obj) =
+  echo "igotdestroyed"
+  this.v = -1
+
+var test* = Obj(v: 42)
\ No newline at end of file