diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index 20f903da9d..9265d09e3d 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -362,6 +362,7 @@ proc detectCapturedVars(n: PNode; owner: PSym; c: var DetectionPass) = # this handles the case that the inner proc was declared as # .closure but does not actually capture anything: addClosureParam(c, s) + c.somethingToDo = true let innerProc = isInnerProc(s) if innerProc: @@ -654,7 +655,6 @@ proc wrapIterBody(n: PNode; owner: PSym): PNode = proc symToClosure(n: PNode; owner: PSym; d: DetectionPass; c: var LiftingPass): PNode = let s = n.sym - if s == owner: # recursive calls go through (lambda, hiddenParam): let available = getHiddenParam(owner) diff --git a/tests/closure/texplicit_dummy_closure.nim b/tests/closure/texplicit_dummy_closure.nim new file mode 100644 index 0000000000..ec608b31ad --- /dev/null +++ b/tests/closure/texplicit_dummy_closure.nim @@ -0,0 +1,22 @@ + +# This is a regression of the new lambda lifting; detected by Aporia +import asyncio, sockets +import os + +type + Window = object + oneInstSock*: PAsyncSocket + IODispatcher*: PDispatcher + +var + win: Window + +proc initSocket() = + win.oneInstSock = asyncSocket() + #win.oneInstSock.handleAccept = + proc test(s: PAsyncSocket) = + var client: PAsyncSocket + proc dummy(c: PAsyncSocket) {.closure.} = + discard + client.handleRead = dummy + test(win.oneInstSock)