summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndrii Riabushenko <cdome@bk.ru>2019-08-31 09:56:39 +0100
committerAndrii Riabushenko <cdome@bk.ru>2019-08-31 09:56:39 +0100
commita388c35741b4e9718ddd1d1f781a56f6bc0373c0 (patch)
treea7ab5e1f2d7f6802b3cfd6c86a4d61b3c63a78cc
parenta055f628f4354f6125e97c42bcf83f8e20149fac (diff)
downloadNim-a388c35741b4e9718ddd1d1f781a56f6bc0373c0.tar.gz
support forward declared destructors
-rw-r--r--compiler/semstmts.nim8
1 files changed, 6 insertions, 2 deletions
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index dff67f175..262deba5e 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -1595,7 +1595,9 @@ 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 and tfCheckedForDestructor notin obj.flags:
+        if obj.attachedOps[attachedDestructor] == s:
+          discard "forward declared destructor"
+        elif obj.destructor.isNil and tfCheckedForDestructor notin obj.flags:
           obj.attachedOps[attachedDestructor] = s
         else:
           prevDestructor(c, obj.destructor, obj, n.info)
@@ -1660,7 +1662,9 @@ 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 and tfCheckedForDestructor notin obj.flags:
+        if obj.attachedOps[k] == s:
+          discard "forward declared op"
+        elif obj.attachedOps[k].isNil and tfCheckedForDestructor notin obj.flags:
           obj.attachedOps[k] = s
         else:
           prevDestructor(c, obj.attachedOps[k], obj, n.info)