Finalizer proc must be global (#10388)

Fixes #10376
This commit is contained in:
LemonBoy
2019-01-22 07:35:52 +01:00
committed by Andreas Rumpf
parent 7a3f382517
commit 3ea099bc7f
2 changed files with 36 additions and 0 deletions

View File

@@ -410,4 +410,9 @@ proc magicsAfterOverloadResolution(c: PContext, n: PNode,
result = n
else:
result = plugin(c, n)
of mNewFinalize:
# Make sure the finalizer procedure refers to a procedure
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 procedure")
result = n
else: result = n

31
tests/errmsgs/t10376.nim Normal file
View File

@@ -0,0 +1,31 @@
discard """
errormsg: "finalizer must be a direct reference to a procedure"
line: 29
"""
type
A = ref object
proc my_callback(a: A) {. nimcall .} =
discard
proc foo(callback: proc(a: A) {. nimcall .}) =
var x1: A
new(x1, proc (x: A) {.nimcall.} = discard)
var x2: A
new(x2, func (x: A) {.nimcall.} = discard)
var x3: A
proc foo1(a: A) {.nimcall.} = discard
new(x3, foo1)
var x4: A
func foo2(a: A) {.nimcall.} = discard
new(x4, foo2)
var x5: A
new(x5, my_callback)
var x6: A
new(x6, callback)
foo(my_callback)