summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2020-07-23 16:53:07 +0200
committerAndreas Rumpf <rumpf_a@web.de>2020-07-23 20:27:17 +0200
commitc90c53e8bb93c99a323684d73df7e7ec4791107d (patch)
treeca67f5fb4618bedbd08c74dc234acb0d4db9c417
parent14d16c2174a4fcefd405f8c4eeaf57a6dcd2731d (diff)
downloadNim-c90c53e8bb93c99a323684d73df7e7ec4791107d.tar.gz
fixes #15044 [backport:1.2]
-rw-r--r--compiler/semmagic.nim8
-rw-r--r--tests/arc/tarcmisc.nim18
2 files changed, 23 insertions, 3 deletions
diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim
index 6aa440aa9..f991b4ac6 100644
--- a/compiler/semmagic.nim
+++ b/compiler/semmagic.nim
@@ -527,12 +527,14 @@ proc magicsAfterOverloadResolution(c: PContext, n: PNode,
     if n[^1].kind == nkSym and n[^1].sym.kind notin {skProc, skFunc}:
       localError(c.config, n.info, "finalizer must be a direct reference to a proc")
     elif optTinyRtti in c.config.globalOptions:
+      let fin = if n[^1].kind == nkLambda: n[^1][namePos].sym
+                else: n[^1].sym
       # check if we converted this finalizer into a destructor already:
-      let t = whereToBindTypeHook(c, n[^1].sym.typ[1].skipTypes(abstractInst+{tyRef}))
-      if t != nil and t.attachedOps[attachedDestructor] != nil and t.attachedOps[attachedDestructor].owner == n[^1].sym:
+      let t = whereToBindTypeHook(c, fin.typ[1].skipTypes(abstractInst+{tyRef}))
+      if t != nil and t.attachedOps[attachedDestructor] != nil and t.attachedOps[attachedDestructor].owner == fin:
         discard "already turned this one into a finalizer"
       else:
-        bindTypeHook(c, turnFinalizerIntoDestructor(c, n[^1].sym, n.info), n, attachedDestructor)
+        bindTypeHook(c, turnFinalizerIntoDestructor(c, fin, n.info), n, attachedDestructor)
     result = n
   of mDestroy:
     result = n
diff --git a/tests/arc/tarcmisc.nim b/tests/arc/tarcmisc.nim
index 51c80c348..cb889db15 100644
--- a/tests/arc/tarcmisc.nim
+++ b/tests/arc/tarcmisc.nim
@@ -23,6 +23,7 @@ whiley ends :(
 0
 new line before - @['a']
 new line after - @['a']
+finalizer
 closed
 destroying variable: 20
 destroying variable: 10
@@ -258,6 +259,23 @@ newline.insert(indent, 0)
 
 echo "new line after - ", newline
 
+# bug #15044
+
+type
+  Test = ref object
+
+proc test: Test =
+  # broken
+  new(result, proc(x: Test) =
+    echo "finalizer"
+  )
+
+proc tdirectFinalizer =
+  discard test()
+
+tdirectFinalizer()
+
+
 # bug #14480
 proc hello(): int =
   result = 42