From c90c53e8bb93c99a323684d73df7e7ec4791107d Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Thu, 23 Jul 2020 16:53:07 +0200 Subject: [PATCH] fixes #15044 [backport:1.2] --- compiler/semmagic.nim | 8 +++++--- tests/arc/tarcmisc.nim | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim index 6aa440aa9e..f991b4ac6c 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 51c80c3484..cb889db15c 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