summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/sempass2.nim13
-rw-r--r--tests/destructor/tdestructor3.nim35
2 files changed, 47 insertions, 1 deletions
diff --git a/compiler/sempass2.nim b/compiler/sempass2.nim
index b94d75e87..4c4899391 100644
--- a/compiler/sempass2.nim
+++ b/compiler/sempass2.nim
@@ -758,6 +758,19 @@ proc track(tracked: PEffects, n: PNode) =
       if n[1].typ.len > 0:
         createTypeBoundOps(tracked, n[1].typ.lastSon, n.info)
         createTypeBoundOps(tracked, n[1].typ, n.info)
+
+    if a.kind == nkSym and a.sym.name.s.len > 0 and a.sym.name.s[0] == '=' and
+          tracked.owner.kind != skMacro:
+      let opKind = find(AttachedOpToStr, a.sym.name.s.normalize)
+      if opKind != -1:
+        # rebind type bounds operations after createTypeBoundOps call
+        let t = n[1].typ.skipTypes({tyAlias, tyVar})
+        if a.sym != t.attachedOps[TTypeAttachedOp(opKind)]:
+          createTypeBoundOps(tracked, t, n.info)
+          let op = t.attachedOps[TTypeAttachedOp(opKind)]
+          if op != nil:
+            n[0].sym = op
+
     for i in 0..<n.safeLen:
       track(tracked, n[i])
   of nkDotExpr:
diff --git a/tests/destructor/tdestructor3.nim b/tests/destructor/tdestructor3.nim
index 4c251e0bf..b68aedce9 100644
--- a/tests/destructor/tdestructor3.nim
+++ b/tests/destructor/tdestructor3.nim
@@ -7,7 +7,13 @@ destroy
 destroy Foo: 123
 destroy Foo: 5
 (x1: (val: ...))
-destroy'''
+destroy
+---------------
+app begin
+(val: ...)
+destroy
+app end
+'''
 joinable: false
 """
 
@@ -93,3 +99,30 @@ proc test =
   echo obj2
 
 test()
+
+
+#------------------------------------------------------------
+# Issue #12883
+
+type 
+  TopObject = object
+    internal: UniquePtr[int]
+
+proc deleteTop(p: ptr TopObject) =
+  if p != nil:    
+    `=destroy`(p[]) # !!! this operation used to leak the integer
+    deallocshared(p)
+
+proc createTop(): ptr TopObject =
+  result = cast[ptr TopObject](allocShared0(sizeof(TopObject)))
+  result.internal = newUniquePtr(1)
+
+proc test2() = 
+  let x = createTop()
+  echo $x.internal
+  deleteTop(x)
+
+echo "---------------"  
+echo "app begin"
+test2()
+echo "app end"
\ No newline at end of file