mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-06 21:17:48 +00:00
fixes #15044 [backport:1.2]
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user