diff options
author | Andrii Riabushenko <cdome@bk.ru> | 2019-08-31 09:56:39 +0100 |
---|---|---|
committer | Andrii Riabushenko <cdome@bk.ru> | 2019-08-31 09:56:39 +0100 |
commit | a388c35741b4e9718ddd1d1f781a56f6bc0373c0 (patch) | |
tree | a7ab5e1f2d7f6802b3cfd6c86a4d61b3c63a78cc | |
parent | a055f628f4354f6125e97c42bcf83f8e20149fac (diff) | |
download | Nim-a388c35741b4e9718ddd1d1f781a56f6bc0373c0.tar.gz |
support forward declared destructors
-rw-r--r-- | compiler/semstmts.nim | 8 |
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) |